This page is collection of general questions that I’m thinking of asking the programmers I interview for Coders at Work. (As opposed to specific questions for specific interviewees.) My goal, as I hope is obvious from the questions here, is to focus primarily on the actual art/craft/science of programming, though I do construe programming somewhat broadly. I’ve tried to categorize questions here into basic themes both as a way of organizing them and also as a way to try to prompt myself to think of other questions. (“What else should I ask about X?”) If you have suggestions for other questions, in the categories I have here or otherwise, please email me or leave a comment on the comment page. If you want to suggest a question for a specific interviewee, find their name on the list and click on it.
How do you design your code? On paper? Whiteboard? UML? While coding? By test first methods?
How do you tell if a design is any good?
Do you think being a good software designer/architect is part of being a good programmer? Or are there great programmers who shouldn’t be involved in design?
How do you start a programming project? How do you know when you’re done?
To what extent is it possible to design software before you start coding? Have you ever had good success with a substantial upfront design?
Have you ever been involved in a project that wasted a lot of time on an upfront design that didn’t work out?
Some people say the only way to really understand what problem you’re trying to solve is to start coding. What do you think of this notion?
Is it possible to arrive at a good design by following the XPers rules of YAGNI and constant refactoring?
Is it possible to arrive at a good design entirely before programming? Assuming you are starting from a reasonably stable set of requirements, can you get to a design that is detailed enough that once you start programming all that remains is to flesh out the final level of implementation detail? Or do designs, like plans of battle, never survive first contact with the enemy?
Do people unnecessarily conflate requirements gathering with design, leading them to think that up-front design is harder than it really is? Or are the people who try to separate requirements gathering and software design misguided because these things are fundamentally intertwined?
How do you go about gathering requirements for a new piece of software?
How do you deal with changing requirements? Try to lock them down early or use a process that can more easily accommodate changes to the requirements? In either case, describe how you do it.
Do you use prototypes as part of your requirements gathering process? Do you actually throw them away?
Do you use any low-fidelity prototyping techniques (paper prototypes, etc.)
Do you believe it’s possible to accurately estimate the time it will take to develop a piece of software? If so, what do you have to do to make it possible?
Have you ever used formal estimation procedures? How did they work for you?
Have you ever faced a build vs buy decision where you choose to build and later realized you should have bought? How about one where you chose to buy and later realized you should have built?
Have you ever faced a build vs buy decision and you’re still not sure whether you made the right choice or not?
What programming techniques do you think programmers overuse?
What programming techniques do you think programmers under-use?
What’s your philosophy of commenting?
What are some psychological traps you can fall into while programming? How do you attempt to avoid them?
How conistent are you about your code formatting? What happens when you work with someone with a different style?
Are there aspects of your style would allow your coworkers to look at a piece of code and know that you wrote it? What are they?
How would you describe your programming style?
Is the day when all programmers need to be algorithm experts past? (Quote: “We read Knuth so you don't have to.” -Tim Peters (explaining what the Python developers do in their spare time))
What was your first programming language? When did you learn it? What was your second, and when did you learn it?
What programming languages have you used professionally?
What’s your favorite programming language? Why?
What’s the lowest level programming language you still use regularly?
What’s the lowest level programming language you’ve ever used? When and why?
Are there important ideas from less-used languages that should be in mainstream languages and aren’t?
How much does choice of programming language matter?
Are languages getting better over time?
When was the last time you learned a new programming language? How long did it take you to get up to speed in it?
Are there any programming languages you don’t know well that you’d like to learn better? Why haven’t you?
Are there any programming languages you wished you’d never learned? Why?
Do you still like the first programming languages you used? Or has learning new languages revealed limitations in those languages that you can’t live with any more?
If you could add one feature to your favorite language, what would it be?
If you could remove one mis-feature from your favorite language, what would it be?
If you could make one other change to your favorite language, what would it be?
Are you still searching for a better language?
How do you think most programmers choose their programming language? Is that a good way?
What’s your favorite team structure for a programming project? What’s the most productive? How is work divided?
Gerald Weinberg said in The Psychology of Computer Programming, “for the best programming at the least cost, give the best possible programmers you can find sufficient time so you need the smallest number of them.” In the silver anniversary edition he says this claim is still true but with three amendments, one of which is: “The smallest number is never a single programmer.” Do agree?
Have you ever extensively pair programmed, i.e. two programmers at one machine? Did you like it? Why or why not?
What roles related the development of software should programmers participate in? Documentation? Tech support? Testing? User-interface design? Which should they not be involved in?
Are the difficulties you’ve experienced working on software projects primarily management problems or technical problems? (C.f. The Psychology of Computer Programming, p. 113)
Is it true that great software is always the product of a single mind/vision?
Is any really interesting software written completely by one person? Was it in the past?
Are there any special techniques for working well with other programmers on a project?
In The Psychology of Computer Programming (p. 150) Gerald Weinberg talks about the balance between “humility” and “assertiveness”; the former keeps you from over-reaching while the latter allows you to work your way through obstacles. How should a programmer find the right balance?
Have you ever had your Myers-Briggs Type Indicator assessed? What was it? Do you buy it?
What percentage of your time do you spend working alone? (Weinberg in The Psychology of Computer Programming, says industry average is 33%)
Suppose you are starting out on a new project. Describe what you do.
Do you follow any particular programming methodology? How scrupulously do you follow it?
Would you use a dramatically different methodology for different sized teams?
How would you break down the sub-tasks of developing software? What is your role in each stage?
Have you ever worked somewhere where there was a strong division between “programmers” and non-coding “architects”? Which were you? Did it work well?
Have you ever worked on a team that used a “name brand” methodology? (XP, Scrum, RUP, etc.) Describe your experience.
Have you ever worked on a “Chief programmer” (a.k.a. “Surgical”) team? What role did you play? Describe your experience.
Have you ever done work for a government contract? What was that like? Is it possible for good software to be written under those circumstances?
Have you ever worked anywhere that tried to get ISO-9001 certified? Was it successful? Was it worth it?
Have you ever worked anywhere that worried about its CMM level? What level did you get to? What was good about it? What was bad?
Have you ever worked anywhere that regularly did project post-mortems? Describe how it affected the software you built.
Have you ever worked anywhere that used formal inspections? Describe how it affected the software you built.
Have you ever worked anywhere that did pair programming regularly or exclusively? Describe how it affected the software you built.
Have you ever worked anywhere that proved programs correct? Describe how it affected the software you built.
Have you ever worked anywhere that practiced test first programming? Describe how it affected the software you built.
Have you ever worked anywhere that practiced “egoless” programming? Describe how it affected the software you built.
Have you ever worked anywhere that consistently hit estimates? If so, how did you do it? If not, do you think it can be done?
Have you ever worked anywhere that worked without estimates? Describe how it affected the software you built.
Have you ever worked anywhere that had a large project spiral wildly out of control? What happened?
Have you ever worked anywhere that worked no overtime but still got a lot done? If so, what made it work?
Have you ever worked anywhere that worked a lot of overtime? How did it affect the software you built.
How do you deal with error handling? Exceptions? Return codes? Formal invariants?
What do you think of “defensive programming”?
There’s an impedance mismatch between stack unwinding exceptions and invariants. How do you deal with it?
Is it possible the functional programming guys are right?
What is your ideal physical environment for programming? Is it the same for all tasks?
What tools do you use every day? Every week?
Favorite tools? Editor? Version control? Debugger? Drawing tool? Other?
Have any tools dramatically improved your productivity and/or enjoyment of programming?
Are there any tools you use regularly that you hate? Why do you use them?
What tools do you think programmers overuse?
What tools do you think programmers under-use?
What tools do you wish you had that you don’t? Why don’t you have them?
Have you had any physical problems (e.g. RSI) from programming? What did you do about it?
Alan Cox is reported to have once said, “A computer is a state machine. Threads are for people who can't program state machines.” Comment?
What’s your preferred approach to writing concurrent programs? Threading? Erlang style? Don’t?
Are there techniques you use to increase the portability of your software?
Have you ever regretted not having taken more care to make some of your software more easily portable? What happened?
Have you ever had to deal with internationalizion/localization of your software? How’d it go?
Typical output a day?
How often do you take a break?
Where do you program? Home, office?
Anything unusual about office setup? Computer setup?
Number of computers and types. Extra screens? Other hardware? Advice?
Do you prefer explicit memory management or garbage collection?
Do you prefer static or dynamic typing?
Do you prefer languages with implicit booleans (e.g. C or Common Lisp) or explicit booleans (e.g. Java)
Do you prefer case-sensitive or case-insensitive languages?
To what extent should a programming language be designed to prevent programmers from making mistakes/writing bad code?
Is “egoless programming” (or “no code ownership” as the XPers have it) a good idea? A bad idea? An over-hyped fad?
Is it important for programmers to “own” parts of code when working in a group? Or is it important, a la “egoless” programming, that they not?
Have you ever felt compelled to significantly rewrite a coworkers code? How did you deal with the potential personal conflict that could cause? Are you glad you did the rewrite? Would you do anything differently if you had it to do over again?
Have you ever used a Literate Programming system (a la Knuth’s WEB or CWEB)? Did it work well for you? Why or why not? If it did, do you still program that way?
Do you ever read code that you’re not working on, just for the sake of reading it?
What was the last piece of code you read this way?
How do you test your own code? First? Last? Never?
Have you ever worked anywhere that had a great QA group? What made them so great?
Have you ever worked anywhere that had no QA group? How did it affect the software you built?
What’s the worst bug you ever had to track down? How did you find it? (Quote: “As soon as we started programming, we found out to our surprise that it wasn't as easy to get programs right as we had thought. Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs.” - Maurice Wilkes)
Describe the best aha! moment you’ve ever had while debugging.
Do you use a symbolic debugger, printlns, assertions, corectness proofs? Other?
Do you document invariants? Do you check them with assertions? If so do you leave the assertion checks in when you deliver the app?
Do you ever or always step through your whole program in a debugger.
Do you do anything explicit to try to learn from the bugs you find? (C.f. How Doctors Think and also PSP)
Do you ever write formal proofs of your programs’ correctness? If not, why not? If so, how do you use them?
Have you ever just given up on finding a bug? Did anyone ever find it?
How do you deal with undocumented APIs, buggy interfaces, etc?
On a scale from 0 to 7, where 0 is leaving your code as you originally wrote it to 7 being recoding it in hand-tuned assembler, what is your average optimization level? What about the min and max?
Describe how you approach optimizing code.
Are there any tasks left where hand-tuned assembly code is worth the time it takes to develop it? Will we reach a point where the complexity of CPUs and caching schemes make it impossible (or at least uneconomical) for human beings to outperform good compilers?
Will we reach, or are we already at the point, where a good garbage collected language is likely to generally outperform hand written, application specific memory management?
How do you tackle understanding a new (to you) piece of code, particularly a large system?
Peter Naur claims that what’s fundamentally going on when programmers develop software is that they’re building a theory of how the software works. This theory ultimately exists only in their heads, no matter how well commented and documented the code is. Consequently it’s basically impossible for a new team to take over maintenance of or make modifications to an existing system without the help the original programmers. What do you think of this idea?
How do you tell when it is better to throw out an existing system and start from scratch?
Do you consider yourself a scientist, an engineer, an artist, a craftsman, or something else?
To what extent is programming an art? A science? An engineering discipline? Or a business?
What other mental disciplines is programming most like? Writing? Mathematics? Music? Something else?
Dijkstra considered programming to be a branch of mathematics. Do you agree? Is it necessary for programmers to have studied mathematics?
To what extent can programming itself be automated?
What skills should new programmers work on developing? What important skill do you most often find lacking in otherwise competent programmers?
What skill, related to programming, do you wish you had that you don’t?
How important is it to have a good memory?
What is the most important skill for a programmer to have? Have you ever known a programmer who was a great programmer despite lacking that skill?
What skill, related to programming, do you wish you had that you don’t?
What are the most important ideas in programming/computer science?
What are the most over-hyped, least important ideas in programming/computer science?
Does academic research affect industrial practice enough? Too much? Not enough?
Dijkstra said, “A programmer must be able to express himself extremely well, both in a natural language and in the formal systems.” What, if any, formal systems do you use?
When and how did you learn to program?
What drew you to programming?
What was the first interesting program you wrote?
What’s the biggest difference in the way you think about programmingnow compared to when you started programming?
What, if anything, would you do differently if you could learn how to program all over again?
Are there any books you think every programmer should read?
If someone comes to you and says, “I want to learn how to program,” what do you tell them?
Have you ever taught anyone to program? How did you go about it?
How would you start teaching someone to program?
How much about the layers below their programming language(s) should programmers know? How compilers work? How hardware works? How to design a chip?
What would you recommend to someone who is learning to program in a formal educational setting?
Many programmers are self taught. What would you recommend to someone who is learning to program outside of a formal educational setting?
Any advice for new programmers? Best practices they should adopt now? Bad habits they should try to avoid developing?
What skills should new programmers work on developing? What important skill do you most often find lacking in otherwise competent programmers? (Quote: “Chance favors only the prepared mind.” - Louis Pasteur. What should folks do to prepare?)
What do you do to improve your skill as a programmer?
What do you read to improve your knowledge of programming, computer science, design, etc.
What do you read that’s not related to programming?
Are there any skills not directly related to programming that every programmer should develop? What do you do to work on those skills yourself?
Dijkstra said, “A programmer must be able to express himself extremely well, both in a natural language and in the formal systems.” What have you done over your career to improve your ability to express yourself in a natural language?
How do you recognize a great programmer?
What are your favorite interview questions for programmers?
Is the ability to solve puzzles a good indicator of programming ability? If so, why do you think so? If not, why are is it such a popular interview technique?
Do you believe that some programmers are ten times more productive than others? Do you think you’re one of the ten times more productive ones?
Do you know anyone who’s massively more productive than you? How do they do it?
Who’s the best programmer you’ve ever worked with? What made them the best?
Have you ever managed programmers? Do you feel you are good at it? Why or why not?
Have you ever had a really great manager? What made them so good?
Do you lead a team? Do you program on a team? Do you program alone? Which do you prefer? Why?
Have you ever worked anywhere that had brilliant managers? What made them so brilliant?
Have you ever worked anywhere that had terrible managers? What made them so terrible?
Has the role of the individual programmer changed in the time you’ve been programming?
Has the kind of person drawn to programming changed in the time you’ve been a programmer?
What’s the biggest change you’ve observed in the practice of programming since you started programming yourself?
Do you have kids? Did you teach them to program? If you haven’t yet, do you plan to?
How early do you think children should learn to program?
Should everyone learn to program as a mental discipline that is distinct from but approximately as important as reading, writing, and math?
Lots of people program a bit. What separates professional programmers from the amateurs? (C.f. The Psychology of Computer Programming, p. 125)
Do programmers have any special ethical responsibilities to society?
Should programmers be licensed? Why or why not?
Lots of people who have gotten into computers have believed that computers would provide a real benefit to society by enabling more and better political involvement. How do you feel about how computers have affected the rest of life? What do you think their potential to affect it in the future is? What has to happen to have the best possible outcome?
Do you ever contemplate the ethics of programming? Either the ethics of specific development projects or, more generally, whether writing yet more software is the best thing to be doing with your time? (Quote: “Computers make it easier to do a lot of things, but most of the things they make it easier to do don't need to be done” - Andy Rooney)
Do you ever contemplate the ethics of programming? Either the ethics of specific development projects or, more generally, whether writing yet more software is the best thing to be doing with your time?
What do you use computers for, other than programming? Are you happy with the software you have to do these things? Are you ever tempted to write your own?
Do you ever get caught up in the fun of developing software and forget what the point of having the software was in the first place?
Are you a tool builder? Do you ever get sidetracked into spending more time building tools than the tools end up saving you once they are built?
How has your programming practice changed as you’ve gained experience?
Do you still enjoy programming as much as when you started? Is programming a young person’s game?
How have your feeling about programming changed from the days when you did it just for fun to when it became a job that you were paid for?
What life experiences unrelated to programming helped you learn to program or made you a better programmer.
What aspects of programming (e.g. design, debugging) are you best at? Why? What have you done to improve your skills in these areas?
What aspects of programming (e.g. design, debugging) are you worst at? Why? What have you done to improve your skills in these areas?
What aspects of programming do you enjoy the most? The least? Why?
What piece of software are you most proud of having worked on? Why?
What’s do you think is the most innovative piece of software you’ve worked on? Why was it so innovative?
What’s the best team you’ve ever been on? What made it so great?
If you weren’t a programmer, what do you think you’d like to do?
Have you ever worked in a completely different field? How did it compare to programming?
Have you ever contributed to an open source or free software project that you didn’t start?
Do you play a musical instrument? How well?
Do you juggle or ride a unicycle?
Do you frequently play any non-computer games? Chess? Go? Poker? Paintball? whatever?
Have you ever contributed to an open source or free software project? One that you didn’t start?
Do you like to write?
Is the computer industry a horrible mess or a brilliant engine of innovation? Why are there so many ways to do the same basic things? Are other fields the same way?
Why are so many programmers enamoured of the latest new thing? Have there really been that many significant advances or would we be better off sticking with what we know a bit longer?
Finish this sentence: there are two kinds of programmers ...
Which are you?
Do you lean more toward code bumming or beautiful abstractions?
Do you enjoy the journey or the destination of programming?
Do you have a philosophy of programming? Describe how you developed it.
Have you ever written a computer game?
Do you play computer games?
If you could go back and make any change you wanted to your language, what would it be?
What languages positively influenced the design of your language?
What languages negatively influenced the design of your language?
217 questions (375 question marks); 4 categories.