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.
By:
Updated: Feb 3rd, 2011
I couldn’t agree more with you… In fact I believe I fit perfectly to what you’ve said about programming… The fact is that some frameworks are so complicated that you can’t remember every method on it and sometimes you need google to help you get back on track, also If you think that your programming language is so damn hot that will be the king forever you are lost already(tnik of visual studio in 90’s, or java in 2000) as some kids comming behind you will easily bypass you with new techniques….
As Matt Perez (My CEO/COO) said… a good programmer will never stop learning, they will find the way no matter how much work they have. As you said: if you think you know everything you are totally lost in this career…
About the interviews you are totally right, I got selected because of my talking skills (as my mother was a seller) and not by my code skills, I was eager to get a real problem and solve it in my own way, I was eager to show them that I actually comment my code and follow some patterns but all in the interview was “bla bla bla do you remember this? bla bla”, I’m so happy with my new job but I still hold my breath as I still don’t know the rest of my team and don’t know if they are good for programming or just talking (as someone pointed, good programmers love to work with good programmers and create new solutions to problems, if they can’t find them they quit and bad programmers make a great company to fall apart).
Thanks a lot as I fell you’ve talked for all of us :)
God I hate there is no “edit button”, I mispelled some words, please be kind :)
Nice entry, Loved the article :)
Perfect analysis. But how do we get the ‘real programmer’-kandidates ringin’ at our doorstep ?
Spot on. That is all.
I completely agree with googling as an accepted practice. Everything changes all around, in all professional domains. Google has managed to filter data that has an acceptable, workable degree of correctedness and authority, data that can be readily used in a world that’s flooded with new knowledge.
Either get (significantly) more people and specialize them on narrow niches, or let the people you already have use every tool available to get their edge.
“The ability to understand complex problems from written and verbal description, and break down those problems into precisely defined, digestable chunks.”
That’s a real programmer.
I do generally agree with you except for a couple of caveats:
– 99/100 not passing the interview may be reasonable if you have a need for a very specific skill set and not just another programmer who will become great. Consider if you were working on an embedded multithreaded kernel and a programmer shows good abilities to work through a generic problem. This could be a great programmer for your organization in enough time, but with deadlines, you do need someone who had a concept of multithreaded or working at a low level. Most teams are not like that though.
– I support conceptually googling but while in an office. This is especially important for larger companies or a question of team skills. Being able to look something up is useful most of the time, but a lot of large companies might have a large amount of proprietary infrastructure already in place that the internet will not tell someone about (alternatively you can consider intellectual property questions about the use of code provided by someone on the internet going into a product). What seems like a good strategy is prefacing a difficult question or ambiguous question with the statement that questions are very encouraged and the interviewer is more interested in your thoughts than the correct answer. Working through a problem with an interviewee can really show how well they can open up with a challenge and whether or not they can consider different approaches when suggested.
– I would argue that law still takes learning. How about mopping floors?
Good article
Great article, 100% agree. The skill is called initiative, and it’s wonderful, albeit rare.
As someone who has mostly been an independent developer and programmer most of my career, I keep it real.
That’s a nice quote – but it’s not really what Confucius said.
A real programmer is someone who declares extremely difficult and/or impossible problems “trivial,” then, when asked to provide a code fragment to prove how easy it is, contemptuously refuses because “it’s beneath me.”
A real programmer is someone who boasts that “most programmers can’t look at a program and understand what it really does, but a REAL programmer can do it instantly” — and then, when faced with a code sample to demonstrate this capability demurs with the claim “I don’t have the time.”
A real programmer is someone who jeers that “documentation is for wusses” and “readabiltity is a sign of incompetence” and spends three hours figuring out how to collapse 10 different statements into a single completely indecipherable line of C code, the better to insure that he can never be fired since no one else can maintain his code.
So, by this standard, being afraid that I don’t know anywhere near enough as much as I think I should know (because I’m about to graduate in Computer and Information science) is a good thing? :D
It seems ages ago that my eyes were enlightened. I heard the wise words, “knowlegde is 99% knowing where to look it up!” And it truly revolutionized my programming skills. No longer did I get stymied or bogged down when I ran into a tough bit of coding that just had to get done.
There’s no way to know everything about everything. I cannot even manage to know a lot about a few things. Back in the day, all it took was the language manual, and you could do it with enough determination. Things are far too complex, now, for that. No one can be an expert at “golly, just everything”, and I think it is stupid to even try.
But what I do know is how to make things happen. I’ve made things happen that people have told me cannot be done. In fact, I’d say it is now a speciality of mine. I take actual pride in the fact that I (as you put it) “code by google.” Good search skills are as useful to a programmer as any other of his or her good coding skills.
And… and this is a biggie in my book… I have the knack for “knowing what I want to do.” Frankly, I believe that if you are facing a coding project, simply having a good picture of what it is you want to produce is virualy all of the game. After that, coding it is a trivial matter that can be accomplished with nothing more than sheer determination.
I gave up a long time ago on knowing everything. Now, I trust in my proven ability not to know, but to find out.
At my company we took the coding assignment a step further and provided requirements that they use some specific open source code within their project… including a web framework that isn’t terribly well documented. This ensures that they are capable of adapting to a new code base quickly, since that’s what new developers are going to have to do if you hired them.
Great article.
I assume by focus on CS theory you really meant the faux theory, such as overuse of design patterns, vs. real theory of knowing the difference between an array and a linked list. Knowledge of real CS theory is a very good asset that makes the difference been good and great developers.
Wow you have really low standards for people. That’s ok. But I don’t think I can respect your skills if you can’t hash out how you would think you could implement linked list reversal or read/write locks.
The fact is that you should be able to think and most of those questions Slava asked, are about applying critical thinking and problem solving. Not necessarily simple undergrad crap.
Hello Anonymous,
Your example is one of the best googleable things most programmers don’t even need to know… Most programming toolkits already have a reversal function, and knowing how it’s implemented really is just a nice-to-know for higher-level problem solving. If it is for C-programming, okay, you have a point, but e.g. a lisper can basically solve this problem using (reverse) and its brothers. The building blocks here are just different. I won’t ask a mason if he knows how to make his bricks, it’s enough if he knows how to select the right one.
And how would you go about testing critical thinking?
Perhaps I am naive, but it seems to me that one piece that is missing from these discussions is the programmers ability and willingness to understand the domain in which she/he is being asked to develop. Though the code he/she develops may be extremely elegant and efficient, if it doesn’t meet the needs of the users, it is all wasted. Specifications never cover every detail, and intuition about what the user needs, without inserting biases or egoism, can go a long way to delivering code that moves a product forward at a lower cost to all.
I think this is not entirely off-base, but I think it’s pretty misguided. It misses something crucial to the discussion related to that RethinkDB post: RethinkDB are doing low-level database implementation stuff, and so I think reversing a linked-list in C or understanding locks is probably pretty relevant to their domain. They aren’t just gluing web frameworks together, and their interview questions weren’t about trivial method names or details about some API. People often say things like “oh you never need to know that because there will be some implementation in the standard library or toolkit you are using.” In this case, these guys are building PART of that toolkit.
That being said, reversing a linked-list in C isn’t exactly rocket science, OR hardcore Computer Science.
*sigh* Again I see this one-dimensional one-eyed thinking of “good” (or “real”) programmers vs. “bad” programmers. If you ever say and really mean things like “People who [this and that] are a perpetual thorn in the side” or “they just might be better than you” (from the Get Real section), it only shows how shallow your idea of programming task is. Is it a running competition? Can you put people in strict order by how fast or “real” the perform?
The very idea of scoffing at, for instance, deep theoretical knowledge of CS is troubling to say the least. Performing some tasks very well benefit from such insight, and may even depend on it! Creative thinking and eye for good design and elegance also cannot be googled. I understand this was a rant, but this was truly a rant that compares programming more to assembly line labor than an art. I’d say that people who fail to appreciate the different skills of their team members and collagues are definitely a bigger thorn in the side of the industry than many others! (And by different, I mean qualitatively different, not just “more real” and “less real”… just to underline :)
At first I thought there was wrong link to Slava’s article, because linked article talked about analysis skills, not about memorization. But it turns out that many people really think that the only way to solve eg. linked list reversal problem is to reapply a memorized solution. That was surprising! And they say that only smartest part of programmers read programming blogs …
really real programmers = RoR programmers :)
/s
Standardized tests provide excellent metrics for gauging effort and understanding.
Dear Steve, I believe you must be based in US. Unfortunately I am based in Australia otherwise I will get a way just to shake your hand. All IT Managers here should use your article as a learning source. They just don’t understand that a written test won’t prove anything at all and expected you remember every functionality from the framework.
I believe the best way to evaluate a programmer is as you mentioned give them a real life problem and let them work out.Not a paper question. You will have a better chance to see if the programmer are keen to get his/her way to provide a solution.
Best article… very good
When I read this article, I had mixed feelings. Conceptually I agreed, but was troubled by your examples. I am not a CS graduate, I moved from Electronics to C/C++ programming 20 years back. Therefore, I don’t have any classroom training in algorithms and data structures. But I learned stuff from books whenever I needed them. I never studied any CS stuff I didn’t use at work.
Therefore I am wary of CS pundits in high towers trying to judge who are real programmers with their high standard goggles. I still program in C++ and enjoy doing it. So I must be doing something right despite my CS ignorance.
I am also sick of companies who interviewers want you to move mountains or solve world hunger or design a compiler. Especially when the company in question has no contract to move any mountain, solve world hunger or deliver a one man designed compiler.
But the Google dependency is a red flag for me. Looking up the Internet for help in debugging a problem, or how to use a particular API is one thing. But looking up the Internet on how to code a common enough algorithm is something else.
My uncle is retired doctor and he tells me that there is a major difference between his generation of doctors and the current generation. His generation of doctors could do clinical diagnosis of most cases without any gadgets or tests. They would prescribe tests only when they are not very sure. But the current generation of doctors are completely dependent on lab tests and gadgets. Yes, they would also need these tests as defense against malpractice suits. As a result, the clinical diagnosis is becoming a lost art. Why bother trying to diagnose when the tests can tell you in writing.
I have seen similar thing happening in the programming world ever since Java came into being 1995. It was the first major language that lowered the entry barrier into the programming job. I am not saying it is a bad thing. Most programming jobs are not rocket science, you don’t need a CS graduate to render a sales report onto the browser by querying into the database. Advent of easier languages like Java/C# has made it easy for coding such requirements. But you do need a programmer with decent understanding of CS to design a browser or a database itself. Firefox or MySQL was not designed by somebody who didn’t have understanding of CS. Therefore, if somebody is looking for programmers with understanding of CS, we have no business poopooing their requirements without knowing their coding needs.
A programmer who can code without Google, can be even more potent with Google. A hell of a lot better than the programmer who is helpless without Google. If this is the kind of programmer you need, then you have to look for them, nothing less will do.
After reading this article, I looked up the blog article by Slava. And I am fully with him. A link list is one of the simplest DS out there. Even a non-CS grunt like me could instantly think of how to code a C function to reverse a link list in my mind. Even the rest of the problems looked reasonable and anybody with CS background should find it easy. I empathize with him because I too reject 100s CS candidates each year who couldn’t code a C function to replace a character in a string. It is really scary.
The truth is that the art of programming is getting lost just like the art of clinical diagnosis. And lots of people think it is okay.
Man, I want to work for you. :)
I think in truth there needs to be a balance. An employable programmer cannot get by looking everything up – they need to know the programming language/paradigm they’re working with. It isn’t even possible to look everything up. If they don’t already know about a design pattern, they’re not going to think to use it. But, at the same time there is no need to memorise every detail. If they know when to use a design pattern but are unclear on its intricacies then there is no harm in looking it up. As you say, the skill of being able to seek answers and learn is a vital skill.
I teach introductory Java programming to CS students and an important step is getting them to learn how to use the tools available to them to look up answers to their own questions. It is impossible to know the entire standard Java API, but knowing how to use the JavaDoc effectively means there’s no need to. Obviously, with time much of it seeps into memory and this is why we rate experience so highly in our field.
real programmers,
need to run a comb through their hair (or wash it occasionally)
run their work through a spell checker. (hint hint)
I think trying to define a ‘real programmer’ is like trying to define a ‘real athelete’.
Within atheletics there is a whole range of skills required based upon the sport in question and what serves one well in one sport would be of no use in another.
For example, I don’t have a CS degree so if you asked me about reversing a linked list in an interview I’d first have to ask you to define a linked list. I’d be a poor candidate for a job that used a great deal of CS know how. I couldn’t help you with multi-tasking or writing a new kernal.
That said, I’ve had 10 years of success of having my boss say, “Go find out what this manager needs and then write a solution that fixes the problem.” So I go off to the manager’s office, find out what they need, and then give them that. Perhaps some CS candidates would find it too trival (simple accounting programs) or maybe they wouldn’t work well with skittish managers who have a hard time articulating what they need. Maybe in that case I’m a better fit.
Maybe companies should hire the guy who can do what they need done.
Maybe there is no one size fits all programmer.
I was bothered by Slava’s blog post as well. Thanks for articulating this!
Hello Steven,
This is a great article and I agree with all your points, but I think that something is missing. That is; the love of the craft. I know I can speak for many programmers when I say that I cannot wait for Monday mornings to go to work/play? My days go by so quickly I often wonder where they went. I get so engrossed in my work that I have to use Outlook’s reminder feature to help me remember when it is time to go home. (I also have a family life) I do realize how blessed I am to have a job I truly love.
I often use Google but mainly as a guide to help me research what I need from the framework or to point me in the right direction.I seldom use other people’s code and will almost always come up with my own algorithms so that I can learn from the experience.
When time permits I also try to help others on Forums. I thus, get exposed to particular problems I would never experience where I work.
My point of view is that, I believe that If you love programming and have an inquisitive mind you are likely to become a great programmer. No that I view myself as one since I feel that I still have a lot to learn. This is a life long process.
Agree with this post. Disagree with RethinkDB. There are too many algorithm to solve in the real world. The world of Computer Science is too big to memorize. Instead RethinkDB should give each interviewer a few articles or a few chapters of a book to help them get familiar with a given topic, this can be high-level coding, a business case, or some extreme low level coding. Then in the interview they can exchange algorithms, ideas, or outcomes based on the content that was given out. That should give them ideas on a few things, such as, how well the person understood the topic, whether they can expand on the material, or whether they can even critique a given approach by reflecting on their experience.
It’s completely stupid and a waste of time to have a set of random questions in an interview process. Anyone can ask someone an easy question that the other person wouldn’t know. At my work, we’re constantly bombarded to find solutions to business problems that haven’t been solved before. At first, there are always blanks in the room, but after some investigation and research we come up with great new approaches to handle each situation. That’s why it’s called R&D.
RethinkDB had some success and now they have inflated egos, so that they’re even snubbing PHDs in their post.
Hi, everybody!!!
Anyone from you could say that he really perfect programmer? Or vice versa?
Mixed reactions –
yay – no textbook questions. I agree 100%.
However some standard skills are a must – For eg, if a person has worked on relational db before (and I assume most have) I just really want to see some query writing skills. You can definitely build a working software without writing good queries, but more often than not, you end up writing more code, or more difficult to maintain code.
By same analogy, if you have worked on a particular framework, then I expect you to remember the basics of ‘that’ framework at least. Googling up something new is fine, but I expect sufficient memory to avoid googling ‘every time’. You save a lot of time by just remembering how to do stuff if you are doing something the second time.
I agree 100% In my 35 years working with Process Control Computers, I can say I “never stop learning” because it those 35 years I have worked on over 35 different Computers, 35 different Operating Systems, & have LEARNED & USED 35 different Programming Languages! I am retired now, but I am still doing developement & had to LEARN XML!
As I read your article I wanted to highlight parts and send it to some people. Then I realized the whole thing would be highlighted – thus, they will get a link! Excellent! I’ve been coding since Fortran 77 and continue to learn and enjoy to this day. My motto has always been “gotta have aptitude and enthusiasm” – just get the job done. Thanks for a great article.
I agree wholeheartedly about how learning is the most important thing an engineer does. In fact I believe it so much – it’s the main point my resume’ makes. Then again – it may explain why I’m still at the same job 29 years later. I’ve always said – even back when I was in school, that majoring in CS is not too many steps from majoring in “Hammer” – you need an application for that tool. Fortunately, though, if you’re good with a hammer – it’s not too hard to learn to hit something new.
Thank you. You’ve basically laid out my personal beliefs for the foundation of great programming. A true programmer should always want to learn more and never think that their way is the only way. My personal pet peeve is the developer that thinks they know everything there is to know and can’t find room in their mind for another’s way of doing things. There’s a place for developers like that – a college campus – a beautiful place where they can discuss theory all day and not have to deal with real world situations.
A great read; thanks for posting this! I have a lot of thoughts on this, but in short, I think I disagree slightly. To me, you definitely have to be WILLING to learn at all times, but I don’t think it has to be your driver. For instance, I have a developer who is worth his weight in gold, but his excellence comes in taking his existing toolset and leveraging the heck out of it. He works best when someone else is feeding him new ideas and technology, and I don’t fault him for it.
I think your article got closest to my view when you quoted Confucious: “Real knowledge is to know the extent of ones ignorance”. I may be biased based on my experience (aren’t we all), but to me, two major marks of a real programmer are being able to (a) accurately judge how well you understand something, and (b) know when you’re making assumptions (assumptions aren’t bad, just important to note and verify). I also think that’s why (as the article references) some people think memorization is key: they’ve inverting a quality of the worst programmers to find the best, and the worst programmers don’t REALIZE they’re forgetting things. In essence, I think it’s more about good (and speedy) self-reflection than a drive to learn.
Thanks again!
مشكووووور هههه
merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
اواه نتا باين خاطيك البروجراماسيون هههه
المبرمج العربي & khiro :
Man We know you’re the same dude
Even if I do understand arabic a little this is a comment that a baby won’t even write
So please let this topic stay far away from this kind of “joking” and go play with someones that are really like you
Thinks ..
——-
Sorry for that , Topic is very good as first fast read . Will leave a comment after a real reading this time :D
I think you’re right in most of the points you said,
in my company I know a guy who is too much interested into informatic theory and you know what..he’s the worst programmer I ever seen..
My only question now is…WHERE FIND A PROGRAMMER WHO CORRESPONDS WITH WHAT YOU WROTE ??
LOL :)
Once upon a time there was a church group that went with the name “the church”.
Then, some of them felt that members of “the church” on the whole were not churchy enough. So they decided to form a caucus within “the church” and soon enough they broke away from “the church” and formed their own church called “the church of jesus christ”.
OK, “the church of jesus christ” was humble accepting, and soon their members swelled. Then some members of “the church of jesus christ” decided that their church was not churchy enough. They, then like the founders of “the church of jesus christ”, formed their own caucus and soon enough splintered out of their church to form “the real church of jesus christ”.
OK, OK, “the real church of jesus christ” was humble humble and accepting accepting and soon soon their members swelled and swelled. Dissatisfaction again prompted the formation of a caucus which then again splintered towards forming a new church called “the true real church of jesus christ”.
OK, OK. OK, ….. OKn. After n number of iterations, there were more and more holier-than-the-holiest churches. The true^n real^n church of jesus christ^n.
So AlQaeda think they are holier than other muslims. And so you think you are the true true real programmer? Among the chosen ones, the ones who snob at others because others have only tasted Americanized or Europeanised Thai food – you on the other hand, know what authentic Thai food is all about. Snub up your nose, eh?
Thank you! As a budding programmer looking for work this was a great morale booster, I’m happy it seems I’m moving in the right direction. :) I love your articles!
As a teacher I can only agree with your statements. Programming is not the most difficult part of building software applications. Finding solutions for problems is much harder for my students.
All these folk are really making me feel OLD!!!!!
I first learned Fortran when it was called “NCE Load-and-Go” & ran on an IBM1620!!!!!
I also had to learn LISP for my Masters Project!!!!!
“Did they do anything cool to show off?”
Come on. Any programmer who is more interested in being flashy, shifting focus from the subject onto himself is not a real programmer. If he’s happy to share what he’s done because he finds his discovery intriguing (with a realistic assessment of his contribution in proportion with the grand scheme of the universe and human existence — and I’m not talking about eager-to-please brown nosers who also fail) then you’ve got someone who is interested in helping improve the situation, instead of flashing his peepee around the office, which no one cares about (expect for maybe a few idiot groupies).
I came across a company you might want to slam a bit while googling around. Actually two, but one is a subsidiary I believe. D. E. Shaw Group, and D. E. Shaw Research. They ask for things like GPA or SAT scores and brag about having demanding standards, which made me chuckle and sigh.
It does well to remember that programming is a trade, a practical discipline in the practical service of something. And like anything, it does well to wrestle personal thought and experience with tradition.
Memorization is about answers. Your focus on applying the same technique over and over. You can then combine several techniques into a combination and ‘solve'( really respond to well known situations. The author here in my opinion is talking about a different type of person. A problem solver. These kind of individuals love problems more than answers. Today let’s mine the data from users to see why features they really are using. Tomorrow we need to “find” the correct algorithm for a statistical method to help the marketing dept. next week we will write some c functions for our postgres database that we just installed last week to help the GIS dept. this kind of person can tell you everything ( and indeed memorizes almost everything about the answers) as long as he is working on the problem. Once he is moved on to the next problem… forget it. He remembers problems with clarity, but not the details of how he solved it. Many businesses don’t really know how to handle this kind of employee and indeed some of the bosses are threatened by them. they would be in r&d if not in a business world. many times they are borderline ADD. these two types are not better or worse. they have different uses.
Must admit, I totally agree.
“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.”
Yes! If you are this person, please go away. The rest of us don’t want you.
“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.”
Search for Paula Bean. She’s apparently ‘brillant’.
“If 99 out of 100 candidates fail your interview then you are looking for something that doesn’t exist.”
They probably exist. They just don’t want to work for you for some reason. Most likely reason: Insufficient pay for the requested skill set. Either lower the bar and offer on-the-job training or offer more money.
“If you ever finish learning, then your career as a programmer is over. Go study law.”
Interestingly, I know a whole slew of programmers who randomly went to study law once they reached 40-ish. Guess they got tired of programming. Sure hope I don’t.
I think that this is a wonderful explanation of how to find programmers that you should hire, though I do think that academic-oriented programming and CS theory still have their place in the world. I am a new programmer, going into my second year of university, but I already know from 4 months of work with start-ups that if I have to write websites and their data backend for the rest of my life, I’d be a very depressed man…
“Real Programmers” does not have to be limited to corporate or start-up usable programmers. People trying to solve NP hard problems are very useful in furthering the computer sciences and their applications.
There is an additionnal type of developper :
Eclipse dev who lose their time to start & stop the Eclipse App
Thanks for reminding me what my calling in life is. I agree that being an encyclopedia of CS theory is useless, but I do support actually having gone through it at some point.
Initiative and creativity is the answer, in the end.
I read half way through your post and knew that I had to post a comment. I especially liked the term you used code_by_google. I’ve never seen anyone use that before, but I know exactly what you are talking about because I’ve coded by google many times. Especially in a language that I just needed to use for one particular project. If job recruiters do not know this concept of coding by google they should!
Never stop learning my friend.
Good points! In my years, I’ve struggled to ‘find my place’ as a programmer. There is a lot of arrogance in computer science, lots of critics, and lots of egos battling it out. Nobody knows as much as they think they do, and, as most people can relate to, with every passing year it is easy to look back and scoff at how little your old self knew!
There’s an infinite amount of things that can be learned, and an infinite number of specialties.
At the end of the day, it boils down to this.
If I was hiring, I’d look for these qualities:
1. *Humility* – Egos are a barrier to learning and writing good code, as well as collaborating with others.
2. *Enthusasism* – Without enthusiasm, you’ll get lazy, lose interest, and writing good code is very difficult if you’re not enthusiastic about programming, and learning. Companies should be particularly careful not to quell the enthusiasm of its programmers. Critics and perfectionism can stifle enthusiasm very quickly.
3. *Pragmatism* – People often get caught up in writing ‘perfect’ code, or nit picking other people’s code, which is really a function of their ego. They feel if they release anything not perfect, they’ll be criticized, and their ego can’t take that. GOOD CODE doesn’t need to be PERFECT.
Good blog entry, if only there were more ‘good’ managers to do the recruitment. I too have been on both sides of the desk, recruiting and being recruited. Unfortunately in too many corporations the first interview is conducted by juniors fresh out of college and still remember each line of whichever computer language manual they’ve read. I’ve lost count of the numbers of languages I’ve developed in in my career that spans 30 years of development. When I recruit, I tend to ask questions that probe whether I can work with the guy or gal and how they will behave in the team. Hard code technical skills is absolutely secondary. When I started this game there were not that many computer science graduates, we had to recruit graduates majoring in other disciplines. The fact that some of the best developer I know are English and History majors tells me something.
Hi, I see a lot of mixed feelings in the comments and actually I’m not sure why.
I believe we can all agree that the fundamental think that we are looking for in a candidate is his problem solving skills (including his ability to find a solution if he does not have it), after all that is why we are hiring…
I like this approach (build small realistic project at home) because the candidate is not nervous at home so I would expect he will perform his best and I can review his implementation when I get a chance.
Also another approach, similar to this, is to create a programming test online which the candidate would take and if he passes then I will review his test, his problem solving implementations or bug fixing or whatever.
Nice post and it’s informative too. Thanks for sharing.