
Why Can't Programmers Program? (2007) - 0xmohit
https://blog.codinghorror.com/why-cant-programmers-program/
======
cbanek
I'm really conflicted when I keep hearing that programmers can't program,
especially in such a high number (199 out of 200).

I've done a fair bit of interviewing (on both sides), and while I've seen some
bad people, it seems like if 199 out of 200 candidates couldn't write code,
then we'd have a lot of out of work coders, since as everyone also complains
about, everyone has to write code when doing interviews.

Just because someone can't do exactly the type of program you're looking for,
or in a particular way, doesn't mean they can't program. It only means they
couldn't program what you asked in the way you asked. A fail for sure, but
that doesn't always mean what you think.

I always like to let a candidate go to their strongest area, if that is a
particular technology or problem, or bit of code they've written, because then
I know I should be able to ask them deep questions (performance, design
tradeoffs) that actually matter on their job, instead of fizz buzz or
inverting a binary tree.

There's also just the possibility of nerves, or other factors as well. It's
fun to follow people on linkedin and keep up good relations even if they're a
no-hire, to see if your hunch was right, or dead wrong.

~~~
jasode
_> hearing that programmers can't program, especially in such a high number
(199 out of 200)._

Fyi... that 199/200 quote came from J Spolsky that he got from D E Shaw.[1]
That's a hedge fund and like other computational finance firms, they would
look for strong programmers who had very good math skills (statistics,
probabilities, etc).[2]

Therefore, the typical web programmer who knows the difference between HTML
tags and CSS selectors, or knows text slicing with Python/PERL, will not pass
the rigorous interviews. Using that criteria, it's very realistic that less
than 0.5% of applicants would be hired.

Another way to put it: those trading firms are looking for _math nerds_ who
happen to know how to program more than programmers who happen to know some
math. Including them in the general discussion about _" what's wrong with
hiring"_ will skew the discussion. Most everybody else is just looking for
CRUD/web/iOS/etc programmers.

[1][https://en.wikipedia.org/wiki/D._E._Shaw_%26_Co](https://en.wikipedia.org/wiki/D._E._Shaw_%26_Co).

[2][http://www.streetofwalls.com/finance-training-
courses/quanti...](http://www.streetofwalls.com/finance-training-
courses/quantitative-hedge-fund-training/quant-interview-questions-answers/)

~~~
laughinghan
Does it make me a math nerd if I point out that accepting 0.05% of
applications would mean rejecting 1,999 out of 2,000?

TL;DR: I think you mean 0.5%

~~~
edoceo
0.5% of pontificators can pontificate

------
carapace
I taught myself to program as a child, and I didn't know any other programmers
until I was around thirty and took my first professional job as a programmer.

To me it seems like 60% to 95% of the people employed as programmers _should
not be_. In other words, most people cannot program, even if they are working
as programmers.

:-(

I have no idea what, if anything, to do about this.

(It absolutely shocked the shit out of me the first time an interviewer asked
me to write fizzbuzz. He had to convince me he was serious. Double-you tee
eff, folks.)

~~~
busterarm
I have a similar background as yourself but I'm not as negative about other
peoples' programming skills.

What I do find a lot of is that people can write code just fine, but they
often just do the simplest thing that they can get out the door, regardless of
whether or not they're doing things the correct way.

I often find myself refactoring systems that are hard to reason about, where
they put something into configuration that still requires a code change to
reconfigure, or deploy scripts with internecine external dependencies (bash
scripts) when the deploy platform can accomplish the same tasks.

Given enough time and guidance I find (almost) anyone can write code, but it's
the architecture stuff that's hard and I think it's something a lot of
programmers do not spend enough time working on.

------
pyb
All in all, I'd say this 'classic' post was overly influencial. It has damaged
to the software industry, and only contributed to making the hiring process
more adversarial than it already was at the time. It's no fun being presumed
incompetent everywhere you go.

More importantly, I have never met any one of these supposed incapable
programmers. A better title might have been 'Why Can't Jeff Atwood clean up
his recruiting pipeline ?'

(Or was he just stressing candidates out?)

------
fideloper
A majority of my career has been CRUD (occasionally "advanced" CRUD). Ive
worked in (and coded non-trivial things) in PHP, Python, node (lol) & Golang.
I've learned a ton of server management.

I've literally coded a linked list once, years ago, when reviewing an
algorithms book (never played in anything more advanced). I don't have a CS
degree.

Am I a programmer in the eyes of these interviewsers? It feels an awful lot
like the answer is "no". And "hope you never get an intense technical
interview!"

What do y'all think?

~~~
mseebach
A linked list is probably literally the simplest data structure in all of CS.
No, you'll probably never need to write one in real life because most modern
languages come with one, but exactly because it's so simple and so ubiquitous,
it speaks quite loudly about the level of abstraction at which you operate if
you can't implement one quite quickly.

~~~
quaunaut
Is there a problem with operating at that level of abstraction? Are we here to
serve our egos, or business needs?

I'm sure I could implement one, but it'd require googling. If that ever kept
me from a position, they could gladly keep it.

~~~
teacup50
A linked list is so simple that you _should_ know how to implement one off the
top of your head.

It's literally:

    
    
        struct list_node {
            struct list_node *next;
            ...
        };
    

There, you know how linked lists work :)

~~~
quaunaut
That's what I came up with in my head, but my issue is, in an interview I'd
not be confident with that kind of an answer. I've never done that before,
I've never had a reason to do that before. I've contributed to Rails, graphing
libraries, written docs for complex JS projects, implemented caching
solutions, written authentication and authorization backends- but this here is
like asking an architect to cut down a tree.

Sure, he can figure it out, but he's gonna look stupid for the first few
minutes.

~~~
sulam
The figuring it out is entirely the point of the interview. When I interview
someone, I need to work on a problem with them. The simpler the problem we can
work on together, the more likely that I'll learn what they're like to work
with, not whether or not they've memorized some trivia like how to implement
quicksort in 10 lines of Python.

~~~
quaunaut
That's fair, and a totally valid way of going about it. But if I'd been
devving for a few years and hadn't heard the term "linked list", and the
interviewer scoffed at having to answer the question of what it was, I get
uninterested real fast.

------
yumaikas
Should we put a (2007) on this? It is still a relevant subject, perhaps one of
the more timeless pieces Jeff has written, but it is from some time in the
past.

~~~
wiredfool
I love how the next article is titled: You want a 10k rpm boot drive.

------
Animats
Who writes a linked list in Javascript? Or Python? Or even C++? I haven't had
to code a linked list since the 1990s.

How much low-level knowledge does a programmer need today? There's an old-
school approach to computing that starts with explaining binary, then goes on
to gates, progresses to a full adder, and goes on to an entire arithmetic
unit. Few people need that today.

But they probably need to know too much about CSS selectors. Statistics is
becoming more necessary to programmers than binary logic. Programming today is
following an endlessly churning mess of APIs.

(Today's grumble: the author of the serial port library, "pyserial", decided
to change the API so that baud rate is set by "ser.baud = N" instead of
"ser.setBaud(N)", breaking existing code. This isn't progress, it's faddism.)

~~~
jean_claude
>Who writes a linked list in Javascript? Or Python? Or even C++? I haven't had
to code a linked list since the 1990s.

Neither have I, but I didn't write that bloody circular queue in SPARC-V9
assembly language for nothing!

But, seriously, so many interviews are full of these sorts of questions. It's
almost like they're trying to hire a reference book... or they don't know how
to interview and just use the same sort of methods they were exposed to.

------
msie
I know how to do the fizzbuzz and swap questions but I'm terrified there will
be that one "simple" question that I won't be able to do under 3-5 minutes.
Sorry, I don't know every trick in the book but I figure things out
eventually.

------
preordained
It's hard, man. I think most people who call themselves programmers could
write some simple programs or tinker together a really simple app that was
fragile and buggy. To do programming _right_, where your software has real
impact on people's lives and you can't afford to kinda sorta get it
right...that's not something most people have in them. And there are levels to
this. I've worked alongside people whose code made me recoil in horror. It's
like watching a toddler skipping merrily through a minefield, just no clue how
careless they're being. On the other hand, I've worked with others who pointed
out things I've done or an approach I was considering, and I've had to blush
when they pointed out how I was sprinting headlong into a world of error...but
their filter for bad logic was so fine and accurate that many other people
wouldn't have thought twice about the work in question. Computers are
machines, they're cold and unfeeling and they won't meet you half way...either
you've codified your logic and presented it to the computer perfectly, or you
lose. In other words, the best programmers may not have to be cold or
mechanical in personality, but without fail they can wield logic with
mechanical precision--as much as human beings are capable of, anyways. I'm not
sure we know exactly what we're asking when we're trying to find the meat
bodies who best interface with machines.

------
EngineerBetter
I'd rather candidates had empathy, a willingness to learn, and an appreciation
of testing & CI, than the ability to implement a linked list in under 10
minutes.

In over a decade of software development including web systems, games
development, command line tools and distributed systems, I've never had to
implement a linked list. If you haven't used the modulo operator, FizzBuzz
isn't necessarily obvious.

~~~
mseebach
If you don't know the modulo operator, your claim to be a good programmer is
rather suspect, so that's probably OK.

~~~
busterarm
Where have you ever had to use the modulo operator in your programming career,
especially on the web side of things?

Outside of challenges where it's almost required (FizzBuzz), the only thing
that I can think of that I've ever used modulo for is to set an upper limit on
random numbers. I can probably count the number of times I've needed to do
that on one hand and for every one of those I've used several hundred other
math functions like abs, floor & trig functions.

I don't really do a lot of math in my code anyway.

It's one of those things I see how to do in the language when I'm first
learning the syntax and then move on.

~~~
jasode
There are lots of everyday uses (not mathy domains) for % operator.

Some examples...

Outputting a text report with columns. If there were 5 columns, use the
"col=i%5" to put it in the correct column as "i" is incremented.

date/time calcs such as...

x%7 is often used for day-of-the-week algorithms

x%3600 and x%60 is often used for converting raw seconds (e.g. convert 86400
seconds per day into hh:mm:ss)

(If programmer doesn't know modulus "x%7", he might hardcode a big switch
statement with 7 cases -- which will work, but it's not as elegant.)

round-robin in discrete integer values --> use % modulus

round-robin in continuous values --> use trig sin(), cos()

~~~
busterarm
Working with dates and time has so many edge cases and gotchas that I think
it's irresponsible not to use a library for working with them. Any good
Date(Time) library should abstract this away from you.

Say Hello to Leap Seconds for me.

~~~
jasode
It's common to have a value called "total_elapsed_seconds" which comes from
job logs, traces, etc and "leap seconds" wouldn't be relevant. You just want
to "pretty print" it into hhh:mm:ss and %mod is the easiest way to calc that.

I've used % for various unrelated tasks for more than 20 years. Another
example... in languages that didn't have bit shifting like C/C++, I used % to
convert bytes to a hex string (e.g. x%16).

~~~
busterarm
I guess what I'm saying is... is calculating it easier than going:

    
    
      x = Time ( now )
      ...
      total_elapsed_time = Time ( now ) - x
      print strftime ( total_elapsed_time )
    

I've actually used your hex example once before!

------
raister
I believe that students feel that everything is possible to accomplish with a
library, let's say, <list>. When you ask them to create a list by hand (using
classes or structs), they simply don't know, because they always used the
library. This is the plumber analogy: "they know how to _connect_ the pipes;
they don't know how to build them."

~~~
Retra
This is the exact opposite of my problem. If you ask me to use a list, I'll
roll my own every time. Ask me to do anything, and I'll go to paper and try
designing a data structure. Ask me to setup a web page and I'll probably start
designing my own web protocols. :)

~~~
raister
do you have infinite time?

~~~
Retra
If you can't build something yourself, then you won't know how it works and
what the consequences of the relevant design decisions are. I do it because my
goal is to learn how to do things right, not to get things done quickly.

~~~
ownagefool
That's cool, and I indeed like to understand things too, but how do you
deliver anything of value to a business if you start of designing a CPU? ;)

~~~
lostlogin
CPU? Your jumping all the vital underpinnings. What if the copper was of low
quality or the silicon was a low grade? I'm in a cave rubbing sticks together
to make fire.

~~~
sn9
What an absurdly high level of abstraction to begin with.

First, I create the universe.

------
thedevil
I like coding questions because I have an easier time then most.

That said, I have sympathy with those who struggle with whiteboard questions.
Even for an easy problem, you have to context switch to the language and
problem type then simultaneously communicate and code, without the environment
and tools to which you're accustomed.

It's easy to forget some basic concept or misunderstand the question just
because you're not in your element.

Edit: That being said, there's plenty of developers that can't code. But
there's plenty of false negatives in interviews too.

------
skybrian
What's changed since 2007? I'm under the impression that interviewing
standards are much higher than they used to be. (Sometimes terrifyingly
arbitrary, but higher.)

------
GreaterFool
There has been a recent proliferation of posts raging at even the simplest
programming questions. Fizzbuzz? Unrealistic so what's the point? DFS/BFS?
When was the last time you needed to write BFS/DFS _in real world
application_? And so on. So maybe it is 199 out of 200.

------
johansch
This is so weird and arbitrary. Of course if you accept any random person who
applies to any job, sometimes because they have to apply to jobs to keep their
benefits, yes, you'll see a lot of people who have no clue.

