Aug. 5, '10
by Evan Owen
How we manage large projects
One of our recently completed projects was a relatively complex web application. Here are some interesting facts:
- 3 primary developers, 2 others involved
- 8 months
- 90 MB of data
- 41,000+ lines of code in 510+ separate files
With projects like this one, there’s always a risk that the size of the project itself will actually hinder our progress and ability to meet the client’s needs quickly and efficiently. As a project gets larger and lasts longer, the effort required to keep things organized and moving forward increases dramatically. In fact, the chances that the project will be finished at all actually goes down substantially. For projects over 6 months in duration, the average success rate (completed on time, under budget) has been shown to be below 50%. [ Agile and Iterative Development by Craig Larman, p. 71 ]
That’s not a statistic we want our clients to have to deal with.
1. Prioritize features and functions
One of the most common reasons for failed development projects is having too broad a scope. After all, the duration of a project is directly related to the scope of its features. A recent study of large projects and their implemented features showed that over 45% of the features initially requested are never used in practice, with another 35% seldom used. Shockingly, only 20% of features in initial project scopes are actually used regularly. [ Agile and Iterative Development by Craig Larman, p. 73 ] In other words, for many projects, a large portion of the time, energy and money invested in them is essentially wasted.
We combat this danger by spending time early on helping our clients analyze their needs and choose only the most important features and functions. If the project is coming in on time and under budget, there’s always room to add those extra touches from the wish list later on. But the reality is, if we don’t intelligently pick and choose, the project is on rough ground right from the start.
2. Short development cycles
Developing a large website or web application is a lot like constructing a building. You need plans before you begin if you want to obtain a satisfactory result. And if those plans are going to change significantly, you want it to happen as early on as possible. Changing the floor plan after sheetrock is on the walls would be costly and time-consuming. In the world of software development, this risk is exacerbated. The longer a project takes, the more likely things are to change along the way. And when they do, it can cause major delays.
There are a few things we can do to lower the chances of budget-breaking changes late in the development cycle. First and foremost among these is “iterative development”. In simple terms, we break the project into smaller, more manageable pieces. Instead of tackling the entire feature set from day one, we take things in bite-size chunks of 2-3 weeks in length. During each of these development cycles, we examine the most important features we’d like to implement, work with the client to make sure we’re meeting their needs, and finish by testing and reviewing the outcome of that particular piece. This lowers the risk of failure by reducing the feature scope, shortening the duration, and giving us a chance to quickly adjust to any changes as we go along.
3. Source code management
Dealing with project source code is a regular task for developers, but one that can lead to serious problems if not handled correctly. If you’ve ever collaborated with others on a single document, you’ll know that information can be lost if more than one user is editing simultaneously. The easy way around this is to restrict editing to one user at a time. For a large project however, this limitation is unacceptable. For the project I mentioned at the beginning, we often had 3 developers working with dozens of files at any given time, and regularly needing to work on the same files simultaneously. Coordinating with each other to make sure we had the latest versions and weren’t overwriting each other’s changes would have slowed progress to a crawl.
The solution? Source control management (SCM). SCM software stores source code in a simple database called a “repository” and tracks each of the changes made to the code as development progresses. Because the SCM is keeping track, it can intelligently merge changes from multiple developers within a single source code file. If something goes wrong, it can even help undo any changes made by mistake. There are several SCM tools available, but our favorite is Git. Git is a “distributed” SCM, meaning each developer has his own code repository that he makes changes to. When we’re ready, a simple command merges all our code into the master Git repository for the project. A wonderful benefit to using an SCM is that making quick changes to a project is trivial. Any one of the developers has full access to the latest copy of the project code, and any changes he makes are instantly available to all the others. An SCM is essential for any project involving more than one developer.
4. Centralized project testing
Another area that can often slow down project teams is the test environment setup. Each developer working on a project needs to be able to quickly test the code he’s writing, often in multiple browsers to ensure compatibility. The usual way to do this is to set up a local web server on every developer’s system. Aside from the time this consumes every time a developer is added to the project, it can cause further delays any time a dependency or server extension is required in the project code. This then has to be properly installed or upgraded on each developer’s machine independently. Having multiple server environments also increases the general amount of effort required to keep things running smoothly.
At Brighten Labs, we got tired of dealing with these headaches, and decided to set up a single, central server environment for testing. All the code being edited by our developers resides on this central system. By giving the server a public IP address and each project its own subdomain, a developer can even connect securely and continue working when outside the office. Any changes can be tested instantly on this subdomain address, without even being committed to our Git repository. This takes half a dozen steps out of the usual process, speeding up development and testing substantially.
—
With over 50% of larger projects (over 6 months duration) going beyond deadlines and over budget, we want to do whatever we can to make sure our clients don’t have to feel that pain. I’ve mentioned four of the major ways we’ve found to combat “large project syndrome”, but there are many other things that can help.
Do you have a story involving trouble during a large development project? Maybe you have some strategies you’ve discovered along the way? Feel free to sound off in the comments.
LinkedIn:
Twitter:
Comments
HzXeDD , [url=http://bdvyuuowxnhb.com/]bdvyuuowxnhb[/url], [link=http://ysihfhnmkrcf.com/]ysihfhnmkrcf[/link], http://libjehdguciv.com/
rvmABT ooyvukgwdicq
SOOwqQ , [url=http://xxdsctrkpdcq.com/]xxdsctrkpdcq[/url], [link=http://oldeuxbnsdff.com/]oldeuxbnsdff[/link], http://xezcdmicxfkw.com/
W0Vv2k rqdrskcizwyb
Back in scoohl, I’m doing so much learning.
Tyler, thanks for the question! Let me expound a bit on what I mentioned in the article:
Our central test server (an iMac, actually) is set up in our office and hosts all our code. It has a static public IP address and runs a DNS server so that we can assign subdomains to each of our users (ie. evan.brightenlabs.net). Within each of those, we have another layer of subdomains for each project (ie. bigproject.evan.brightenlabs.net). Our developers can then mount their own directory over SSH (using a utility like sshfs, or in our case MacFusion) and have direct access to their code repositories. We all use TextMate, but any IDE should work fine since your files are being mounted locally. This may seem a little convoluted, but it gives our developers freedom to work on their own directory trees / code branches without concern for what someone else might be doing, while still gaining the benefits of managing a single server environment.
I should note that we also have a staging environment set up on our remote server. We almost always test large commits there before pushing them to production. Having our central test server saves us a bunch of headache early on in development cycles, but its difficult to set up a local test server to exactly match a production environment, so that final staging point is really important on mission-critical projects.
Evan, I would love to hear more about your test server. How do you have developers remotely editing code on a single central system? Does this restrict your developers’ choice of IDE/etc?
My usual solution to this problem is to set up a “staging” server (as identical to production as possible) and allow each dev to run a local server as well, so changes are first tested locally, then committed to git, pushed to the staging server via capistrano, then (if all is still well) pushed to production via capistrano. This is a little top-heavy, though..
Great article.
What a great resource, Evan!