Is your program as fast as it needs to be? As fast as it can be? Does it use as little memory as possible? Is it free of memory leaks? Is the response time that the users experience as low as possible? Is their a cap on the maximum response time? A low cap? Does your program consume as little bandwidth as possible? Does it consume no more energy than necessary?
Can your program report on its own functioning? Can it detect its own errors? Report them? Can you change your program while it’s running? Can your program update itself? Securely? In the background? Without restarting?
Is your program easy to understand for new programmers? Easy to change? Can parts of it be changed or configured by non-programmers? While running? Can you easily find programmers that are proficient with the languages and technologies you have chosen? If new programmers introduce errors, can these errors be easily detected? How does your program handle faulty user input? Deliberately invalid user input? Do you make a separation between parts that will probably remain unchanged and parts that will probably see a lot of change? Can your program be built in one step? Can you create and distribute patches for older versions?
Can parts of your program be used in other programs? Replaced by other modules? Can a single module be assigned to another team for improvement?
Can your program be scripted on the command line? Does it expose an API? Are there bindings or wrappers for Java and PHP? For Ruby and Python? For OCaml and Smalltalk?
Does the performance of your program increase linearly with faster hardware? With more hardware? Can you sacrifice memory usage for speed and vice versa with one setting?
Can your program survive a computer crash? Without data loss? Without downtime? Does it have a single point of failure? If it crashes, will you be notified automatically? At once?
Does your program run on IE, Firefox, Opera and Safari? All versions of IE? On windows, mac and linux? On windows 95 and Vista? Without administrative privileges? On all common linux distributions? On 64-bit hardware? On a PowerPC? On an iPhone? With a Turkish user interface? A Japanese interface? Will it work for the colorblind? The visually-impaired? The illiterate?
Does your program follow code conventions? Does it have conventions in naming variables and functions? Have you documented them? Does it have a glossary of terms? Can your program be read from beginning to end as a literate program? Understood? Understood a year from now by you? By other people? Does the documentation answer all the relevant questions in this essay?
Is your program correct? Is what it does worth doing?
July 25, 2008 at 6:09 am
niice! You should make another 10 point Joel-type-of-test out of it which people can stick up their wall.
July 26, 2008 at 12:44 am
Really nice. Man, I wish I could say my programs pass this test. Anyways, I agree with Vinh up there.
July 26, 2008 at 8:11 pm
I don’t get the point of this list. There is no such thing as a perfect program; any program involves tradeoffs. A program that is as fast as it can get is most likely much more unreadable than if the end goal was readability.
July 26, 2008 at 8:36 pm
There exists a branch of mathematics devoted to finding optimal solutions in the face of conflicting requirements: Linear Programming.