ar Everyday Information Architecture: Auditing for Structure By feedproxy.google.com Published On :: 2019-04-18T12:45:30+00:00 Just as we need to understand our content before we can recategorize it, we need to understand the system before we try to rebuild it. Enter the structural audit: a review of the site focused solely on its menus, links, flows, and hierarchies. I know you thought we were done with audits back in Chapter 2, but hear me out! Structural audits have an important and singular purpose: to help us build a new sitemap. This isn’t about recreating the intended sitemap—no, this is about experiencing the site the way users experience it. This audit is meant to track and record the structure of the site as it really works. Setting up the template First, we’re gonna need another spreadsheet. (Look, it is not my fault that spreadsheets are the perfect system for recording audit data. I don’t make the rules.) Because this involves building a spreadsheet from scratch, I keep a “template” at the top of my audit files—rows that I can copy and paste into each new audit (Fig 4.1). It’s a color-coded outline key that helps me track my page hierarchy and my place in the auditing process. When auditing thousands of pages, it’s easy to get dizzyingly lost, particularly when coming back into the sheet after a break; the key helps me stay oriented, no matter how deep the rabbit hole. Fig 4.1: I use a color-coded outline key to record page hierarchy as I move through the audit. Wait, how many circles did Dante write about? Color-coding Color is the easiest, quickest way to convey page depth at a glance. The repetition of black text, white cells, and gray lines can have a numbing effect—too many rows of sameness, and your eyes glaze over. My coloring may result in a spreadsheet that looks like a twee box of macarons, but at least I know, instantly, where I am. The exact colors don’t really matter, but I find that the familiar mental model of a rainbow helps with recognition—the cooler the row color, the deeper into the site I know I must be. The nested rainbow of pages is great when you’re auditing neatly nested pages—but most websites color outside the lines (pun extremely intended) with their structure. I leave my orderly rainbow behind to capture duplicate pages, circular links, external navigation, and other inconsistencies like: On-page navigation. A bright text color denotes pages that are accessible via links within page content—not through the navigation. These pages are critical to site structure but are easily overlooked. Not every page needs to be displayed in the navigation menus, of course—news articles are a perfect example—but sometimes this indicates publishing errors. External links. These are navigation links that go to pages outside the domain. They might be social media pages, or even sites held by the same company—but if the domain isn’t the one I’m auditing, I don’t need to follow it. I do need to note its existence in my spreadsheet, so I color the text as the red flag that it is. (As a general rule, I steer clients away from placing external links in navigation, in order to maintain a consistent experience. If there’s a need to send users offsite, I’ll suggest using a contextual, on-page link.)Files. This mostly refers to PDFs, but can include Word files, slide decks, or anything else that requires downloading. As with external links, I want to capture anything that might disrupt the in-site browsing experience. (My audits usually filter out PDFs, but for organizations that overuse them, I’ll audit them separately to show how much “website” content is locked inside.) Unknown hierarchy. Every once in a while, there’s a page that doesn’t seem to belong anywhere—maybe it’s missing from the menu, while its URL suggests it belongs in one section and its navigation scheme suggests another. These pages need to be discussed with their owners to determine whether the content needs to be considered in the new site.Crosslinks. These are navigation links for pages that canonically live in a different section of the site—in other words, they’re duplicates. This often happens in footer navigation, which may repeat the main navigation or surface links to deeper-but-important pages (like a Contact page or a privacy policy). I don’t want to record the same information about the page twice, but I do need to know where the crosslink is, so I can track different paths to the content. I color these cells gray so they don’t draw my attention. Note that coloring every row (and indenting, as you’ll see in a moment) can be a tedious process—unless you rely on Excel’s formatting brush. That tool applies all the right styles in just two quick clicks. Outlines and page IDs Color-coding is half of my template; the other half is the outline, which is how I keep track of the structure itself. (No big deal, just the entire point of the spreadsheet.) Every page in the site gets assigned an ID. You are assigning this number; it doesn’t correspond to anything but your own perception of the navigation. This number does three things for you: It associates pages with their place in the site hierarchy. Decimals indicate levels, so the page ID can be decoded as the page’s place in the system.It gives each page a unique identifier, so you can easily refer to a particular page—saying “2.4.1” is much clearer than “you know that one page in the fourth product category?”You can keep using the ID in other contexts, like your sitemap. Then, later, when your team decides to wireframe pages 1.1.1 and 7.0, you’ll all be working from the same understanding. Let me be completely honest: things might get goofy sometimes with the decimal outline. There will come a day when you’ll find yourself casually typing out “1.2.1.2.1.1.1,” and at that moment, a fellow auditor somewhere in the universe will ring a tiny gong for you. In addition to the IDs, I indent each level, which reinforces both the numbers and the colors. Each level down—each digit in the ID, each change in color—gets one indentation. I identify top-level pages with a single number: 1.0, 2.0, 3.0, etc. The next page level in the first section would be 1.1, 1.2, 1.3, and so on. I mark the homepage as 0.0, which is mildly controversial—the homepage is technically a level above—but, look: I’ve got a lot of numbers to write, and I don’t need those numbers to tell me they’re under the homepage, so this is my system. Feel free to use the numbering system that work best for you. Criteria and columns So we’ve got some secret codes for tracking hierarchy and depth, but what about other structural criteria? What are our spreadsheet columns (Fig 4.2)? In addition to a column for Page ID, here’s what I cover: URL. I don’t consistently fill out this column, because I already collected this data back in my automated audit. I include it every twenty entries or so (and on crosslinks or pages with unknown hierarchy) as another way of tracking progress, and as a direct link into the site itself. Menu label/link. I include this column only if I notice a lot of mismatches between links, labels, and page names. Perfect agreement isn’t required; but frequent, significant differences between the language that leads to a page and the language on the page itself may indicate inconsistencies in editorial approach or backend structures. Name/headline. Think of this as “what does the page owner call it?” It may be the H1, or an H2; it may match the link that brought you here, or the page title in the browser, or it may not. Page title. This is for the name of the page in the metadata. Again, I don’t use this in every audit—particularly if the site uses the same long, branded metadata title for every single page—but frequent mismatches can be useful to track.Section. While the template can indicate your level, it can’t tell you which area of the site you’re in—unless you write it down. (This may differ from the section data you applied to your automated audit, taken from the URL structure; here, you’re noting the section where the page appears.)Notes. Finally, I keep a column to note specific challenges, and to track patterns I’m seeing across multiple pages—things like “Different template, missing subnav” or “Only visible from previous page.” My only caution here is that if you’re planning to share this audit with another person, make sure your notes are—ahem—professional. Unless you enjoy anxiously combing through hundreds of entries to revise comments like “Wow haha nope” (not that I would know anything about that). Fig 4.2: A semi-complete structural audit. This view shows a lot of second- and third-level pages, as well as pages accessed through on-page navigation. Depending on your project needs, there may be other columns, too. If, in addition to using this spreadsheet for your new sitemap, you want to use it in migration planning or template mapping, you may want columns for new URLs, or template types. You can get your own copy of my template as a downloadable Excel file. Feel free to tweak it to suit your style and needs; I know I always do. As long as your spreadsheet helps you understand the hierarchy and structure of your website, you’re good to go. Gathering data Setting up the template is one thing—actually filling it out is, admittedly, another. So how do we go from a shiny, new, naive spreadsheet to a complete, jaded, seen-some-stuff spreadsheet? I always liked Erin Kissane’s description of the process, from The Elements of Content Strategy: Big inventories involve a lot of black coffee, a few late nights, and a playlist of questionable but cheering music prominently featuring the soundtrack of object-collecting video game Katamari Damacy. It takes quite a while to exhaustively inventory a large site, but it’s the only way to really understand what you have to work with. We’re not talking about the same kind of exhaustive inventory she was describing (though I am recommending Katamari music). But even our less intensive approach is going to require your butt in a seat, your eyes on a screen, and a certain amount of patience and focus. You’re about to walk, with your fingers, through most of a website. Start on the homepage. (We know that not all users start there, but we’ve got to have some kind of order to this process or we’ll never get through it.) Explore the main navigation before moving on to secondary navigation structures. Move left to right, top to bottom (assuming that is your language direction) over each page, looking for the links. You want to record every page you can reasonably access on the site, noting navigational and structural considerations as you go. My advice as you work: Use two monitors. I struggle immensely without two screens in this process, which involves constantly switching between spreadsheet and browser in rapid, tennis-match-like succession. If you don’t have access to multiple monitors, find whatever way is easiest for you to quickly flip between applications.Record what you see. I generally note all visible menu links at the same level, then exhaust one section at a time. Sometimes this means I have to adjust what I initially observed, or backtrack to pages I missed earlier. You might prefer to record all data across a level before going deeper, and that would work, too. Just be consistent to minimize missed links.Be alert to inconsistencies. On-page links, external links, and crosslinks can tell you a lot about the structure of the site, but they’re easy to overlook. Missed on-page links mean missed content; missed crosslinks mean duplicate work. (Note: the further you get into the site, the more you’ll start seeing crosslinks, given all the pages you’ve already recorded.) Stick to what’s structurally relevant. A single file that’s not part of a larger pattern of file use is not going to change your understanding of the structure. Neither is recording every single blog post, quarterly newsletter, or news story in the archive. For content that’s dynamic, repeatable, and plentiful, I use an x in the page ID to denote more of the same. For example, a news archive with a page ID of 2.8 might show just one entry beneath it as 2.8.x; I don’t need to record every page up to 2.8.791 to understand that there are 791 articles on the site (assuming I noted that fact in an earlier content review). Save. Save frequently. I cannot even begin to speak of the unfathomable heartbreak that is Microsoft Excel burning an unsaved audit to the ground. Knowing which links to follow, which to record, and how best to untangle structural confusion—that improves with time and experience. Performing structural audits will not only teach you about your current site, but will help you develop fluency in systems thinking—a boon when it comes time to document the new site. Full Article
ar Responsible JavaScript: Part II By feedproxy.google.com Published On :: 2019-06-13T13:30:28+00:00 You and the rest of the dev team lobbied enthusiastically for a total re-architecture of the company’s aging website. Your pleas were heard by management—even up to the C-suite—who gave the green light. Elated, you and the team started working with the design, copy, and IA teams. Before long, you were banging out new code. It started out innocently enough with an npm install here and an npm install there. Before you knew it, though, you were installing production dependencies like an undergrad doing keg stands without a care for the morning after. Then you launched. Unlike the aftermath of most copious boozings, the agony didn’t start the morning after. Oh, no. It came months later in the ghastly form of low-grade nausea and headache of product owners and middle management wondering why conversions and revenue were both down since the launch. It then hit a fever pitch when the CTO came back from a weekend at the cabin and wondered why the site loaded so slowly on their phone—if it indeed ever loaded at all. Everyone was happy. Now no one is happy. Welcome to your first JavaScript hangover. It’s not your fault When you’re grappling with a vicious hangover, “I told you so” would be a well-deserved, if fight-provoking, rebuke—assuming you could even fight in so sorry a state. When it comes to JavaScript hangovers, there’s plenty of blame to dole out. Pointing fingers is a waste of time, though. The landscape of the web today demands that we iterate faster than our competitors. This kind of pressure means we’re likely to take advantage of any means available to be as productive as possible. That means we’re more likely—but not necessarily doomed—to build apps with more overhead, and possibly use patterns that can hurt performance and accessibility. Web development isn't easy. It’s a long slog we rarely get right on the first try. The best part of working on the web, however, is that we don’t have to get it perfect at the start. We can make improvements after the fact, and that’s just what the second installment of this series is here for. Perfection is a long ways off. For now, let’s take the edge off of that JavaScript hangover by improving your site’s, er, scriptuation in the short term. Round up the usual suspects It might seem rote, but it’s worth going through the list of basic optimizations. It’s not uncommon for large development teams—particularly those that work across many repositories or don’t use optimized boilerplate—to overlook them. Shake those trees First, make sure your toolchain is configured to perform tree shaking. If tree shaking is new to you, I wrote a guide on it last year you can consult. The short of it is that tree shaking is a process in which unused exports in your codebase don’t get packaged up in your production bundles. Tree shaking is available out of the box with modern bundlers such as webpack, Rollup, or Parcel. Grunt or gulp—which are not bundlers, but rather task runners—won’t do this for you. A task runner doesn’t build a dependency graph like a bundler does. Rather, they perform discrete tasks on the files you feed to them with any number of plugins. Task runners can be extended with plugins to use bundlers to process JavaScript. If extending task runners in this way is problematic for you, you’ll likely need to manually audit and remove unused code. For tree shaking to be effective, the following must be true: Your app logic and the packages you install in your project must be authored as ES6 modules. Tree shaking CommonJS modules isn’t practically possible.Your bundler must not transform ES6 modules into another module format at build time. If this happens in a toolchain that uses Babel, @babel/preset-env configuration must specify modules: false to prevent ES6 code from being converted to CommonJS. On the off chance tree shaking isn’t occurring during your build, getting it to work may help. Of course, its effectiveness varies on a case-by-case basis. It also depends on whether the modules you import introduce side effects, which may influence a bundler’s ability to shake unused exports. Split that code Chances are good that you’re employing some form of code splitting, but it’s worth re-evaluating how you’re doing it. No matter how you’re splitting code, there are two questions that are always worth asking yourself: Are you deduplicating common code between entry points?Are you lazy loading all the functionality you reasonably can with dynamic import()? These are important because reducing redundant code is essential to performance. Lazy loading functionality also improves performance by lowering the initial JavaScript footprint on a given page. On the redundancy front, using an analysis tool such as Bundle Buddy can help you find out if you have a problem. Bundle Buddy can examine your webpack compilation statistics and determine how much code is shared between your bundles. Where lazy loading is concerned, it can be a bit difficult to know where to start looking for opportunities. When I look for opportunities in existing projects, I’ll search for user interaction points throughout the codebase, such as click and keyboard events, and similar candidates. Any code that requires a user interaction to run is a potentially good candidate for dynamic import(). Of course, loading scripts on demand brings the possibility that interactivity could be noticeably delayed, as the script necessary for the interaction must be downloaded first. If data usage is not a concern, consider using the rel=prefetch resource hint to load such scripts at a low priority that won’t contend for bandwidth against critical resources. Support for rel=prefetch is good, but nothing will break if it’s unsupported, as such browsers will ignore markup they doesn’t understand. Externalize third-party hosted code Ideally, you should self-host as many of your site’s dependencies as possible. If for some reason you must load dependencies from a third party, mark them as externals in your bundler’s configuration. Failing to do so could mean your website’s visitors will download both locally hosted code and the same code from a third party. Let’s look at a hypothetical situation where this could hurt you: say that your site loads Lodash from a public CDN. You've also installed Lodash in your project for local development. However, if you fail to mark Lodash as external, your production code will end up loading a third party copy of it in addition to the bundled, locally hosted copy. This may seem like common knowledge if you know your way around bundlers, but I’ve seen it get overlooked. It’s worth your time to check twice. If you aren’t convinced to self-host your third-party dependencies, then consider adding dns-prefetch, preconnect, or possibly even preload hints for them. Doing so can lower your site’s Time to Interactive and—if JavaScript is critical to rendering content—your site’s Speed Index. Smaller alternatives for less overhead Userland JavaScript is like an obscenely massive candy store, and we as developers are awed by the sheer amount of open source offerings. Frameworks and libraries allow us to extend our applications to quickly do all sorts of stuff that would otherwise take loads of time and effort. While I personally prefer to aggressively minimize the use of client-side frameworks and libraries in my projects, their value is compelling. Yet, we do have a responsibility to be a bit hawkish when it comes to what we install. When we’ve already built and shipped something that depends on a slew of installed code to run, we’ve accepted a baseline cost that only the maintainers of that code can practically address. Right? Maybe, but then again, maybe not. It depends on the dependencies used. For instance, React is extremely popular, but Preact is an ultra-small alternative that largely shares the same API and retains compatibility with many React add-ons. Luxon and date-fns are much more compact alternatives to moment.js, which is not exactly tiny. Libraries such as Lodash offer many useful methods. Yet, some of them are easily replaceable with native ES6. Lodash’s compact method, for example, is replaceable with the filter array method. Many more can be replaced without much effort, and without the need for pulling in a large utility library. Whatever your preferred tools are, the idea is the same: do some research to see if there are smaller alternatives, or if native language features can do the trick. You may be surprised at how little effort it may take you to seriously reduce your app’s overhead. Differentially serve your scripts There’s a good chance you’re using Babel in your toolchain to transform your ES6 source into code that can run on older browsers. Does this mean we’re doomed to serve giant bundles even to browsers that don’t need them, until the older browsers disappear altogether? Of course not! Differential serving helps us get around this by generating two different builds of your ES6 source: Bundle one, which contains all the transforms and polyfills required for your site to work on older browsers. You’re probably already serving this bundle right now.Bundle two, which contains little to none of the transforms and polyfills because it targets modern browsers. This is the bundle you’re probably not serving—at least not yet. Achieving this is a bit involved. I’ve written a guide on one way you can do it, so there’s no need for a deep dive here. The long and short of it is that you can modify your build configuration to generate an additional but smaller version of your site’s JavaScript code, and serve it only to modern browsers. The best part is that these are savings you can achieve without sacrificing any features or functionality you already offer. Depending on your application code, the savings could be quite significant. A webpack-bundle-analyzer analysis of a project's legacy bundle (left) versus one for a modern bundle (right). View full-sized image. The simplest pattern for serving these bundles to their respective platforms is brief. It also works a treat in modern browsers: <!-- Modern browsers load this file: --> <script type="module" src="/js/app.mjs"></script> <!-- Legacy browsers load this file: --> <script defer nomodule src="/js/app.js"></script> Unfortunately, there’s a caveat with this pattern: legacy browsers like IE 11—and even relatively modern ones such as Edge versions 15 through 18—will download both bundles. If this is an acceptable trade-off for you, then worry no further. On the other hand, you'll need a workaround if you’re concerned about the performance implications of older browsers downloading both sets of bundles. Here’s one potential solution that uses script injection (instead of the script tags above) to avoid double downloads on affected browsers: var scriptEl = document.createElement("script"); if ("noModule" in scriptEl) { // Set up modern script scriptEl.src = "/js/app.mjs"; scriptEl.type = "module"; } else { // Set up legacy script scriptEl.src = "/js/app.js"; scriptEl.defer = true; // type="module" defers by default, so set it here. } // Inject! document.body.appendChild(scriptEl); This script infers that if a browser supports the nomodule attribute in the script element, it understands type="module". This ensures that legacy browsers only get legacy scripts and modern browsers only get modern ones. Be warned, though, that dynamically injected scripts load asynchronously by default, so set the async attribute to false if dependency order is crucial. Transpile less I’m not here to trash Babel. It’s indispensable, but lordy, it adds a lot of extra stuff without your ever knowing. It pays to peek under the hood to see what it’s up to. Some minor changes in your coding habits can have a positive impact on what Babel spits out. https://twitter.com/_developit/status/1110229993999777793 To wit: default parameters are a very handy ES6 feature you probably already use: function logger(message, level = "log") { console[level](message); } The thing to pay attention to here is the level parameter, which has a default of “log.” This means if we want to invoke console.log with this wrapper function, we don’t need to specify level. Great, right? Except when Babel transforms this function, the output looks like this: function logger(message) { var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "log"; console[level](message); } This is an example of how, despite our best intentions, developer conveniences can backfire. What was a handful of bytes in our source has now been transformed into much larger in our production code. Uglification can’t do much about it either, as arguments can’t be reduced. Oh, and if you think rest parameters might be a worthy antidote, Babel’s transforms for them are even bulkier: // Source function logger(...args) { const [level, message] = args; console[level](message); } // Babel output function logger() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } const level = args[0], message = args[1]; console[level](message); } Worse yet, Babel transforms this code even for projects with a @babel/preset-env configuration targeting modern browsers, meaning the modern bundles in your differentially served JavaScript will be affected too! You could use loose transforms to soften the blow—and that’s a fine idea, as they’re often quite a bit smaller than their more spec-compliant counterparts—but enabling loose transforms can cause issues if you remove Babel from your build pipeline later on. Regardless of whether you decide to enable loose transforms, here’s one way to cut the cruft of transpiled default parameters: // Babel won't touch this function logger(message, level) { console[level || "log"](message); } Of course, default parameters aren’t the only feature to be wary of. For example, spread syntax gets transformed, as do arrow functions and a whole host of other stuff. If you don’t want to avoid these features altogether, you have a couple ways of reducing their impact: If you’re authoring a library, consider using @babel/runtime in concert with @babel/plugin-transform-runtime to deduplicate the helper functions Babel puts into your code.For polyfilled features in apps, you can include them selectively with @babel/polyfill via @babel/preset-env’s useBuiltIns: "usage" option. This is solely my opinion, but I believe the best choice is to avoid transpilation altogether in bundles generated for modern browsers. That’s not always possible, especially if you use JSX, which must be transformed for all browsers, or if you’re using bleeding edge language features that aren’t widely supported. In the latter case, it might be worth asking if those features are really necessary to deliver a good user experience (they rarely are). If you arrive at the conclusion that Babel must be a part of your toolchain, then it’s worth peeking under the hood from time to time to catch suboptimal stuff Babel might be doing that you can improve on. Improvement is not a race As you massage your temples wondering when this horrid JavaScript hangover is going to lift, understand that it’s precisely when we rush to get something out there as fast as we possibly can that the user experience can suffer. As the web development community obsesses on iterating faster in the name of competition, it’s worth your time to slow down a little bit. You’ll find that by doing so, you may not be iterating as fast as your competitors, but your product will be faster than theirs. As you take these suggestions and apply them to your codebase, know that progress doesn’t spontaneously happen overnight. Web development is a job. The truly impactful work is done when we’re thoughtful and dedicated to the craft for the long haul. Focus on steady improvements. Measure, test, repeat, and your site’s user experience will improve, and you’ll get faster bit by bit over time. Special thanks to Jason Miller for tech editing this piece. Jason is the creator and one of the many maintainers of Preact, a vastly smaller alternative to React with the same API. If you use Preact, please consider supporting Preact through Open Collective. Full Article
ar Lessons Learned from a Year of Testing the Web Platform By feedproxy.google.com Published On :: Mon, 22 Jul 2019 16:32:14 +0000 The web-platform-tests project is a massive suite of tests (over one million in total) which verify that software (mostly web browsers) correctly implement web technologies. It’s as important as it is ambitious: the health of the web depends on a plurality of interoperable implementations. Although Bocoup has been contributing to the web-platform-tests, or “WPT,” for […] Full Article Uncategorized
ar Contributing to the ARIA Authoring Practices Guide By feedproxy.google.com Published On :: Thu, 01 Aug 2019 16:24:37 +0000 We believe that inclusivity and accessibility are of utmost importance to the open web platform. One of the ways that we empower the full diversity of Internet users is by ensuring that those with permanent disabilities and temporary limitations, can browse websites with assistive technologies. Writing accessible code improves the experience of browsing a website […] Full Article Accessibility Open Source Reliability Standards And Testing Standards Web Platform
ar Introducing a JavaScript library for exploring Scratch projects: sb-util By feedproxy.google.com Published On :: Thu, 26 Sep 2019 15:51:42 +0000 Introduction We’re excited to introduce sb-util, a new JavaScript library that makes it easy to query Scratch projects via .sb3 files. This npm library allows developers (or even teachers and students) to parse and introspect Scratch projects for a range of purposes, from data visualization to custom tooling. Previously, working with Scratch project files required […] Full Article Uncategorized
ar Bocoup & Open Standards: A (Very Full) Year in Review By feedproxy.google.com Published On :: Thu, 19 Dec 2019 08:30:44 +0000 We’ve had a very productive year making web standards more open, predictable, and inclusive. As our standards liaison, my job is to spot opportunities for us to do that work externally, and to see where more support is needed. We still have a lot to do, but it’s nice to reflect on our accomplishments over […] Full Article Open Source Standards
ar Class history and class practices in the periphery of capitalism / edited by Paul Zarembka By library.mit.edu Published On :: Sun, 1 Mar 2020 08:00:08 EST Dewey Library - HB501.C53 2019 Full Article
ar Who wants what?: redistribution preferences in comparative perspective / David Rueda, Daniel Stegmueller By library.mit.edu Published On :: Sun, 1 Mar 2020 08:00:08 EST Dewey Library - HB523.R84 2019 Full Article
ar Asian transformations: an inquiry into the development of nations / edited by Deepak Nayyar By library.mit.edu Published On :: Sun, 1 Mar 2020 08:00:08 EST Dewey Library - HC412.A85 2019 Full Article
ar Who governs: legislatures, bureaucracies, or markets? / John H. Wood By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Online Resource Full Article
ar The Oxford handbook of consumption / edited by Frederick F. Wherry and Ian Woodward By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC79.C6 O938 2019 Full Article
ar The age of sustainability: just transitions in a complex world / Mark Swilling By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC79.E5 S9144 2020 Full Article
ar The ethical algorithm: the science of socially aware algorithm design / Michael Kearns and Aaron Roth By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC79.I55 K43 2020 Full Article
ar Laid waste!: the culture of exploitation in early America / John Lauritz Larson By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC103.7.L36 2020 Full Article
ar Globalization, the IMF, and international banks in Argentina: the model economic crisis / Christian Hernandez By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC175.H47 2019 Full Article
ar Arguing with zombies: economics, politics, and the fight for a better future / Paul Krugman By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC106.84.K78 2020 Full Article
ar The dark side of nudges / by Maria Alejandra Caporale Madi By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HB74.P8 C365 2020 Full Article
ar Failure or reform?: market-based policy instruments for sustainable agriculture and resource management / Stewart Lockie By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC79.E5 L636 2019 Full Article
ar Nine crises: fifty years of covering the British economy from devaluation to Brexit / William Keegan By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC256.K44 2019 Full Article
ar Italy's economic revolution: integration and economy in Republican Italy / Saskia T. Roselaar By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HC39.R67 2019 Full Article
ar Demystifying economic markets and prices: understanding patterns and practices in everyday life / Gregory R. Woirol By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Dewey Library - HB221.W64 2019 Full Article
ar Reinventing liberalism: the politics, philosophy and economics of early neoliberalism (1920-1947) / Ola Innset By library.mit.edu Published On :: Sun, 8 Mar 2020 08:11:31 EDT Online Resource Full Article
ar Institutionalised dreams: the art of managing foreign aid / Elżbieta Drążkiewicz By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HC60.D686 2020 Full Article
ar Failure / Arjun Appadurai and Neta Alexander By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HC79.T4 A66 2020 Full Article
ar Price and value: a guide to equity market valuation metrics / George Calhoun By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Online Resource Full Article
ar Human/machine: the future of our partnership with machines / Daniel Newman, Olivier Blanchard By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HC79.I55 B567 2019 Full Article
ar China's Economic Arrival: Decoding a Disruptive Rise / edited by Damien Ma By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Online Resource Full Article
ar The fall of a great American city / Kevin Baker ; foreword by James Howard Kunstler By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HC107.N7 F35 2019 Full Article
ar Carlos Slim: the power, money, and morality of one of the world's richest men / Diego Enrique Osorno ; translated by Juana Adcock By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HC132.5.S55 O85313 2019 Full Article
ar Secrets and siblings: the vanished lives of China's one child policy / Mari Manninen ; translated by Mia Spangenberg By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HB3654.A3 M3613 2019 Full Article
ar Finance and sustainability: proceedings from the 2nd Finance and Sustainability Conference, Wroclaw 2018 / Karolina Daszyńska-Żygadło, Agnieszka Bem, Bożena Ryszawska, Erika Jáki, Tatána Hajdíková, editors By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Online Resource Full Article
ar Economists at war: how a handful of economists helped win and lose the World Wars / Alan Bollard By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Dewey Library - HB195.B65 2020 Full Article
ar Sustainable development and social responsibility.: proceedings of the 2nd American University in the Emirates International Research Conference, AUEIRC'18 - Dubai, UAE 2018 / Miroslav Mateev, Jennifer Nightingale, editors By library.mit.edu Published On :: Sun, 15 Mar 2020 08:09:28 EDT Online Resource Full Article
ar Natural resources and economic development / Edward B. Barbier (Colorado State University) By library.mit.edu Published On :: Sun, 22 Mar 2020 07:44:49 EDT Dewey Library - HC59.7.B3355 2019 Full Article
ar New perspectives on Pakistan's political economy: state, class and social change / edited by Matthew McCartney, S. Akbar Zaidi By library.mit.edu Published On :: Sun, 22 Mar 2020 07:44:49 EDT Dewey Library - HC440.5.N43 2019 Full Article
ar The third realm of luxury: connecting real places and imaginary spaces / edited by Joanne Roberts and John Armitage By library.mit.edu Published On :: Sun, 22 Mar 2020 07:44:49 EDT Dewey Library - HB841.T45 2020 Full Article
ar Accelerators of India's growth--industry, trade and employment: festschrift in honor of Bishwanath Goldar / Suresh Chand Aggarwal, Deb Kusum Das, Rashmi Banga, editors By library.mit.edu Published On :: Sun, 22 Mar 2020 07:44:49 EDT Online Resource Full Article
ar More from less: the surprising story of how we learned to prosper using fewer resources--and what happens next / Andrew McAfee By library.mit.edu Published On :: Sun, 22 Mar 2020 07:44:49 EDT Dewey Library - HC79.C6 M383 2019 Full Article
ar The politics of pain: postwar England and the rise of nationalism / Fintan O'Toole By library.mit.edu Published On :: Sun, 22 Mar 2020 07:44:49 EDT Dewey Library - HC240.25.G7 O76 2019 Full Article
ar Macroeconomic Analysis and Parametric Control of a Regional Economic Union Abdykappar A. Ashimov [and more] By library.mit.edu Published On :: Sun, 29 Mar 2020 07:44:51 EDT Online Resource Full Article
ar Radical markets: uprooting capitalism and democracy for a just society / Eric A. Posner and E. Glen Weyl By library.mit.edu Published On :: Sun, 29 Mar 2020 07:44:51 EDT Dewey Library - HB501.P6457 2018 Full Article
ar The enchantments of Mammon: how capitalism became the religion of modernity / Eugene McCarraher By library.mit.edu Published On :: Sun, 29 Mar 2020 07:44:51 EDT Dewey Library - HB501.M443 2019 Full Article
ar The creation of the extraordinary: perspectives on luxury / Hannes Gurzki By library.mit.edu Published On :: Sun, 29 Mar 2020 07:44:51 EDT Online Resource Full Article
ar The balanced development index for Europe's OECD Countries, 1999-2017 Andrzej K. Koźmiński, Adam Noga, Katarzyna Piotrowska, Krzysztof Zagórski By library.mit.edu Published On :: Sun, 5 Apr 2020 07:47:23 EDT Online Resource Full Article
ar How to divide when there isn't enough: from Aristotle, the Talmud, and Maimonides to the axiomatics of resource allocation / William Thomson, University of Rochester By library.mit.edu Published On :: Sun, 5 Apr 2020 07:47:23 EDT Dewey Library - HB801.T5285 2019 Full Article
ar Walking the highwire: rebalancing the European economy in crisis / Olli Rehn ; [with a foreword by Mark Carney] By library.mit.edu Published On :: Sun, 5 Apr 2020 07:47:23 EDT Online Resource Full Article
ar A human rights based approach to development in India / edited by Moshe Hirsch, Ashok Kotwal, and Bharat Ramaswami By library.mit.edu Published On :: Sun, 5 Apr 2020 07:47:23 EDT Dewey Library - HC435.3.H86 2019 Full Article
ar Romantic anti-capitalism and nature: the enchanted garden / Robert Sayre and Michael Löwy By library.mit.edu Published On :: Sun, 5 Apr 2020 07:47:23 EDT Dewey Library - HB501.S3196 2020 Full Article
ar Thanks for watching: an anthropological study of video sharing on YouTube / Patricia G. Lange By library.mit.edu Published On :: Sun, 5 Apr 2020 07:47:23 EDT Dewey Library - HC79.T4 L364 2019 Full Article
ar Armenia and Europe: foreign aid and environmental politics in the post-Soviet caucasus / by Pål Wilter Skedsmo By library.mit.edu Published On :: Sun, 5 Apr 2020 07:47:23 EDT Dewey Library - HC60.S54 2019 Full Article