When you’re working on a project, one of the things you always must achieve is flexibility. Why? Because you never know what the future may bring you: functionality may be added, priorities may change, the deadline may be set earlier than originally was agreed upon, team members may get sick, etc. In other words, you must be able to cope with an uncertain future, while still being able to deliver a useful product or service. The way you break down you project into smaller parts highly influences the amount of flexibility you will have, so good project work-break-down is crucial!

In a current project I am working on I was given a predefined work-break-down of the project. The thing with this work-break-down that bothered me was that it was a break-down based on components, instead of User-Stories, behavior or functionality. The project was divided into components like a GUI component, a core back-end component, interface with other applications component, etc. What’s problematic here is that in order to have the smallest working application possible (the most critical parts), a little bit of all of the components was needed. So either I developed the most critical application while none of the defined components were finished, or I could develop all of the components but then I would be doing much and much more than just the most critical application. There are several problems with this approach:
- prioritizing is hard, because everything seems to have an equal priority since all components seem to be needed
- it is hard to change priorities because all components seem to be needed
- you are unable to drop one of the components because all components seem to be needed. After all, just having a GUI component without a core back-end component for example makes it quite a useless application
- it becomes difficult to finish a component since they contain both critical parts and less critical parts, so all components seem to be needed. (if the GUI component contains both critical parts as well as eye candy, then this way the eye candy must be completed as well in order to finish the GUI component).
Conclusion: all components seem to be needed! And that doesn’t really sound like flexibility!
So, what should you do in order to be more flexible, be able to prioritize more effectively? You should: break down your project based on User Stories, behavior or functionalities.
This allows you (or actually a product owner, end-users, clients or whoever is responsible for it) to prioritize behavior or functionalities of the application. The guiding principle behind this approach is: deliver the simplest, most critical working application as soon as possible, and then add features to it to make it better. This will probably mean that the part with the highest priority contains a little bit of GUI, a little bit of core back-end application, a little bit of interface with other systems, etc. This part should be finished first, and then other parts should be developed in order to make it better, more beautiful, more user-friendly, more whatever.
For example, if I were to build some sort of search application, I would build the most critical part of the search functionality first (highest priority). This would include some GUI with input fields, a software component that has the searching logic, a component that contains an implementation that connects to some data source, as well as a GUI part that displays the result. Now lower priority functionality would be pagination of search results (back-end logic as well as GUI), filtering search results (back-end logic as well as GUI), etc. In other words, once the basic search application is ready (tested, accepted, demoed or whatever), you start adding additional User-Stories, functionalities or behavior.
The great advantage of this approach is that you can easily change priorities (”sorting is more important than filtering, so do that first”), you can drop functionalities while still have a working, useful application (”we’re not going to make it to the deadline, so let’s drop the sorting functionality for now, we’ll release that after the deadline”), and you can truly finish individual parts of the project (”sorting is now finished and accepted, so we remove this from our todo list”).