Time Management and Multiple Personalities
Originally, I set out to do a sort of "Day in My Life" entry, that broke down what I do at my job on a per-hour basis. I started 2 days ago around 6:30 AM, which is when I woke up. [My sleep schedule has been totally random lately, which is partly really cool, and partly really disorienting.] I then logged what I was doing for the next massive chunk of time (close to 28 hours, not including an incidental nap).
Unfortunately, it didn't work out so well as a journal entry. Often I'd just totally forget to log what happened for a few hours, leaving weird gaps and mysterious inconsistencies in my accounting of time. Once I just fell asleep for 6 hours. Worse, most of the notes I kept were really trifling little blobs; they aren't interesting to anyone who isn't working on the project. After a while, I started just interjecting stupid thoughts and observations, and it became a mass of jumbled idiocy that was neither fun nor informative to read.
So I chucked it out. There really wasn't much use to it, and it wasn't worth the time.
That's not what I find interesting, though. One curious side-effect was how it affected my work patterns. I started to see little web-surfing breaks as massive chunks of time, rather than just vague "oh, look, it's getting dark out and I still haven't done any work." Quantifying the amount of time I spent working and goofing off really made me feel like an idiot for slacking around too much, so I ended up doing a lot more work instead.
That much wasn't too surprising - time logging is a well-known technique for time management. What was really different was the way my thought process was affected. In taking notes on what I was doing, I had to justify aloud some of my design decisions. Now these decisions are all made with discussion and agreement from the rest of the team, so they're by no means arbitrary and off-the-cuff things. Yet, when I started trying to explain them in a way that would make sense to an outsider, I started seeing all kinds of new opportunities to make even better decisions.
Discussing and verbalizing design decisions is not a surprising new technique, either; I've been doing it for years. It's part of why team programming (and micro-scale practices like pair programming) is such an effective tool when used correctly. It's a sort of extra mind to make sure that everything is sane and sensible.
So often, though, that extra mind is an insider, and if one insider is prone to make some oversight or bad decision, another insider is just as vulnerable. We all get so involved in the system that we can't see beyond it, and at some points, even peer-review won't catch the really deep, subtle, and subconscious assumptions that give designs the most trouble.
When I get into a system, learn it, and start to develop a zone-sense for it, I get a sort of holistic, top-down feel for how it all works. I have an intuitive feel for what will happen if I poke the system in certain ways, and that by and large is how I do design. For the most part, this works great; but the danger is that one can get too accustomed to that sense. One might know how the system works now, but when doing refactoring and redesign, that is not enough information. You have to know what else could be. A redesign requires you to step outside the system, look at all of the truly available options, and consider them objectively. Getting stuck in a rut of "how it already works" can be deadly.
So, the next time you go to adjust a design, develop multiple personalities. Create an imaginary friend that has never touched your system before, knows nothing about the design, and maybe even isn't a programmer/designer. Then justify everything you do to this imaginary friend. Avoid the temptation to make excuses and empty rationalizations; really sell this guy on what you're doing, and why it's the best possible choice.