I’ll describe the modified agile software development methodology which I’ve been using for the last two and a half years. I’ll call it MA for short. MA was far from perfect and was constantly evolving, but it worked on our project. I’m sure I’ll remember more details and update this in the future.
I should note that the products sold by my former company were heavy duty business applications, not web sites. The business problems solved by this stuff are extremely complex: it’ll make your head hurt. One of the major challenges faced by the project was to ramp up an outsourced team of 50 developers on the obtuse business problems as well as the code base. MA made this process less painful.
Major MA concepts:
- 3 week cycles
- Cycle planning with the Planning Game
- Estimation in “points†(nebulous units of time)
- Centralized integration server with serialized integrations. No committing to the repository unless the tests were green.
- Every commit represents a fully functional system
- Update the test server every day
- Unit test the hell out of everything.
- Close relationship with the product managers and other business experts.
- Understand the business domain, not just the technical needs
Agile concepts missing from MA, for whatever reason:
- Pair programming
- A Coach or other technical/process advocate
- Mock objects
- Courage to refactor as needed – stability favored over refactoring
I’ll highlight some of the MA concepts in detail.
Cycles and Cycle Planning
We tended to have 4 releases per year, one per quarter. These releases were broken down into 3 week cycles. This gave us enough time to complete either several small tasks or a couple (sometimes just one) really big task per cycle. It was the developer’s job to break those tasks into smaller pieces, but we estimated them at this larger level.
Our nebulous unit of time was called “pointsâ€, and in general developers had about 5 points to spend on tasks. Our product managers were bought in to the point system and were very good at resisting the urge to translate points into days, and thus didn’t drop by exactly when the point-to-days conversion suggested a task should be completed. The developers would estimate all of the cycle’s tasks in points, and product manager would decide which tasks would be worked upon that cycle based on the total available number of points.
Unit Tests and the Central Integration Server
The central theme of MA was our unit tests, which we ran through our centralized integration server. The important details about our integration process are that it was serialized and un-committed: one integration at a time, and code was never committed to the repository unless the tests succeeded. I realize that this is different from many of the “Cruse Control†style integration setups used on many projects today, where developers commit code directly to the repository and hope that the tests run later will succeed. We never did this, and for reasons I’ll describe later I think it was for the best.
Our project had roughly 5000 data-intensive tests – no mock’s here! Integrations took about 45 minutes, where 30 minutes of that was running tests. The remaining 15 minutes was spent checking out code, compiling, shipping the test images to a server farm to be run, etc. I won’t get into the specifics about the integration technology since friends of mine are building a product based on that technology.
The process went like this:
- Developer is worked on their tasks and wrote lots of tests.
- They decided it was time to integrate.
- The developer would add themselves to the “Integration Queueâ€, which was a list of people waiting to integrate.
- Once the developer’s name got to the top of the Queue, they would merge their changes with the latest code from the repository. This merge would only exist on their workspace and was not committed. At this point the developer could submit this merged code to the integration server.
- The server ran all the tests upon the merged code. If everything was successful, the code was committed to the repository.
- If tests failed as a result of the developer’s new code, they were not allowed to commit their changes. We enforced a “one shot and you’re out†rule, and thus the developer would go back to the end of the Queue if they submitted their integration again. There was an economy here, though, and developers could swap spots in the Queue if they wanted to.
So that’s pretty rigid. But in reality, it’s not so bad when you only have a hand full of developers who know what they are doing, and they are used to the process. But what happens when you drop 50 new developers on the project over night?
Ramping Up the Outsourced Team
Suddenly, our team went from about 10 to 60+ with the addition of an outsourced team in Bangalore, India (BLR). What were some of the challenges?
Our application was weird: I’m sure this is biased, but you can’t get a much harder business realm to learn than our domain. Computer science does you little good on this planet, and it really helps to know why you are being asked to implement such strange features that were often backwards from conventional logic.
Potential for mass destruction: small errors in the application would cause most of it to be completely useless. It had to work as a functional, cohesive system.
We keep our promises: we promised our product managers and QA folks that the test systems would be updated with the latest code every day.
Here is how the MA process addressed those challenges:
Put people on the ground: Ok, this might not be MA specific, but we had people in BLR for a year strait to fully convey the business problems and to teach the MA methodology. I’m sure this would not have worked over the phone. There were technical difficulties, too, which were handled well by having people on both sides of the globe working on the problem.
Non-committing integrations: Since our integrations did not commit code to the repository before the tests ran, nobody could “break the build.†Nobody was frantically email the team with “don’t check out the latest code!†messages.
Test and test and test and test: The BLR team had The Fear put into them if they did not write through unit tests. We, the US based team, would sometimes go so far as to roll back their changes and tell them to commit again after they had more test coverage. Many of the developers had done very little unit testing in their past, having relied on rigorous testing from a fully staffed QA organization. But the team really bought into unit testing once they saw how well it improved their productivity and quality.
Developers wrote the specs: The US developers translated the business specification into technical specifications; BLR would work from these specs. This was a painful doubling of effort but it seemed to work. We would distill the business requirements into a language we would use to speak with other technical people, with a little business explanation mixed in. Eventually the BLR team was knowledgeable enough about the business domain to work with the experts directly, but for a long time developer-to-developer communications were best. Our specs broke the tasks down into chunks that could be more easily estimated.
One day I would love to work with an outsourced team again and evolve the distributed-agile model. I’m sure that I will get chance again.