Wednesday, December 24, 2008

Are Engineers’ Minds Wired Differently?

Back during the dot-com boom of the late 90’s a lot of people jumped into the IT field because they saw plenty of jobs offering good pay. And for a while they did fine, at least until the bottom fell out. Then many of those people washed out of the industry, leaving mostly the ‘core’ engineers with stronger technical skills and programming abilities. And in fact another version of that shakeout is also occurring today as I write this article.

So why did people who entered the field from outside ultimately not fare as well? Or more generally, why do some people succeed in software engineering, while others flounder? It can’t be a simple matter of comparative intelligence since smart people exist in all fields, and there are many smart people who just don’t ‘get’ programming. Even people you might think of as ‘nerds’ don’t always perform well in the programming realm. So what separates two people, both of them smart, but where one of them can program well and the other can’t?

It’s been said that engineers’ minds are wired differently than other (normal?) people, and this most likely applies even more to software engineers. Some will point to Meyers-Brigg and other personality tests to evaluate a person’s suitability for analytical tasks. However, just what does it mean to say that a task (or a person) is analytical?

I like to think there are two types of people in this world -- and I don’t mean those who like to categorize people and those who don’t. One group is interested in outcomes, and the other in the mechanics. Computer nerds might compare this to declarative vs. functional languages, if that makes any sense to you. An analogy is when a person admires a new car. Do they appreciate its aesthetics and comfort, or do they digest the specifications and performance numbers? Of course the two are not mutually exclusive, but people sometimes lean towards one or the other. Also think music fans vs. audiophiles.

Beyond the personality differences, there are also very real skills required to be successful in software engineering. Some of these skills can be taught, but others are innate. For instance, there is the ability to see patterns and complex relationships in large systems. Some people can easily juggle highly abstract, non-visual concepts in their head. They can read or hear about a concept and instantly see how it can be applied in a myriad of problems, and also understand where the approach might not be appropriate.

These people can look at a screenful of text (source code) and envision a program’s flow of control and spot logical errors. They can think of the possible potential and combinatorial ramifications of various decisions without resorting to a “let’s see what happens” approach. Like a good chess player they can foresee how various scenarios and branches will play out, evaluating them to a depth and level of detail that would overwhelm most people.

If you remember as far back as the 80’s you might recall the first time you saw a Rubik’s cube. Solving it (at least at first) posed an immense challenge, requiring the ability first to experiment, then figure out how the contraption worked. Thereafter you’d have to evaluate patterns and visualize how you would interact with the cube to get the configuration you wanted. Most people were so daunted by these things that they dropped the cube after a bit of experimental play, but others stuck at it and discovered its secrets. In a way, good developers have the vision, cognitive skills, and perseverance to stick with problems like these and solve them.

I hope this discussion makes some sense to you. I’ve spent a lot of time wondering why some people have better aptitude for software engineering than others, but I still can’t say that I’ve fully cracked the code.

No comments: