Now that we have a very good idea about what app X is all about, we can finally start writing tests and implementing functionalities. We feel very good because we are a modern agile team, with TDD, pair programming, CI, even Kanban! There is a lot of work to do. And we mean business. But how long do we take to release new features? How long do we take to release the very first one?
Delivering the first functionality involves a lot of work exactly because it’s the first time the app is going to be released in production. Just to mention a few tasks:
- choosing all the essential libraries, tools, preferred frameworks and make them work together;
- set up repository, continuous integration, database in the dev environment*;
- prepare the staging environment*;
- production environment;
- automate deploy.
It’s common to have dev-teams developing code right after completing the 2nd or 1st task in the list, and measuring progress somehow. It certainly feels like a lot of progress is happening there (and we like to feel we are productive developers), though none of that is useful since customers can’t use the app yet.
I’ve seem “continuous delivery” in staging environments. That’s surely better than not building and deploying at all, but it won’t provide enough feedback; different environments shouldn’t but may differ significantly from each other.
Releasing Something In Production Asap
In Growing Object-Oriented Software Guided by Tests, the authors propose to start “working-out how to build, deploy and test […] an implementation of the thinest possible slice of real functionality that we can automatically build, deploy, and test end-to-end”.
This slice of real functionality should be uninteresting, small enough, that we can focus on the infrastructure.
That’s what I call Iteration Zero: nothing really useful from the customer point of view will be ready to go at that point. I usually start with a status page due to its very simple requirement both for happy and sad path.
“The ‘end’ in the ‘end-to-end’ refers to the process as well to the system”
Everything is going to be tested, including the release process.
When starting developing an app from scratch, I recommend to begin with an end-to-end test for a very simple functionality and release it in production before moving on to the next story. This is not only going to speed up the whole process, but also help to see if the team is going in the right direction.
In order to do that, it will be necessary to have all the infrastructure in place, including automation and the production environment. But once that’s done, the next releases will be straightforward and all the work will pay off.