The Non-Programming Programmer

I’d like to plug my website, http://collabedit.com, it’s a collaborative text editor with syntax highlighting.

Where I work our phone interview consists of about 20 multiple choice questions covering basic concepts like algorithms, recursion, databases, OOP, etc.

We also like to have them write code on the phone using collabedit.

It is important to ask a very simple question, one so easy that if the person is nervous, a novice, or just even just low on caffeine they can still answer it. A good warm up is to show them some dead simple code and ask for the output, make the syntax extremely simple, there is no need to get into pointers or recursion. You are just trying to screen out people that can’t and never will be able to program. It will be at least half of the people that apply.

I think that a lot of these interview questions that are drilled down and are so specific (i.e - prime number function, etc) are great to get an overall picture of someone, but it shouldn’t be THE deciding factor. I would think that a more of a “How would you approach this situation?” type questions would be more suitable. The applicant would be able to use more tools in their toolbox than just a loop pseudo-code and some math.

To the people that are just graduating and complain that you’ve got the resources/knowledge to code, you just have done it yet – that’s your own fault. It only takes a few days in an intro Java class in college to realize that you aren’t going to get much coding experience in college outside the coding you choose to do on your own for fun.

I believe the author belongs to mars or some outer space. As, clearly he is not aware of the IT industry. asking about Why Can’t Programmers… Program?? The question has a tiny answer - because they are the product of IT industry. Software doesnt build ONLY by coding and programmers neednt do coding all the time they work.

199 out of 200 cannot answer the questions?? But dont you think that the rest of 199 are also working somewhere. And most probably they are working well.And i can bet many (MANY) of them can beat the hiring technical guy who rejects them by asking there own versions of remembered TINY puzzles to him just like the hiring guy asks him.

All programmers will program when there will be quality work available to sharpen there skills. In 4 years of experience a guy actual programs 30-40 percent of his time. In that too 90 percent of work is dealt with for and if else. From where the competency will come? and from where the rocket scientists will born to satisfy hiring manager’s hunger?

As someone else has correctly put in his comment - you can always learn to pass interview tests of any kind - that doesn’t mean you can program or not.

What about a common example about it. Which company is famous for its puzzle problem questions and very feared about not to hire any wrong guy? The Microsoft. We have even books for its puzzles of interview(How to move mount Fuji).
But please ask yourself which company has given us most bugs, security flaws and crashed systems?(if u dont remember recent IE flaw used by hackers).
And who has written all those buggy code if not the ones hired by their strict hiring measures??

My fellow programmers, despite your 10+ years of experience, your reactions are almost childish when you fail to recognize that the world around you is evolving. It may be scary, but this frustration you are experiencing is a side-effect to all that cool stuff that we developed to make our lives easier. We refused to write the same code twice, we complained about the tools, created new frameworks, controls, plugins, intellisense, code snippets so that we would never ever have to deal with those crappy pointers again. So don’t be shocked if this drag-and-drop programmers never needed to write any code to make a dumb form. Blame it on Microsoft, whatever.
But think about it. What was the last time you had to implement a linked list? Do you want this change to stop? Would you really want to be back to writing assembly language, or are you ready to live with the side-effects of making programming easier?
Now… worrying that they will steal your jobs?! You, as competent programmers should instead feel confident, that while those non-programmers will be doing the easy copy+paste work, you have the chance to worry about real, hard problems to solve.

I am of totally mixed feelings regarding this entire subject. I realized just the other day that I am coming up on my tenth year as a programmer, having started at 18.

I have conducted only a handful of interviews myself and I usually try and find out if the candidate actually likes programming. So I ask questions about what cool new things they learned recently, stuff they never used before, how it was used. What the last interesting chunk of code they wrote was, why it was cool, how it helped in their job. Stuff like that.

The thing that bothers me and has bothered me for a while, is that I probably couldn’t answer any of the questions posted here. I don’t remember how most internal compiler stuff works anymore. I don’t ever have to do any complicated math so I wouldn’t remember any of that. And I worked with 3-4 different languages on any given quarter… so I usually need to refresh my memory on the exact syntax of certain things every time I started a new project.

Does this make me a non programming programmer?
By the definitions above it might.

I would say that finding out if someone has the mind for problem solving is definitely important.

Knowledge of concepts is also pretty key (control statements, loops, recursion, inheritance, things like that). (I’ve talked to someone that couldn’t understand why having 2 else statements in 1 if statement was a problem before…)

In addition to that I definitely think you need people that actually like programming, people that write a function or solve a problem and fire off an email asking for a code review. People that actually brag to their peers about the sweet design they came up with to solve integration problems.

Lastly, people that know how to develop maintainable code. You can write all the super complex math functions you want, or you can tell me exactly what the compiler is doing with memory. But if you produce code / design that causes a cascade of bugs every time a revision is made or code that requires changes in 300 projects across 5 applications for the same revision, then no one is going to want to work on your code.

Things like that.

A bunch of the posters have hit the nail on the head. Like, when was the last time you connected to an SQL server database in C??? Have you ever tried without using a wrapped library? I would describe it as horrible and… gross feeling.

Alex at the daily wtf had some things to say about that a while back but I cant find the post. The point was that most of us write boring code, most of the IT world is employed to do boring things for banks and insurance companies.

So if you have heard the words “Oh, and we need it to have reporting!!” as many times as I have you really wont care too much about how all the lower level calls work, you will care more about how long its going to take you to write the code, how hard it will be to maintain for 10 years to come and how hard it will be to integrate with your other systems.

“I was asked in a phone interview the difference between a linked list and an array. The company does not do low level programming or code for mobile devices which would make the performance between the objects perceptible.”

Unless they only ever work with small amounts of data in a high-level language, all programmers should understand the difference between an array and a linked list. It’s almost akin to a carpenter knowing the advantages and disadvantages of nails versus screws. There are plenty of software creation activities where understanding how to use a hash table aren’t important, but they shouldn’t have Programmer or Software Engineer in the job title.

A surprising number of recent CS graduates have trouble writing a program. There’s a tendency for CS classes to focus on theory more than practice. Algorithms classes, for instance, will often provide skeleton code so the student just needs to fill in the algorithm’s implementation, because that’s the important piece for that class. And at a first pass that’s good: more of my software engineering worth comes from learning about computability and context-free grammars than comes from chasing leaky pointers in my freshman year. But I’m very glad that my program requires all students to participate in an actual software development project (sponsored by and in communication with local companies).

In case any CS students are reading this comment, here are my key tips:

  • Know one language well. Use it to do math, manipulate strings, handle collections of data, read and write input (from standard in and standard out, if possible).
  • Write simple but real programs. If you’ve got a repetitive task, write a small program to do it. You’ll quickly learn the quirks and bookkeeping that aren’t theoretically interesting but are critical for getting things to work.
  • Learn a few tricks about your development environment, from IDE shortcuts to text-processing functions in vim/emacs. If you’re interested in professional software development, these instincts will pay dividends.
  • Learn why things work the way they do. When you use a utility function, think about how you might implement it. Then look at the source code to see how the library designers decided to do it. (They’re usually pretty good.) Don’t get worried if you don’t understand something yet; there’s a lot of “It just works that way” until you learn more.
  • Program outside of school. Internships, ACM programming challenges, fun projects with friends, whatever. Just like students in music school should play their instrument beyond what’s required for class, computer science students should program for fun and profit.* If you can’t seem to get the hang of programming, assess your interests. There are lots of ways to be involved in software development without writing code. Quality assurance, user interface design, project management, system administration…
1 Like

To folks commenting about the relative merits of algorithmic questions versus solving business programs:

Your interview should test the skills you need at your company. If you’re applying for a job at my company, you need to know how to work out a solution to a novel problem, so an algorithmic question is great. If your company needs people that can create Visual Basic forms to call COM objects, create a simple one and have interviewees pop up a dialog with the result of a method call. I’d probably struggle in the latter interview, which is good for both of us: I don’t want to work with VB and you wouldn’t like the way I’d try to solve problems. The principle in both cases is the same: quickly reject anyone who can’t do the work that, in your company, is really basic.

Of course, you need to decide how much of a learning curve you can handle. When I created a “take home” programming interview problem, I let candidates do it in whatever language they wanted because it’s easier to teach a good programmer a new language than teach someone who knows a language how to program. But if you want someone who can complete the VB project in three months for a big client, you may not be happy with someone who’s spent his time writing UNIX device drivers.

Perhaps one problem is that there are several articles on the internet ALWAYS stating that one of the top 5 best paying “hot” jobs right now (especially in this bad economy) is the “Software Engineer.” Of course people are going to be drawn into thinking they can program when they can’t.

Another problem is that colleges do not ever train programmers to drill themselves on answering simple coding questions. It’s more about passing exams and learning theory. Most coding done in college is for assignments and projects that the students have one to several weeks to work on (with books, notes, etc.). When is a budding programmer ever trained to practice these interview-style questions from memory? I think part of this “epidemic” is due to lack of practice.

“Google-style graduate computer science interview problems” are not the kinds of problems that a working programmer in business will ever encounter. Fortunately I live in podunk PA so I only have to be more competent than an Amish programmer.

To people who say that in their many years of programming experience they have never needed to use recursion/linked lists/sorting algorithms/loops/arithmetic/etc., implying that those things don’t matter:

The charitable explanation is that you really understand these things and when to use them, but were “lucky” that they weren’t necessary for your job. If that’s the case, good for you, because you won’t have any trouble if someone asks you at an interview.

The less charitable explanation is that you really don’t grok what these things are or when to use them, and in all your years of experience missed plenty of opportunities to used them to produce a better solution to a programming problem. And believe me, this happens. I’ve seen code by coworkers who apparently didn’t quite get the idea of loops and arrays. The code “works” but is an unmaintainable mess. Or code that performs very poorly because someone didn’t have a clue about the different performance characteristics of arrays vs linked lists (or more likely had no idea about the existence of the latter).

Good programmers have a good toolbox of programming techniques, algorithms, and basic logic; they are always eager to learn and improve their toolbox and are constantly thinking of better ways of using the best tool for the task at hand.

I find these pompous posts from interviewers HILARIOUS! Sure, there should be some coding questions, but not to the point of mathematical riddles (12…9 to equal 2002? Give me a freaking break!).

Lots of people code by Googling. The purists would frown on that, but that’s the way of the world. You don’t reinvent the wheel when someone else has done it. The more an ‘expert’ you become, the more you realize how much you have to learn.

So, keep patting yourselves on the back, chuckling at the way you slam candidates with mind bending mathematical questions. While you are in your tiny cube doing the same monotonous thing over and over, the candidate you happily smacked down have probably written some iPhone apps already and earning twice as much as you.

EGO limits your world.

I am a computer science student. This blog and the comments by the recruiters have really surprised me. If this blog (and the comments) is anything close to reality, I highly recommend very recruiter in the country to come to IUPUI ( www.cs.iupui.edu ) for on campus recruiting. Most of the CS students at my university would easily be able to solves the coding problems described here. I promise, it would not be a waste of your time.

@Paul Jungwirth

Well for reference there are 2 solutions for 2001 if you include ‘-’ minus sign.

one main reason i see, lot of people without computer science degree are into Programming. Well yes there are some very bright programmers who learnt the basics out of curiosity but most did not. if they had the ground work , then i think most prob’ly they won’t be bad. we don’t have Doctors who studied Physics, then why we have a chemical engineer doing programming ?

I’m a freshman CS/Math double major, and I definitely agree with Jeff here. I’ve been coding for just over a year, and I found the 123456789 problem to be relatively easy(it took me about thirty minutes to work out in VBasic). It seems like CS graduates really shouldn’t struggle with those kinds of problems.

Unfortunately, my upperclassman friends confirmed that most programming classes are 90% theory and 10% coding… Which is why I take it upon myself to write new code as much as possible. Every once in a while, I’ll write a completely random script just to make sure programming becomes second nature. (Example: last week, I wrote a Sudoku solver, and the week before that I coded Minesweeper.)

Of course, no job would ever require you to code something trivial, but I still think that anyone who’s applying for a general programming position should be able to do so, even if they only use pseudocode. Not being able to print the nth Fibonacci number is just embarrassing, especially if the math part is explained to you.

@Murray Macchio IMHO if people don’t know how to program, they definitely can’t rate themselves. But I was asked this kind of questions sometimes, and it feel strange to answer something like “uuuh, this tech I don’t know, something between 2 and 3 perhaps”, but that’s honesty to yourself and recruiter.

@Mikeash I agreed, that’s not what we expect from a programmer. If he can answer this question by oral during the interview, he’s damn smart and would probably make a really good programmer.
In that sort of questions, out-of-school engineers are most likely to find an answer, but exeprienced programmer could stuck on it because they are not used to think on purely mathematical problems like this one.

It seems that in Europe, and in France actually, we do not have such sort of recruitement issues. It happens, but I think less than 25% percent of applicants. That’s why we filter them through their experience and references. As programming jobs is in general not so well paid and recognized here, and require strong skills, people tends to target other jobs (PM, consulting, or sales in computing field for instance).

I agree with the article but disagree. My background I did a Bachelor of Engineering in Engineering Geotechnics(basically a cross between geology and civil engineering) after 4 years of Uni 5 years doing the job I decided to go back to Uni and do a 1 year IT course. To get my first IT job the employer knew they were recruiting mainly non programmers, thus we all went through a long programming aptitude test to see if we could at least think like a programmer and produce pseudo code snippets to questions.

In the 10 years I have now been working in IT of have done pretty well for myself. I am not a brilliant algorithmic programmer but I can do all basics in my chosen language of Java (I am SCJP and SCWCD but just certs that can be crammed), I would call myself a alright coder thanks to my Google search skills and my focus on quality and being professional. I have coded and delivered many successful J2EE applications, but this is less about lots of algorithms but more about plumbing together frameworks with some business logic. I have worked with some very good people including some exceptional programmers that put my programming skills to shame. But writing small algorithms as a tiny part of a modern day senior developer in large businesses these days. So why have I done so well for myself? I spend many hours a week reading about many things in programming especially good design an coding principles and practices and have always been vocal in pushing these practices into the teams I have managed. I also make sure I work in teams that have smarter people than me so I learn. I have also developed my communication skills and tried to break down the barrier between geeky developers and the business. Being able to write algorithms is great but not the be all end all list of the skills a modern day developer must have. Give me a mediocre programmer that has read some Bob Martin (and other) books, has a passion for continuous improvement, can talk to the business and project managers and understand coding is all but a small part of delivering a successful software project. Rather than a great algorithmic programmer that sits with his headphones on and does not communicate. But hey his code is amazing, shame he is the only one that can understand it let alone the poor badly paid support team. I have seen too many times the mess that is left behind when great programmers have hacked a program together.

There is a place for all kinds of programmers in our industry we just need to stop thinking that everyone needs to be superstars. Know your own and those around you strengths and weaknesses and work with it. Why are very good technical people pushed into team leader position or architect positions if they do not have good communication skills?

All that said if you are going for a job as a low to medium grade programmer role you should know the basics of the your primary language and at least be able to produce basic pseudo code for logic problems.

All those people whining about the questions being irrelevant to your profession - you are the problem! For the sake of humanity, please go into some field that better fits your interests and capabilities, like taxidermy or landscape architecture.

Would you expect an aerospace engineering to be able to fly a plan? No, but he should no the principles of flight.
Would you expect a civil engineer to be able to drive a digger? No, but you would expect him to know how deep a hole can be dug without it collapsing.
Would you expect a senior software engineer how to implement a specific algorithm in language x? No but you would hope he knew the fundamental principles and practices of how to produce we designed and quality systems. If he can still dip into code all well and good.
Would you expect a programmer to be able to program. Yes

Lets not forget their are lots of different roles and responsibilities in large software projects not everyone needs to be the best programmer.

That’s all my point is.
PixyMisa - If you think I have a problem, well that’s your opinion, but not one that I fully agree with :-p