My company is hiring, so I've been interviewing software developers lately. Even though we're located near the tech Mecca of Boston, finding truly outstanding developers is always a challenge. In fact, we've gotten so desperate that we're considering off-shoring -- in spite of two earlier experiences with off-shore teams that did not work out very well.
So far, I have interviewed three developers from a country that is considered Blue Chip in the off-shore world. They have a flourishing educational infrastructure and an excellent reputation.
The off-shore partner I've been dealing with is likewise an established company, with great reviews all over the Internet. Because their contractual arrangements with developers are exceptionally humane, I would expect them to attract the very best.
That is why I have been so shocked at what I've found. To summarize, the developers I've interviewed have known the syntax of the language (sometimes not even that!), but don't know the first thing about writing good code. Although they have spent years in school, they have not gotten an education.
In medieval times, the first stage of education was called the trivium. The student learned grammar, logic and rhetoric, in that order. (The trivium has lately made a come-back in the world of home education, by the way.)
All three subjects focused on the use of language.
The grammar stage consisted of learning the mechanics of the language: the parts of speech, what makes a sentence, and so on.
Logic is the art of thinking with language.
Rhetoric means using language to communicate persuasively to someone else -- ideally with integrity and polish.
We can recast the trivium for software developers.
To learn the grammar of programming is to learn the syntax of a programming language.
The student has mastered logic when he or she can write correct solutions to business problems.
The rhetoric of programming consists of writing code that someone else would find compelling, elegant and beautiful.
Too many developers have barely progressed to the logic phase. I believe this is because software education -- both in America and abroad -- focuses on syntax, data structures and algorithms. Those are important subjects, but they are only part of a good education.
When I've asked my interviewees what they do to make their code maintainable, most of them respond, "I put lots of comments in it." That's not a bad answer, but it's a grammar-based one. Their instructors have told them, "This is how you write XML comments. You should include them in your code" and they have dutifully gone off and done just that.
What I'd like to hear is something like, "I write each class with a single responsibility. I use dependency inversion to minimize coupling between classes." That would show they have progressed to the rhetoric stage -- they know how to make code that is compelling, elegant and beautiful.
So far, not a single one of my interviewees has even known what dependency inversion is, let alone why it makes code more maintainable. And these are people who have an undergraduate degree, and maybe even a master's degree, in a computer-related field!
If you're saying "Amen" right now, and spend your brain-cycles in the rhetoric phase because you have thoroughly mastered grammar and logic, please contact me. I can probably offer you a job where your talents will be highly respected. Use the email address for this blog: LSpencer [at] FascinatedWithSoftware.com