99 Out Of 100 Programmers Can’t Program – I Call Bullshit!

BullshitSomething has always struck me as a little bit off, about that "statistic" (or its equally unlikely brothers, 199 out of 200, 19 out of 20 etc.). I remember reading Joel's post alluding to this back in the day, then Jeff's a couple of years ago, there were a few others, most recently this one. And as much as I want to just accept it (for reasons of self-aggrandisement), I can't. I've been in this industry for a few years now, in that time, I've met some really good developers, a bunch of average ones, even the odd crappy one, but I am yet to meet the veritable army of totally useless non-programming programmers that must surely exist if those numbers are accurate (the "architects" don't count :P).

Why Should Top Developers Seek You Out?

Whenever I see the latest post about how hard it is to hire good people, because x out of y developers are useless, one question immediately springs to mind. Is that x out of y applicants, or x out of y working developers? There is a massive distinction. Unless you're a company trying to compile stats by doing an industry-wide study, you can't really comment on the skill levels of all working programmers in any authoritative fashion. So, we must be talking about x out of y applicants. But once again, it's not applicants in general it's applicants to YOUR company. All of a sudden the headline is:

X out of Y Applicants for Positions Advertised By My Company Can't Program

That's a whole lot less impressive/sensational and whole lot closer to reality. But, let us dig a little deeper. It's not just the one company, too many other people/companies have had the same pain. Which is perhaps why these posts receive so much attention. It's cathartic to have a bit of a whinge along with a bunch of other people who feel your pain :). My question for everyone is this, what makes your company so special? How much time did you spend making sure your ad was sufficiently attractive to the star developers and a sufficient deterrent to the crappy ones? I can tell you right now the fact that you're the "world's leading enterprise wodget provider", the latest "well-funded social startup" or pay "above industry rates", is not going to bring the coding elite knocking on your door. I guess it comes down to this, if you try to attract talent in a generic fashion you will attract a generic response, meaning that there is a decent chance your 200 applicants were ALL a bunch of discards.

Blame Your Interview Process First

Go back to that article of Joel's that I mentioned above where he talks about the 199 useless programmers who apply for every job thereby inflating the applicant numbers. I don't think those 199 wannabe programmers exist, I think the pool is much larger. There is a whole bunch of, let's call them "aspiring programmers" who are totally crap and either can't get a job or can't keep one, which doesn't stop the from trying. A significant percentage of your applicants are those guys and yeah they can't program, but then again I wouldn't really call them "programmers" either. It wouldn't take long to get discouraged and cynical about the whole industry when dealing with those guys for days on end. But let's say you can screen all those out via resumes or whatever and only end up with seemingly legitimate applicants, how come so many of those can't code their way out of a paper bag?

Firstly, you didn't really screen all the discards out via the resumes, that's not possible, I've seen some highly impressive resumes from some highly unimpressive people. All our stats are already suspect at this point, but let's plow on anyway. Likely the next course of action is to screen further via phone or face-to-face or both. We ask simple coding questions like the fizzbuzz, but our applicants still fail – even ones that shouldn't:

"Here is the question that the vast majority of candidates are unable to successfully solve, even in half an hour, even with a lot of nudging in the right direction:

Write a C function that reverses a singly-linked list.

That’s it. We’ve turned away people with incredibly impressive resumes (including kernel developers, compiler designers, and many a Ph.D. candidate)…"

That's from the RethinkDB post that I also mentioned above (I am not picking on the RethinkDB guys, it is just conveniently the latest post on the subject that I have read :)). Kernel developers, and Ph.Ds can't reverse a list? That seems entirely unlikely. Perhaps it is not the people who are to blame but the process. We have learned, especially over the last few years that it is often the process that prevents a software team from being productive. These days most teams would cast a critical eye towards their process when looking for causes of dysfunction, before they start pointing fingers at each other. So, why not cast the same critical eye towards the interview process? Perhaps the objectives of the interview are unclear, or you're not communicating well enough, or you're using the wrong medium for what you're trying to achieve (e.g. coding over the phone), or you didn't prepare thoroughly enough as an interviewer added to the probable unpreparedness of the interviewee (this chronic unpreparedness is endemic in our industry and deserves a post of it's own). Sounds like the same kind of issues that cause software projects to go off the rails :). My point is, it is not necessarily the fact that the candidate is crappy it could be that you're just doing it wrong.

Just Because It Makes Us Feel Good Doesn't Make It True

As I was thinking about all this stuff I found myself referring to the X out of Y "statistics" as "feel-good numbers" because they make us all feel good about ourselves. I mean, it's pretty sad for the 99 out of 100 poor schlubs, but not you and me – we are coding ninjas. How does it feel to be special :)? Somehow though I don't reckon there are 99 working programmers sitting there reading those posts thinking "…yeah I am a bit of a failure, I wish I was one of those 1 in a 100 dudes". As a decent programmer, look around yourself. Can you really honestly say the vast majority of the developers you're working with have trouble with loops or basic arithmetic? If you can, I fail to see how your company can produce any kind of working software and why are you hanging around that place anyway, it surely is not healthy for your career not to mention your sanity.

If you've read anything I've written before, you know that I am not one to shy away from a generalisation, but in this case I believe it gives a skewed picture that needlessly makes the whole industry look bad. There is no denying that lack of skill can be a problem in software, but then again this is one of the few professional disciplines where you can read a book and "wham bam thank you ma'am", you're a programmer, or at least think that you are (and might even be able to find work if someone is desperate/stupid enough and you're smooth enough). Try doing the same thing in the medical profession or law, or accounting. This is one of the problems that is unique to IT (other industries have their own), we deal with it to the best of our ability. This issue will always make the hiring process difficult, which makes it doubly as important to think long and hard about how to attract decent people and tweak your interview process to make sure you're getting what you need out of it. And yes it will be time consuming and difficult and will make you feel like you're wasting time instead of doing "real work", but then again you know what the other side of the coin is.

Image by nitot

  • brmore

    I don’t care if a candidate can “Write a C function that reverses a singly-linked list” … I really don’t.

    I value the candidate that knows and can visualize when he/she needs to reverse a singly-linked list in order to achieve the larger objective of the project (which, one assumes, is not simply reversing a list).

    Do we give coding quizzes? You bet .. same one every time … “build me a something that does this from end to end”. But the quizzes are open book / open internet / open everything, including asking questions of the other programmers in the office if they feel it’s appropriate or required.

    Few candidates finish in the time we allow, but if the start is good, the overall picture correct and reasonably well thought out, if the candidate can well and articulately explain what they were trying to do … well, then I know I have a winner. So what if they need to go query StackExchange for the particulars … I can live with it and they’ll grow into it.

    • I actually like your approach, although I can’t even begin to tell you how many people whinge that this would be unfair and takes up too much time and puts them on the spot etc. But then again, I am a more social kind of developer :). Some of the arguments they make are sensible though, since it does take up longer than the average interview and many people are often uncomfortable in a new environment etc.

    • Rafael Imas

      That’s really brillant! I’m hopping to be part of this kind of interview one day, but haven’t in the 13+ years I’ve been working as a developer.

    • sunny

      my hero…..absolutely the correct approach.

  • jonny

    I was also skeptical of these numbers until I took a job at a company in the health care industry. I worked with dozens of SAS ‘Programmers’ who could only do simple tasks in SAS. Outside of that environment and they became pretty useless. 95% of them couldn’t create an alias on our linux servers to assist in automating their tasks much less develop simple shell scripts (90% of our work was done through a Putty terminal). After 6 weeks on the job, I was able to write simple scripts to automate much of my job. If I went in on a Sunday evening, I could run my scripts and get the expected 40 hours of work done in 2 hours, most of that time spent waiting for processes to run.
    These people considered themselves Programmers, yet they spent a majority of their time manually dragging and dropping files on the windows desktop, manually verifying log files, or manually modifying dates in scripts that ran on a monthly basis. Needless to say, I spent enough time there to not seem like I was a job hopper and took the first position available at a nearby e-commerce start up – despite the lack of security. The caveat was there were several good developers there in different capacities, but they were not allowed to implement robust solutions because of the lack of technical skill that existed in the majority of the ‘programming’ workforce. The most telling experience I had was that the ‘lead architect’ did not know what cvs was, ‘wasn’t comfortable enough with recursion’ to utilize it to fix path errors in code, and took over a year to implement a load balancing solution using a shrink-wrapped solution. This job was a real eye opener to how screwed up some industries are when it comes to technology and hiring good developers.

    • Yeah I hear you man, I guess it comes back to that old question, “what makes someone a programmer”. Personally I wouldn’t call the people you describe programmers, just like someone who administers medicine is not necessarily a doctor. The thing is our industry is only now beginning to come to terms with the fact that we have to be more careful about hiring and our hiring processes should be different, but there is a massive amount of “hiring debt” out there already i.e. crappy pseudo-programmers that should never have gotten a job in the first place.

  • jon

    Excellent article. And I think the parenthetical comment here cuts to the chase

    > And as much as I want to just accept it (for reasons of self-aggrandisement)

    For people who identify as “great programmers”, there’s a huge amount of ego and status that comes with this view. Don’t get me wrong, I think that computer science education in the US is pretty bad, and lots of people come out of school without having great programming skills, but there’s a huge difference between the elitism of “almost everybody but me is a bozo” and the more complex reality.

    • Exactly what I was getting at, I am glad you picked up on it.

  • ” Can you really honestly say the vast majority of the developers you’re working with have trouble with loops or basic arithmetic? If you can, I fail to see how your company can produce any kind of working software and why are you hanging around that place anyway, it surely is not healthy for your career not to mention your sanity.”

    You’re describing the company where I used to work. We had an internal workshop and most programmers could not write a function to determine if 3 points are collinear (formulas provided)! That’s a couple of arithmetic operations and a couple of “if”s!
    But I understand how they got there:
    The company needs X “programmers” for a project.
    The recruiting people contact candidates, but as it happens most of them are in the “199” category.
    The existing programmers spend a lot of time doing useless interviews.
    At some point management says something like “We have a deadline, you are too picky, you’ve seen enough candidates, pick one!”


    • Hi Vlad,

      As I said in one of the comments above, that;s what I call “hiring debt”, just like technical debt. And all those “programmers” who couldn’t write that function are a result of that hiring debt. It will lead only to bad things in the long term and nothing good in the short term either. As long as management keep saying lines like the one you mentioned, companies will continue incurring this debt, I personally wouldn’t call the people they hire programmers though.

      • Hi Alan,
        I agree with you, and the term “hiring debt” seems very appropriate.
        It puzzles me how companies manage to survive hiring that way – especially outsourcing companies that “borrow” programmers on a project by project basis and don’t have to live with the long term consequences of the bad software they produce.
        Nevertheless, (and especially if you define “programmers” as people who know how to program) the statistic could easily be “99 of 100 PEOPLE WORKING AS programmers can’t program”.

  • Jaspal Sawhney

    I do feel that this whole hiring dilemma can be handled if we choose to focus on some of the below mentioned points
    1. Strong Concepts – Evaluate whether the candidate has strong concepts or not. Companies at most times are not willing to hire people who might not know how to code in something but at least are analytical, logical and smart enough to be able to learn. You can teach someone to code easily as compared to teaching someone to solve a problem.
    2. Invest in Training – Acknowledge the fact that all people you hire will not be coding ninja’s and then invest time and effort in insuring yourself to that risk by also hiring someone who can mentor people. What sucks is having a coding ninja who cannot mentor anyone it limits rather it increases the pressure on the ninja to drive the weight of both himself and the ‘not-so-good’ programmer.
    3. Plan for who you need in the team – Do you really need all the programmers to be coding ninja’s? of course it might be a great thing to have but its expecting too much. It might just make sense to have some ninja’s and some not so good programmers who are good learners. I feel that a lot of people need hand holding aka mentoring on how to go about a task confidence and soon enough they gain their confidence.
    4. Communicate openly and care – During an interview I have found it very helpful when my interviewer builds a rapport with me and has been open about what he wants of me. Engage in a dialogue rather then doing a Q&A. It will help you more to know whether the ninja is actually a ninja or a grasshopper. You’ll be doing yourself a favor and to the team in the long run

    What do you think?

    • Hi Jaspal,

      I completely agree, especially on the last two points. I am yet to see even good companies really plan who they want to hire, and how they will want to grow/use that person. It seems all hiring is geared towards getting the same guy. And communication is a major fail, before during and after interviews. Companies are never clear on who they want and how to prepare for their interviews, possibly because they don’t know themselves, makes it hard for everyone.

  • Anonymous Loser

    Sorry to comment anonymously but I would rather not have this comment attached to my name.

    I would say the number is closer to 50%. I have worked for 3 companies so far, two smaller companies and then one Fortune 500 as a consultant. All of the companies had a large population of bad programmers and the Dunning–Kruger effect was strong at all levels from the people doing the hiring and on into the teams.

    In the first company 80% of the programmers couldn’t program. They had a pretty bad dead sea effect and basically relied on their team leads to do/fix everything their teams produced.

    In the second company 50-60% of the programmers couldn’t program. The amount of technical debt at that company was staggering. They would have to do a complete rewrite of their applications every couple of versions just to be able to add new features. There were a few good programmers who tried to keep everything together and mostly running but they would quickly get promoted until they were managing people rather than code so any benefits they brought would be lost after a few years.

    In the Fortune 500 company I was a consultant on a small team that wrote libraries for their websites to consume. Of the three employee programmers on the team two were not very good at all (one was the tech lead) and the other had potential but was still young and will never reach his potential if he stays with that company. The two team members who were poor programmers didn’t really grok fundamental concepts like abstraction, encapsulation, or object oriented programming in general. All of the consultants on the team had given up on trying to write good code because the team lead would just go and destroy it while “refactoring” the night before a demo so I have no idea what their actual skill levels were. Based on the company’s websites and the support questions/complaints coming in from other teams, I don’t think think the situation was very different from any other team in the company.

    So while 99/100 probably isn’t right there is a large percentage of programmers who are not able to write good code. If you haven’t seen it you’ve probably been really lucky with the companies you’re working for. The only other option is that you’re one of the people who can’t program so you aren’t even aware of the problem in your company(s).

    • You actually touch on several points which I consider issues, such as promoting away your best people, hiring badly, not having the courage/ability to fire people, tech debt and a whole bunch of others. Each of those deserves a separate post and infact I’ve been planning to write about some of this stuff for a while now.

  • Mr mouse

    Have you tried to hire people?

    I’ve done recruiting for months at a time and the general hit rate is 3-4 per 100 to get an offer. That includes only good resumes and an initial HR screen.

    It seems the best way to hire is through people you know or people who you see at user groups, putting an ad up is a very inefficient way of hiring.

    • It is a fact that you hire the best people through referrals, unless your existing people are already average or worse in which case you just get more of the same. HR screens are totally unhelpful in our profession and I wouldn’t trust the fact that they aren’t discarding the best people and pushing through the worst.

  • curmudgeonly troll

    Only 20% of people in any given profession really know what they are doing.

    Doesn’t matter if they’re auto mechanics or doctors, the 80% apply simple heuristics and recipes they learned for the vast majority of common situations, and are out of their depth outside of them.

    • That’s approximately how I feel too, although my percentages are a bit more fine grained than that :).

  • Stan

    Alan, I’d love it if you were right, but in my experience, the exact numbers may be overblown, but the overall sentiment is correct.

    I’ve interviewed 50+ developers for open positions over the past 3 years, and maybe 5 to 10 of them could successfully complete the simple programming assessments that I give every candidate:

    1) In any programing language (or pseudo-code): Create a program that accepts an integer from the user and outputs a palindrome [reads the same forward and backwards] (I provide the candidate with verbal & written descriptions of the simple algorithm: i.e., reverse the digits, add reversed value to original number, repeat until palindrome is encountered). I got this idea from the “Java Cookbook”.

    Using a small portion of the Northwind schema, write:
    2a) Simple single-table SELECT query
    2b) SELECT query requiring a single INNER JOIN

    Every candidate that I’ve interviewed had at least 5 years of programming work experience, and all but two of them were currently employed as a software developer.

    • Hi Stan,

      As I said in some of the comments above I believe it is left over “hiring debt”, possibly from the heady days before the .com crash where everyone could be a programmer as long as you didn’t have a pathological fear of computers. Those people were not what I would consider a programmer, but then again, what does constitute a programmer. But I do feel your pain as I said in the article these kinds of crappy applicants make finding decent developers really difficult.

  • Start a public-facing REST API, it’s a quick way to meet some of those 99. I support one such API, and while the number certainly isn’t 99%, at least 50% – and maybe 75% – of emails are because someone couldn’t translate a copy-and-paste curl example plus query parameter examples into their language of choice.

    Another 10-20% run into problems with things I’d say are pretty basic (and easy to solve with google), like differentiating a 404 from a 420/42x (even though both are mentioned in the docs), repeatedly trying GET when every example says POST, or passing no credentials (when curl uses basic auth, the docs say to use basic auth, and without it, the requests would be unauthenticated).

    So, the bar is pretty low. I doubt all of those folks are applying for full-time SDE-style positions, but they’re part of the programming community and are trying to code.

    • Hi Troy,

      Sounds like you’ve been through some pain, those people are trying to code, but as said in the post, it is all symptomatic of the fact that these days everyone thinks they can be a programmer, you do a bit of googling and you’re good to go. I don’t see too man people trying the same thing with surgery for example, or even their own taxes (unless they are really simple). It is a whole separate issue from which our industry suffers.

  • frizzo

    I have to call bullshit on Jeff’s fizzbuzz problem. I interview developers on a fairly regular basis – lately, like 2-5 a week. To weed out the clueless among them, I’ve developed a set of 5 really simple problems, of which fizzbuzz is one.

    Out of all these problems, it is a very rare occasion when the person fails fizzbuzz. They fail other problems, but almost never fizzbuzz.

  • LucaB

    Mediocrity knows nothing higher than itself, but talent instantly recognizes genius. – Sir Arthur Conan Doyle –

  • Terry

    I really liked your post and your willingness to speak out against popular opinion. One thing I did find funny though was your comment that people don’t sit back and think “I wish I was one of the good guys instead of being part of the 99”, because I actually do consider myself to be part of the 99, haha!

    Seriously, I don’t think many people would consider me a programmer, but I like what trying to do it anyways both for a career and just for my own fun projects. Maybe someday I will become a guru, but I am not even close to that right now. Anyways, thanks again for your honest opinion, much appreciated.

    • HI Terry,

      There is nothing wrong with being aware that you have lots of things you need/want to learn (I am the same). This doesn’t make you a programmer who can’t program though :).

  • Hey. Reversing a singly linked list in C is hard. If you can do that, you can program. And if you can program, you can probably find a job. Let me see if I can solve this problem in 30 minutes. Then at least I will know whether I am a real programmer or not. Btw, I do have a job. But I worry about keeping one.

    • I did what you did, went off and reversed a list myself just to make sure I haven’t become a dumba$$ in the last few years :). It actually ended up being an intersting experience for reasons other than reversing a list, I should write about it.

    • Dan

      Hmmm…reversing a linked list in C is VERY easy. At most it should be an O(N) operation requiring no recursion or tricks.

      Even if someone can’t figure out how to do it in-situ they should at least be able to do it in less than 5 minutes by using a second list (ie, Moving A->B->C->D from one list to a new list (using front insert) should automatically reverse it to D ->C -> B -> A).

      I’m amazed that ‘programmers’ would think this is even remotely hard.

  • Evan Smith

    By definition, 100% of programmers can program. :)

    • Haha, yeah and everyone else must not be a programmer, good one :)

      • That’s pretty much how I actually read your post.

        You say people who call themselves programmers but can’t program, aren’t programmers.
        That doesn’t mean that there aren’t 99 people who falsely call themselves programmers for every real programmer. :/
        (I’m a lazy hobbyist who needs external motivation to do anything, so don’t expect to find anything even slightly awesome at my site.)

        • This is getting almost as complicated and circular as a temporal paradox :).

  • The numbers don’t surprise me too much. I am currently studying IT at university, and am appalled at the level of skill shown by most other students – particularly those in their final year as they have less excuses. There are only a few students that I would let edit the code in any of my projects. And all of them are – like myself – the students who the school pay as tutors, and who get near straight 7’s (here a 7 is equivalent to a A or A+). I pity whoever employs the rest.

  • Consultant

    Another way to extend the headline is “99 out of 100 programmers can’t program – the way I program”. I’m a consultant which is another way of saying I’m a legitimate job hopper and thus get to see a great many variations on how to program. Every time I join a new shop the teamlead or architect fills me in on how things are done the right way. He is an anchorman in the company – typically he has been with the same company for several years or if hes a consultant then hes been in a position that allows him to define what aspects of programming to focus on to do it right. I nod my head and confirm its the only way to do it right – in fact I express enthusiasm about the frameworks the shop uses especially the homemade ones. If the way the shop programs is not threadsafe, is filled with inefficient manual procedures, has massive productivity loss because of homemade solutions with no documentation.. Don’t tell them because its a strong indicator that you don’t know how to program.

    • I think that’s a somewhat separate issue, but I do agree that sometimes you project your expectations onto the applicants and if they don’t immediately meet them you see it as failure.

  • Alex Yap

    Having taught Java programming to graduate-level students in a local Melbourne-based IT college a few years ago, I definitely agree with “9 out of 10 can’t program”. Forget about writing any useful algorithm, I’m talking about not being able to understand basic constructs like conditional statements and loops.

  • To Me ,i don’t care a dam think about list.That’s even not related to real life.I want a programmer understand real life.

  • mick

    Almost everybody considers himself a good car driver, and almost everybody considers the vast majority of other car drivers bad ones. Me too. I guess it’s the same with programming. The situation is similar to what Paul Graham describes in “Beating the Averages” (http://www.paulgraham.com/avg.html). There he talks about the power of languages: since programming languages come with different degrees of expressive power, there’s a slope from the very powerful ones down to the very powerless. A programmer who’s fluent in the hypothetical language “Blub” somewhere in the middle of this slope looks down on the languages with fewer expressive power, knowing Blub is more powerful. But since he thinks in Blub, the more powerful languages he cannot perceive as such. What he sees when he looks upwards is all this strangeness and all those weird concepts that might look good in a doctoral thesis but seem utterly useless to him in practice. In fact, he doesn’t even know he’s looking upward.

    IMO it’s the same with programming skills in general. There’s a slope of skillfulness of programmers. Programmers with fewer skills than me I recognize on the spot. They’re below me on the skill-continuum. Programmers above me I don’t recognize, all I see is the strangeness of their code and all those weird concepts that might look good in a doctoral thesis, but… .

    This might explain the number of 99% bad programmers: every programmer is bad who’s significantly below me on the skill-slope. The ones above me I don’t recognize as such, so it looks like there aren’t any. The ones at par are the 1% good programmers of which I am one.

    On the other hand your argument seems also flawed: calling bad programmers pseudo-programmers (which means: non-programmers) leaves only the non-bad ones – per definition. That’s like saying there’s no bad music since that would be non-music (or pseudo-music). This kind of classification came down to us from Plato and his theory of ideas: being an concrete representation of an idea (in the platonic sense) is the same as being a good one. Bad representations of an idea don’t even represent it.

    But how to differentiate good from bad programmers? IMO by measuring the code they write against the rules of proper software design. Is it working? Are there regression tests? Is there low coupling and high cohesion? Is it easily understandable for anyone who can read the programming language it’s written in?

    Being able to reverse a linked list is nice but no measure of how good a programmer one is. That can be looked up in TAOCP.

    • What you say makes sense, I also liked that essay of Paul Graham’s, it is difficult to draw the line between people I would consider pseudo-programmers and those who I would consider professional programmers. There is no doubt that there are crappy professional programmers around, my point is that even though they are crappy, they are not so bad that they couldn’t understand simple conditionals. There is a difference between crappy as judged by the standard of other professionals and crappy as judged by the general population.

  • ah , nice post . so are you one among that 99% .. lolz..

    • Ha, I’d like to hope not, but that’s probably not for me to say :)

  • Good article.

    Being prepared for interviewing people and having a plan for what you’re going to do are vital to getting decent people. If it is treated as an incidental process your results will not be good. Parsing resumes to find things out before speaking to someone and asking some probing (especially behavioral) question before a face-to-face interview is very effective.

    I included simple tests like “fizzbuzz” into the last round of hiring that I did and it worked quite well. Being the guy who in the past has choked during various exams I can empathize with people not wanting to be put on the spot, but when an applicant just flat out refused to even try it was a huge red flag for me. What would this person do with the first challenge they encounter? Throw up their hands and declare it impossible? One hire struggled with it a bit, but worked it out on a whiteboard and spoke through the thought process. To me that showed that at least a problem would be approached and analyzed and SOMETHING attempted.

    (small grammar Nazi ding: s/stop the from/stop them from/g)

    • Hey Todd,

      No matter how hard I edit, grammar and spelling mistakes always seem to sneak in anyway, it’s annoy, but I try to think of it as one of those universal mysteries we’ll never be able to explain :). I do love the format of the correction though, vim FTW :).

  • Squirrel

    Reversing a linked list in C isn’t that hard. You just have to prepend nodes to the result (reversed list) as you remove them from the original list. (I just typed this code in without testing; hopefully it doesn’t have bugs.)

    struct list_node {
    void *data;
    struct list_node *next;

    struct list_node *reverse (struct list_node *list)
    struct list_node *result = NULL, *p, *next = NULL;
    for (p = list; p; p = next) {
    next = p->next; /* save next pointer, since we need to modify it */
    /* Prepend current node to result: */
    p->next = result;
    result = p;
    return result;

  • Korny

    I think it’s essential to have multiple levels of triage, when going through candidates.

    I used to work for a small company that had a standard phone interview before any other processing. The jobs all required Java knowledge, and most of the phone interview was just to weed out folks who knew no java at all. The vast majority of applicants failed the phone interview – in fact, from memory, 50% failed question 1:
    “what is the difference between a String and a StringBuffer”

    You didn’t need to be precise – you just needed to mumble something vaguely informative that showed you understood the difference.

    In a bigger company, that’s where the HR screen (or the agency ‘filter’) is useful – it is no guarantee of any sort of real quality, but it weeds out the *totally* incompetent.

    You still need a coding challenge, of course – open book is fine, it encourages the incompetents to cheat, which will become obvious when you ask them about their code in the interview :)

  • LucaB

    few additional thoughts:

    Fact of life # 3 : We don’t figure out how things work. We muddle through. – Steve Krug, Don’t Make Me Think!

    So, I agree with curmudgeonly troll: most people, in every imagined field, simply don’t know what they really dealing with. You can’t blame us, life, and job, is horribly more complicated than what our brain was designed for.

    Besides, you talk about “software industry”: here is a point.
    Maybe in some specific fields, software can be considered an industrial activity: take aero-spatial engineering, or driver for electro-magnetic resonance machinery. Even in these fields though, I guess that software is not really industrial, I would consider it more as a scientific-research branch.

    In many other fields, you could consider that software may not be an industrial process. We all know there is a lively debate about this topic. Nevertheless the debate seems to be justified to me.

    So, if you talk about industry, and you hire as you were acting in an industry, it’s likely that all you’ll get will be industrial workers.

    Can you blame an industrial worker, if he can’t build an entire vehicle, or a microchip, or whatever, from the ground up?
    You hired him to tighten the screws – and, above all, you treat and pay him like that. Odds are good that it is all you will get.

    • I kinda agree with you, but I do have to point out that “industry” and “industrial activity” are different things. I say industry as in profession, e.g. developers are part of the software industry, doctors are part of the medical industry etc. The stuff you say about industry would apply if we talk about a hypothetical “software manufactory” of some sort. But, I do see where you’re going.

  • Tom

    I know a lot of very good programmers. The reason you don’t see them on interviews is that their current companies value them, so they don’t leave.

    Here’s the thing I have found out. The good companies know how to interview to get the good developers. The know what is relevant in an interview (personality, conformity, good technical questions) and what is not (overly technical questions without Google handy, certifications, outside work interests).

    If you want to find a good developer, take some time and read up on how to interview. It will save you a LOT of time.

    • Amen to that, I will cover some of this stuff when I get around to writing that article on preparation that I mentioned in the post :).

  • That is really interesting. I have had good luck with finding programmers but i also go by referrals. I think it is a good idea that you test them to make sure they are even qualified before you waste your time and money.

  • sybrix

    Good programmers are extremely hard to find. And you can validate this doing 2 simple polls: 1) Ask the programmers you know how many good programmer they know
    2) Contact any recruiting/staffing company and ask which them if programming positions are hard to fill

  • Pingback: Weekly Link Post 166 « Rhonda Tipton's WebLog()

  • Pingback: Hiring Programmers | Thought Clusters()

  • Is this and education problem? “Programming” is an art.. not all people are artists. Many of the people comming out of college tech classes are copycats. They can mimic the code the see on a blackboard but when it comes to being able to see what they are trying to accomplish… well they can’t see the whole picture, let alone the little piece that is in front of them.
    Hiring is not a whilly-nilly process of picking the first body that walks through the door either. I like the “brmore” approach, that time consuming test that allows you to really know what someone is capable of, and then making damn sure that his trainer/mentor sets him on the right path is critical and sets him up for success. I wish everyone conducted those kind of interviews. This was a great post, thanks for the effort.

  • Samuel

    I just discovered this website, but i’ve read about the 1 out of 100 program earlier and i just wanted to say I think it’s very hard to correctly estimate your skill level.
    I’m a first year computer science student and i see a lot of people struggling with basic conditions / loops etc, or still trying to patch everything into one class, when clearly you should apply OOP principles, or sticking to bad styles they had from their hobby-programming, and in general i would (without being too vain i hope) count myself to the better programmers of the class.
    Now when i go on stackoverflow though, all of a sudden i feel like the most stupid programmer on earth. Everybody seems to know so much more than myself. But when i tried to determine in what all those members are better than me, I think it’s often language details or language concepts that i haven’t heard of or grasped yet. (And of course most of them have more experience).
    So i think you should differentiate in what people you are interested: do you want a programmer who writes code for a restricted range of problems, very language oriented, or do you want a programmer who comes up with solutions to general problems and maybe implements them.
    I think in every case you certainly need a basic understanding of programming, but for some jobs you might actually not want to ask to specific details, which the programmer will learn by doing but focus on the aspect of solving general problems.
    So why i think everybody should be able to write code to reverse a list or that palindrome problem, but depending on the later field of occupation you might want to refrain from asking too specific programming questions at start.

    (My opinion, i might contradict myself in a couple of years :p)

  • Pingback: If Google went down, would you still be able to code? | batikhasafra()

  • Jeff Overcash

    Someday I wish to live where you live or to have the hiring habilities you have. Because today I can’t help but join my voice to the crowd who says that 49 in 50 applicants JUST CAN’T CODE. PERIOD.

    Last week I received ~70 resumes. All of them “programmers”. No one stellar. I sent to them two basic programming questions. Only 4 answered me. 2 were wrong.

    I know. Must be my fault.

  • Brandon

    I personally struggle when it comes to bragging about myself in interviews. The reason is because I am a humble person by nature, and having the mindset of “I’m the best” only hinders your performance. I have only programmed for 1 1/2 years, but I know more and can do more than “programmers” with 3 or more years of experience (maybe even more). I am also very capable of working in teams. The problem is that interviewers can’t truly see my skill level based on the questions that they ask. I do have a creative mind, but sometimes it’s hard to think on the spot when you are being interrogated. It’s one of the most frustrating things coming from a technology institute and seeing “programmers” cheat night and day. Then they get the interview with Google over me. Google then realizes they are a waste of time, because they don’t actually know anything. *Shake my head*

    • If interviewers can’t see your “skill level” it’s not their fault, it’s YOURS.

      If you don’t get at least an interview at Google, it’s not Google’s fault, it’s yours because you did not know how to sell yourself appropriately.

      Being humble doesn’t stop you from highlighting your achievements. Otherwise you look just like anybody else, and you will not get hired.

      • threni

        Ridiculously peremptory.

      • Brandon Chapman

        This is honestly one of the dumbest posts I’ve ever read online in the last 25 years of using the internet. Everything you said is entirely presumptuous nonsense.

  • 99% of programmers are awful. And I will tell you why. They are hired, especially by the larger companies, on the basis of their “personality” and “conformity”. Although Alan and Tom thinks these are correct priorities – this is the root of the true awfulness. “conformity” means average, and average means stupid – stupid people like other stupid people, and that is how the world goes around. I could tell you hundreds of nightmare stories – but the one that broke the camels back for me, and made me want to have nothing to do with the software industry ever again, was having to support a team of Microsoft programmers. Their lack of technical aptitude was indescribable – forget reordering linked lists, some of these guys could not access the command line. They were spoon fed dopes – and that is the way most corporate programmers are.

    • I’m gonna call bullshit. “average means stupid”. I’m pretty sure average means average. You are with the mindset that everyone is an idiot. If you are that cynical in real life, I can see why you don’t have a job as a programmer, where communication skills are a must.

    • Yawn

      and yet for some reason I get the feeling that you’re the problem…

  • Unwanted speaker

    I attended university both in the home of von Neumann and in Massachusetts as well, and I have to tell you that it’s mostly an educational issue. In Hungary you have to pass an entrance exam filled with puzzles, because you need a certain mindset to be an effective programmer. You can teach a monkey to code, but if you don’t understand the problem you are screwed. They also teach high level accounting and economics, so their graduates know about real life problems as well. They teach several languages (assembly, pl/I, basic, c, etc) on multiple platforms (IBM mainframes, PCs and microcontrollers). Over here I went to a well respected school, but there was no entry exam at all. It was enough to have good grades to get in. Students with no prior experience failed to grasp anything, they became copycats, they tweaked boilerplate code to meet their needs and they would never even attempt to try write an app from scratch. The other group who already worked in the industry but needed a piece of paper barely learned anything new.
    Another issue is the available tools for development. Since Visual Basic released everybody thinks they can be programmers. You drag an drop some components into a view and copy some code from the internet and you are done. These are the guys I would call “pseudo programmers”. You can find these people on freelance websites. They win tons of bids, because they are willing to work for beans. But at the end the project will end up on a real programmer’s desk and as a result customers think all programmers are lousy.

  • Michael Phoenix

    Thank you for some reality on this issue…

  • bad programmer

    Well, i guess I’m one of those guys, who can’t program. Here’s my story. As I was looking for a job for half a year, failing all these “simple” problems, I thought to myself “Hey, I haven’t done anything real, I should make something and show it, maybe I’ll have more luck”. So I made some blogging engine in a day or two and went on applying. Couple of my friends started using the engine and posted stuff on it and it seemed like it was really working and people were using it. So I went on to this interview, where I left a really bad impression of myself once again, and the guy was already trying to get rid of me, when I showed it to him. I told him how it worked, how my content was cleverly held in XML files, how the XML files were structured like DB tables, how the jquery was doing all the frontend functionality, the PHP classes. He was impressed and actually surprised. He saw that I could get something done. Anyways, I was hired and it’s a startup company. The site shut down briefly after that. Now I’ve been working here for 1.5 years doing Java Spring web apps and getting bored. So I’ve started applying again and like earlier, still failing miserably. So I guess, what I’m trying to say is : all of these guys failing, can’t be that they can’t program. There’s something wrong with your process. What I’ve noticed is I get really nervous and I don’t like bragging about myself. The nervousness makes you really dumb and you can’t get anything done. I’m not that great at math, I’m actually ashamed that I’m not good at it and if some guy starts asking me these math questions, I f**k up. If I wasn’t in this position, I would get the answer right. I’ve done all the linear algbera, discrete math courses in university. I’ve been there once, but it’s not like I can remember all of it right on spot, I have to look it up and then it comes back easier. The linked list – I never use it, so I can’t remember the mechanical procedures, to relocate the nodes, it takes time to remember. Recursion – Yes, I am using it sometimes, but if some guy asks me to do it under pressure, I definitely f**k up. Binary search – What? Sorry, I did it once in my algorithms and datastructures course, but I see no point in doing it again. FizzBuzz – I’m guessing if you’re challenged with this, the first thought that goes through your mind is “It can’t be this easy” and you fail over analyzing it. You can’t expect the guy to remember stuff he never uses. Plus the person is not that concentrated on the problem, cause there are million thoughts going through his head. You can’t do a mindjob, if you’re under pressure. I’d say there are atleast 50 out of 100, who can get stuff done, it’s the pressure that ruins your mindjob abilities.

    • Programmer

      You are speaking the truth brotha! Your words sing to my life story. What you do as a “programmer” sometimes goes out the window when you are in front of an interview panel. Simple questions that you really do know the answer to sometimes comes out as “I don’t know” during the interview process. Although I do not really agree with the recursion (how can you not know when to use algorithms to make a process/function easier/shorter), I can agree to messing up data structure questions or “pop-word” questions like, “Are you familiar with REST?” It’s a dumb question, especially when your resume indicates that you are familiar with using REST, and the way you are asking that question (in today’s society where EVERY programmer is familiar with REST) becomes a trick question. Just fucking ask if you are familiar with HTTP Requests and stop with the dick holding contests. Tech interviews are the worse. Just keep plugging away my programming brothas, keep interviewing, keep applying, and keep practicing. Someone will hire you eventually, it will just take some time.

    • Evan Grantham-Brown

      As a guy on the other side of the process (not a manager, but a dev who participates in job interviews from time to time), what I’m looking for is simply: Do you know how to program? We give you tests and ask you questions, not because we’re sadistic Dilbert bosses, but because we’re trying to find that out.

      If you freak out in interviews, but you’ve got something cool that you built on your own time, just tell me, “Look, I know I didn’t do so hot on the test. I freak out in interviews. But I’ve got this thing that I built on my own time, and I brought my laptop with the source code, if you want to see it.” Then put the laptop in front of me, with the source code open in one window and the working program in another. I’ll play with it a bit to see that it works, look over the code, and ask you a few questions. If your code looks decent, that’s good enough. You know how to program. I don’t care how you prove that to me as long as you do.

      This won’t work with everybody, of course. But it will work with reasonable people, and the unreasonable ones, you probably didn’t want as co-workers anyway.

  • Josh

    If you all want to know why so many programmers are bad, why not consider the fact that, these days, many companies expect new developers to know entire software stacks and produce applications from ground-up. Not to mention the fact that they fire entry-level and junior-level developers long before they’ve had time gain necessary experience.

    I’ve been programming for a little over a year, and I have tried my best to master everything I can while finishing college. I earned an MCP for HTML5 development with CSS3 and JavaScript, learned C#, Java, database design, T-SQL, SSRS reporting with BIDS, graphic design using expression studio, UML 2.2, and on and on and on. That’s not even getting into the hardware side of the house, building web servers, learning MS Server 2008 r2, mastering IIS, port forwarding… I could go on for a very long time here, but you get the point. It doesn’t matter how hard ‘new programmers’ try, or how much they learn on their own, because from my experiences, we’re all shitty programmers unless we’ve been doing it for 10+ years.
    Programmers who started their career 10 or 15 years ago had it easy. Hell, you could make 50k a year knowing nothing more than HTML and some CSS. Plus, nothing existed back then. You didn’t have employers grilling you about 40+ frameworks for 6+ languages that came out a week prior to your interview.

    For us new developers…. it’s like be thrown into the middle of the ocean with no land in sight and us asking senior developers which direction we should swim. Sadly, instead of getting a simple North, South, East, etc., all we get is… one developer saying ‘South’, one saying ‘North’ and another saying ‘it all depends’, then bitching when it takes us so long to reach land and canning us without an answer.
    I understand that there are some developers out there with egos. I’m sure some have earned them, but programming is a skill like any other and it can be mastered by ‘anyone’ in the exact same way- Ambition and patience.
    ps. Apologies for the long rant, I think I’m just getting burnt out.

    • Wow. Never seen a better opinion on the subject. “‘anyone’ in the exact same way- Ambition and patience”. Amen.

  • Enola Labs

    Looking at this post 8 years later, and this statistic is still thrown around. It seems very unlikely as unemployment rates for developers are so low.