My problem with this starts with their <noscript>
block:
it says “JavaScript must be enabled for the correct page display” and that’s a bad sign.
It indicates that the people who wrote this code have grasped the wrong end of the stick.
If your page does not display correctly without JavaScript, you have already failed.
You might need to adjust your definition of “correctly”—
for example, it’s difficult to define what it’s “correct” for Google Maps to do without JavaScript.
But it’s not difficult for this site: it’s a dang discussion forum.
Its purpose is to display text.
This is something that the Web was able to do before JavaScript was even a twinkle in Brendan Eich’s eye.
I end up saying this a lot in the JavaScript Rehab context: if you can’t display text without JavaScript, you are a bad person and you should feel bad; also your keyboard should be taken away.
I won’t get too exercised over the clumsy prose of the message (“for the correct page display”? Ugh.):
it just merits mentioning that if you’re going to run a forum, you should set a good example of prose and communication skills for your forum-dwellers.
What I will say, is that the fact that the message is nearly unstyled, just a sentence that looks like it wandered in by accident, speaks poorly of the site owner’s attention to detail.
A WHOIS query says that gardenweb.com
has been registered since 1995, so it’s not like they just didn’t have time to get around to it
(and judging by how often I see cgi-bin
in their URLs, I’m betting that there’s a strong continuity between the 1995 version of the site and the 2013 version).
What really gets me cranky, though, is that by and large the site does “the correct page display” without JavaScript enabled. What it doesn’t correctly display is advertising. In the screenshot above, a little poking at the page source reveals that the big blank space on the right is intended as space for advertising. So what the message at the top of the page is actually saying, is “we’re trying to BS you into enabling JavaScript because a page that gives you just the content that you actually want to see, is to us a broken page.” Fuck that.
GardenWeb, you are JavaScript addicts. Go to rehab.
This post is part of an ongoing series— please read the first JavaScript Rehab post to see why I get so cranky about JavaScript.
]]>Now, this is not to say that users should be able to control that visual weight. Part of why MySpace sucked is that people could present their stuff any old way, which led to a de facto shouting contest. Similarly, the “urgent” flag in email is useless because very few people have the same rubric about when to apply it and it’s trivial for a few antisocial idiots to make the signal impossible to rely on.
However, we also—everyone is subject to this—tend to read everything on Twitter in the same register, because it’s visually alike. Normally “oh, you can’t read tone on the Internet” is a canard. You can read tone just fine when someone who can actually write tone is trying to convey is, and conveying it is a learnable skill. Twitter, though, has a combination of constraints (length and visual weight) that makes it very easy for readers to read “I disagree with this portion of your argument and here’s a link about why” as “you are so wrong, you’re an awful person and also you smell funny.”
I try to use this to keep myself from getting into arguments on Twitter. It is a great medium for some things. Longform conversations — nope! I’m jazzed about my Branch invite, I hope that that or Medium builds something interesting on top of Twitter (assuming that Twitter consents to let someone build; lately they seem to be more interested in killing off all the good things about the service).
Postscript: the image in Monteiro’s post is a dead link, but I grabbed it from archive.org and here it is on imgur.
]]>JavaScript is actually pretty great: Brendan Eich’s problem child has many good parts and people are building genuinely astonishing things with it (recent favorite: Infinite Gangnam Style). You can do anything in JavaScript, just like Atwood foretold!
That’s the problem!
Despite the heroic efforts of browser-building folks, JavaScript is getting closer and closer to being equivalent to just downloading code and running it. That’s a bad thing. That gave us the 90s and the Bush years' legacy of viruses and botnets, of exploit after exploit. In addition to its many wonderful properties, JavaScript is also a gift to malware authors everywhere, a category that includes 90% of the analytics companies I’ve ever seen.
If running JS is not already equivalent to running arbitrary code on your machine, you would be prudent to treat it like it will soon become so and install NoScript or your browser’s equivalent.
Meantime, I see too many web developers who are drooling addicts to using JS for everything, who treat running JS on a user’s machine as their natural-born right. This is deeply not the case. It’s not hard to earn the privilege of running JS - you just have to make a value proposition! “Please enable JavaScript” is not a value proposition, it’s an admission of laziness (or an admission that some pointy-haired boss is in charge).
There are many things you can only do in JavaScript. Having JavaScript in your toolkit, as a web developer, is indispensable. But you also must know when you don’t need JavaScript, and to go without it when you don’t need it. If you can’t display text without JavaScript, if you can’t construct hyperlinks without JavaScript, if you can’t display images without JavaScript, you’re a bad person and you should feel bad.
On top of this, there’s the fact that a great deal of the JavaScript out there is designed for tracking, analyzing, and identifying users — you know, the sort of thing that makes Richard Stallman break out in hives. I am not against analytics — I am against users being simply mugged for that information. If the information has value, you don’t get it for free, analytics companies.
“JavaScript Rehab” is going to be a series of notes, added to when I happen upon sites like this, that names people who are addicted to JavaScript and encourages them to break the habit. I will also insult them, because over-using JavaScript is easy to avoid and the messages that tell you to enable it are usually condescending and dishonest.
]]>Here’s an example: a major public transit agency near me, Caltrain, is about to cut service. Caltrain’s funding, in large part, comes from sources beyond its control. A little less than half comes from ticket sales - and the rest from local municipal governments. The local governments collect no taxes dedicated to and aren’t bound to pay for Caltrain: in years like this one, where tax revenues are shrinking, they can simply decrease their funding. That’s what’s happening now. That’s a transaction between them and Caltrain. I’m just a Caltrain rider, I’m not a party to the transaction - but it’s going to affect me anyhow. The service cuts that Caltrain has to make have major negative effects on riders who aren’t part of the transaction between Caltrain and local governments: they are the subjects of a negative externality. Similarly, if the service cuts go through, traffic on highways between San Francisco and San Jose will get significantly worse. Train service created a positive externality that benefited drivers - anyone who was taking the train was not driving, and congestion decreased. There’s also a positive externality that has to do with air quality: the train is a more efficient way of transporting large numbers of people than requiring each of them to drive their own car.
The reason that externalities are relevant to the tech field is this: most startups entirely rely on them. Free Software, whatever its intentions, creates enormous positive externalities. It’s almost impossible to name a tech company that doesn’t depend on some piece of free software. Further, most tech companies in turn create significant externalities because of their advertising-driven revenue models. I dislike advertising-driven revenue models - but like everything else, they’re a trade-off. An advertising-driven revenue model - for example, Facebook’s - means that all benefits to users are externalities on one level. Of course you are still in a transaction with Facebook - but most of that transaction is invisible to the average user. We users give Facebook data - the data that makes their vaunted social graph valuable and lets them produce creepy marketing videos. That tiny transaction, times hundreds of millions of users, gets refined into a product that Facebook can actually make money from. Any other startup with the same revenue model is doing the same thing: they’re purposefully creating positive externalities, because without those, they can’t do the transactions (with advertisers) that they actually make money from.
This is a highly interesting business model, and has created many interesting things. I personally think that in evolutionary terms it’s a loser: advertising as practiced in the modern world is a hostile, toxic, invasive species, and letting it into your ecosystem is a bad idea. But what I want to talk about now is a company that doesn’t share that revenue model, and about how it handles externalities. It’s time to talk, yet again, about Apple.
Part of the reason that Apple’s prices are what they are is that you are paying for things that you normally get for free as an externality. When you buy Apple products, you are forgoing a price that’s artificially low. I like to think of it this way: you are paying something closer to the ‘true’ price of the product. The price in dollars to the users of Google products like web search, Gmail, and Google Reader, is low or nil because Google relies on selling user data to others for its revenue. You get nice things for ‘free’ because the actual price you’re paying is invisible. Apple products, on the other hand, usually don’t do that - you will pay dollars, and you will get your product or service from them, and that’s that. I think of it as paying for peace of mind. Free services usually involve a third party, an advertiser, who has an enormous, overwhelming, powerful incentive to attack my peace of mind. That is what the modern business of advertising is: it is attacking people’s mental health.
Apple is in the tech news again because of externalities: they have allowed iOS apps to use a subscription-based revenue model, and the changes that they’re making are pissing off all kinds of people. As another economics-oriented blog post put it, “if you own the infrastructure, you get to charge rent.” What interests me, though, is that Apple has chosen to create a positive externality for user experience here - and they have deliberately done it, risked money to do it, risked business partnerships to do it. That’s interesting - and, I think, good. When the people who use your product are the people you make money from, you wind up focusing on keeping them happy. If you make money otherwise, you risk turning into Adobe (Microsoft also has bouts of this): making mediocre products at exorbitant prices and squealing when someone exposes the flaws of your product line.
Whimsically, I think that Apple also creates a huge externality for the tech journalism corps. They are the largest company that actually takes risks, and so they help ensure that there’s always something interesting to write about.
]]>I think that Mr. Spolsky oversimplifies in one aspect of his talk. So I’m going to jump off from there: he says that thinking that you must choose between simplicity and power on a one-dimensional axis is a trap and that you have to construct something else to usefully think about what features software should have. So he talks about elegance and about good features and bad features. I’m going to say it a slightly different way. I just say that you do have to choose between simplicity and power - but it is possible to make good choices and bad choices. Not every choice gives up 1 Simplon of simplicity for 1 Pill of power. There are a lot of choices you can make that trade 2 Simplons for 4 Pills, or sometimes 1 Pill for 87 Simplons. You’d much rather make those than 1:1 trades, and you should spend a lot of time avoiding trades where you give up 1 Simplon and gain 0.005 Pills.
Too often, we act like the curve on the right is what we’re stuck with - the best we can do is those 1:1 trades. It should be obvious, though, that we can do better. The problem is that to do better, generally we need to make those hard decisions. Achieving trade-offs that are better than 1:1 is hard, and it’s easy to construct (purposefully or not) incentive structures that absolutely destroy the chances of making good trade-offs. My favorite example of this is in airline security - we’re trading security and convenience instead of simplicity and power, but the two problems map onto one another extremely well. The Transportation Security Administration is living proof that 1:1 tradeoffs aren’t the only kind - they demonstrate, every day, that you can make far worse trade-offs. They’re the pathologically bad case, where you make so many trade-offs that are so bad that you with up far less security and far less convenience.
But why is that? It’s not because the TSA is filled with evil moustache-twirling types who want travellers to be inconvenienced. I believe that the TSA is full of perfectly average humans who act according to their incentives, overseen and directed by perfectly average humans (who happen to be politicians) acting according to their incentives. Those incentives produce the pathology, because they’re not “produce better security” incentives, they’re “avoid punishment” incentives. There are few rewards for actually improving security, and tremendous punishments for letting people think security has been degraded — and because we laypeople assess security pretty badly, a perverse cycle of incentives produces pretty bad security.
This maps directly onto producing software and wrangling production servers: even though it is harder, we need to seek out those better trade-offs, and that means both difficult work and setting up good incentive systems. That also means that the managerial professions need to be very careful about the incentive structures that they set up - the intent of an incentive structure is almost never the only outcome that that structure can produce. When you’re creating systems, if you refuse to take responsibility for better trade-offs, bad ones will creep in. One of my favorite examples in software is stealing focus - when the window that you thought you were working in gets shoved behind something else that decides that it needs your attention. Stealing focus is, I’m convinced, the sort of sin that means you should never be allowed to touch a compiler again, and furthermore you should probably lose your right pinky, the one that you tap Enter with. Every time I’ve seen a window stealing focus, it’s been at the intersection of the worst programmer habits - hubris in thinking that your program, right now, needs to be the most important thing in my computing world, and bad laziness in that the program is always asking me to make some decision that I don’t actually need to make right now. Of course, the existence of this capability also means that it can be used for malicious purposes in a nasty trifecta of bad UX. Far better to use alternate notification methods (the Notification Area nee system tray in Windows, and bouncing Dock icons or Growl messages in OS X) to convey such information.
Like the security/convenience example, this doesn’t happen because we programmers are finger-steepling connivers of inconvenience. Rather, it happens because too often our incentive structure is disconnected from what actually happens to users of our software. This is part of why startups are a good thing to have in the world: by necessity, a startup deals much more closely with its customers, and developers routinely talk to people who actually use the software.
So the challenge to us is to recognize good trade-offs, and work to make those trade-offs instead of 1:1 or sub-par tradeoffs. This involves making difficult decisions for your users - and it involves respecting that they’re busy making their own difficult decisions, and getting out of their way.
]]>