Breaking Down A Project Into Stages.
The 6 step process I use to break a software project down into stages.
This is the process I used to break down Redis for the Build Your Own Redis Coding Challenge, so I’ll use that as an example:
-
Sketch out the vision - what is the application going to do at a high level. In this case I’m going to build an in memory data store.
-
Break down the application into building blocks - As it is a server, I might decide that I’ll need a ‘block’ to listen for client connections, another to handle each connection, one to serialise/deserialise the messages, one to handle the protocol and lastly some form of data store.
-
Build the core of one or more of the fundamental blocks using test driven development. For a Redis clone my first step would be to write a set of tests focused on handling the protocol. Then I’d develop the code to pass those tests, completing the ‘block’ that is my protocol handler.
-
Build a walking skeleton - once I’ve built any fundamental blocks, I like to build a walking skeleton. A walking skeleton is a tiny implementation of a system that performs a very small end-to-end function. For the Redis clone that might be building just enough to handle a client connection request, parsing an incoming message and handling the simplest possible command: PING.
-
Flesh out the functionality - Once I have a walking skeleton I start to add flesh to it. Adding more end-to-end slices of functionality by writing tests and then the code to pass them, for the minimum functionality I will need for each block, to deliver the end-to-end slice. Repeat until all the functionality is there.
-
Refactor - This isn’t really step 6, I tend to refactor as I go. As the software evolves I will have to change things that were done to enable the development of a walking skeleton (i.e. I might not handle concurrent clients when I handle PING). I will also refactor as I gain a better understanding of the challenges and my design evolves.
For other systems my approach might change in small ways, but these are the fundamental high level building blocks of my process.