Are You a Computer Programmer?

Ars Technica published excerpts today from Stack Exchange on the subject of what it takes to be a good programmer:

An old adage that many programmers stick to is “It takes a certain type of mind to learn programming, and not everyone can do it.”
Now I’m sure that we all have our own trove of anecdotal evidence, but has this been studied scientifically?

Specific studies are cited, and a whole lot of opinions are slung around, but I’m not sure that they really get any closer to resolving the issue than they do in any other study and discussion on the source and influence of aptitude in intellectual pursuits.

I can’t even speculate on the specific causes of the differences in programming aptitude between individuals, or what can be done about them, but they are definitely there. In thirty years of coding I’ve consistently seen a division between people who glance at code, even in languages they don’t know, and understand them, and people who may make a living coding but still don’t grasp many of the fundamental nuances. I tell people that if they don’t enjoy reading new code to see how something works, or grappling with a new syntax or pattern, they probably ought to look somewhere else for their strengths, because a lifetime of good coding is just more of the same.

For me, coding is like writing. Thinking about how to put ideas together, what the context is, what the possible side effects of specific phrasing might be–these are all the same for me in prose as in programming. Sometimes I’m writing poetry: elegant code which functions on multiple levels to provide greater flexibility in a compact algorithm. Other times I’m writing a memo: quick and dirty, but robust and precise so that there is no chance of misinterpretation. And we all know the novel: lengthy projects with huge process flows, hooks in modules that will be called further on in the story, all of it built of individual scenes which together drive the program to the ultimate business logic or data output. I can take this metaphor absurdly far, but it suffices to say that both endeavors occupy the same space in my head, and feel like the same process.

There is an expressive power in code which has called to me since I first managed to dump the binary assembly code on an Apple ][ and teach myself how it worked from contextual clues. This enormous sense of potential sits on my shoulder and sings to me as I work on every problem, from the mundane to the unusual. To not code is to be silent and refuse to speak, and to not read and interact with others’ code is to close my ears and never hear. I can easily live without it, but it feels like a fundamental part of me which enriches my life, like speaking Spanish or writing in any language. I’ve sometimes wondered what would have filled this place if I had been born earlier in history, but clearly writing in human languages would have been my calling, and if that were not possible, speaking, story telling, or some other language oriented activity.

Throughout my career I’ve known many others who felt this fundamental connection with code, though sometimes they expressed or experienced it differently. These are the people who consistently found the flaws in the code before they became a problem.  They are the ones who proposed solutions that no one realized were possible.  They are the ones who refused to take shortcuts that would be an issue in the future.  They grasp what the more experienced programmers are explaining before they are done with the explanation, and influence their peers and more junior programmers to reach further, work more efficiently, and accomplish great things.

I have also known many who programmed computers but didn’t have any idea what I was talking about when I spoke of the excitement of finding new design patterns or digging deeply into a new code library, API, or language.  These were the ones who put in their time, learned what they needed to, accomplished what was set out for them.  These people I respect for their endurance and dependability, for I couldn’t do what they do.  Without the addiction to the craft which pulls me into the wee hours of the night and leaves me helpless in my overwhelming need to bridge that gap, connect my data to people and machine, and create the thing which fills my imagination, I don’t think I could do it every day.  It would be tedious, mind-numbing drudgery–constantly struggling to keep up with an ever changing technical landscape pitted with the shortcomings of human architects, while solving the same sorts of problems ad nauseum.

I do have to laugh about those in the Ars Technica comments who claim that Python is indisputably the best language to teach programming with.  After hearing the same thing said about various flavors of Basic, Lisp et al,  and Pascal in my early years of programming, I’m not surprised that they’ve dredged up another low performance, non scalable language that bears only a passing resemblance to the languages most used in the industry.  My point isn’t to start a flame war on the virtues of Python, because I’ll likely concede any argument you make in its favor beyond the above.  But I want to highlight this great wheel that we’re on, if you’ll indulge me for a moment.

Like the Aristotelian story, we return to the same general problems over and over again, always with new tools and new approaches which really aren’t new at all, except in the way that they address transitory aspects of our industry, such as interpreted vs. compiled, static vs. dynamic, and native vs. virtual machine.  Whether it’s a printout, a text console, a graphical desktop, or a hand gesture driven interface, the people are the same, and their problems are the same.  Office email replaced memos, spreadsheets and word processors made everyone a potential secretary or actuary, and the internet continues to replace whole sections of classic social interaction from conferences to knitting circles which were too slow and cumbersome for our fast paced crowded lives.

We are ever compelled to reinvent the wheel with our latest power tools.  None of us want to go without our pneumatic, water-shedding, all weather traction tires, but the wheel has been hauling big boxes full of people and things for thousands of years.  Our current wheels tell us more about our culture and our need for constant long distance travel, our ability to build expensively maintained freeways, our expectations of comfort, and our vast global pipeline of rubber and metal and manufacturing, than about new methods of conveyance.  We dream of hoverboards, jet packs, transporter beams, vast moving conveyances and more, but still we move big boxes around on wheels as we have always done.

And that’s okay.  The power is in the context, without which our stories and truths are meaningless.  The ability to find that context in the rapidly evolving world of code and to feel my own contribution to it, defines me as a programmer.  This constant flow of code at multiple layers, from the device drivers to the user interfaces, across API calls and remote invocations, through languages, compiler conventions, and data protocols, is a vast internet in itself.  To launch my programming contribution on a modern platform is to join the communications of millions of people, shaping a world of thought and experience as I interact with all who have come before and all who will build on my own efforts.

As for the technical demands of the craft on a programmer, I’m sure it can be taught to anyone with enough patience, intelligence, and desire.  I don’t know if passion can be taught, however.  It can be shared, and thus kindled in another.  But I’m not sure that that passion is the same thing as deep interest.  I don’t know where the compulsion and deep connection that comes to the best programmers comes from.  And so I have come full circle.  I’ve never heard a good explanation for the source of aptitude in any intellectual field, let alone a universal unit of measure.

I don’t know whether good, effective programmers are born or made, but they do exist, and I have known them.  If it calls to you, despite horrible Computer Science professors, bad programming environments, and soul crushing entry level computer jobs, you can be a programmer.  A good programmer can only be kept down by themselves (or by the lack of a computer).  If, however, it doesn’t seem worth it, and you don’t find yourself looking forward to reading more code, learning yet another flawed language or API, or spending another weekend typing symbols on a computer screen with only a slim hope of getting everything to work in the time you have available, please consider your options.  It only gets worse as you go along.  There are so many wonderful, useful things you can do with your life, and I’m sure you will bring a great deal of joy to a different group of people when you find your own ways of contributing to this world, in other aspects of computing or elsewhere.

email  Facebook  Twitter  Digg  Delicious

SOPA threatens DNS and HTTP, not Free Speech

SOPA, and the recent domain name seizures, makes me concerned for the domain system. Really DNS is nothing more than an open agreement, and if it stops resolving what people are looking for, alternate schemes will rise. It’s surprising DNS has lasted so long, given that there’s no real authority behind the DNS roots, no compelling technical superiority, and no barrier to a new system beyond the strength of numbers that a system like Facebook or eBay holds.

Granted, such systems are hard to take down from the perspective of the guy trying to build a replacement, but the harder you hold onto a monopoly by agreement, the easier it slips away like OpenOffice or xfree86. I’d add Vietnam and others to the list, but I’m pretty sure there’s internet rules about forfeiting your point if you invoke such references.

A darker shadow is the SOPA mandated refusal to route ip requests to certain servers. There is a tremendous amount of thought and money that has been put into routing around such obstructions. The very same services that have been used to circumvent the great firewall of China would be quickly deployed against US filtering of the same kind. Open HTTP is another open agreement. You throw a request out there and trust that everything between you and the server you’re trying to talk to will see that the content gets back to you. But it’s not the only way to get content across the network. For example, if every DSL and Cable router became a TOR node things would get very messy indeed. There are vulnerabilities in onion routing and similar schemes, but there are work arounds for them as well. Getting messages you want delivered without undesirables hitching a ride is an unsolved problem.

However, the physical fabric of the internet is a very real vulnerability. Don’t kid yourself that a government (or an industry) can’t shut down or control the internet. Money makes the internet run, not idealism or some inherent technological democracy. When it becomes more financially attractive to do so, the companies that control your pipes can and will police, filter, or shut them down. At this point in time there is so much undeployed management hardware and software in place that industry will have a huge first mover advantage in any war of escalation that might result from outright rebellion against the regime.

For now, we are better served by working inside the system than outside it. And that means defeating SOPA the old fashioned way—letters to your representatives, election decisions, action committees, etc. Before the technological advantage against arbitrary DNS and HTTP restrictions is pressed, and the dirty, casualty-ridden circumvention escalation begins. This will be a lot messier than deCSS and DRM circumvention.

email  Facebook  Twitter  Digg  Delicious

Organizing the Pieces

writingscrapI find myself writing bits of stories, poems, or even song lyrics in odd places. Sometimes an idea shows up and demands that it be written down while I’m eating, or in a meeting, or waiting for the bus, or on a telephone conference. Consequently, scraps show up on my desk as precious bits of napkin, envelopes, or powerpoint cue pages. They are found amid meeting notes on my computer, saved as email messages to myself, and scattered across a dozen types of word processor files on every computer I’ve ever used.

From time to time I attempt to track them all down. When, in the course of getting things done, I fill up a steno notepad, I flip through it page by page, typing up anything that seems like it might be potentially useful. Deconstructing the heap on my desk always results in a motley pile of mismatched paper products, from which I seem to be less successful in gleaning–perhaps because I mistakenly assign them more permanence than the notebooks that I’m about to entomb in neat paper boxes, somewhere in the garage.

Mining the creative pieces out of old computer system backups, however, seems to be the least dependable of my content collation routines.  Everything I’ve written in the last ten years is saved…somewhere.  I think.  If I could just find a SCSI-1 interface with a Centronix port to hook up my old SPARC drive.

Even when I know where information is stored it doesn’t necessarily do me much good.  I just purchased a 2TB drive for the purpose of short-term backup in my house.  That’s 2,000,000,000,000 characters of storage.  At this point the total data storage in my house is approaching the storage requirements of the Library of Congress (itself a unit of storage capacity).  I spend far too much time down in the stacks of my own personal research library.

So, for anyone who writes on a regular basis, how do you keep track of it all?

email  Facebook  Twitter  Digg  Delicious

User Friendly

When a computer system, hardware or software, is easy to use and doesn’t cause us too much trouble, we say that it is user friendly.  The very existence of this term troubles me greatly.

Somehow we’ve decided that technology is hard, computers are difficult, and powerful software is tricky to use.  This has progressed to the point that we need to point out the exceptions and call them user friendly.  Anything less is the expected norm; there is no single term for it.  I’ve heard colleagues refer to things as user unfriendly, annoying, temperamental, hinky, touchy, picky, particular, and unreliable.  Is it just me, or do these all sound like things we would call a problematic coworker, rather than an inanimate object?

I would go further, and call these systems User Hostile.  Software that makes you click repeatedly and unnecessarily is actively wasting your time and effort.  It is hostile.  Systems that don’t report issues or errors until the user has gotten much further down the path of configuring or using them waste the user’s time and energy, but also confuse them and leave them exasperated.  Error messages that don’t explain the error, configuration settings that don’t tell you what your options are, VCRs with poorly labeled buttons–these thing stop the user dead in their tracks, putting up a roadblock to all further progress.  They are hostile.

The irony in all of this is that technology is expressly developed to make our lives better.  Much of it is manufactured and designed for the purpose of saving us time and energy, simplifying lengthy tasks and making them easier or more accessible.

I have some theories about where this problem comes from.  I believe most of the root causes come back to money.  Perhaps I will take them up in later posts.  For now, here’s a brief list:

  • Making a stronger user interface is harder than it seems, and the design, testing, and implementation costs seem unreasonable.
  • Time to market is very important, and the extra time implementing better interfaces can make your product obsolete when other manufacturers make their products available first.
  • Users are content with good enough, and our bargain culture deems good interfaces an unnecessary luxury.
  • There is a lack of knowledge about how to produce good interfaces in product design, and the skills, experience, and exposure to good interfaces are inadequate in those responsible.
  • Computers, like cars, are complicated systems that can have serious consequences when misused.  Shouldn’t we expect at least the same level of devoted time and training to use them as we do our cars?

There are counter arguments for all of these, and possible solutions even where they are accepted as problems.  I’d love to hear what your responses are to these, or what theories you might have about them.

The market decides these things, as it does in so many areas, but there is still some room for change.  Apple created a whole new market when it created the iPod, almost entirely on the basis of its interface, long before it became a social symbol.  Google was turning heads with its easy, straightforward search box before anyone knew the power of it’s pagerank search algorithm.  On the other hand, there are large corporations who have the market for operating systems, DVRs, various online services, computer office suites, etc., comfortably enough in hand that they can afford to spend a bit extra on better interfaces, which may give them the edge they need to keep competition from closing in.

Why do you think technology is so hard to use?  What can we do about it?

email  Facebook  Twitter  Digg  Delicious