With the shortage of quality talent in software engineering continuing to worsen, there have sprung up a multitude of programs, both online and classroom-based, that claim to be able to turn a tech novice into a functioning, effective, hire-worthy software developer in as little as 6 months. Granted, these courses generally focus on a very specific technology (PHP, or Ruby on Rails, etc.). But can they really deliver? Can someone who wouldn’t know a for-loop from a Fruit Loop really emerge from a 6-month course ready to set the Rails world on fire?
I root for the underdog (Cubs fan) so I’d like to believe it can happen. And as a hiring manager in a consulting firm, I feel the pinch of the talent shortage as much as anyone. Yet, as much as it kills me to say this my answer is, in the vast majority of cases, no. It just ain’t that easy.
Shifting gears a bit, one of the things that continually amazes me about many IT managers (and, sadly, many accomplished software developers) is widespread underestimation of the ability of professionals in this field to quickly pick up new skills and concepts. Whether it’s new programming languages, new design or architectural patterns, or new communication protocols like Web sockets, far too many people in this field have an inner fear of the new. This fear, more than any real or imagined challenges in learning, is what stagnates far too many people in our field. Be ready for the challenge, my compadres – it just ain’t that hard.
See what I did there? 🙂 Contradicted myself. How can it be both ways? As you, astute reader, have probably guessed, I’m about to use that apparent conflict to make a point.
For probably 15 years or so, I have carried around in my head a visual image representing the various skills and bits of knowledge required to be an effective practitioner of software development. It’s heavily influenced by (okay, almost a carbon copy of) a pyramidal diagram that anyone with a reasonably well-rounded education has seen at least once: Maslow’s hierarchy of needs.
In that mental model, Maslow places basic, vital human needs – food, water, elimination – at the base of the pyramid. These are fundamental – without them, we quickly expire, and won’t continue to need anything.
In a succession of layers, moving up the pyramid, we see needs that are less critical to survival, but increasingly focused on what most of us consider to be a meaningful, healthy and successful life. Things like love and friendship. Achievement and mastery. Independence. And finally, at the top, this concept he calls self-actualization – the act of becoming all you can, and were meant to, become.
What if we were to start thinking about software engineering skills and knowledge in a similar manner? Are there basic, fundamental skills that we all must have? Of course there are. Language syntax. Compilation and the ability to understand compile errors. Variables, and flow of execution, and loops and conditional statements. If you don’t “get” these things, your career in this field will suffer the same fate as a human being without food and water. Ist kaput.
But once we do master those things, something wonderful and powerful begins to happen. Higher-order skills and concepts – things like object orientation, and effective relational database design – things that would have been nearly impossible to understand absent those fundamentals – are suddenly attainable. Not only attainable, but almost natural. The human brain has a wonderful way of building on one set of knowledge to form broader, more complex forms of knowledge. (This is how we’ve evolved from flint-tipped spears to intercontinental ballistic missiles over the years. The effect is real.)
And once we’ve mastered knowledge at an increased level of complexity and specialization, we’ve enabled ourselves to achieve still more. It’s a bit like starting down a big hill on a bicycle. The farther you’ve traveled, the faster you find yourself moving.
So – back to this earlier bit about learning a new programming language, and how it ain’t that hard. Think about it in the mental model of the hierarchy of skills. Once you’ve learned any programming language, learning a new language is largely something happening within the same hierarchical level – you’re not moving up the pyramid, you’re moving sideways. An if-else block is an if-else block, whether it’s in Java, Ruby, C# or Visual Basic. You don’t have to relearn what conditional logic does – you just have to discover what it looks like in the new language. Granted, there are always a few unique twists and turns in any language – new built-in features and common frameworks, fancy new operators (I’m looking at you, Ruby), etc. But these are relatively small and incremental, and quite easily learned while actively producing quality, useful code. Classroom time not required.
What, then, about the “be a programmer in 6 months” courses? Why don’t I believe in them? Because that bottom layer of the pyramid – the Fundamentals – is huge in our discipline. The amount of knowledge one needs to amass in order to be reasonably productive in this field is quite significant. The diagram I’ve included here is just a start, and in no way all-inclusive.
Courses that rush someone through will, out of necessity, spend far too little time on the fundamentals. If you’re learning Ruby on Rails in six months, the breadth of knowledge you’ll be presented with is staggering. You’re learning at every level of the pyramid. Where in this mental model would you place an ORM like ActiveRecord? Before you answer, remember that ActiveRecord presupposes knowledge of SQL, which presupposes knowledge of relational database theory, and so on, and so on…
So what happens in these courses is that a person emerges with some, but not nearly all of the fundamental skills an effective developer will need to have in the real world. I envision it as a tall, narrow slice of the pyramid. A skyscraper with a very small footprint. And that’s not a model for stability.
That’s why I don’t believe it’s possible to create an effective professional software developer of any ilk in 6 months. It just ain’t that easy.
One last thought before I wrap this one up. When I look at this diagram, and see the names of the various skills sort of suspended in space, I envision the presence of something else – something invisible, but which gives us the fabric on which all this technical stuff can be pinned. Things like passion. Intellect. Determination. Curiosity. Humility. Pride in a job well done. With all those things in place, pinning skills on the board becomes surprisingly easy. Without them, it can all fall like a house of cards.
Well, there it is. I’ve finally published that particular bit of content I’ve been carrying around in my head for so long. It’s a model that has served me well over the years, and one that has helped Redpoint identify, hire, and grow an incredibly talented and powerful team of professionals.
One thought on “Technical Knowledge is Hierarchical (with apologies to A. Maslow)”
Nice job; couldn’t agree more. Now, if you can somehow convince corporate America that those top level attributes are valuable, and to stop giving so much weight to the bottom level attributes.