I had an insight a few weeks ago that I thought was worth sharing. First some context.
On the Jazz project, one of my jobs is leading the software development for our platform-level web UI stuff . Erich Gamma is the overall Jazz technology lead. Twice a month we have a sync up meeting where we discuss platform-level web UI progress.
In our last chat in mid-December, one of the things we chatted about was the status of the Jazz Server's Admin Web UI. We began bootstrapping the Admin Web UI in September and I thought we'd made good progress in such a short amount of time. Erich didn't seem so impressed with what he saw. I was a bit frustrated by this because I thought Erich was being unreasonable - we'd made good progress for the short amount of time we'd been working on it. But after a few more minutes of chatting, I realized that there was simply a mismatch in what we were evaluating. I was evaluating the state of the Admin Web UI vs. the resources (time and people) we'd had to work on it; Erich was evaluating the state of the Admin Web UI vs. his vision of what an awesome Admin Web UI should look like. Put more tersely, I was measuring "current vs. previous" while Erich was measuring "current vs. ideal".
I found this difference in approach fascinating and insightful. I'm a very methodical person; when someone gives me a job I very methodically list its goals and measures of success, then I work backwards given the time and people I have to reach the goals and then over the course of weeks or month work towards the goals. But during my conversation with Erich I realized that a risk of my methodical approach is that I can become too bogged-down on the blocking and tackling of day-to-day software development and become overly focused on incremental progress and lose sight of the big vision of what you're trying to build. I found that when I adopted Erich's point of view and thought about the current state of the Admin Web UI vs. what it could become in the very long-term, I became very dissatisfied with its current state and highly motivated to be more ambitious with the next iteration plan.
It's ironic because most of the iterative software development literature talks about the converse problem - you're too focused on the big picture that you don't make day-to-day progress. Indeed it's become a cliché over the past several years to make fun of architects who are too far removed from day-to-day coding, testing, and building.
So the insight I gained was that I need to think in terms of both "current vs. previous" and "current vs. ideal". Fortunately our iterative development process supports finding this balance. At the beginning of iterations it's fine to dream big dreams about what you're trying to achieve but then to become very pragmatic about how to make incremental progress towards realizing those dreams in the course of a four week iteration. Then over the four weeks you can be extremely methodical about making progress. Then at the end of the iteration you can reflect on what you've accomplished and feel some short satisfaction that the software is significantly better now than it was four weeks ago. Then you can reflect that the software's not nearly as good as you ideally want it to be which provides the motivation to start the cycle again.
 By "platform-level" I simply mean more of the infrastructure. That is, frameworks and APIs rather than tangible applications.[Read More]