How do you define a real programmer? There are many facets that you can use to judge someone’s skill as a programmer: ability, experience, enthusiasm, dedication, etc. But I recently read an article by RethinkDB blogger Slava, and he boils all of these points down to one item, memorization. Some people agree with this idea, but I do not, at all.
I have heard several companies bragging about having interview scripts like this, saying that this kind of testing is the most effective way to filter out unqualified applicants. However I think that the post by Slava perfectly demonstrates just how flawed this concept is. If there is one thing you should have learned in school, it’s that standardized tests are a terrible metric for gauging skill or intelligence.
But more to the point, I think that this is the wrong way to define a real programmer. Allow me to present you with my definition of a real programmer.
What is a real programmer?
This comes from one of my favorite quotes in all of history:
“Real knowledge is to know the extent of ones ignorance” – Confucius
Having an encyclopedic knowledge of a college curriculum is not required to be a great programmer. Real world software development isn’t about memorizing low-level programming techniques, or math formulas. These are great tools to have at your disposal, but are certainly not the end-all-be-all of development. It’s all about problem solving, in the most efficient and elegant way that circumstances allow.
As a programmer you will be supplied with problems every day, and it’s your job to figure out how to solve these problems. To do this you need to know what your language of choice is capable of, this comes with experience. You will also need to be able to look at the possible solutions and pick the best one for the situation at hand.
Now here’s the fact that breaks the machine, you do not know every possible solution for every problem, and you never will. I don’t care how experienced you are, how much education you have had, or how many millions of lines of code you have written, because there are so many possible ways to approach the practical problems you find in software development that it is literally impossible to know everything. So you need to have a mix of creativity and resources that let you learn how to solve new problems.
Real programmers are the ones who can learn fast, and learn by doing. These are the people who constantly strive to keep up with the technology they love. They have ample real world experience building, learning and growing their craft, but know that they still don’t know everything.
In short the defining characteristic of real programmers is that they never stop learning.
My experience with real programmers
I’ve worked as a peon coder, link-in-the-chain guy, I’ve worked as a manager who did the hiring and firing, I’ve worked as a one-man-shop serving milti-billion dollar corporations, and I’ve worked as a solo freelancer. This experience has taught me two things:
- I am not the greatest programmer in the world, despite what my website says, and
- That you can rarely tell a good programmer from a bad one by the resume, or the interview.
I’ve seen guys with terrible resumes turn out to be so far above my level that I still have them on my guru list, and I’ve seen guys with amazing resumes who couldn’t grasp even the most basic concepts.
How to find a real programmer
It is true that there is often a gap between what candidates say they can do and what they’re really capable of. That is why testing candidates is still a very good idea, but you need to test for higher level skills and abilities. Testing a candidate’s knowledge on obscure techniques and patterns means passing off great people for not remembering stuff that they simply do not need to be top notch coders.
In my experience, it is very easy to separate the wheat from the chaff: go through the normal interview process to see if this is a person you can work with (and let’s face it, that’s all that the interview is really for). Then give them a small project, something realistic that resembles what their real work would be like, and send them home. Not a knowledge test, but a real “build something that does this” task.
When you get the finished result of their labor you will know if you’ve got the real deal. Is it done the way you would have expected (or better)? Is it high quality, showing some love some thought? Did they get it back to you reasonably quickly? Did they do anything cool to show off? If so, congratulations! You’ve just found a great programmer!
code_by_google != bad_programmer
Yes, they could have just coded by Google. But you know what? That shows they can learn and adapt. I have plenty of respect for a person who doesn’t immediately know how to accomplish a complex task, but can quickly find out how and do it on their own without bothering the other programmers on your team.
Remember the key point of my real programmers definition, they never stop learning. Google is the greatest programming resource that has ever existed. You cannot look down on someone for using the most powerful learning tool computer science has ever known. I would go so far as to say knowing how to code by Google is the single most important skill in a programmers tool box, because if you want to grow as a programmer this is going to be the tool to use.
Someone who knows how to search for code examples and how to learn from the work of others will be more or less self-sufficient. They can learn and grow their skills on their own without needing someone else to do it for them. The ability to learn and grow your knowledge is the single most important skill for any developer. Without the ability to grow you will find yourself quickly deprecated.
I do expect people to know how to use the language and/or framework they were hired to work in, but I judge them primarily based on the work they submit. A guy who can figure out how to do things that he doesn’t know how to do, on his own, on the fly, is a real programmer.
The catch-22 of impossibly high standards
Of course it’s pretty absurd to require knowledge that 99% of programmers have absolutely no need for in real life. But perhaps you don’t entirely know why. If you have very strict hiring standards then you are only going to find people who match your specific model, and your code will suffer because of this.
Computer science grows at a fantastical rate, every day there is another small innovation that someone came up with. This small innovation will slowly propegate out to the rest of the programming community and become part of everyone’s toolbox. This happens because some creative programmer tried some alternative idea and found a new way to solve a problem.
If your team consists entirely of people with the same background, skills and knowledge then your creativity bucket will be quite small. This means you will not see as much innovation as a varied team with people asking questions that wouldn’t normally be asked, and people offering solutions that wouldn’t normally be offered.
Most alternative idea’s will, of course, be immediately shot down. But that one in a hundred that actually sticks will give your team an advantage. This alternative idea has given a level of innovation to your project that would not have existed if you didn’t have a radical element thinking in a unique way.
This was a rather long-winded rant, but let me sum it up in a few nice bullet points.
- People who are more interested in the buzz words and CS theory than actual experience and a history of practical application of skills are a perpetual thorn in the side of the programming industry.
- Don’t look down on other programmers because they don’t fit your model definition of a programmer, they just might be better than you.
- If 99 out of 100 candidates fail your interview then you are looking for something that doesn’t exist.
- Without a varied group of developers in your team you will suffer from a lack of creativity.
- Don’t test a CS curriculum, test the ability to create.
- If you ever finish learning, then your career as a programmer is over. Go study law.
Look for someone who truly understand the concepts, who can offer creative and alternative ideas, and who shows the ability to grow as a programmer. Then you will finally find a real programmer.
Updated: Feb 3rd, 2011