There Is No Done

Software is never "Done" there is always more to do. Thoughts on the common misconception that you can be "Finished" with systems software development.

Are you Done yet?

It's a question we all hate to hear, "Are you Done yet?" or the more common "When do you think you'll be done?" In our head we hear the answer, "Never!" but that's not what we say. We answer the question when will we be Finished and this is often not the same thing as "Done" in the mind of the person asking the question. The problem is that in Software development, especially in larger Systems Development, nothing is ever really Done, it's only finished to the standards of the requested result given the amount of time allowed to solve the problem. Often in system development we come across situations that require more work than we can do with the time on hand, therefore we make sacrifices in order to meet the desired results. It's a sad reality that happens when you're working in software systems with no real rules. When there is no "Right" way to do things and when each hand that touches the system brings their own opinion of how it "Should" work, software often gets overly complex and becomes a hinderance to getting things "Done."

The definition of Done

The problem with the word Done is that it means something different to different people. Within the school of Agile Development there have been attempts to define Done so that everyone agrees with the concept. There is even the concept of "Done Done" which tries to handle the difference between the meaning and understanding of the concept of Done. Since no one can agree with the concept of what Done means and because it means something different to everyone I propose we just stop using it when we refer to building Software.

When we turn back to the original Agile Manifesto it's interesting to see that they don't really put a meaning on the word Done and only mention it once in the context of being complete.

Build projects around motivated individuals.
Give them the environment and support they need,
and trust them to get the job done.

This still leaves the question open as far as what considers the "job done." Further writings have gone on to try to remind all of us that Done means complete such as Kelly Waters' 10 Key Principles of Agile Development, Agile Principle 7: Done Means DONE! Here Waters stresses that all features included in a Sprint should be complete before the sprint is completed and therefore Done. I agree with this 100% but again in the context of Software being ready to release Complete and Done may not have the same meaning.

Done ≠ Finished & Complete

We should look at Software Development as a series of tasks that need to be completed based some sort of criteria. With TDD (and especially with BDD) we speed up the path to a system being complete and usable by only building what we need in order to pass all tests defined for a problem that is being worked on. Once all tasks are complete and passing tests for a given piece of functionality within a system then once all the pieces are combined system level tests should pass and the system is ready to be released. Therefore it is Finished and Complete.

But is it done? Of course not. Ask any person that worked on any code if there is something they would like to change or improve if they had the time given to them to do so and you'll have a long list of areas of the code that could be worked on and the system be made better. Unfortunately this isn't always an option though and if some time is not dedicated to improving or rewriting areas of a system then the system will become unwieldy and impossible to either work with or find people to work on. I've worked on several large scale systems that had this problem and unfortunately I've watched several of those companies in the years past fail due to the complexity and structure of their code and the ability to stay up to date with modern Technologies and User Experience.

Be Done with you!

I'm done with being Done so I'm just going to work on being Complete! :) Seriously though let's stop lying to our users, managers, investors, and ourselves and when people ask when you'll be done be honest and tell them you'll be 'Finished' or 'Complete' at a certain time when you think you can finish the task but remind them that the system and software development is never "Done." It's just not that easy in a world with no rules.

Feel free to send Comments or Thoughts to me on Twitter: @KFinley