Dear Startups: Stop Asking Me Math Puzzles to Figure Out If I Can Code

I’ve always been pretty good at math. Not trigonometry, or arithmetic, or whatever people are usually thinking of when they’re like, “Oh, you must be smart! I hate math!” But, combinatorics and graph theory and proving things and figuring out how to put hats on prisoners – I love that stuff. I went to three different high schools, and I did math team at all of them. When I was ten or eleven and my parents needed me to shut up at dinner parties, they bribed me with books of math puzzles. No joke.

During my sophomore year of college, I was dating a Computer Science major, and I took some CS classes out of curiosity. To my surprise, CS wasn’t different from math at all. I took my Intro class in Java, so there was some mumbo-jumbo that you put at the top of your programs that went “public something void main something something”, but once you got that nonsense out of the way, it was all sorting lists and putting stuff in matrices and traversing trees. Easy stuff. And once the CS department switched to Python, it got even easier.

So I became a math and CS double-major at my tiny liberal arts school in Minnesota, and my senior year, I started looking for jobs. Turns out, only actuarial firms want to hire people who are really good (but not, like, PhD good) at nothing except figuring out how many ways there are to distribute hats from a coat check so that everyone gets the wrong hat back. So, software engineering it was.

After some research and a couple bad interviews and no small amount of panicking, I found a startup in San Francisco that looked awesome. I interviewed, expecting the worst. But for some reason, my interviewer asked me to find the shortest path between nodes A and B in a graph. (Essentially. I think he said some stuff about Kevin Bacon.) I did so. He asked if I could do better if I knew that A and B were exactly six degrees apart. Yep! Breadth-first search from both ends. Oh wait, you should do that anyway, even if you don’t know how far apart the nodes are! Cool. They flew me out for a full-day onsite interview, where they asked me a bunch more questions that involved sorting things and memoizing things and traversing things, and then they gave me an offer. The entire interview process from beginning to end took six days, and I wrote exactly zero lines of actual code.

Some more relevant things they could’ve asked me, but didn’t:

How comfortable are you with Unix?
I can change directories, list things, and run Python programs. Oh! And rename files. Probably.

Describe how Ajax calls work.
Umm, isn’t that what Gmail uses? It’s like, refreshing the page without refreshing the whole page?

What version control systems are you familiar with?
Oh, we used SVN for our senior thesis project. I accidentally triggered a conflict one time. Someone fixed it for me.

How would you implement a [deck of cards, public garage, hotel reservation system] using object-oriented design?
Variables. Variables everywhere. With counts. And maybe some strings.

Absolutely anything at all about databases.
Huh?

Listen, the very last thing I want is to sound ungrateful. At that first job, I learned all of those things I listed, and more, because the senior engineers patiently sat with me and put up with my stupid questions and never got frustrated with me, even when I got frustrated with myself. But it took me more than a year. And I’ve worked at three jobs since then, and interviewed at many, many more places, and I’ve found that my first startup’s interview style wasn’t a weird fluke. It’s actually extremely common practice. People ask math puzzles to determine programming ability. Why?

In a particularly egregious example of this, when I was interviewing for my second job out of college, I was asked to come up with an algorithm to eventually sink a submarine with unknown (but integral) position and velocity that was somewhere on a number line. (Spoiler alert: to solve this problem, you need to know how to enumerate the rationals.) Once again, zero lines of code. Two weeks into my new job, they told me to write them a consumer iPhone app. Needless to say, I had never encountered Objective-C. I’d written perhaps twenty lines of C in a group project in my programming languages class in college, and all I remembered was that it was terrible and you had to do your own garbage collection or something. My new startup gave me a book called The C Programming Language, pointed me to where I could install the newest version of Xcode, and off I went. Three weeks later, my CTO had a talk with me where he was like, “You’re not getting up to speed as quickly as we expected.” I redoubled my efforts. A week after that, we had the same conversation, but harsher. And then there was a holiday break, and the day after it, I was fired.

I was pretty devastated. I mean, nobody had ever called me a slow learner before. And I had a ton of software engineer friends, and they could all do this stuff. How hard could it possibly be? Why couldn’t I get it?

I promptly repressed my experience at that second startup, talked to nobody about it, joined my third startup (they asked me something about Markov chains), and proceeded to quietly freak out every time I had a 1-on-1 with my new CTO, wondering if I was about to hear that I wasn’t contributing enough, that I’d somehow tricked them into hiring me, that they’d thought I’d be so much better at this.

And I kept struggling, although I did feel like I was learning, and it did get easier. Slowly. But still, I would run into entirely new concepts that I just didn’t have the context for. One time, a few of us got together to code for fun on a Sunday, and someone suggested using node.js, because it seemed like a cool thing to learn. And, looking at some example code, I encountered an anonymous function being passed into another function. I did not get it. Everyone else did! Right away! Even though backend Javascript was new to them, too! So they spent half an hour drawing diagrams with lots of arrows for me, and finally (relying on a lot of metaphors in my head at once), I managed to cobble together a cursory understanding. And then I watched them pass their callbacks around in their code, and it was still magic to me, and I felt so dumb.

Recently, a close friend of mine began learning to code, and I found myself explaining stuff to her. Pretty basic stuff, like the difference between static and instance variables, and how inheritance works. And it dawned on me that I was using all these words like “class” and “object” and “method”, and I knew what they meant, intrinsically, without having to think about it, because I’d been using those words and those concepts for years. But every time I said one of those words, I saw her trying to remember what it meant, what properties it had, and how it fit with what I was saying, because somebody had just written the definitions of all those things on a blackboard for her not two weeks ago. And I realized (it took me that long to realize) that I couldn’t just transfer three years of software engineering experience to her by building and building on stuff I’d already explained. Brains, apparently, don’t work that way. Not like codebases.

It seems like a lot of interviewers think that CS theory and problem-solving skills are the important things, the difficult things, and if you know them, everything else is easy. It makes sense that they think this, because a lot of them have been coding since they were twelve, and they get how to code the same way I get how to solve puzzles. And they probably didn’t learn the theory side of it until college. But me, I’ve been practicing problem-solving since I was ten. So I feel like I’m in a pretty good position to say: programming is fucking difficult. Just as difficult as problem-solving, if not more so. And just because I breeze through your common-elements-in-unsorted-lists and linked-list-cycles and paths-through-grids problems, doesn’t mean that I’ll learn all the new coding stuff I need to know in my first few weeks on the job.

I mean, I’m getting better at it. I feel like I’m finally on the other side of the sheer confusion in the beginning. But I’ve been doing this for over three years now. And there’s still a long, long way to go before I’m anywhere near as good at programming as I am at solving math puzzles. So please, future interviewers, ask me a coding question. You’re trying to figure out if I can code. And I’m not trying to trick you! I want you to know! So there is absolutely no reason for this roundabout nonsense.

119 thoughts on “Dear Startups: Stop Asking Me Math Puzzles to Figure Out If I Can Code

  1. Roberto says:

    I have been coding for quite a while and i still don’t understand people!

  2. kryzodoze says:

    I’ll keep in mind to ask at future interviews what kind of coding they expect of me, thanks!

  3. Rizzex says:

    This is pretty funny. Software interviews are a plague on humanity: They suck.

    Here is how they work: One group of monkeys who have formed a tribe are introduced to a strange outside monkey. This monkey looks and smells funny, he has not yet been rubbed with feces and rolled in the common mud hole so they cannot determine if this is a good monkey or a bad monkey. Will this monkey make loud noises and summon nearby jaguars while they are all foraging for food and get them all killed? No one knows for sure. Clearly this monkey must be tested.

    The alpha monkey from the tribe…who knows everything, has a brilliant idea: Let me find a bunch of questions which I personally love in domain areas that give me a hard-on and then ask this outsider monkey these questions and watch him squirm while I crack my knuckles and chortle about how smart I am.

    Having greatly enjoyed Databases and Scalability , the alpha monkey proceeds to belittle the new monkey with these questions. Of course, the outsider monkey fails miserably and is clearly not a fit. The alpha monkey knows best: If this monkey does not enjoy Databases and Scalability they can’t be good because he personally loves these things and has studied them in depth. Therefore: No hire.

    Except for one thing. The new monkey was interviewing for an iOS programming role. Befuddled, the outsider monkey leaves the territory of the new tribe wondering to himself: “What kind of shitty interview was that? I applied for a job building iPhone apps and didn’t get asked a single XCode question. The guy kept asking me about how to scale AWS services. I didn’t even put any of those things on my resume?”

    The new monkey has made a critical mistake: Thinking that what he writes on his resume actually gets read by anyone. No, the way interviews actually work is that other monkeys pick topics they enjoy personally and then pelt the incoming monkey with random questions from those domains without respect for the job title or the background of the new monkey.

    Why is this the case? Because humans are nothing but large monkeys who hate outsiders and wish to ensure that only other monkeys just like them get in the door.

    The above story has been repeated in my life at least three times. Over and over I interview for an iOS role only to get asked server questions or some other domain specific questions from each interviewer (automation testing? wtf?) who has no idea about iOS, hasn’t studied the topic and hasn’t read my resume or the job description I am interviewing for.

    The above story is the best I have been able to do to come up with an explanation about why this is the case.

    • gwisrp says:

      Sounds like you should start your own group of monkeys with just the right faeces smell for you!

      • engineer says:

        The point is you should interview for programming ability, not to stroke your own ego or to see what they smell like.

    • cachichas says:

      Had a similar experience. I was being interviewed for a front-end developer position when a Project Manager started bombarding me with project management questions. I suppose I should be able to answer a few of his questions which I believe I did but according to the feedback I got afterwards is that I gave mostly vague answers. Of course, I did not get the job.

      PS. After the interview with the manager, I was interviewed by 2 developers and we sort of hit it off. A couple of programming questions and a lot of situational discussions went on. Feedback from them is that I was a great cultural fit.

    • There is automated testing in iOS…. Kiwi and is excellent for 1) Scoping out a problem and providing coverage for the edge cases the problems might occur 2) Making sure things don’t break during refactors.

    • Thunderbird says:

      Good point. I actually personally saw a senior member in a company that bombarded freshmen with questions the interviewer himself spent year in the field to realize…

  4. fkl says:

    Finally some one pointed out the importance of the ability to actually code and produce something that works. Really liked it. I would like to add that the algorithmic problem solving ability is far less utilized in actual every day job compared to being able to code. Just imagine how much of your math skills did you actually need going well through all those bad experiences? Would you still be considered slow learner and fired if you knew how to code pretty well but just wasn’t so good at figuring out shortest path in a graph. Isn’t it possible to know the CS basics well i.e. familiar with complexity, big Os, basic data structures and sorting and being able to learn any advanced standard algo when needed by looking it up? Just wondering….

  5. Mike Adler says:

    We have a couple of people like you at our place – people who are exceptionally good theoreticians but can’t code worth a damn. Usually they end up in the quality assurance or modelling branches – where logical thinking and mathematical background mean a lot more than language-specific alphabet soup. Good cross-training is a bonus here – they pick up a bit of coding from the developers, who themselves gain a bit more insight into the foundations of what they should be doing. Works for us.
    Incidentally, what you describe sounds to me like you should excel at graphing out complicated software and finding potential for optimization. Ever tried to go down that road?

    • countaleph says:

      Heh, I’ve certainly considered it. I’ve grown to love programming, though, and I’m over the steepest part of learning curve at this point. I definitely still struggle with new stuff sometimes, but it’s not nearly as difficult as when I was first starting out.

      • lauro gama says:

        The good is that your puzzle solving background will make you a better coder than most Once you get up to speed in the flavor of the month code language.
        And the good thing about “flavor of the month” is that they will come back next year, once you get 2 or 3 kinds of languages known (python and java and c++ are real good starts, now its just practice for you) the others will look familiar after 1 hour of coding.

      • engineer says:

        Please stop coding and start programming. (Seriously, “coding” is a diminutive term which implies uncreative transcription.)

      • Programming makes you sound like a middle-aged mental laborer. Which is exactly the sort of monkey outsider that most start-ups refuse to hire.

      • Wyrd Smythe says:

        Heh. I’ve proudly called myself a coder for over 35 years! I’ve done it all, down to the metal and up in the 4GL clouds. Coding is the honorable art of breaking a problem down into good,… oh, what was it called again,… ah yes, “code”! 😀

        But, then number me among those who think that, given the youth of software theory and practice, “Software Engineer” is vaguely insulting to real Engineers who’ve mastered a prescribed course of study and can be expected to understand the theory of their craft. Software development hasn’t reached that stage just yet. There is a wide range of skill sets out there, some broad, some narrow, but very few with good foundational knowledge, but often plenty of practical knowledge.

        Among those who take it very seriously, most consider “coder” an honorable, if unpretentious, term.

  6. Hi, I think we are in exactly the same boat. I guess you are from that cozy little school in Northfield too? Now I am trying hard to be good at programming instead of problem solving.

    • countaleph says:

      Ah, yes! Good to meet another Carl. Best of luck to you 🙂

      • Richard says:

        Darn. I was hoping you were from Mac. Congrats on dealing with this BS in interviews and congrats on sticking with it and learning so much.

      • Holly French says:

        Thanks for the great article, it really resonated with me. I’m also a Carl at a teach startup in the bay trying to learn how to be a programmer and not always think in terms of CS and math theory. 🙂

    • Calder says:

      Great article! And congrats on making it to the front page of Hacker News! 😀

      I was reading it thinking “no WAY is she from Carleton…” AND THEN YOU WERE. Yeah. True story.

      P.S. Hi Holly! 🙂

  7. mc says:

    Hi Emma, thanks for the interesting post. I’m interested in being a better problem and puzzle solver, myself. As coding, not problem solving is the thing I did when I was young, could you recommend some problem / puzzle books or resources for a beginner in the space?

    • countaleph says:

      Hmm, that’s a really good question. Do you work with other programmers? That might be a good place to start…most software engineers I know here in SF really enjoy these types of puzzles, and I heard most of my favorite puzzles from coworkers and friends. Plus, then you get to talk about it with another person, which is always helpful.

    • Mike Adler says:

      If you already can code a good bit and you want very interesting math puzzles, check out projecteuler.net

  8. And when they ask you to code something it’s again some sort of oh-so-creative-and-original problem that involves Fibonacci, prime numbers and auto-generating haiku poetry to be read in reverse. For years I thought it’s some sort of extremely clever HR trick to learn about the dark secrets of my personality, but then I realized that they just try to look smart in your eyes…

  9. S says:

    This is a really interesting post to me, because I’m exactly the opposite of you, I’m a programmer/coder since a young age when I did it as a hobby, but I’ve never been good at theories, terms and logic puzzles because frankly I couldn’t give a damn about things that isn’t in my way – I wouldn’t solve puzzles for the fun of it.

    I never felt that I was in anyway inferior to people who are good at theories or essentially has a good memory, when it comes to programming. Yet in companies whose interview consist of testing theories, terms and logic puzzles. I usually won’t get past those rounds, but believe it or not, the software that I make are often more superior as I focus on real-world application and performance – essentially by solving problems with the knowledge of the entire processing stack per CPU cycle and how instructions are performed and variables are stored and passed around, because, that’s where my passion is, computers.

    I originally made a long post explaining my case so that it doesn’t seem like I am trying to justify myself, but that’s what I often find myself doing when I go for interviews at companies whose process primarily revolve around theories like asking people to solve graph traversal problems and where the interviewer is specifically looking for BFS/DFS as answers but I’d come up with other solution to solve it using multiple threads or doing some preprocessing applicable to a certain problem domain.

    It is wrong. Computer science is an art that involves knowing and being able to analys exactly what your code does. Not just about in theory, you should solve it using some process designed at a time when single-process CPU is all people can fathom, but alas, even our academic system focuses on grading by a student’s knowledge in thoery and their ability to recite over their ability to solve real problems. This I know first hand since when I was in University, we had a 3rd year challenge to build self-driving robots in groups, our team won the event at the end of the year as it was the fastest and most reliable, but academically the teams that failed but focused on theory got better grades.

    • Mike Adler says:

      Two minor points to that:

      First, CS – or rather, SE – is more a craft than an artform. Thus, the developer should be more artisan than artist. Having functional, problem-solving code that then, furthermore, also possesses an intrinsic beauty is desirable and should be striven for, but functional and problem-solving is the baseline here.

      Second, if you intend to make a career in software development you will soon reach the point where both the theoretical foundation and the expertise in your chosen language(s) with all their caveats, libraries and tools are necessary. Any dev worth his salt should be able to not only code a solution, but also explain why that solution is good and just. Especially in back-end programming the things those seemingly stupid interview questions try to check will eventually come into play.

      Of course, as soon as you are not involved with some interchangeable facebook-ios-android-flashgame outfit but instead delve into other realms, domain knowledge and the ability to actually prove the correctness of your code also come into play. Most of the startup devs I know, if they told me they were developing for automotive or medical now or cobbling together air traffic control software – I would never get into a car again and stay clear of aircraft and any medical machinery more complex than a stethoscope.

      • engineer says:

        I believe it is an engineering discipline. You know the coded is just because you understand the science. Not so much it’s elegance or art, though those can be appreciated as well.

        Most startup engineers are incompetent because startups are started by kids right out of college who are themselves incompetent.

        They have no value for experience because they have no experience.

      • S says:

        I think you’re missing my point. I’m saying it’s an art because the ones that can actually program well and innovate are usually the ones that can think outside the box and not be bound by theories, and for that you have to look at it as an art form.

        If companies are only hiring for baseline engineers, sure, then it’s a craft. But companies whose hiring process involves checking on theories that were created in the 80s are usually the ones leading in one field or another, and to lead, you need to innovate, and to do that, you can’t just have a baseline engineer, you need engineers that are also architects.

        There are a million ways in SE to reach a solution. There maybe a best solution to a certain problem, but that is only true to a specific CPU architecture and thus the idea of a single correct solution is invalid, this is why I’m saying is an art. Because hardly anyone engineer software by knowing about the top down from the entire hardware architecture and the problem domain. At some point they either stop caring or hand the task to others or starts using libraries. There is a lot of balancing involve when engineering _for performance_ to ensure it works well on as many architectures as possible. In such cases, it’s only a craft if you can allocate resources to cover custom coding for the entire stack including the hardware.

        I’m not saying the theories are not important because knowing them means you have a base to step above, learning from history is important, but I think it’s very applicable today when I say that the theories we’ve learnt in Uni 5 years ago are mostly out-of-date and there are better solutions most of the time, what I’m trying to say is, companies whose interview process that involves specific set Q&A of “classic” problems aren’t doing themselves a favour, when people starts answering them using different and often better solutions to which the interviwer would not have the time or in certain cases may not even have the capability to proof it.

  10. I know a guy who is mechanical engineer and he was hired as a software engineer because his boss assumed that mechanical engineering is harder topic than software engineering :), after 6 months he was fired :).

    People if you want software engineer, hire software engineer!!!

  11. Greg says:

    These puzzle interviews are even less fun when done over the phone.

    http://typicalprogrammer.com/thirteen-patterns-of-programmer-interviews/

  12. Mihnea says:

    I know about “math” interviews. My opinion is that they want to know if you are comfortable in math, as this is taken as a sign that the person CAN learn programming, even if at the respective moment is less than a junior

  13. […] Dear Startups: Stop Asking Me Math Puzzles To Figure Out If I Can Code [Today Emma Learned] […]

  14. John says:

    The best test of whether a person can code is to sit down and code with them.
    The next best test is have them whiteboard code.
    Another good test is to review some of their production code (IP and NDA constraints considered.)
    BTW.These are also good ways for them to test the hiring company as to whether they might want to work there.

    • engineer says:

      I don’t code. I program. The difference between the two? I’m not a monkey transcribing ideas (which is what a coder is)… I am an engineer who understands systems.

      Having me write some arbitrary code will tell you a lot less than asking me questions about systems.

      Most of the “coding” challenges are just variations on these stupid math questions that involve not only solving the trivia problem but writing code for it too.

      The correct questions to ask are the real ones the company is facing at the time. What the real challenges are and possible ways to solve it will reveal a lot.

      • Mike Adler says:

        I think you’re talking about architecture. The difference between, as you put it, transcribing other’s ideas and engineering a systematic solution of your own. As I read the original poster, that level of competence, while striven for, is not currently achieved. Yet in most projects you actually have need of coders – at least as long as the market is shy of sufficiently qualified engineers. Those are at a premium.

  15. While I agree 100% that technical interviews are a bust, it seems to me you are looking at the wrong pastures, IMO. Putting yourself on the shoes of a startup, someone who isn’t up to speed on whatever platform they are using is a liability, not an asset. I think for someone in your situation, you (and your potential employer) would be much, much better served if it was an established business and not a startup, IMO.

    • engineer says:

      It doesn’t take significant time for an engineer to come up to speed on a platform. The idea that you need experience programming a specific language in order to do a job in that language is the idea of HR people who think that these skills are unique and who do not understand programming. I can interview in a language I only learned that day, and be proficient on the job the next week. Learning APIs takes longer, but is not really much of an issue as competent APIs are very similar.

      No, they ran an incompetent interview and then decided to jack off their ego by firing her.

      It’s very highly likely that these were startups run by incompetent people… because most startups are run by incompetent people. (Which is the real reason most startups fail… you could blame the VCs who give money based on sexiness of the idea rather than competence… but you can’t blame her.)

  16. Why Do You Need To Know says:

    Need a bigger font! Had to zoom to 200% to read comfortably.

  17. Ugh! I hate coding. I fully admit that I’ve never been even remotely okay at it. I love math and I can describe all the same math stuff you described above. But ask me to code and I’m out. For my undergrad I majored in math and my degree program required that I take and pass a C++ course. After three attempts and a high grade of a D, I had to get special permission from the Dean to drop the requirement for my degree.

  18. kris says:

    I am not a software engineer, but a scientist. I have had limited big company job interview experience.

    I think successful interview questions should have no right answer, and should indicate preference. This is typically a way to tell efficiently if someone has a clue.

    I was asked “which compiler would you in your work?” And I answered “it depends, if you want diagnostic error messages, use this one, but if you want execution speed – use this other one” and they immediately said “that is essentially the correct answer.”

    It would also be revealing to ask about something which involves defending which editor or version control someone uses. Having a preference at all is good, and certain preferences usually indicate advanced understanding.

    Actually asking someone to solve a simple problem seems like a good idea “e.g. Fizz buzz”, but is honestly often plagued with issues. Smart people can come up to speed quickly with most reasonable systems.

  19. Don'tknowmath says:

    I’m quite the opposite. I am good at getting stuff done, but I have forgotten most of the math I learned

    This also applies to algorithms. I always learn what I need to learn, but it’s often pushed out to make room for new stuff. I don’t remember if a function is O(log n) or O(n^2), but I can easily tell if a function is more efficient or not.

    I’m dreading my next interview

  20. tdemo says:

    Interviews are annoying. You never know what you’re getting into! Half of them are excessively ridiculous. Like dating girls that don’t know what they want and make bad decisions based on image.

    Just code away! It really shouldn’t be hard, and it really isn’t.. it just takes time and loads of coding to finally get to the point were you can do anything and get crazy with it.

    You might fail at first for awhile, just get up and keep going. I say.. start some self projects (to practice) to avoid disappointing people. School teaches nothing but fancy concepts and words that you won’t ever use.

  21. Aleksey says:

    This is a classic. I had pleasure of interviewing with a fresh out of school CS graduate (I don’t know why a company would match somebody with 10+ years of experience with that guy).

    He had a puzzle that I solved programmatically but since it was solved in 1 line he wanted me to do it in ‘math’.

    Yeah, have fun guy.

    • engineer says:

      I see this a lot with startups. Getting interviewed by people who are too green to be able to understand the answers they are given. They ask trick questions that they think there is a pat answer to, but you give them the results of experience, and they are incompetent so they don’t understand it and assume you’re just BSing them.

      It’s quite sad, really.

  22. John says:

    You can tell you’re from Minnesota because you said “math team.” I think we’re the only state that has math team. I have a lot of good memories from my time on math team, including meeting my future wife.

    As for interviewing, after interviewing at Amazon, Microsoft, Google, and many other companies, I’ve come to realize that the only way to know if someone is a good employee is to give them real work. However, since so few companies do “contract to hire” systems, we’re stuck with interviews, and, sadly, interviews are more of a crap shoot then any company would care to admit.

    • engineer says:

      The problem with contract-to-hire is it has become a trick where they don’t pay contract rates and instead pay regular salary rates without the benefits of actually being employed.

  23. Nick says:

    You double-majored with CS and can’t answer those questions? That my friend, is why they are asking them. You don’t have enough experience or knowledge of what’s need for the job.

    • tdemo says:

      ^ A bit harsh but true. It’s more of a matter of experience and real-life practice if I can say. The double major definitely makes people expect more (from the start) out of an individual.

      • engineer says:

        You don’t get it. She didn’t fail, they failed. Because they ask stupid self aggrandizing trivia questions rather than do a competent interview. Because they ask trivia and then expect her to have zero time to come up to speed with Cocoa.

        That’s pure incompetence.

        It’s not surprising too, because bay area startups are generally run by idiots with no engineering expertise who hire right-out-of-school self-centered jerks who aren’t half as skilled technically as they think they are.

        Every time you fire someone, it’s incompetence on your part, not theirs. It’s proof you did an incompetent interview, or provided a poor work environment.

      • Right on!
        I’ve experienced this thought. But the Man always wins!

    • engineer says:

      You aren’t paying attention are you? She aces all the stupid math questions they give. You’re an incompetent programmer so you think that somehow them asking her stupid questions reflects badly on her.

      You’re just projecting your own incompetence on her.

      Thus it’s clear to me you have less experience or knowledge than she does.

  24. Zack Bloom says:

    If you want to hire engineers, ask about engineering. http://dev.hubspot.com/blog/interview-loop

  25. David says:

    Whilst I agree whole heartedly, with the points you are making, such as companies looking for software engineers could do more to test your programming skills prior to work placement, my overwhelming view is that you are a tit for not being more involved in your interview process.

    How do you allow yourself to by employed into a role you do not fit, more than once without learning from it? – Reading your story it comes across as though your just floating through life.

    In future I’d advise asking relevant questions instead of wasting your time.

    At least you had a go though…

    • countaleph says:

      That’s a totally fair question. Certainly at this point I know better – I know that interviews exist for me to make sure the company is right for me, too. And I make damn sure that the resources to learn what I need to learn will be there for me.

      All I can say regarding previous career incompetence is: it’s pretty hard to disagree with a boss who tells you that you ought to be able to do something. I mean, they should know, right? They can do it. All the other engineers can do it. And they all saw something in me that indicated to them that I would be able to do it too. But then, it turned out that I couldn’t. At least, not right away. It’s pretty hard not to doubt yourself in that situation.

  26. David Minor says:

    I’ve worked for 14 years as the “system guy” in math research groups. There is an intersection between the two areas, but they definitely are not the same. I’ve met plenty of top mathematicians who could barely code and top system programmers that could barely run a proof!

  27. Cronut Maven says:

    Great article. I just had to endure the above plus the CEO wanted me to replicate a website using yola.com. Used that before? One of the worst pieces of software EVER CREATED.

    Also, were any of these places looking for a PHP Ninja?

    http://www.bunstermedia.com/guru-ninja-rock-star/

  28. Jessica Shu says:

    I have the exact same problem!! I’ve been getting so many job offers but I don’t feel like I deserve them. It’s bothering me so much and it’s the biggest problem on my mind lately.

    Algos are so easy – I’ve been doing times math competitions since grade school so I always ace interviews but I don’t understand software at all. Last summer I did an internship where I had to learn Ruby on Rails – barely got anything done other than write some client code and api stuff after they told me exactly where to start typing. I didn’t get how it all fit together to make the product (a pretty complicated FB app)

    How do I get more comfortable with software and real life web development? It confuses the hell out of me =(

    I’m very willing to work hard and ambitious but the only thing that is stopping me from joining a high growth, very small startup is my fear of failure or letting someone down and my inability to understand how this stuff works. I get that it takes work and maybe I can spend a few hours learning to use heroku or node.js or ios or whatever, but I feel like if I am fundamentally not good at learning to use new technologies maybe being a developer is not a good choice since new technologies are always popping up. But I love coding so much! I write python scripts and run them in codecademy for all my math homework (because I haven’t even completely figured out how to run it anywhere else….)

    I literally understand about half the news I read on HN. If anyone has been in my position and has any advice – please help. I’d love to get an email on how you got over it or what you did to fix this.

    The website I posted was the only work I have ever done from start to finish by myself. I friend walked me through basics – let me know what you think. I made it last week and it’s actually given me a bit of hope that I could learn enough to make it. Other than that though – I feel like I am completely inexperienced despite how my resume looks.

    • Mike Adler says:

      Perhaps a startup isn’t the right choice with that skill set. Established companies tend to value it more, I think. They can afford to hire people that don’t directly contribute to the codebase but offer valuable skills that coders – and I do mean that diminuitively – lack.

    • countaleph says:

      I got incredibly lucky with my first startup, because they were willing to teach me the stuff I didn’t know. Even the really, really stupid stuff I didn’t know. I’d say that you should try to find a place like that – one where you’ll have a mentor, and lots of mid-level and senior engineers to learn from. Ask them during interviews what kind of resources they have for a junior engineer who’s new to a lot of this. Avoid the places who brush it off with, “Oh, it’s super easy, you’ll pick it up.”

      Other than that, I’m just going to pass along some advice from a senior engineer with whom I had the pleasure of working last year: just keep programming. This advice infuriated me when I heard it, and it still infuriates me, because why the hell aren’t there shortcuts through this stuff? If there are, I haven’t found them 🙂

      • Jessica Shu says:

        Thanks! Will definitely keep that in mind. It is just hard to turn down companies with great reps in exchange for smaller ones where I know I would get better mentoring but I guess it would be best if I did that. Can I ask which startup you worked at?

    • AntiSlice says:

      Replying more to your comment “that makes me sad.” Why does someone suggesting that an established company could be a better fit make you sad? It makes sense – they have more resources and can therefore spend more time mentoring someone inexperienced. My first programming job ever was at a 10 year old enterprise company and it was a fantastic decision as they were able to offer me a lot of support while I came up to speed. And judging from your site, you have plenty of time to practice and learn before the quote unquote real world. So don’t worry about having to find a small trendy startup for internships or a job, go with somewhere that offers the best support and learning experience. Then you can go start the trendy small startup!

  29. A.M. says:

    I can’t understand what this fuss is all about. I’m almost 18 and I’ve been programming for almost 3 years now. I’ve learned a lot. PHP, HTML/CSS/JS/MVC pattern. Next C# and Java with their OO principles. Then a bit functunal programming with Scala. Then C and C++ algorithms and data structures and a bit Android development. All this for 3 years. And wow, can’t believe they are asking you questions on the interviews about traversing graphs, that’s literally a no-brainer. This is the most basic stuff in graph theory. I guess the average level of developer proficiency in SF isn’t high at all (even generally) despite the good universities.

    • Mike Adler says:

      I hear the voice of the junior coder. Dabbles in everything, master of nothing – yet. Time will tell.

      • A.M. says:

        Well yea, you can’t become a master in such a short period of time. But by the time I graduate from university, I will be a lot better. And I was kinda expecting more advanced questions to be asked in an interview, maybe some problems involving min/max spanning trees/graph flows or some dynamic optimisation problem, not a simple DFS/BFS. And IMO, if you want to be one of the best at something, you should start early and improve every day. That’s what I’m doing. And dude, I’m not a coder, that’s kinda an isult. I dont just code, I am stdying algos and data structures/functional programming so I can make fast and efficient software. That’s definitely not relating to being a coder/code monkey or whatever.

  30. Rob says:

    Cool post. As a long time (i.e. old) programmer who never had official CS training,I really like your post. I also suck at math, so there’s that too.

    I’ve built rather specific domain knowledge, and combined that with a healthy interest in other software related techniques. I have a good job with plenty of opportunities. I guess my point is that yes, there are definitely moments where my lack of formal CS education hinders me, but if you put your mind to it, and have a basic understanding of how code works, you can get pretty far in software development.

    Oh, and search engines are your friend, but only if you are trying to *understand* the search results……..

  31. Jase says:

    The interview is a 2 way street. While the company makes you jump through hoops to see if your good enough, you also have a opportunity to determine if you want to work for them.

    I like to ask “what will I be working on in the next 6 months” that way you don’t rock up and than the second day they through you in the deep end. Them telling you to learn ObjectiveC and iPhone a few weeks in is ridiculous if they didn’t tell you to expect this in your interviews.

    Best of luck in the future

  32. Alex says:

    True, some interviews definitely suck. But not all companies are like that. I’ve met many really great companies that actually tested me on coding ability.

    If you’re interested in getting better at programming, I’d recommend checking out Hacker School (https://www.hackerschool.com/). It’s great!

  33. Suren Sarukhanyan says:

    I was reading an article in LinkedIn the other day about weird interviews. Think it will be relevant here too and after all it’s funny
    http://www.theworkbuzz.com/get-the-job/interviews/13-strange-interview-mistakes/#! 🙂

    And this is in case you need an advice: http://www.holborntraining.co.uk/interview-advice-tips/

  34. richarddunks says:

    Reblogged this on Datapolitan and commented:
    A great post on the mixed up world of tech interviews.

  35. Blake says:

    Maybe they hired exactly what they were looking for? (Except that second company; they sucked.) But the others… in three years you became a good coder. They invested, and for this third start up it’s paying off. Looking for someone who could solve puzzles let them find someone who could learn how to code.
    If you need a coder who can solve puzzles your options are pay through the nose, get a coder and try to teach them to solve puzzles or get someone who can solve puzzles and will be able to learn to code. These companies were willing to hire the latter.

    I’ve only once been hired into a job where I already knew the language and technologies (my expertise is OO design and architecture, but I’m a coder, not an architect.) I’m almost always learning on the job, and the companies I work for know they are subsidizing that. My current company goes out of their way to make sure developers are working on stuff they haven’t done before, because it keeps them interested and lets them grow as developers.

    I doubt you are as underqualified as you think; entry level positions are supposed to be entry level, and if you’re productive three years later, their screening was probably successful.

  36. matt the atheist says:

    Regarding Job Security Today…

    There are two main issues here: The first issue (and the smaller of the two,) is that companies are looking for candidates that already have a specific set of skills. And yes, they expect you to already have those skills. They don’t care about how quickly you can learn. They just want you to jump right in and start producing. Is it fair? Not really. But that’s the way it is. You have to learn to play the game.

    The second issue (the really big one,) is about the demise of the CS programs in America. I am amazed at how little “technical” knowledge CS graduates actually have. Sure, they can use and abuse a bunch of API libraries in Java, C#, etc, but what else do they really know? Just look at the comments posted here! CS graduates are competing for jobs with other people who DON’T have CS degrees.

    If you’re worried about job security, listen to me. I’m a graduate of Virginia Tech’s Computer ENGINEERING program. Why did I choose CpE instead of CS? Because it’s harder. MUCH harder. I’m talking multiple orders of magnitude harder. I’m talking about designing microprocessors (one transistor at a time), writing operating systems from scratch, tons of assembly and C programming, signal and speech processing, digital filters, digital control systems, etc. It was tough. I cried. I cried a lot. And in the end, it was worth it. No pain, no gain, right?

    You want real job security? Choose CpE. And forget this CS liberal arts degree.

  37. Bryce says:

    One of my college internships was one where I didn’t understand what they wanted me to do, they didn’t understand where my skills actually lay, and once we realized that we were both too stubborn to admit things weren’t working.

    I thought I’d be using a specialized modeling program for the work they were doing, they thought that since I’d spent a summer with the team that made the program I could get the Windows-based program installed on Linux and then teach them how to use it so they wouldn’t have to pay for training. I never got to that second part because this was back when “user-friendly” was seen by Linux people as a sign of weakness, so I spent the whole summer stuck in dependency hell trying to get the thing installed. Maybe someone who knew what they were doing could’ve done it in a day, but they didn’t hire that.

  38. Alex says:

    Google did some research on the predictive ability of these types of puzzle questions and found it’s worthless:

    http://www.nytimes.com/2013/06/20/business/in-head-hunting-big-data-may-not-be-such-a-big-deal.html?_r=0

  39. […] Dear Startups: Stop Asking me Math Puzzles to figure out if I can Code […]

  40. Jeremy says:

    I’m a little late to the party but here’s my 2 cents…
    Good programming can be realized starting with good pseudo code.
    Making sure to stick with best practices like SOLID –
    http://en.wikipedia.org/wiki/Solid_(object-oriented_design)

    This will throw you into design patterns that can be considered depending on the complexity of your problem.
    Like you, I love problem solving, and programming is just another problem.

    There are a lot of good frameworks out there, many with community contribution. Front-end stuff like JQuery and KnockoutJS, and on the back-end they are countless and mostly language dependent.
    Watch out for people telling you frameworks are bad.
    Mostly you’ll hear this from the old guys that are upset by the fact there are libraries for most low level coding now, and “these young folks don’t understand….”, “When I was your age, I had to punch cards, and if someone tripped on the way to the loader…” LOL.
    It’s not like that anymore for a reason =]

    Understanding the concepts is important in the real world. Understanding everything about a language or low level methods is not necessary in the real world. Don’t waste time.
    You seem like an intelligent person, if you have trouble making something work, dig into the internals, but don’t be afraid to stand on other’s shoulders to get some fast gratification [and a paycheck].

  41. pchtraveler says:

    Hi Emma,

    It sounds like you are colliding with detail design vs system design and architecture. As you have found out, they are not the same thing. Unless a company is farsighted enough, the system / architecture designers are plucked from the detailed designers. I worked at a very large aerospace company just down the Peninsula from you, and had to struggle through this. (If you are into Myers-Briggs, the detail people are SJs and the system / architecture people are NTs, and NTs can mimic SJs but SJs seldom succeed as NT’s) .

    The problem facing the interviewer is to guess how competent people might become. Aside from the SJ / NT thing, the biggest problem with bringing someone new in is that, unless they have already done exactly what the new position is, with the same people, on the same project, the new person is going to have to start over. How quickly they progress from (Step 1 – Insecure – Ignorant) to (Step 2 – Secure – Ignorant) to (Step 3 – Insecure – Smart) to (Step 4 – Secure – Smart) is the question. When someone starts a new job or task outside their original sphere, they always start at Step 1. In time, most get to Step 3, and a few get to Step 4.

    The task of the interviewer is to figure out how long it will take to get from (Step 1) -> (Step 2) -> (Step 3). The sad truth is that most interviewers are, themselves, usually stuck at Step 3, and have no courage to get to Step 4, so they are asking the questions that they themselves, have not yet solved, and are, perhaps, intended to make themselves feel better about how smart they are.

    Hang in there. Hope you make it to Step 4. Pat

  42. Wyrd Smythe says:

    Having been given the job of having to interview prospective new hires, I can say it’s not easy. I’ve been coding since 1977, so I have plenty of experience, but figuring out if the other party does (or is just blowing smoke up your ass) is a challenge. I certainly learned very quickly to never trust a resume. I tried to stick to probing technical questions designed to see how well they understood foundation theory (which I believe makes for better programmers). For Java programmers, a common question was, “What is the difference between class inheritance and interface inheritance, and (more importantly) why would you chose one over the other?” (And in a web context I would definitely have asked you to describe AJAX.)

    From your post, though, it does sound like you’re one of us, even if it was a long and difficult road. (Me, I soaked it up like a sponge… I was apparently born a coder.)

  43. dheerajsah says:

    I understand what you might be going through and can sense the frustration in your words. I too take a lot of interviews in technical and design skills, however I do agree, being good at problem solving or mathematics would largely mean a great programmer. I think knowledge of the tool is equally important as the art of mathematics.
    It is not guaranteed that the person who can draw beautiful painting is also a good sculpture. So, if you are hiring a sculpture, make sure you also check how strong is he with his tools and not paint brush.

    I think you would one day be a great programmer as well, because one who understand what is required, only he or she excels!

    BTW, great work! Loved the narration!

  44. I’m a final year Computing student and just starting to apply for graduate jobs – this post both makes me happy and scared! I’m pretty good at Maths, but I also feel like I don’t know anywhere near enough about programming to do a job! And to make it worse most of my experience is in Arduino, which probably isn’t used much!

  45. twdyen says:

    Well, you just got freshly pressed. I couldn’t have found this post otherwise. The real reason why math is more important is because it actually speeds up performance and possibly enhances scalability by at least 10 times. If you code everything in C or Assembly, you can achieve the same improvement, too, but a good compiler can beat you almost every time. Compilers don’t need to be paid and can’t possibly make mistakes unless the programmers writing them make mistakes. If automated problem solvers can possibly be designed and implemented, then the present state of math becomes a second-class citizen also in the world of computer science. To remain first-class, problems need to be impossible to solve by a machine. You should have taken compiler design if programming had been your weakness and math your strength. If compilers are too hard to understand, you can start with word processors or even text editors.

    In short, whenever we discover a significant improvement, we want to theorize it and call it a math problem. This way, we get a chance to solve a problem at a more abstract level. A side benefit is to make it easier to transfer knowledge.

    Lambda is supposed to be easy to comprehend by a math wizard who learned higher-order logic and functions before. You probably took the easy courses at college. It’s all about deferring actual execution until when it’s absolutely necessary to run it and writing shorter code that fits into cache, if possible at all. Code elegance is a subjective matter and closure is not exactly easy to trace and debug, either. There’s a reason why it’s called functional goto. In fact, if you just like it easy, transactional programming as is done in relational databases is your best friend.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: