The Surprising Number of Programmers Who Can’t Program
letterstoanewdeveloper.com
letterstoanewdeveloper.com
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.
> I've also known some very talented interviewers who have never completed a project from start to finish.
Yea, I'm definitely in the first group. From a career progression and remuneration standpoint, it would be much better to be in the latter. I sometimes wish I could trade in my "gets stuff done, right" skill set for "can invert a binary tree on a whiteboard in 2.5 seconds." Sometimes.
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.
I also ask people to implement the Blum Mental Hash, which I heard about on NPR in 2014. It's easy enough to explain in five minutes or so, but difficult enough to write out in a half hour or so.
https://scilogs.spektrum.de/hlf/mental-cryptography-and-good...
I've had so many co-workers talk, passionately, about stuff they don't have the faintest scent about. It's shocking.
Unless you actually oversee a candidate work and reason through a representative problem, implement it and articulate it, there's no good way to gauge competence.
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.
They may have the simplest of projects or contributions out there but you may infer how they think, how they behave, and what drives them.
If I don't have things to show for it, then I'm not really interested into programming. The immediate knowledge is secondary, the self-motivation is primary, because motivation makes you gain knowledge quickly, or, at all, in fact.
I despise signalling for signalling sake. I just enjoy debugging, learning how things work, and doing the smallest tweak possible to fulfill my needs.
I minimize my digital footprint intentionally; people have a habit of trying to get to know you without engaging with you directly when you're too open, and I hate that.
I throw away and redo things in different ways on a regular basis. I change my working OS, workspace structure, buildtools, programming languages, etc. Keeps beginner's mind firmly in place, and helps keep me humble.
Point being, your vetting process completely fails to take into account someone that simply doesn't put themself out for everyone else's perusal, and who actually values their privacy.
Your method ironically would turn me off of most candidates. The Art of Software Engineering for me is to take what you have, look at the hole that needs to be filled, then coding a piece that looks like it belonged there the entire time. It's about building what you want with what you have.
I can admire idiosyncratic code that works in clever ways. Just as I can run screaming when it comes time to refactor it.
Point being, sometimes people's value add isn't conducive to being posted on GitHub, or isn't for personal reasons.
It was surprisingly easy to see who had both practical problem solving skills and technical ability. I could see how they modeled the data and the functions.
The best candidates emailed me to ask for clarification about the requirements. I was able to see how effective they were at communicating.
Some of the candidates said they loved the assignment. I think we need things that are closer to real work to gauge how good people will be at real work
In contrast, in our profession, certifications tend to be useless. (Certifications tend to be technology-focused, instead of broader skillsets needed to be a software engineer.)
It's like we, as an industry, need to come up with a robust certification process that determines competence.
I spend quite a bit more time reading code than writing it...
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.
I suspect that candidates who are otherwise fine (and not misrepresenting themselves on their CV's), fail fizzbuzz because they overthink the problem, stumble on the not-so-frequently-used modulo operator and then paint themselves into a corner where they can't just loosen up, take a breath and figure out the solution.
You should be able to have a 10 minute conversation with someone and know if they can solve fizzbuzz (without even posing the problem).
The fact is companies hire people all the time, without using fizzbuzz, probably hiring some number of people that would not have passed fizzbuzz if it were given to them. Were all those people definitely bad hires? I think not. The parent commenter's company had "survived" without it, and many do now.
It's understandable to want to have the ultimate "gotcha" interview question, the response to which screens out a candidate. It's not totally wrong, but there's a lot more to an interview. I think the onus should be on the hiring managers to develop their behavioral interviewing skills so that they're able to evaluate a candidate more fully than by using toy problem quizzes.
I've had the same, I was a contractor and not usually involved in the hiring process but I'd been asked for a question they could take to a candidate.
One of the team at the time was a young Maths grad, super bright but prone to being over confident. So I wrote a clear FizzBuzz question, passed him the pen and paper and asked him if he was sure when he was done. There was some minor issue, a boundary issue one think and he was livid with himself. So they took it to the candidate and apparently it was a bit of a disaster.
Personally, the first time I came across it was in an interview and I quite enjoyed it - simple enough to not be threatening but I guess sufficiently able to show I could write code as they offered me the role. They asked some extra questions too with some extensions and about how you could unit test it.
Beats having to implement red-black trees by remembering the crib sheet you read the day before.
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.
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.
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.
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.
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.
> Programming is actually really, really easy.
Perhaps. Software engineering is hard, though, and it is not the same as CS. We turn out these CS degrees, and then we expect that they can do software engineering.
That said, fizz buzz may not be the best way to tell if people can do software engineering, either...
Have unit testing, have integration testing... make it modular... SOLID, write layers, yada yada yada also very easy.
I always hear people say that Computer science != software engineering but really it's the same thing at the upper echelons. Rather than using your gut and all these anecdotal "principles" spewed out by people like Martin Fowler, design pattern books, or books on testing and agile you can actually use theory and science to guide your software engineering decisions.
Let's put it this way. Software engineering is the only engineering discipline where people can get away with not knowing science and mathematics and still build systems that can run. The effective and elite software engineer lets theory and science guide his decisions as well to make systems that are better.
I do agree with you that fizzbuzz is missing something.
In case you're serious, though, you clearly have no clue what software engineering is. Yes, it includes some of the things you mention. No, it's not the same thing as CS at the upper echelons. Yes, you should include theory and science in your software engineering decisions, but no, just (CS) theory and science isn't going to be enough.
BTW, because I don't know how to contact you to tell you this: Your HN profile says "Actively searching for opportunities. email me if interested", but doesn't actually provide an email address.
I'm totally serious. Not trolling at all.
>In case you're serious, though, you clearly have no clue what software engineering is.
The term is so hand wavy. You can read this: https://www.wikiwand.com/en/Software_engineering
Just go to the "Subdisciplines" section in the wiki
Literally every example I mentioned is covered by a "subdiscipline" of software engineering. I'll quote the part that covers my examples:
"Software design:[1][23] The process of defining the architecture, components, interfaces, and other characteristics of a system or component. It is also defined as the result of that process. Software construction:[1][23] The detailed creation of working, meaningful software through a combination of programming (aka coding), verification, unit testing, integration testing, and debugging. Software testing:[1][23] An empirical, technical investigation conducted to provide stakeholders with information about the quality of the product or service under test. Software maintenance:[1][23] The totality of activities required to provide cost-effective support to software."
What happened here is that I never had a strict definition of software engineering in my head. I do know that a big aspect of it usually has little to do with the theoretical side of things, so in my example I just mentioned all the "technical" terminology people throw around that has little basis in rigor or theory. Then when you said I have no idea what it is, I looked it up, and the definition literally covers almost everything that has to do with software including my examples.
There is literally zero chance you could have known that I have "have no clue what software engineering is" because my examples are covered by the definition stated in the wiki. That is zero chance unless you have no clue yourself.
A more accurate explanation is this: "software engineering" is a vague hand-wavy term. Sort of like how "Science" doesn't always involve the "Scientific method." You have some super clear definition of the term in your head, but clearly from this wiki not everybody thinks about it that way.
>Yes, you should include theory and science in your software engineering decisions, but no, just (CS) theory and science isn't going to be enough.
When did I say only CS theory is enough? Many aspects of software and the real world don't have any science or theory to describe it. Usually when you encounter such an aspect of the real world the vernacular changes from "deriving" a solution to "designing" one. My emphasis is that many engineers are "designing" things that are ultimately covered by theory and ultimately can be "derived," they simply turn to "design" either because they are unaware of theory or the theory is too hard.
We are in agreement on the point you mentioned, but I never said all you need is theory. Humanities theories about the universe are prove-ably incomplete and unprovable in general, therefore we have no choice but to exit the theoretical world for many engineering problems.
>No, it's not the same thing as CS at the upper echelons.
By upper echelons I mean you've basically learned most of it, the only thing left is the theoretical part. The theoretical part is harder and usually something a software engineer gets into once he's figured out how the rest of the non-theoretical parts work. You'll note that "mathematics" encompasses "software engineering" as defined in the wiki. I'm also not sure why you disagree with me nor am I clear about your own definition of software engineering, so please explain if you can.
>BTW, because I don't know how to contact you to tell you this: Your HN profile says "Actively searching for opportunities. email me if interested", but doesn't actually provide an email address.
Thanks. I think at one point I had it up there. I forgot why it was removed. I never got a contact from here anyway.
I find it hard to believe that anyone who has spent more than a week programming couldn't solve FizzBuzz. Even if they somehow weren't familiar with the modulo operator, you could just explain how it worked.
FizzBuzz is a way of easily filtering con artists.
An interview is almost like public speaking combined with an intense time based coding competition without allowing you to use an IDE.
I think a good number of these guys are lying. I agree with you. But I also think a good number are honest and actually failing.
It's so well known that everyone uses it to study for their interview. You'll end up hiring someone who just memorized the solution.
Instead, come up with your own unique programming challenge that the candidate hasn't seen before. It should be about as easy / hard as Fizzbuzz.
Related: I once interviewed a candidate who came across as knowing my questions ahead of time, and delivering a well-reheased answer. I made up a question on the spot, and got a "this wasn't supposed to be on the test" tone of voice in the answer. I rejected the candidate.
Technical interviews aren't things that the candidate should memorize and rehearse. That's why I'd never ask Fizzbuzz.
If one is concerned about people memorizing answer, it is pretty simple to change the question a bit to make it non-recognizeable,
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.
I would have pointed out that if you happen edit this tool to transfer 15 items, or any number more, the programming language still obligingly executes all of the larger program, which is because that language implementation contains loops for processing the tokens and statements.
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).
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.
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!
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.
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.
Some of these are or can be included in the system design interview.
For the rest, is there an objective way to ask the same question of each candidate that won't eventually be gamed with pre-canned answers on leetcode?
The history of FizzBuzz was that it was a screening question for webdevs to work on a bugtracking tool. Maybe it is relevant for that, I don’t know. But like most of the rest of its inventor’s advice, it is not as generally applicable as he claims.
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.
In JS:
const isEvenlyDivisible = (num, denominator) => Math.floor(num / denominator) === (num / denominator)
[1] I know us developers like to spend an enormous amount of time making things super complicated with fad tech, but we know a lot of it is not required.
If you provide them a good sample, the function names and behaviors should give a really good sense of direction to the candidate, and the harder questions would be answered by the details of the code.
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.
That some people really struggle with properly defining the problem and what needs done in such a way that it's tractable.
Highly recommend this video on "The Expert" which illustrates this beautifully - https://www.youtube.com/watch?v=BKorP55Aqvg
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.
Yeah, and the sad thing is that you will probably end up trying to raise your car against one of the non-structural frames which will subsequently tear off a panel or two.
What you are measuring here is the skill of speculating.
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.
Every time I start a new job hunt, I have to fail a few interviews before I get practiced up again.
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.
I ask questions that are original (not hard, they don’t need to be hard, just something that they won’t find when they google “how to pass a programming interview”)
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.
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.
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.
"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.
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.
You are being tested on finding a solution that works, not on what function you use.
I had to learn C at some point though, and that used to be common. I suppose it's becoming a less useful test.
Even if you (somehow) don't know about it, figure something out? Do something "stupid that works" like this:
def floatcheck(x:Float, div:Int): String = (x / div).toString.split("\\.")(1) match {
case "0" => "int"
case _ => "float"
}
(1 until 100).foreach(e => {
if(floatcheck(e,15) == "int") println("fizzbuzz")
else if(floatcheck(e,3) == "int") println("fizz")
else if(floatcheck(e,5) == "int") println("buzz")
else println(e)
})
(I'm guessing this works, or maybe I fall into that category as well ;))If the test is interactive, the candidate can express, "I need to find out if this number is evenly divisible by that number; if so, then blah blah". Interviewer can remind them that x % 2 is "remainder of x when it is divided by 2". The point should not be whether someone can remember %, but whether they have any idea what minor goal they are trying to achieve.
I've had the same experience asking applicants to reverse a string in a language of their choice. sometimes they'll give me a simple answer like "''.join(reversed(my_str))" (python), which i'll accept and move on to the next (harder) question, but even if you don't remember that syntax, you should be easily able to build a function using a for loop. I find that 50% of applicants can't and it saves me a lot of time finding this out early in the interview process.
In [1]: "?he ,taeN"[::-1]
Out[1]: 'Neat, eh?'Explicit is better than implicit.
Readability counts.
This is first year-out-o-school, junior gate-keeping bullshit. We need better methods to evaluate intermediate and senior devs, and FizzBuzz ain't it
Think solutions.
------------------
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.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.
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.
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.
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?
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.
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?
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.
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.
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.
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.
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`.
In five years since graduating I haven't used modulus outside of toy code challenges
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.
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.
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).
I’m not quite sure I followed your post, but if I did, you’re still looking because you’re being obnoxious. If you asked somebody to write a class that represents an account with a balance/negative getter _in a job interview setting_, the code you posted looks fairly reasonable (assuming it’s written in a programming language that that compiles in - it’s obviously not Java, C# maybe?). I wouldn’t make “isNegative” a property; I’d replace it with “public bool isNegative { return balance < 0; }”, but otherwise, without any further instruction, again in an artificial job interview setting, without you clarifying what you’re looking for, there’s nothing wrong with this. Or are you pushing back on the “write a command line app” part when there’s no CLI attached? Because if you actually wanted one, you need to provide a lot more context than “write a command line app” (should I be tracking multiple accounts? Should there be a command to create a new one, or is there just one with a starting balance for demo purposes?).
Can I pm you on this?
The correct question is how many applicants are remaining that did this problem successfully? How many from that pool are companies hiring? I wonder what the actual numbers and percentages is.
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.
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.
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.
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.
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.
However, we can talk about overuse of the “singleton pattern” abomination…
I’ve been a programmer for years! Why can’t you just believe me!?
The responsibilities you bring up are valid but meaningless if core concepts are neglected or misunderstood.
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
Or curated here:
https://theoutline.com/post/1166/programmers-are-confessing-...
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
Then you are a programmer.
Please don't. Do enough interview situations at companies you don't care much about to numb you down (I did); this helps with nervousness. And sometimes you find out that you don't actually mind working there, and end up being hired (I did).
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/
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.
I highly recommend Georgia Tech's online master's program. It's ranked in the top 10 of all CS programs worldwide. The total cost of the program is under $10,000, and you can take a class part time while you're working full time. I'm halfway through the program myself, and it's definitely helped me keep my skills relevant especially since certain technologies didn't exist when I got my Bachelor's in 2008.
But when I was a kid / teen, it feels like I could learn anything. I could remember how to write in multiple programming languages, a bit of their std lib stuff etc. Now if I'm not working with it at the moment, it leaves my brain. For example I worked on some Node.js a few years ago. Nowadays, I probably couldn't write it to save my life.
You'd have a huge advantage over the typical student and could probably easily get over any problems with pointers by taking the course.
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.
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 Array(100).fill(0).map((x, i) => i % 15 === 0 ? 'FizzBuzz' : (i % 5 === 0 ? 'Buzz' : (i % 3 === 0 ? 'Fizz' : i)))I feel ashamed.