My team is in the middle of one of the hardest projects—we call them "themes"—we’ve ever tackled. We’re a high-functioning agile team that has helped our company grow and succeed over several years now—we “went agile” in 2003. Here’s one thing I know for sure: No matter how many problems you solve, new challenges will pop up.
We prepared for this project with brainstorming meetings and a design spike. We thought about testing from the get-go. This project is a rewrite of a part of our system that we have never been able to run end to end in our test environment, so testability has been a major focus. Nevertheless, this project has been a bit of a long, hard slog.
I think we’re doing all the right things. The design spike showed the code was too slow, so changes were made to speed it up. Since performance was critical, as soon as the production code was ready, we ran a performance test. That was still too slow, so more changes were made.
As always, the code is being written test-first. We have FitNesse tests “behind the GUI” for larger pieces of the functionality—some using test inputs set up in memory, some more end-to-end setting up and using data stored in a test schema. We’re also testing via the GUI in an environment that is almost an exact copy of production. Meanwhile, our extensive regression test suites run many times per day in our continuous integration, giving us confidence that anything we break in existing code will be detected and fixed right away.
Still, the project is going more slowly than we hoped. There are many tentacles into other parts of the system and many edge cases. I’ve discovered some terrifying defects completely by luck, which makes me worry that we won’t think of all the potential scenarios.
Did I mention that we’d never been able to run the legacy job end to end in our test environment? It isn’t going away yet, so it has to be tested together with this new code. It took a couple of weeks, but a programmer finally got a FitNesse fixture that kicks off the legacy job working. Whew! I’m still in the middle of testing that and I sure hope both jobs work correctly when run concurrently!
Let’s face it: Even if you had the best software team of all time, sometimes you just have to feel your way. We accepted up front that we wouldn’t be able to predict all the risks of this project. Our customers trust us, so they are giving us the time we need to have confidence in this new code. We’re taking an incremental approach and doing the least-critical functionality first. Once it’s proven in production, we’ll fully replace the legacy code. But, right now, it’s still kinda scary.
Once again, I’m reminded of how important it is to have the right people on your team, have an environment that promotes learning and tolerates mistakes, and have everyone in the company working towards the same goal in an atmosphere of trust. Life and work are full of uncertainty, and I think we’re coping the best way we can.
What about you? Are you in the middle of a scary project? How are you identifying and mitigating your risks?