I’m always in the mood to fix what is or isn’t broken, and I’ve noticed that a lot of problems that surround website development are prevalent in almost all development studios, different only in scope and cause. The Joel Test is a simple, but effective method of determining how well a development environment is working towards efficient coding, but it seems geared more towards product development than the client-driven website building that I am familiar with. As such, I thought I’d do the incredibly arrogant thing of rewriting some of the questions to be more apt for asking a company that does custom built websites for clients.
The Joel Mike Test
- Do you use source control?
- Can you deploy the site in one step?
- Do you deploy to a test server first?
- Do you use a project management tool?
- Do you fix bugs before writing new code?
- Do you have an up-to-date schedule?
- Do you have a spec?
- Do programmers have quiet working conditions?
- Do you use the best tools money can buy?
- Do you have automated tests?
- Do you learn from your mistakes?
- Does the client participate in continuous testing?
The idea behind this test, in case you didn’t bother reading Joel’s original article, is to ask these questions to a prospective employer, or to your own team to see how healthy the development environment is. They are simple yes/no questions and answering “yes” to every single one is a sign that you’re doing things right. Joel claimed that a score of ten or less “yes” answers was a warning sign, but it all depends on what you put weight on.
1. Do you use source control?
This is a no-brainer in large production teams, but even if you’re the lonely coder on a project it doesn’t mean you should get away with not using a source control tool such as Git, Mercurial or CVS. If you’re in the mood for basic guidelines on how to use Git from the view of a single individual working on personal projects, I wrote about that too.
2. Can you deploy the site in one step?
Deployment of a site can be a hassle, especially if you have a server farm behind a load balancer and some caching servers, so being able to run a script that takes care of it for you saves a lot of time. However, just because you only have to upload files via FTP to one server doesn’t mean you should. Having to constantly push minor changes, which are plentiful when dealing with clients, will tug on your nerves and waste an unnecessary amount of your time, so this part of the process should be a “fire and forget” procedure that runs an automated script which moves the files to the correct spot, preferably from your source control database so it doesn’t have to copy the files from your local development environment.
3. Do you deploy to a test server first?
If you have a “fire and forget” script that does the deployment, it probably shouldn’t go live without some sort of testing first, preferably in an environment that replicates the live server as closely as it can. This step may seem tedious, but saves you a lot of trouble with minor problems that come up when you’re moving from development to production. You should always test out your code locally first, but having a sandboxed testing location as a stopping station between your computer and the live server is a great way to catch small oversights and bugs before they are exposed to the public. This is also a great place to get your client in to see the changes before it goes out (see #12).
4. Do you use a project management tool?
I’m not saying that everyone should throw a lot of money on a complicated, overpriced ticketing system, but when it comes to building projects where the specification is never set in stone, it helps to have a centralized place to gather all the tasks that need to be done. Even if it’s just a spreadsheet on a shared server, it’s still a lot better than every developer/designer/manager walking around with private todo lists in their heads or on sticky-notes on their desks. A phone call from a client becomes a task in the system and can be dealt with at an appropriate time by the right person.
5. Do you fix bugs before writing new code?
I didn’t have a better way of formulating this, so I just copied Joel’s question. Fixing bugs and catching up on “technical debt” is never prioritized high enough when the clients are knocking on the windows, wondering where their website has gone. However, long periods of neglect can result in bugs accumulating in unsurmountable heaps that hang over the heads of the development team. Being able to stop and take care of the housekeeping before running off to complete the next task is a great way to keep the machinery running smoothly and ensuring that the code monkeys are happy.
This applies also to the progression of the development environment and the tools that the coders use (see #9). If you’re meaning to update the server software, but you’re bogged down by client requests, you should probably just take a step back from the workload and get it done. Waiting until it crashes is not good planning and if you can spend a week to save five minutes of every hour in the future, you shouldn’t delay getting it done.
6. Do you have an up-to-date schedule?
One of the worst parts of the fluid nature of a client site specification is the inevitable feature creep and minor tweaks that sneak their way into a project while it’s being developed. I understand that it’s hard for clients to know everything they want in the pre-project planning period, but when they suddenly remember that they want to enable facebook login, have an interactive image gallery, add some more red on that border or any other tidbit, the end result is usually that the project gets bloated with new tasks without it changing the release schedule.
This is dangerous and stupid, but not really the fault of anyone involved as the changes are small and infrequent but eventually compound the complexity of the project. A good rule of thumb is that any change, no matter how seemingly trivial, gets the project pushed back some amount of time. Moving a frontpage widget a few pixels down adds a few hours to the final deadline and adding any form of custom functionality that wasn’t previously specified should involve asking a developer how long time it’ll take and then doubling that.

Obligatory kitten to break up the wall of text — Courtesy of placekitten.com
7. Do you have a spec?
Ah, the illusive specification, that we all know is going to be out of date in a few months, and usually doesn’t seem to be necessary to write at all, is something that should be demanded by every development team, even if the site is just a personal blog for a local politician’s dog. The specification can be as complicated or basic as you’d like, but the idea behind it is to protect yourself from any later changes that can greatly delay the development period (see #6). If a client asks for something that wasn’t a part of the original agreement the specification will stand as witness to this, and you are free to ask for more time/money/bananas to get it done.
8. Do programmers have quiet working conditions?
This one is a hard question to justify in an environment where communication between the different segments of the development team needs to be frequent and easy, but trying to get anything done in a room full of distractions is a disaster waiting to happen. The general idea is that if a developer can put his headphones on and be able to focus without worrying that someone is going to tap him on the shoulder (or throw a paper plane in his face), then that’s good enough to ensure that work will be done. Communication over email or IM is an easy way to prevent any loss of efficiency from the constant stream of people who may need some information from one of the coders. It may not be a perfect solution, but is a good enough compromise to get stuff done.
9. Do you use the best tools money can buy?
If I have to wait half a minute to login to a page I’m developing because the database server is a decade old then I am more likely to avoid having to wait by visiting YouTube. And since I’m already on YouTube I should probably check out that drum cover my friend told me about. Suddenly 30 seconds turns into five minutes and I’ve lost the groove I was in.
10. Do you have automated tests?
Automated tests are a great way to catch small problems that might otherwise find their way into the live code by way of lazy, tired or stressed developers. Although we would all love to make unit tests for everything we build, that’s usually not how the real world works. However, having an automated script that kicks in when trying to push your code upstream (see #1) which checks your code for debug outputs, kill commands or lack of proper indentation will go a long way to avoid silly and embarrassing mistakes.
11. Do you learn from your mistakes?
Any rational human being can tell you the benefit of learning from your mistakes, but its sometimes hard to see where things went wrong in a lengthy project, especially if there are many people involved. Learning from your (or others’) mistakes would involve a retrospective analysis of the project where you focus on what went wrong and what went right and make a conscious effort to change those aspects of your development process. If you intend on spending weeks on metrics analysis and status meetings, then this point is hard to justify, but usually an hour-long post-morten meeting where you all agree to play less Minecraft and write more comments in the code should suffice.
12. Does the client participate in continuous testing?
You’re building this page for somebody, usually somebody not directly connected to the development team, so if you work in a vacuum with no interaction with the client until the product is finished then you’re setting yourself up for a lot of changes and tweaks after the release date. The client should have access as early as possible (see #3) and should be able to come with feedback in a non-intrusive way (see #4) that doesn’t break the development plan (see #6 and #7). This will ensure that the final result is something they are happy with and it’s easy to keep them appeased if they are aware of the constant progress and don’t have to send a frustrated email before they get to see any changes.
These questions all have their benefits and drawbacks, the major one being the time and effort required to put any of them into practice, but there is always something to be gained from trying to make the way you work better, by however measly amount. All projects are different, all project teams are different, and you’ll quickly find what aspect is important to you, but taking a step back every now and then and tweaking the machinery can’t be a bad thing.
Thanks to Joel Spolsky (of Stack Overflow fame) for the inspiration for this post.