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

Comments are closed.