Coding Horror

programming and human factors

Always. Be. Shipping.

I believe there's a healthy balance all programmers need to establish, somewhere between …

  • Locking yourself away in a private office and having an intimate dialog with a compiler about your program.
  • Getting out in public and having an open dialog with other human beings about your program.

I've talked about this a few times already, so I won't belabor the point.

Most programmers are introverts, so they don't usually need any encouragement to run off and spend time alone with their computer. They do it naturally. Left to their own devices, that's all they'd ever do. I don't blame them; computers are a lot more rational than people. That's what attracts most of us to the field. But it is possible to go too far in the other direction, too. It's much rarer, because it bucks the natural introversion of most software developers, but it does happen. Take me, for example. Sometimes I worry that I spend more time talking about programming than actually programming.

At the point when I spend all my time talking about programming, and very little of my time programming, my worst fear has been realized: I've become a pundit. The last thing the world needs is more pundits. Pundits only add ephemeral commentary to the world instead of anything concrete and real. They don't build any lasting artifacts; instead, they passively observe other people's work and offer a neverending babbling brook of opinions, criticism, and witty turns of phrase.

Perhaps that's why I find this blog entry from SEO Black Hat so inspiring:

Do it F***ing Now.

Don't wait. Don't procrastinate. The winners in this world are not the ones who find the greatest excuses to put off doing what they know will make them more money. The winners are the ones that prioritize and seize the day.

Create a list of action items to make sure your important tasks get accomplished. Every project you're working on should be in action. If you're not moving, you're standing still. Your next step towards making money must not be "something I'll take care of maybe sometime next week." If it's going to help make you money: Do it F***ing Now.

Some of you may think that you don't need the "f***ing" in "do it f***ing now". You do. You need that impact, that force, that call to action, that kick in the ass to get you moving. Otherwise, you'll end up another loser that had a great idea a long time ago but never did anything about it. Dreamers don't make money. Doers make money. And doers "Do it F***ing Now."

It's like a stiff jolt of heavily caffeinated coffee. It may be a bit too Glengarry Glen Ross for some.

Specifically this speech, and this scene.

Even if it's intentionally over the top, I think this advice applies to programming, too. The best programmers get off their butts. As Cade Roux noted in a comment, the text on the Glengarry Glen Ross blackboard is "Always Be Closing", but we should read it as …

Always

Be

Shipping

It's helpful to discuss features, but sometimes the value of a feature is inversely proportional to how much it has been discussed. Our job as software developers is to deliver features and solve business problems, not to generate neverending discussion. Ultimately, As Marc Andreessen notes, we will be judged by what we – and our code – have done, not the meta-discussion that went on around it.

For the background part, I like to see what someone has done. Not been involved in, or been part of, or watched happen, or was hanging around when it happened.

I look for something you've done, either in a job or (often better yet) outside of a job. The business you started and ran in high school. The nonprofit you started and ran in college. If you're a programmer: the open source project to which you've made major contributions. Something.

If you can't find anything – if a candidate has just followed the rules their whole lives, showed up for the right classes and the right tests and the right career opportunities without achieving something distinct and notable, relative to their starting point – then they probably aren't driven. And you're not going to change them.

Maybe "Do it f***ing now" is too extreme, but at the very least, make sure you spend at least as much of your time doing as discussing. Unfortunately, I can't tell you what the right things are to do. If I knew that, I'd probably be a millionaire by now. You'll have to decide what's actually worth doing yourself.

Discussion

The Software Imprinting Dilemma

Ducklings and goslings imprint on the first creature they see shortly after birth.

[Austrian naturalist Konrad Lorenz] discovered that if greylag geese were reared by him from hatching, they would treat him like a parental bird. The goslings followed Lorenz about, and when they were adults they courted him in preference to other greylag geese. He first called the phenomenon "stamping in" in German, which was translated to English as imprinting. Lorenz thought that the sensory object met by the newborn bird was somehow stamped immediately and irreversibly onto its nervous system. In other experiments, he demonstrated that ducklings could be imprinted not only to human beings, but also to inanimate objects such as a white ball. He also discovered that there is a very restricted window of time after hatching that proves effective for imprinting.

Imprinting is a powerful biological imperative in certain species, particularly geese and ducks.

ducklings and duck

But humans also succumb to imprinting, in our own way; in computing this is known as Baby Duck Syndrome:

Baby Duck Syndrome is the tendency for computer users to "imprint" on the first system they learn, then judge other systems by their similarity to that first system. The result is that users generally prefer systems similar to those they learned on and dislike unfamiliar systems.

I'm as guilty of software imprinting as anyone. I was provided an evaluation copy of Visual SlickEdit, but I couldn't bring myself to try it out because I have already "imprinted" on the Visual Studio editor. I'm still learning ways to be more effective in my preferred editor; is it really worth my time to divide my effort and attempt to learn a new, unfamiliar editor that I may not even ultimately use? That's the software imprinting dilemma:

Baby duck syndrome affects the way you learn to use computers and software. It can make it hard for you to make the most rational decisions about which software to use or when the learning curve of a given thing is worth the climb. In general, it makes the familiar seem more efficient and the unfamiliar less so. In the short run, this is probably true -- if you're late for a deadline, the best thing to do is not to switch to a new operating system in the hopes that your productivity will increase. In the long run, it's worth trying a few things knowing that they won't all work out, but hoping to find the tools that match your style best.

It's impossible to understand the alternatives when you can't muster the energy to get past your own software imprinting. You can't rationally compare alternatives with no experience in the alternatives, and software imprinting robs you of that vital experience.

There are periodic Usenet group debates about programming editors where various people will proclaim with conviction that their preferred editor is the best. In some of these debates I've asked some of the believers of various editor faiths if they'd ever tried various other alternatives. Well, no. They had never used CodeWright or Visual Slick Edit or Multi-Edit or assorted other editors. Some claimed to have used another editor about 5 or 10 years ago, but not the latest version.

When I started asking around, I discovered that it's hard to find people who have used recent versions of two major editors, so it's hard to find anyone who can intelligently compare the features of various editors. I use Visual Slick Edit personally. There are things I want it to do that it doesn't do. But I don't know whether any other editor can do all the things I like about Slick plus the things I wish it did.

Maybe it's time to experiment with new operating systems, new applications, and new editors, even if we're happy with our status quo. We should put allegiances and familiarity aside, and push ourselves harder to go beyond our software imprinting-- otherwise, we literally won't know what we're missing.

Discussion

The Coming Software Patent Apocalypse

Every practicing programmer should read the Wikipedia article on software patents, if you haven't already.

Many software companies are of the opinion that copyrights and trade secrets provide adequate protection against unauthorized copying of their innovations. Companies such as Oracle Corporation and Red Hat are therefore generally opposed to the patenting of software.

Nonetheless, these companies do file and receive patents. Since their competitors get patents, they must get patents as well for defensive purposes. In the event that they get sued for patent infringement by a competitor they can counter-sue using their own patent portfolio. The net result is that both companies often cross license each others' patents at little or no out-of-pocket expense for either party. However, the cost of developing a suitable portfolio of patents may be out of reach of many small software companies.

If this sounds like a classic Mutually Assured Destruction arms race, that's because it is.

Atomic explosion

There was a hullabaloo recently about Microsoft rattling their software patent sabers. Sadly, there's nothing notable about it; this is simply business as usual for everyone in the software industry. Software companies are forced to build huge stockpiles of software patents solely to be used as deterrents.

Many notable computer scientists, including Donald Knuth, believe that software is fundamentally unpatentable:

Congress wisely decided long ago that mathematical things cannot be patented. Surely nobody could apply mathematics if it were necessary to pay a license fee whenever the theorem of Pythagoras is employed. The basic algorithmic ideas that people are now rushing to patent are so fundamental, the result threatens to be like what would happen if we allowed authors to have patents on individual words and concepts. Novelists or journalists would be unable to write stories unless their publishers had permission from the owners of the words. Algorithms are exactly as basic to software as words are to writers, because they are the fundamental building blocks needed to make interesting products. What would happen if individual lawyers could patent their methods of defense, or if Supreme Court justices could patent their precedents?

I tend to agree with Knuth that software isn't an industry that should be patentable. The fashion industry, for example, has no concept of patent protection, and thrives regardless:

The fashion world understands that creativity is a collaborative and community affair. It's far too big, robust, and evolving for any one player to "own" as a legal entitlement. Long lineages of couturiers from Balenciaga to Ungaro, Chanel to Lagerfield, and Gucci to Tom Ford have shown that designers necessarily must learn, adopt, and adapt from those who have blazed previous trails. If one were to deconstruct their work, an evolutionary chain of distinct themes, references, design nuances, and outright appropriations could be discerned.

Occasionally someone may protest a "rip-off" and get murmurs of sympathy. And the counterfeiting of brand-name products is rightly condemned as theft. However, in general, creative derivation is an accepted premise of fashion. Indeed, the industry's growth and prosperity have been built upon the famous maxim of Isaac Newton, "If I have seen further, it is by standing on the shoulders of giants."

Is it possible that the fashion industry, long patronized as a realm of the ephemeral and insubstantial, is the real bellwether for future ideas of "ownership" of creative content?

You can't patent recipes, and yet both professional chefs and restaurants are still in business and prospering:

Food relies so much on execution, or at the national chain level on marketing, that the mere circulation of a recipe does not much diminish the competitive advantage of the creative chef. Try buying a fancy cookbook by a celebrity chef and see how well the food turns out. Most chefs view their cookbooks as augmenting the value of the "restaurant experience" they provide, not diminishing it. Furthermore, industry norms, and the work of food critics, give innovating chefs the proper reputational credit. It is not worth the litigation and vagueness of standards that recipe patents would involve.

Of course, the software patent debate is neverending. But patents are especially dangerous and deserving of intense debate, because they're so powerful:

Patents give their owners the right to prevent others from using a claimed invention, even if it was independently developed and there was no copying involved.

Think about that for a minute. Seriously think about it. Every time you write code – even a brand new algorithm in a clean room environment – you could be infringing a patent, somehow, somewhere. That's why it's so often described as a software patent minefield:

Today's computer industry standards increasingly include technology that may be covered by a software patent. The owner of that patent has the right to demand a royalty from all parties that implement the patented principle, or may discriminate regarding who will and will not be allowed to license the patent. It is often the case that there is no way to implement a standard without making use of a particular patented principle. This effectively gives the patent holder absolute control regarding who will implement a standard containing his patented principle.

Such patents arise in two ways: they are knowingly embedded in the standard as it is being created, or they are submarine patents, unknowingly part of the standard until they "surface" after the standard is already in wide use. A pernicious patent holder can engage in patent farming: influencing a standards organization to use a particular principle covered by a patent. In the worst and most deceptive form of patent farming, the patent holder encourages the standards organization to make use of a principle without revealing the existence of a patent covering that principle. Then, later on, the patent holder demands royalties from all implementers of the standard.

It's probably not fair to say that software patents are 100% evil. But from what I've read, I'd say they're 99 and 44/100ths percent evil. I'm not sure what any of us can do about this, but it's clear that the current situation is untenable:

graph of software patents, 1971 - 2005

Something has to be done, or else we truly are staring down a coming software patent apocalypse.

Discussion

Google's Number One UI Mistake

Google's user interface minimalism is admirable. But there's one part of their homepage UI, downloaded millions of times per day, that leaves me scratching my head:

Google: I'm not feeling so lucky.

Does anyone actually use the "I'm Feeling Lucky" button? I've been an avid Google user since 2000; I use it somewhere between dozens and hundreds of times per day. But I can count on one hand the number of times I've clicked on the "I'm Feeling Lucky" button.

I understand this was a clever little joke in the early days of Google-- hey, look at us, we're a search engine that actually works! -- but is it really necessary to carry this clever little joke forward ten years and display it on the monitors of millions of web users every day? We get it already. Google is awesomely effective. That's why I use it so much. That's why Google is the start page for the internet, loading the Google homepage is virtually synonymous with internet access, and the verb "to Google" is at risk of becoming a genericized trademark. Google has won so decisively, so utterly, and so completely that the power they now wield over the internet actually scares me a little. Okay, it scares me a lot.

So can we get rid of the superfluous button now?

You might say it's only one more button, so where's the harm. I say giving a feature that's used less than one percent of the time parity with the "Search" button is a needless distraction for users. Furthermore, the "I'm Feeling Lucky" button is only available on the homepage-- it's not a part of any browser toolbar searches, and Google's intermediate search page results don't offer it, either. Why not standardize and stick with the simple, single "Search" button that everyone understands and expects, on every page? Why muddy the waters with a button that's so rarely useful, and on the homepage of all places? The thought necessary to mentally omit this needless button from the page may be miniscule-- but multiply that by the millions upon millions of users who are affected, and all of a sudden it starts to add up to real time. Don't make us think!

If you're an advanced computer user, you may be wondering why we bother with Search buttons at all when we have a perfectly good ENTER key on our keyboards. As shocking as this may be to us homo logicus, not everyone understands how that works. Sure, we think it's crazy to take our hand off the keyboard, where we were just typing our search query, move it all the way over to the mouse, then carefully move the mouse pointer to a button and left-click it... when we could just take that very same hand, already poised over the keyboard, and lazily tap the ENTER key.

But typical users don't really understand basic keyboard shortcuts. They love their mice, and their big, fat, honking "Search" buttons. That's why the current versions of Firefox and IE both have an integrated "go" button directly next to the address bar-- so users have something obvious to click once they've typed the URL into the address bar. Otherwise, I guess, they'd sit there wondering if their computer had frozen.

Internet Explorer 7 address bar

Personally, I always use the keyboard ENTER key to complete my searches, but I'd be open to a keyboard shortcut such as SHIFT+ENTER that invoked the Lucky function. I still can't imagine using it more than once a week at most-- and that's probably an optimistic estimate.

Strunk and White urged us to Omit Needless Words:

Vigorous writing is concise. A sentence should contain no unnecessary words, a paragraph no unnecessary sentences, for the same reason that a drawing should have no unnecessary lines and a machine no unnecessary parts. This requires not that the writer make all his sentences short, or that he avoid all detail and treat his subjects only in outline, but that every word tell.

I urge us to Omit Needless Buttons. I hope the "I'm Feeling Lucky" button isn't considered a sacred cow at Google. Removing it would be one small step for Google, but a giant collective improvement in the default search user interface for users around the world.

Discussion

Whatever Happened to Civility on The Internet?

In response to Wil Shipley's recent post about the lack of an iPhone SDK, a reader left this comment:

I often enjoy reading these entries, but you always come across as a little bit of an a**hole. Full of yourself, overly critical and a bit mean. Dismissing and dissing, out of pure ignorance and spite, the work of the people who made Javascript – people who have done more for the world, and written a better language, than you have or likely ever will – is truly a huge a**hole move.

Although I'm a staunch proponent of comments for most blogs, it's comments like this – what Anand Iyer calls nerd rage – that cause me to question my stance. I don't think it's necessarily wise to dignify these kind of comments with a response, but a few comments later, Wil Shipley responded with exactly what I was thinking:

Miss Manners once said the rudest thing to do is point out someone else's rudeness in public. By extension, what do you suppose the biggest a**hole move is?

Bonus points for invoking Miss Manners; her Guide to Excruciatingly Correct Behavior has been a staple of my bookshelf for years. Think what you will about stodgy old Judith Martin, but she has a razor wit and an enduring, keen eye for human behavior. I learned a lot about life by reading her guide in my early twenties; it's a rich comedy of errors in book form that I earnestly recommend to everyone.

Miss Manners' Guide to Excruciatingly Correct Behavior

I understand the G.I.F.T. is an unfortunate side-effect of anonymity and the faceless interaction mode of the internet. But I think we can do better. As Miss Manners said:

You can deny all you want that there is etiquette, and a lot of people do in everyday life. But if you behave in a way that offends the people you're trying to deal with, they will stop dealing with you. There are plenty of people who say, 'We don't care about etiquette, but we can't stand the way so-and-so behaves, and we don't want him around!' Etiquette doesn't have the great sanctions that the law has. But the main sanction we do have is in not dealing with these people and isolating them because their behavior is unbearable.

I don't object to criticism. Criticism is what comments are for. What I object to is criticism that resorts to least-common-denominator attacks. The use of angry invective negates any criticism you were trying to make. Insulting someone might make you feel temporarily vindicated, or give you a brief, cathartic moment of release, but you aren't convincing anyone of anything. People will read your angry words and see them – and you – for what you are. It's a completely self-defeating exercise. The minute you call someone an a**hole, they're no longer listening to you.

For an example of effective criticism of the strongest kind, I can think of no better piece than Martin Luther King's Letter From Birmingham Jail. I re-read it every year, and each time I'm floored by the passion behind this incredible persuasive essay – and the deep anger and frustration it presents in such rational terms.

While confined here in the Birmingham city jail, I came across your recent statement calling my present activities "unwise and untimely." Seldom do I pause to answer criticism of my work and ideas. If I sought to answer all the criticisms that cross my desk, my secretaries would have little time for anything other than such correspondence in the course of the day, and I would have no time for constructive work. But since I feel that you are men of genuine good will and that your criticisms are sincerely set forth, I want to try to answer your statements in what I hope will be patient and reasonable terms.

This legendary essay demonstrates the fine art of disagreement: the ability to respect the people you disagree with, and to earn their respect in turn. The only way to do that is to be civil, reasonable, and rational.

Discussion