The software development final exam

When I tell North Americans about my time at Oxford University, one aspect of its undergraduate program inevitably surprises them: Final examinations. Rather than writing examinations at the end of each term, students in most subjects write a single set of examinations at the end of their final year, on which their entire degree performance is measured. (In recent years, some subjects have switched to annual examinations.) As terrifying as this might sound, the system has some merits: Whereas many students at institutions with termly examinations study the day before an exam and forget the material the day after the exam, attempting to "cram" three years worth of material at once is largely an exercise in futility; as such, Oxford's examinations often provide a better measure of how much material a student has learned. Given some of the conversations I've had with — and code I've seen from — people who have received computer science degrees from major universities and are actively working as software developers, I think that last part is very important: There's a lot of people out there who have forgotten some very basic — and very important — material.

As an experiment, I've put together a "software development final exam", consisting of 20 questions split into four "papers" of five questions each. The questions vary in difficulty, but any good undergraduate program in computer science should cover all the material needed to answer these questions; and on each paper, at least four of the five questions relates directly to material I have needed to know during my time working on Tarsnap, so these are not simply theoretical questions. If you can't answer the majority of the questions on these four papers, and you're working or intend to work as a software developer, you should ask yourself why — most likely you're either you're missing something you really should know, or you're lucky enough to be working within a narrow area where your deficit doesn't matter. Conversely, if you can answer all of the questions, you're probably in good shape — while a 20 question exam obviously can't cover every topic in a three or four year degree, I think I've covered a wide enough range that it's unlikely anyone could answer every question correctly while still having any serious deficit in their basic computer science knowledge.

One thing I have not included is any test of practical programming ability — FizzBuzz, reversing a linked list, or suchlike; there are two reasons for this exclusion. First, there's a wide variety of languages out there, and some questions are easier or harder — or just plain don't make sense — in different languages. Second, I wanted questions which are easy to mark as right or wrong — both to benefit people who want to use these questions to evaluate their own knowledge, and also because I will be offering to grade any responses I receive. And I would like to receive responses: My readership may be a biased sample, but a sample it is nonetheless, and I'd love to see both how people do overall and any patterns I can find within the data.

The four papers — which will be linked as I post them over the next four days — are:

Each paper should take no more than 15 minutes; if you hit the 30 minute mark on one of them, you might as well stop at that point. They are intended to be answered under "exam conditions" — without discussion with anyone else, and without consulting Google, Wikipedia, or other sources. Obviously, I have no way to know if people are respecting these conditions; but since the purpose of this exercise is to obtian accurate information, I hope people will comply.

Thanks to Slava, Colin, Graham, Angela, and Eitan for discussions over the past two years which led to this exam and for allowing me to throw questions at them and watch their thought processes.

Disqus