Wouldn't it be sweet if your whole life were perfect? Your wife would fulfill your every wish. Your children would be perfect examples of responsible happy people growing up. At work your colleagues are the nicest people and working with them is always fun. Your team would feel responsible for every action they (proactively) take and the software systems you produce and maintain are flawless and run like well oiled machines?...
You need to wake up! Nothing will ever be perfect and Agile knows it!
Perfection and Change
How does Agile know this? The answer is very simple: If something was perfect, changing it could only make it worse. Agile says embrace and welcome change and thus acknowledges that nothing will ever be perfect. There will always be room for improvement in (almost) every direction!
In an Agile software project this applies to all possible levels: The code, the design and the architecture will never be perfect. The business requirements will never be perfectly clear. The team and the process require constant attention. Collaboration can always be improved.
That is why Agile processes incorporate finding improvements into their very core. For example, the sole purpose of the retrospective meeting in a SCRUM process is to find concrete ways to improve yourself as a team in every possible direction. The scope of the improvements is limited only by the capabilities of the team: The team is allowed to change and improve every aspect of their way of working, be it how they write code, how they communicate with the rest of the organization or how they schedule their meetings.
Agile goes even further and says that everything should be barely good enough. As a software development practice Test Driven Development embodies this. This approach helps the developer to focus on writing only what is absolutely necessary.
The Agile answer: Learning by Doing
So, how do you build good systems in an imperfect world? The agile answer is to see the whole building process as a learning exercise on all levels. The business gradually learns what they really want, while the team learns to work together and how to apply the latest technology to the chose architecture and solve the technical problems. And where people are learning, mistakes1 are being made. This is not to be avoided nor to be feared: Making mistakes is the only behavior that infallibly leads to learning.
As a SCRUM team you are in the perfect position to learn from your mistakes, if you allow yourself to make mistakes, dare to look them in the face and only then try to overcome them. SCRUM's short iterative process and intensive inspect and adapt cycle will bring out the problems sharp and quickly. It is up to the SCRUM team to be brave and tackle the ever arising problems. And remember, even if you constantly tackle every problem that comes your way... nothing will.. ever... be perfect...
The one thing that is allowed to be perfect is the vision of where you are going. The vision of a beautiful system and a happy team. This vision lives in a perfect world. It will always be that one dot just over the horizon. The prefect image that -you will have to accept- is ever out of reach. The main challenge is to keep the team in the right direction and gently steer it closer and closer.
Agile pitfall: Single User Story Features
One approach that aims for perfection and ends with frustration is to try to complete every feature in one go. The iterative approach is meant to enable developers and users to learn. The more opportunities for learning, the more you will learn. So instead of building a feature in one go, and create only one learning moment, deliver in small steps and gradually improve the application.
A good agile planning incorporates this from the beginning and deliberately plans to pickup the same functional area multiple times during the development process. Don't try to do the fancy search box all in one go: start with simple searching, add auto complete, add a time filter, add faceting. Make all of these simple improvements small User Stories that you plan over the course of the entire development process.
Deliberately take small steps!
Dare to accept the current reality as the only reality!
Dare to dream of the perfect end result!
If you start to take small steps, allow your team to make mistakes and stimulate them to learn from them, you'll find that working with them becomes easier and more fun. The team will feel more empowered and more eager to take decisions. Eventually, you'll also be happier at home, a better husband and after years and years of applying this rule, you'll finally see how your children have grown into responsible adults ;)
Mistakes here are not like bugs or coding errors, but rather like misinterpretations or misunderstandings.