
The Surprising Number of Programmers Who Can’t Program - mooreds
https://letterstoanewdeveloper.com/2019/08/23/the-surprising-number-of-programmers-who-cant-program/
======
overshard
This also fails to point out the surprising number of developers who know
their algorithms, know every "coding question" for whiteboard interviews, can
copy and paste a ton of code off of StackOverflow to create a quick mockup but
also still don't know how to code.

I've known some very talented developers who could never pass a standard
software engineering interview but if you give them a week to create a project
they'll have something to you that works.

I've also known some very talented interviewers who have never completed a
project from start to finish.

I think we just need to all agree that interviewing is hard for Software
Engineering and no one has a good solution for it yet. I am constantly on the
lookout for someone who finds something that is both effective and doesn't
waste a ton of time for both the interviewer and interviewee.

~~~
ellius
Here's mine:

1\. I ask about prior experience, following up on any interesting resume items
or comments. I try to act like a "biographer" (per the book "Who") and just
learn their story.

2\. I ask them to describe data flow in a basic web app. If I push this UI
submit button, explain the progression of data from the client to the
database.

3\. I ask for an explanation of core concepts of the framework I'm
interviewing for or any one they've used.

4\. I ask about version control concepts and some specific git commands.

5\. I ask about prior team practices, e.g. what types of meetings they have
and what the interviewee thinks of their effectiveness.

6\. I ask about their knowledge of ops/DevOps, e.g. explain how a pipeline
works.

7\. I ask about basic CS/object orientation/language concepts, e.g. static vs.
dynamic typing.

8\. I ask what their most interesting project or story was and why it
resonated with them.

9\. I ask what their toughest debug was and how they solved it.

10\. I ask about their experience with testing and opinions on how best to do
it.

Between all that you get a pretty decent picture of what level they're at and
what is their capacity to learn.

~~~
MperorM
My problem with this style of interview, is that someone like me, who is a
mediocre programmer, but stellar communicator will fare MUCH better than
someone who is a brilliant programmer but poor communicator.

I spend lots of time reading about smart people's opinions on programming, and
will be able to recite that knowledge and play it off as my own hard-earned
experience. I could talk for an hour about tradeoffs between Vagrant and
Docker, without ever having spent more than a few hours actually working with
Docker.

If the interviewer is really sharp they could maybe dig deep enough until they
see that there's nothing beneath the surface, but I suspect most wouldn't do
so even if they were capable.

~~~
ellius
It depends on what you need. If I need a Docker expert, you can be sure I'll
tailor my interview to a Docker deep dive with very precise and detailed
questions about commands, concepts, etc. The first step in any interview
process should be to think very clearly about what you need and to then adjust
any template you have to those needs.

~~~
MperorM
Yeah, I was mostly thinking in the context of a junior role. Generally
bullshitting of any kind will be caught out. My point is not that someone
could bullshit their way through an interview of this style. It's rather that
I think it unfairly favours people with a lot of general and high-level
knowledge, over someone with strong fundamentals.

------
gervase
When I was running hiring at a previous startup, we ran into this issue often.
When I proposed adding FizzBuzz to our screening process, I got a fair amount
of pushback from the team that it was a waste of the candidates' time.

Once we'd actually started using it, though, we found it filtered between
20-30% of our applicant pool, even when we let them use literally any language
they desired, presumably their strongest.

However, it usually only filtered fresh grads (CS students from top-10
schools). Those with previous work experience almost never had a problem.

~~~
crimsonalucard
That's the thing... you feel fizzbuzz is effective but the fact that it
filtered out CS students from top 10 schools says more about the test then it
does the student.

Think about it, it takes way more work, way more intelligence to get into and
graduate from a top 10 school then it does to learn how to pass a fizzbuzz
test.

I can 100% tell you that ALL CS grads from top 10 schools can pass fizz buzz
given a day to do it. That being said I can also say literally most of your
coworkers who are administering the fizz buzz test will not be able to ever
attend a top 10 school given a lifetime to prepare.

It is incredulous to me that people can literally dismiss an MIT candidate
because he didn't pass a fizzbuzz test. Do you not realize that it is 100x
easier to learn programming then it is to get into MIT?

People need to get it through their heads. Programming is actually really,
really easy. That's why there's so many people who can learn how to do it
without going to college. But instead I see most people thinking that they are
so intelligent they didn't need to go to college because they can just learn
programming.... That may be partially true, but most of what I see is actually
just people learning programming because they COULDN'T get into university.

But it still begs the question... what is making an MIT student fail a
fizzbuzz test? It's like failing to recite a paragraph out loud with zero
stuttering to an audience who is judging your future career. How could one
possibly be so stupid and not stutter? If you stutter it must mean you can't
speak english, just like how if you fail a fizzbuzz test is must mean you
can't program.

To be honest I don't know why so many programmers fail. But I'm honestly
pretty sure fizzbuzz is so dreadfully easy that there is some other factor
that is influencing this high failure rate.

~~~
gwbas1c
> To be honest I don't know why so many programmers fail.

Because many people are not capable of programming.

More importantly, the school you go to has nothing to do with your capability
of a programmer. I worked with quite a few people in my CS department who
couldn't program their way out of a paper bag. Most were still very bright
people who I assume figured out successful careers.

I suspect a lot of the recent CS grads who can't do fizzbuzz end up following
careers that don't require programming.

It's also important to understand that Computer Science is not Software
Engineering. Computer Science is fundamentally a mathematical field. Don't
conflate the two.

~~~
crimsonalucard
>Because many people are not capable of programming.

You think too highly of the field. Programming is easy. Everyone, and I mean
everyone can do it and eventually become good at it, especially fizz buzz.

>I suspect a lot of the recent CS grads who can't do fizzbuzz end up following
careers that don't require programming.

Nah, more than likely they learn the fizzbuzz question and still become
programmers because programming is easy. It takes time to learn programming
like it takes time to become good at basic algebra or calculus, but literally
anyone can do it.

>It's also important to understand that Computer Science is not Software
Engineering. Computer Science is fundamentally a mathematical field. Don't
conflate the two.

The two fields are intricately related. Most junior devs who lack the academic
rigor like to separate the fields into a dichotomy and use this dichotomy as
an excuse to justify the lack of expertise on the academic side.

After a certain amount of time you'll realize that all of programming is
rehashing the same concepts over and over again just in a new
framework/language. To gain deeper insight into the nature of computer
programming and engineering and to actually become better, the dichotomy must
be eliminated. In the upper echelons of Software engineering, people will
realize that computer science and software engineering merge to become the
same thing. Juniors have yet to realize this.

Take this for example. Did you know that a unit test does not guarantee
correctness of a function? To guarantee correctness of a function you'd have
to write a unit test for every possible input of a function. Did you know that
computer science offers a way to do prove your program 100% correct without
writing a single unit test? This is an example of a merger of engineering and
theory. A computer is a deterministic machine amenable to proof yet we choose
to treat it like a black box and test it as it was a chaotic system that needs
to be tamed. There are advantages and disadvantages to both methodologies but
I illustrate this here to show you that SE and CS are in fact different
aspects of the same thing.

~~~
gwbas1c
Computer Science has very little to do with unit testing.

Look at things like theoretical computer science and category theory. The word
"class" comes right out of basic category theory. (You don't need any category
theory to program a computer, but it directly influenced object oriented
programming.)

And, if you think programming is easy, consider yourself lucky. Take the time
to learn some soft skills. Maybe you'll understand your downvotes.

~~~
crimsonalucard
> Take the time to learn some soft skills. Maybe you'll understand your
> downvotes.

lol, I'm not here to win votes. This is the internet. This comment alone shows
a lack of soft skills on your side. Except for when the person I'm
communicating with chooses to get personal I never get personal when I talk
about things on the internet and I never hold back either, that's part of the
appeal of being here. I can tell what I believe to be the truth without
concern for your feelings. Despite the lack of concern for your feelings I do
make deliberate effort to not attack YOU directly. I am aware that the things
I say may piss people off but in all I'm just here to talk about the topic at
hand without worrying about real world stuff like your feelings.

>Look at things like theoretical computer science and category theory. The
word "class" comes right out of basic category theory. (You don't need any
category theory to program a computer, but it directly influenced object
oriented programming.)

OOP was invented before anyone knew that category theory had anything to do
with computer science. Class most likely comes from set theory. Also if you
work with category theory or languages that implement the theory you'd know
that the morphism is central to the theory not the object. In other words it
has much more to do with Functional programming then it does with OOP. OOP has
virtually no theoretical basis and it fits into category theory in a very
awkward way.

>Computer Science has very little to do with unit testing.

It does. I'm literally talking about how it does have to do with theory.

In computer science there are two ways to verify 100% correctness of a
function. You either prove it correct given an initial condition and a final
condition. Or you unit test every possible input with the associated output.
Software Engineering chooses to go with neither approach. Software engineering
chooses to go with a tiny subset of all possible unit tests and hopes that the
correctness of that subset of tests correlates with the correctness of the
entire domain. This is a more applied math (aka statistical) approach to
verification that increases confidence but does not verify the program to be
correct. (This is also debatable how much statistical rigor unit tests have as
its a usually done with a very ad-hoc approach... unit tests are usually too
few in number and highly biased).

All of this is part of Computer Science. You will note that the paragraph
above uses the word "unit testing" Software Engineering is simply application
of said theory or application of no theory but they can be one in the same.

>And, if you think programming is easy, consider yourself lucky.

I hear parents talking all the time about trying to teach their kids
programming. Internet tutorials are all over the place. It's easy in the sense
that mostly everyone can learn it. It's not easy in the sense that it does
require a lot of effort.

What's hard is quantum physics. You ever hear of an internet tutorial that
will teach you all of quantum physics? An udemy course that will cover all you
need to know? Ever hear parents trying to teach their kid about quantum
physics? Quantum physics is hard, programming is not.

------
jofer
I've seen this first-hand both in interviewing and on the job. I expect it in
interviews, but I never thought I'd see it from a colleague.

I once worked with someone who refused to use loops. He would write everything
out... Thousands of copy-pasted lines with incrementing values... He'd often
insist that things only deal with certain numbers of inputs for this reason.
E.g. he had a bulk data transfer tool that would only transfer 10 items. If
you had less than ten, you had to make dummy files. If you had more than 10,
you were supposed to use it multiple times. He was also considered "a key
technical leader", and constantly lauded by management. He was in his late
20's and had a CS degree from a relatively well-known school. I'm a geologist,
so I was constantly told I "just didn't know anything about programming" when
I'd ask why. (I suspect he thought it was an optimization, but he never
explained.)

This was at a company that's a household name (though not a tech company). I
suppose the moral of the story is to be careful about assuming that experience
implies a certain level of competence.

~~~
tempguy9999
> who refused to use loops. He would write everything out... Thousands of
> copy-pasted lines with incrementing values

You're fucking joking us right? I've seen bad stuff but this is far, far
beyond what I consider credible incompetence. You aren't serious?

(Edit: you mention being a geologist. Happens something similar occurred - I
was being uber'd by a geologist (he described himself thus) who could talk at
length and very knowledgeably about the geopolitics of oil price and reservoir
modelling, all fascinating stuff to me. But he mentioned a fossil that he
could barely describe beyond being 'like a snail with bits coming off'. I
offered that it was an ammonite and he seemed unfamiliar with the word. Also
seemed to struggle to know what bauxite was when I raised it. I found those
lacunae rather strange).

~~~
jofer
It's not quite as crazy as it sounds. It was a case of laziness and a belief
that he was smarter than the compiler, rather than a lack of knowledge of
basic flow control.

For context, the "ten-item-only data transfer tool" was a plugin to a much
larger piece of software with a Qt-based gui. He copy-pasted an example from
the vendor that used a QLineEdit input widget ten times because he couldn't be
bothered to look up how to use a QListWidget or something similar.

The "avoidance of loops" I was referring to was mostly in the inner loops of
volumetric image processing routines. A lot of things we worked on were
domain-specific operations that are vaguely analogous to a convolution --
there's usually a moving window operation. He'd happily loop over the volume,
but insist on writing the inner loop (the actual moving window) as repeated
copy-pasted lines.

He was basically doing manual loop unrolling, which could actually make sense
in this context. (The codebase was C masquerading as C++.)

However, the compiler was perfectly capable of optimizing a loop for the exact
use cases he was working with. There was zero benefit manually unrolling a
nested loop for a 5x5x11 or 3x3x7 window (in once case he did it for a
25x25x51 window -- 31k lines of C++... Generated with Perl... Yeah...)

On the geology note, palentology is actually a fairly niche field. I wouldn't
assume that every geologist has taken a paleo class. It's usually on the "take
3 of these 5" requirement list in undergrad, and it's not something you take
at a graduate level unless that's your specialty. I certainly took a couple
paleo/evolutionary biology classes, but it's useful for what I used to do. It
wouldn't shock me if someone primarily doing reservoir modeling didn't know
what an ammonite was.

~~~
tempguy9999
Ah, thanks for the loopy explanation.

Actually any loop unrolling to that extent is counterproductive as it will
simply burst the instruction cache, which causes expensive reloads from
further down the cache hierarchy, whereas loops can be minimal or even zero
overhead. I'd be really curious to know how much performance that cost.

re. ammonites, ok, thanks for explanation!

------
non-entity
I now consider myself one of these people. I've written and shipped a number
of business applications, but have little understanding of CS concepts and was
unable to complete some leetcode problems I tried a while back. Unfortunately,
I find myself mentally unable to keep focus and and attention to properly
learn. I've looked at going back to school as well, but cost make it
impossible.

Anecdotally, i recently became semi_obsessed with operating systems and OS
development.I tried to pick up C wanting to do some kernel development on
NetBSD and thought it would be easy, given the familiar syntax, u just needed
to learn pointer logic/ arithmetic. I was finally defeated after trying to
write a program with multidimensional arrays and working with them decayed
down to pointers. At the same time, though, I _need_ a new job asap, so I've
given up on the interesting stuff and am back to learning stuff for
employability reasons only

~~~
rifung
> I now consider myself one of these people. I've written and shipped a number
> of business applications, but have little understanding of CS concepts and
> was unable to complete some leetcode problems I tried a while back.

I don't think fizzbuzz == leetcode? I thought fizzbuzz was like super basic
can you write a for loop type question.

[https://blog.codinghorror.com/why-cant-programmers-
program/](https://blog.codinghorror.com/why-cant-programmers-program/)

I think it's pretty common for people to not be able to do leetcode. I learned
the concepts in college and usually did very well in class. I didn't even
bother preparing for interviews and could still pass.

However, after working for a while I don't think I'd be able to do them
anymore, or at least not at the speed which is expected.

~~~
non-entity
A fizzbuzz is something in could easily write. I think I was working on some
binary tree problems at the time

------
kerkeslager
Whats more surprising is the number of programmers who defend this, i.e.
claiming that questions like Fizzbuzz filter out good programmers due to
interview pressure or whatever. It's a simple loop, folks. Writing code _and
talking about it_ is the job, and if you can't do that you can't do the job.

EDIT: Contrary to what some believe, there is no programmer who you simply
hand requirements to and then they take those requirements to a dark room,
produce programs that fulfill those requirements, and then reappear and hand
you the programs, all in silence without looking you in the eye. Programmers
need to be able to _communicate_ about the code they're writing to collect
requirements, explain problems, etc., and if social anxiety keeps them from
doing that, social anxiety keeps them from doing their job.

~~~
soniman
Do you have any good data on this? Maybe those people are right!

~~~
kerkeslager
A programmer is someone who programs. If one cannot program they cannot be a
programmer. It doesn't take a degree in data science to figure this out.

------
weego
If so many well paid people at big companies can't do it, maybe that's an
indicator that it's absolutely not a good screen at all, that there are far
better screens that can be used to weigh developer worth, and you're just so
far down the rabbit hole that you can't see what's clearly obvious: once you
get past the arbitrary tech hoops most developers only need about 30% of their
entire skillset to be programming skill to be of great value to a business.

No one screens for understanding complex business domains, breaking risky big
scope tasks down into iterative low risk steps, leading meetings /
conversations where you have to rethink complex tech requirements into non-
technical speak.

~~~
crimsonalucard
I agree, but the test is also dreadfully easy. Literally it's hard to see why
anyone would fail.

The more interesting question is why did they fail? Why is this a bad
barometer or what is making this a bad barometer despite it being so easy?

If you took a career software engineer that would otherwise fail a fizzbuzz
interview and put him alone in a room with a computer for an unlimited amount
of available time and made it known that he's just solving a fizzbuzz question
for fun and not being judged for a future career... I'm willing to bet that he
will could walk out of that room in reasonable time with a working fizzbuzz.

If you did this for 100 individuals with the exact same credentials as the
person above I'm pretty sure you could get 99 people who walk out of that room
with a working fizz buzz in reasonable time.

------
newfocogi
As a software developer, I spend much, much more time reading code, trying to
understand code, looking for bugs in code, and tweaking existing code, than I
do writing totally new software applications. Although I agree it is
surprising that many people can't reason through fizzbuzz, it is very possible
to make valuable contribution to a code base in a language that you don't have
the syntax for the "main" function memorized.

~~~
stormbeard
It’s definitely possible to make some other contribution, but not as a
“programmer”. I can’t imagine giving a task to someone who can’t construct a
basic for loop and a conditional statement.

------
Jun8
"I’ve been working since the 90s and I never attempted to do FizzBuzz. Is it
really relevant?"

So, when stating "can't do FizzBuzz in interview" I think there are two
meanings: (1) Candidate attempts to do it, writes some code in language X with
some (many) syntax errors and some logic errors and (2) Cannot do anything _at
all_ , i.e. candidate there's no response and the onscreen cursor does not
move (usually this is a phone interview). My experience with candidates I've
seen is that the ratio of (1) to (2) is about equal!

Depending on the number and the of errors, (1) could be worrisome but the
issue that people generally bring up in discussions on FizzBuzz is the utter
incredulity of (2).

I'm mechanically challenged and have never changed a tire, yet , if asked to
do so, will make some movements that are roughly aligned with the goal, albeit
may be laughable to more knowledgeable people. Ditto for cooking a simple
dish, e.g. spaghetti. I think this residual knowledge is acquired by osmosis
through being around people (or watching TV) doing the task.

So, the most unnerving aspect of (2) to me is that it shows that the candidate
does not even has this residual knowledge about programming.

~~~
mdorazio
As a counterpoint, your real-world equivalent example is kind of bad. A normal
person who had never changed a tire and got a flat would, as step #1, Google
or YouTube "how to change a tire" and follow the steps. Or perhaps look in the
owner's manual. Randomly rummaging around in your trunk and trying to puzzle
out how to use a bottle jack and get the lug nuts off/on correctly is a poor
way to go about it. Similarly, in real-world programming if you get to a
requirement to do something you've never seen before, the first step most
programmers I've worked with would take is looking up potential solutions that
already exist.

The problem, of course, is that if you're in the middle of an interview and
someone throws a programming problem at you, your first instinct to go look up
potential solutions would generally lose you the job opportunity. A better
test of real-world skill needed would be to give them some variant of fizzbuzz
code then ask them what it does, or put a bug in it and ask them to find the
bug and fix it based on the expected output of the function.

------
james_s_tayler
Let's assume everyone gets a job in industry.

Those people who couldn't program their way out of a paper bag in the first
interview probably went on to solve whatever issue it is they were having that
day (nerves, not ever having heard of modulo etc) and subsequently get more
practiced by at least the 3rd interview. All of a sudden they can magically
program.

I just don't buy the premise that these people can't program, get rejected
from every interview, give up and drop out of industry.

I'd say the vast majority of them get jobs. And you're hiring filter can't
calibrate for how the previous interviews have set the current candidate up
for your interview.

If you could be a fly on the wall for every interview the candidate you just
hired had done, there would likely be some in which you would have assessed
"this person isn't capable of doing the job".

The signal/noise ratio in hiring is abysmal.

~~~
jcadam
I can usually tell when I lose an interviewer. They stop paying attention and
start fiddling with their smartphone.

Every time I start a new job hunt, I have to fail a few interviews before I
get practiced up again.

~~~
james_s_tayler
Exactly.

Since interviewing is a skill and interview skill is used as a proxy for job
skill and interview skill is a function of recent interview experience, job
experience, and your mix of personality traits, and only two of those are
roughly stable. Job experience is a slowly changing dimension, but recent
interview experience changes very rapidly and it has a huge effect on
interview skill, and the interviewer has no way to calibrate for it. Instead
they always try to calibrate for job experience. Interviewers also don't have
any hope of calibrating for your mix of personality traits.

The whole thing is basically a crapshoot. But I take comfort in that. I don't
ever feel bad if I get rejected. I just see the process as essentially random.

------
tomohawk
Was a fairly new engineer, when an engineer with a few years of experiencein
the office, who was taking classes on the employer's dime towards a masters
degree, asked me for assistance.

She was trying to run a C program she'd created, but it wouldn't run. I asked
if she'd compiled it. She asked what a compiler was.

How can a person could survive in an office where C was the main language, and
be taking courses that assumed familiarity with C, and still not know what a
compiler is?

Turned out she was very skilled at taking credit for other people's work.

~~~
Hitton
To be honest such scenario is not so hard to imagine. When I think of my
studies, it was probably some introduction to Java, we learned how to use
javac during first lesson, but never used it since, because we just clicked
button in IDE. Someone who missed the lesson, might never noticed he misses
basics.

With advanced build systems in some companies, someone who arrives from
scripting language, is shown build system and told to look up the syntax might
not ever realize the gap in his knowledge and at the same time might even be
productive part of the team.

------
stronglikedan
> FizzBuzz [...] You wouldn’t believe how many people can’t do it.

This is so true. IME, less than 50% of applicants can even get close. Mostly
due to not remembering or even knowing about the modulo operator or a suitable
workaround.

~~~
mysterydip
If mod isn't something needed for whatever their normal work is, is it a valid
test? Or are you potentially throwing away otherwise good candidates because
of it?

~~~
patio11
In my experience one sees roughly similar results with:

"Write a function which counts the number of a's in the input string."

"We will give you an array of words. Print out each word which appears more
than 3 times in the array."

"We will give you two arrays of words. Print out each word which is in exactly
one of the arrays."

It's not _just_ the mod operator. These are toy problems for difficulty but
they're _not_ "implement the rules to a children's game"; with a few seconds
of effort you can describe a boringly plausible business reason for having to
implement them during a fairly pedestrian career.

~~~
ciao_ciao
Bear with my potentially dumb solution, but i'm trying to understand what an
interviewer would look for in answering questions like these. For the third,
in python, could you make both sets and print the symmetric difference? Does
this (a) demonstrate practical knowledge of python or (b) necessitate a follow
up from the interview to provide a solution that does more of the "work"?

~~~
wikwocket
Since these are riffs on fizzbuzz, the goal is just to evaluate whether a
candidate can use programming to solve these at all, i.e. whether they can 1)
think through how to accomplish a basic task with some data and code, and 2)
implement it in a language they know.

The goal of fizzbuzz in a phone screen should not be to see if someone can
solve it in an optimal memory-efficient framework-idiomatic way. Clever syntax
and data structure use is lovely, but these are really about finding whether
someone can use a 'for' loop and an 'if' condition.

------
jwkane
I've grown fond of using:

    
    
      ------------------
    
      def alpha(n):
          if(n <= 1):
              return n
          else:
              return(alpha(n-1) + alpha(n-2))
    
      what is alpha(5)?
      -----------------
    

Instead of fizz. They don't have to recognize that it is fib or do it in their
head, on paper is fine. No perfect syntax under pressure to worry about. I
feel okay with an easy smile, handshake and thank you for your time when I get
that confused/embarrassed/angry look like I've just asked them to translate
hieroglyphics. Works out nicely.

------
rossdavidh
While I agree there are some people who just can't program, I think it's worth
pointing out that in many cases, the candidate who simply cannot FizzBuzz in
one interview, will do so (or other similar tests) perfectly well after a few
interviews. Have you even blanked out on something you knew the day before the
test? Most people have. Some (not all) of these interview bombs, are by people
who know perfectly well how to program, but can't do it in an interview (until
they've done a few interviews and get over that).

------
acollins1331
Reading this article and these comments made my imposter syndrome just fade
away! I can't imagine how a student could make it through a CS program and not
be able to fizzbuzz.

------
voidhorse
I was just thinking about programming and how to get better at it today.

I think a huge crutch for a lot of people is the immediate feedback loop
execution gives you. Rather than truly understand the api we’re using, I think
there’s sometimes a tendency for programmers to just skim, try a function
call, and see what the repl/executable or w/e does, and to roll with that.
While this works for getting things done it doesn’t really improve your
understanding. I think practicing programming without the feedback loops the
computer provides, e.g. based on documentation and reasoning alone, is a great
way to become better and more disciplined. You can do this with pseudocode,
whiteboards, or even with actual languages, forcing yourself to write complete
programs/features before turning to the repl instead of a piecemeal write then
verify approach.

------
komali2
This is basically just a hacker news comment, but instead on someone's blog.

------
reilly3000
I failed at FizzBuzz in a coding interview, my first coding interview in fact.
It wasn’t because I don’t know what modulo is or couldn’t forgive out the core
logic... I just completely choked and my mind went blank. I made a function
using a switch operator, but I couldn’t figure out how to do a for loop or
apply. Hot Shame!

I work well under pressure. I generally have no issues with speaking in public
or performing; I majored in music in college. My programming skills have lots
of room for improvement, but that hasn’t stopped me from writing lots of
useful, maintainable, performant code.

It sucked to fail at FizzBuzz. I’ve been working at my algorithms and syntax,
but also trying to code in front of others as much as possible.

~~~
dpc_pw
Exactly. Even when I am typing something with a friendly coworker causally
looking over my shoulder, I tend to make way more mistakes then I would if I
was by myself.

I've been interviewing a lot of people, and it is very, very important to make
them feel as comfortable and as much at ease as possible in couple of first
minutes etc. Otherwise you're going to be testing their stress resistance, and
not creative thinking. And it is just impossible to completely remove the
stress.

------
meheleventyone
This sort of finding always makes me wonder if the issue is that there are
somehow loads of programmers who have apparently had long careers who can’t
program or if there is something wrong with the method of determining it?

With quotes like:

> So, as someone who spends maybe 20% of their time hiring, it’s still a very
> effective screen. You wouldn’t believe how many people can’t do it. People
> at big companies, respected places. It’s surprising.

Shouldn’t people start questioning the validity of their method?

------
enahs-sf
I regularly do technical phone screens at my company and it is amazing the
number of people with masters degrees or very pedigreed backgrounds who are
unable to solve a relatively simple problem. I think part of it is performance
anxiety being put on the spot, but I have noticed that asking anyone to write
java or c++ without an IDE is very akin to taking a fish out of the water.

~~~
rjkennedy98
Maybe I'm in the minority for the HN community, but even I would struggle to
write Java without an IDE. I've done it before and compiled manually using
javac, but if someone asked me to do that in an interview I might struggle.
The IDE just does too much in java, from generating boilerplate code, to
managing packages and imports, and autocompletion.

Maybe that's the reason I've almost never done interview questions in java. I
always use python/javascript, because I write those with VIM, even though,
until recently I did only a small percentage of my professional programming
with those languages.

~~~
enahs-sf
definitely. Tools like coderpad naturally lend themselves to dynamically typed
languages.

------
jppope
In the workplace we don't write katas, thats all there is to it... We have
tools that we are able to offload most of the specificity required for real
programming => Code examples, Documentation, Stack Overflow, IDEs, etc. ...
This is both efficient and lazy.

There's also nuance to the "fizzBuzz" thing that people always leave out when
they say that developers can't do "a simple fizzBuzz". Things like => It needs
to be done on a whiteboard w/o syntax errors, they give FizzBuzz a significant
variation, a requirement is slipped in to have fizzBuzz print on the same line
when 15s come up, tons of things that make "a simple fizzBuzz" not so simple
to pass if people aren't paying attention.

Gun to their head, IDE in hand, and stack overflow at their beckon, the vast
majority of those programmers wouldn't have a problem stringing together
fizzBuzz... but thats not really the question being asked in an interview now
is it?

------
braythwayt
I am one of the people who was involved in the original discussion twelve
years ago.

It is incorrect to say that there are a surprising number of programmers who
can't program something as simple as FizzBuzz. The vast, vast, vast majority
of working programmers have no trouble with such ridiculously simple toy
problems.

However, although the overall proportion of self-identified programmers who
can't program FizzBuzz is very, very small, the proportion of job applicants
who can't program FizzBuzz is surprisingly large.

The entirety of the "surprise" as originally described was that the percentage
is so out-of-whack. But once you think about it, it is not so difficult to
understand why this may be so.

Competent programmers spend most of their careers working, not interviewing.
If they are looking for a job, they tend to only go to a few interviews.
Whereas, incompetent programmers spend more time looking for jobs, and when
they are looking, they tend to apply over and over and over again to job after
job after job.

So every company that has an opening gets "spammed" with the same couple of
hundred applications from the same people the are applying for job after job
after job. And many of them can't program FizzBuzz.

Whereas, the few competent people looking for a job tend to get an interview
or two through referrals, then get an offer, accept it, and they are back in
the workforce. But the couple of hundred applicants who can't program FizzBuzz
shoulder grimly on, applying for the next job opening they find.

The net result is that if you have a job opening, you might have to filter out
90 or 95% of the applicants as "no-hopers," but that does not mean that 90% or
even 9% or even 0.9% of programmers cannot program FizzBuzz.

TL;DR: The sample of programmers applying for a job is not representative of
the set of all programmers, not even close.

~~~
ubu7737
I am someone who has changed development jobs quite a lot, far more than the
average for my seniority.

Skill in software engineering can't just be measured by skill at writing the
language, and this is trending forward faster and faster. The really
accomplished engineer is one who has experienced many teams, many managers,
many processes, and many deployments.

The accomplished engineer is opinionated about testing methods and about code
readability, because he has suffered under many misconceptions about these
things and taken the time to consider the alternatives.

~~~
braythwayt
Even if you change jobs frequently, and take long sabbaticals (I took a year
off for the birth of my first child, and another to write one of my books),
you probably still spend much, much, much more time working than actively
seeking jobs from strangers.

------
_bxg1
Re: FizzBuzz, one factor could be that it's deeply procedural/imperative in
nature. Whereas HTML, CSS, and functional programming styles (which rule the
JS world and quite a few others right now), have you thinking declaratively.
If, like me, that's most of what you've been doing for the past couple years,
FizzBuzz may take you a second because you have to dust off a different way of
thinking. If you _learned_ on declarative/functional stuff - in a web dev
bootcamp for example - and never had exposure to anything outside of those
practical skills, you may be totally lost.

Is that a bad thing? Probably. Computers are, at their base, imperative. So
it's important to have a grasp on that way of thinking. But does it mean these
people who've held "programming" jobs are frauds who don't know how to program
at all? Not necessarily, I don't think.

~~~
mathw
If that's the case, you can solve FizzBuzz using a declarative style in
JavaScript, surely? It's pretty trivial in Haskell, which is declarative all
over.

~~~
_bxg1
It's a little more natural in languages like Haskell and Python that have
range generators; JS doesn't. You can do a hack where you initialize a sized
array and then map over its indices, but that's unusual.

Part of it may have been that the problem description I read used very
imperative language. It didn't say "return a list of Fizz, Buzz, and
FizzBuzz", it said "for each number that's ___, print X". Very side-effect-y.

~~~
_bxg1
Another thing is modulus. I know off the top of my head that mod == 0 means a
number is divisible by another number because we used it all the time in my
college programming assignments. People without a formal background may not
even know what modulus is; there are lots of programming domains where it's
not really useful.

~~~
LyndsySimon
> there are lots of programming domains where it's not really useful.

Off the top of my head, I can't think of any.

Even if all you're doing is a simple CRUD app, alternating attributes on a
list you're outputting to HTML is easily done with `if i % 2`.

~~~
_bxg1
I'd do that particular case with CSS

In five years since graduating I haven't used modulus outside of toy code
challenges

------
LandR
This is fairly common.

I've seen the tech tests we receive from potential candidates and they are for
the most part appaling. Our technical test is incredibly simple as well and
they can do it at home in their own time.

Imagine something as simple as write a console app where you have a class that
represents an Account. Write a function to debit and credit an amount that
value and have a property to return the balance and a property to show if the
value is negative.

The amount of code we see that looks something like:

    
    
        public class Account
        {
            public decimal Balance { get; set; }
            public bool IsNegative { get; set; }
            public void Debit(decimal amount)
            {
               Balance = Balance - amount;
               if(Balance < 0)
                 IsNegative = true;
            }
    
            public void Credit(decimal amount)
            {
               Balance = Balance + amount;
               if(Balance >= 0)
                 IsNegative = false;
            }
        }
    

In fact we've seen that almost line for line more than once and they get an
hour to do it. Worse, we've seen stuff that can't even compile!

I've wanted something harder for a while as a filter and we changed the test
to write a very basic WEB API. The tests you get back are equally hopeless.

When you finally get a test that looks somewhat acceptable and they get an
interview, they invariably are awful in the interview if you ask them anything
other than the most basic of questions.

We are still looking. Getting someone you can give a problem to and they can't
be left alone for a reasonable period of time, with minimum of hand holding,
and they will come back with a working, implemented solution is so hard.

If these programmers that can't program drop out of the industry, then great.
Maybe we will eventually raise the bar for what it means to be a programmer
that we will get some decent software.

~~~
nlh
It would be helpful for the junior folks among us (and those still learning)
if you explained a bit about why that code is so terrible.

~~~
LandR
Sure,

Well first off.

IsNegative and Balance are idependantly mutable.

I could do this:

    
    
         var account = new Account();
         account.Balance = 500;
         account.IsNegative = true;
    

Or

    
    
        var account = new Account();
        account.Balance = 500;
        account.Credit(-600); 
    

Now Balance is - 100 and IsNegative is false.

Or vice versa for both.

I would expect anyone applying for a job that is asking for 5+ years of
experience to pick up on something as basic as this.

~~~
dekhn
That was your criterion?

OK... so you're complaining that the coder could use the api to violate an
invariant. I've worked with millions of lines of code and this is certainly
not a criterion I'd use to evaluate a serious programmer. Many codes I work
with permit this sort of behavior (I guarantee you can mess up using the C
library this way).

------
chkaloon
I managed software developers for many years at a fairly well known software
company, where the first gateway for a hire was an advanced Math or CS degree
with an undergraduate gpa of 3.5 or higher from a tough school (undergrade gpa
because we felt that was more indicative of raw talent or work ethic than
graduate gpa). This was followed by rigorous testing in logic and programming.
Even after all that I found there were still between 10-20% of hires who could
not code. Many with Masters or PhDs in Computer Science.

My theory is that coding is kind of like carrying a tune in music - either you
have it or you don't. It's not an intelligence issue or a matter of education.
These were bright folks. There is a mysterious innate ability that you must
have to begin with, and some just don't.

------
helmsb
The biggest thing that has jumped out at me is there seems to be a whole
generation of programmers that can't troubleshoot or debug. Some of the
requests for help from devs that I get is troubling to say the least. Talking
with people at my user group meetings it's becoming worse and worse.

My theory is that I'm the last of a generation of developers who learned to
program without the Internet. I started learning QBasic when I was 8 and
progressed through C++, Perl and .NET. Back then you HAD to learn to break
problems down and use logic to troubleshoot. You couldn't just Google the
problem.

Google and StackOverflow are great resources but you have to understand how to
approach and break down problems if you ever want to be a good developer.

------
blunte
Some basic level of programming and problem solving test is reasonable. What I
find unreasonable - and which I am currently experiencing - are tests where
the description is so convoluted or poor that the challenge becomes
understanding the problem... not solving it.

All that said, I think you better measure a programmer/developer by asking
some questions. Knowing syntax is the last step. But knowing how to break a
problem up and which approaches to take in solving it, especially if there are
constraints stated, is far more interesting. It's basically like asking the
programmer to describe the program they would write.

Let's say the problem is, "Find the first 1000 prime numbers." The solution is
less than 10 lines of code in most languages, but there's plenty to talk
about.

I(nterviewer): How would you approach this problem?

C(andidate): Can I use the "prime" Ruby gem?

I: Well, it's good that you know it exists, but let's assume you can't.

C: I first need to define a function that, given a number, will return if the
number is a prime.

C: Then I need to loop 1000 times, checking each successive integer (starting
from 1) with the is_prime?() function. If it's prime, I print it.

C: Then I increment to the next integer and return to the top of the loop.

I: How did you determine if the number was prime?

C: The simple approach is just to loop from 2 to n-1 (the number we are
checking), testing to find out if the number is evenly divisible by the loop
index. If it is evenly divisible, then it is not prime. Otherwise, it is
prime.

I: Great. What if I asked for the first million primes? Is there anything you
would do differently?

C: I would improve the is_prime? algorithm. Blah blah blah, go from 2 to n/2
(or is it square root of n?) Etc. And if that was still too slow, I would
research efficient prime algorithms and implement one.

This will tell you if someone can program - even if they have never typed on a
keyboard. Programming isn't about typing, it's about being able to define the
steps needed to solve a problem.

------
qntty
Not everybody is good at performing under pressure on problems that come with
ambiguous artificially imposed rules that you have to guess. I remember
solving a problem that involved manipulating a list. There was an improvement
to my algorithm that involved calling list.sort() before performing a slightly
more efficient version of what I was doing. I didn't think calling built-in
sorting algorithms was allowed. That's typically one of the implicit rules,
until it's not, and you just have to figure out when it is and when it's not a
rule.

~~~
komali2
This is why talking is critical during an interview. Typically my answer to
any interview question starts with "I'd Google to find code that already
solved the problem, but I'm assuming you want to see my implemention? Cool,
and, can I use lodash/jQuery? No? Ok, so you're interested in my ability to
transform data, let me just ..."

------
carapace
For those here who question the relevance of the modulus operator to computer
programming, recall that the machines implement _modular arithmetic_.

[https://en.wikipedia.org/wiki/Modular_arithmetic](https://en.wikipedia.org/wiki/Modular_arithmetic)

I won't comment on whether it is a good or bad thing that one can consider
oneself a computer programmer† _without_ being cognizant of modular
arithmetic.

†to the degree that one is applying to be paid for it.

------
southphillyman
That's why I think practicing "leetcoding" is totally worth it. A significant
amount of senior applicants fail easy codingbat level questions. Being
proficient at easy level algorithm questions will usually push you to the
front of candidates at non FAANGs. I've had interview panels tell me I was the
first person who could solve basic palindrome and "best time to buy/sell
stock" type questions.

------
melq
I think articles like this are harmful to new developers. Hearing people make
proclamations like these, saying everyone sucks while also not mentioning what
it means to be good, is only going to make people anxious and second guess
themselves. As someone who became a developer after studying a non-cs topic in
college, I always worry about what skills I might be lacking compared to my
peers, and this shit just isn't helpful.

~~~
commandlinefan
I always thought “fizzbuzz” was sort of an obnoxious “gotcha” sort of test -
it’s actually a test of whether or not you're familiar with the “%” operator.
I wouldn’t have a problem with it myself, but I can easily imagine spending an
awfully long time coding without ever coming across a modulus operation,
especially if you didn’t have a CS/math type background. OTOH, I posted on
here a few weeks back that I had a co-worker who expected candidates to come
up with the binary search algorithm in an interview setting, which I thought
was unreasonable, and most of the commenters thought I wasn’t being harsh
enough… maybe I have low standards?

However, we can talk about overuse of the “singleton pattern” abomination…

------
bluedino
And on the other hand you get programmers who refuse to do a whiteboard
problem, etc.

I’ve been a programmer for years! Why can’t you just believe me!?

------
izzydata
I feel like I'm the exact opposite. I'm much better at deriving algorithms and
CS concepts on the spot than memorizing the latest flavor of the month webtool
or language. Why am I working as a software QA if there are so many developers
that can't do this type of critical thinking? Perhaps I will just start
applying for stuff.

------
blunte
Somewhere there's also an essay, "The Surprising Number of Managers Who Can't
Manage".

------
wickerman
My biggest problem with challenges like this in interviews is that sometimes
they give you a problem to solve through, say, pure OoP when the challenge
itself can be better approached using other paradigms (i.e. functional, or if
the problem is very data centric, plain old SQL!)

------
beardedProgmr
A lot of devs are surprised you are asking then questions. I've had architects
shake and not even write a for loop on an amature level whiteboard question.
It's not a computer I think is the issue. It's also sloppy and they didn't get
a job.

------
almost_usual
I honestly don’t understand the backlash for the Software Engineering
interview process. I hardly program in my current role but I still make an
effort to stay fresh. Spend some time on Leetcode weekly doing practice
problems and you’ll be fine, it’s not hard.

~~~
fooster
Really? So monkey see monkey do? Leetcode doesn't represent much of anything
to do with 99.9% of software development jobs. Mostly we're not solving
puzzles, we're talking with stakeholders, designing systems, working with co-
workers, architecting solution and building systems with code. Leetcode is an
absolutely terrible way to evaluate any of that.

~~~
almost_usual
Leetcode covers data structures and patterns for efficiently using data
structures. Most of the ‘puzzles’ could easily be isomorphisms for real life
problems programmers encounter. I don’t think it’s a waste of time and it will
make you a better programmer.

The responsibilities you bring up are valid but meaningless if core concepts
are neglected or misunderstood.

------
sebazzz
I can write FizzBuzz, but otherwise I found it to be something that you
usually use a rarely used operator (in my field, webdev) for.

Either you:

1\. Use modulo 2

2\. Bitwise AND with 1

3\. Divide as x and check if floor(x) == x

4\. Swap variables

And probably there are other ways as well. I have just disproven myself I
think.

------
carapace
I still recall the first time an interviewer wanted me to write FizzBuzz. I
thought he was joking. I mean he had to convince me he was serious. It's a
weird old world.

------
yters
How many mathematicians can do long division? Perhaps we are crippled by our
tools and the high level of abstraction from the basics we work at.

~~~
jcranberry
I think fizzbuzz-level logic is so simple it's not really abstracted away when
programming. No matter how many nice libraries you have you can't avoid
writing loops and if checks.

------
omarhaneef
In defense of programmers who "can't program":

Is FizzBuzz done with the benefit of Google?

I ask this because, while the program is straightforward, different languages
have different division functions, and you want to make sure you have the one
with a remainder.

You also want to get the OR and AND operator right. (Is it "or", "|", "||"?)

Now, I've used all these many times, but in an interview, you may just forget
for whatever reason. I don't think I would, but I imagine someone competent
could.

Like DHH, for instance:

[https://twitter.com/dhh/status/834146806594433025](https://twitter.com/dhh/status/834146806594433025)

Or curated here:

[https://theoutline.com/post/1166/programmers-are-
confessing-...](https://theoutline.com/post/1166/programmers-are-confessing-
their-coding-sins-to-protest-a-broken-job-interview-process?zd=1&zi=uafs5tet)

------
HNcantBtrustd
11 year, self taught programmer here. Chem engineer by degree.

I had to program for eng 101, engineering 280 mechatronics, and our senior
design.

I'm not a programmer by degree, but I was often the only one in group projects
that understood what needed to get done.

I don't know what I missed out on. I've wrote AI since college and created
embedded systems.

Programming feels unlimited.

But what don't I know? Security? Faster algorithms? I don't know what I don't
know.

~~~
psadri
Take an introductory data structure and algorithms class. Now that you have
some real world work experience, they will be very relevant.

------
quotha
#ruby

1.upto(100) do |i|

    
    
      if i % 5 == 0 and i % 3 == 0
    
        puts "FizzBuzz"
    
      elsif i % 5 == 0
    
        puts "Buzz"
    
      elsif i % 3 == 0
    
        puts "Fizz"
    
      else
    
        puts i
    
      end
    

end

~~~
emilecantin
I just made this horrible JS one-liner:

    
    
        Array(100).fill(0).map((x, i) => i % 15 === 0 ? 'FizzBuzz' : (i % 5 === 0 ? 'Buzz' : (i % 3 === 0 ? 'Fizz' : i)))

