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.
Get real
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.
In short
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.
Src:
http://stevenbenner.com/2010/08/will-the-really-real-programmers-please-stand-up/