The beginning of a project is always a hectic period where several things have to be put in place in order to be able to start the actual development from a solid position.
Interestingly enough, I see that what is important to have ready for ThoughtWorkers most of the time is not what has to be ready for other people.
Given that obviously every project is different and deserves specific attention, here is my list of things that has to be ready before the kick off of iteration 1.
A repository, a Continuos Integration Environment with Cruise (or suitable alternatives) installed and working, a QA environment where we can deploy every successful build whenever we want, a basic build script (i.e. build/run tests/package). Pairing boxes, each one with exactly the same configuration.
Just identify the core services/components, there’s no need to go into detail for each one at this time of the project. If we identify what is the main responsibility of a service is good enough for now, the details will be discovered later in the project. If we can easily identify the way services will communicate (web service? message broker?) good, if not through good OO principles we can abstract the low level mechanism and reduce the cost of change later, deferring the final decision to the point in the project where we have more understanding of the technological constraints.
Pairing and frequent pair rotation will help in spreading the knowledge of the approach to solve specific problems and in maintaining consistency throughout the code base, so most of the time there is no need of defining a sort of “project dictionary” of valid patterns at day 1. If we’re introducing new approaches to solve a specific problem, it’s important to highlight pros and cons of the approach so that people know what they are doing once pairing.
Most of the time these are probably enough to start Iteration 1.
All the other decisions can (and sometimes should…) be deferred to a later stage.