Something I love about agile and iterative development: acknowledgement that software is never done. It’s never the best it could be – even if it were, “best” changes quickly. A typical project is “done” by decision, not by any inherent completeness. We could always improve.
There’s a beauty in that, an embracing of imperfection and balance. And there’s a dichotomy of striving that defies traditional goals. Within any iteration and any one day, there’s a victory condition of completing a feature or small set of changes. Small victory conditions, achieved all the time. At the same time there’s a larger direction: a striving for software that delights people who use it. This is the Unreachable Star of an agile project, the target that is always in the distance, always moving away from us.
At the same time, within the team, there’s work toward becoming better as developers individually and collectively. Each retrospective has its victory conditions of the week, and we always find more ways to improve. The Unreachable Star is perfect communication, productivity, creativity. We aim for it, yet if we ever think we’ve achieved it, we stop growing and instantly fail.
Contrast with waterfall projects, which define “success” as a particular featureset by a particular date. Work really hard for a long time! Hit the milestone (if you’re really lucky), put up a banner, and then miss the real target. Software developed in isolation never delights people who use it. And then what? Athletes who work their whole lives and finally win gold – then what? Victory is fleeting, so keep it small and frequent. The big-milestone strategy lacks the vision of the Unreachable Star and the daily satisfaction of meeting victory conditions.
This works for me in life. Every day I have small victories, like writing this post, tweeting something that is meaningful to me, completing a task, hearing my daughter laugh. In the larger scale, I don’t have “goals” that I work toward blindly only because I set them for myself. Instead I have Unreachable Stars: as a developer, to keep learning higher levels of abstraction and to share it with others; as a partner, to be completely honest with my connections; as a mother, that my children know I love them and can grow in directions of their choosing.
There are many paths toward my Unreachable Stars, sometimes too many (property-based testing! scalaz-streams! clojure!). It isn’t important which I follow, nor is it important that I head straight there. Any small step in the general direction is a victory. If I define a milestone of some sort (“speak at conferences”) and then achieve that, it’s another victory for the day. If I don’t achieve it, there are many other paths to the Star. No milestone, achieved or missed, can end the quest.
Big milestones (what most people call “goals”) are valuable in defining a strategy toward the Star. They give us something to break down into our daily victory conditions. That’s all. They’re not the real objective, and they can distract us if we’re not careful. It is the mission, the quest, the target-that-is-only-aimed-for-never-reached, that inspires me.
I’ve been looking for a word for this, for the target that sets my direction with no expectation of hitting it. The song from Man of La Mancha, sung by Don Quixote, expresses it. Even in his delusion he has no expectation of fixing the world. Yet he finds happiness in every small move he can make toward rightness. Others are inspired by him, and start to move the world in their small ways. He spread hope, and so became larger than one person.
“And the world will be better for this, that one man, scorned and covered with scars, still strove with his last ounce of courage to reach the Unreachable Star."