
In my experience, there are two primary modes of software development, which I'll term the
heroic and the
consensual.
In the heroic mode, the developer sets out on a quest (typically ill-defined, as for any good quest) with a goal in mind, and hacks and slashes a path through to the finale, slaying various dragons and other beasties on the way. Mysterious figures offer enigmatic words of advice from the sidelines, the full import of which our hero(ine) only realizes once an irreversible doom has been allowed to flower. (
"You really don't want to disable that test; it's trying to tell you something...").
The hallmark of the heroic mode is
unplanned impact. Indiana Jones leaves a trail of upturned vegetable carts and irate vendors in his wake, and we laugh, but in real life, it's QA, ops, techpubs, proserve, partners, and customers who pay the price. Perseus doesn't bother to ask Andromeda whether or not pulling out Medusa's head from the bag is a good way to solve the problem--he just does it, and it does
solve the problem; it's a small detail that Andromeda ends up with most of her relatives turned to stone. (
"Well, they weren't very nice people anyway...")
In contrast, the consensual mode proceeds by thinking, controlled experiments, prototyping, impact analysis, release planning, and migration discussions instead of immediate actions. This can be very good, or it can be very bad. The hallmark of the consensual mode is
sitting in meetings, and that can lead to a very different kind of paralysis. However, when the parties involved are all experienced, know what they want to accomplish, and not playing games, it can work very well. A properly-timed discussion can avoid weeks of panic and firefighting in production.
When I was younger, the heroic mode came naturally for most coding projects, and an important part of gaining experience was to become conscious of unintended impact from changes I made. (I can still remember a very dirty look I received from a release manager one time when I checked in a random change smack in the middle of a CVS tag being applied for a release.) However, sometimes the heroic mode is what's called for in order to break a management deadlock--or at least to prove that it can be broken.
The tension between progressive and conservative forces is key to healthy evolution for just about any system, and software development is no exception. Open source naturally balances the two since it allows room for experiment while insisting that long-term architecture and quality be respected. Even for closed source development, a good approach is to apply the heroic mode in private (either before checking anything in, or in your own private branch or equivalent), but still conform to the consensual mode in all interactions with others. In other words, limit heroism to the sandbox, but use the results to drive discussion about how you're going to accomplish the real work. And oh, beware of the management gods, who will try to exploit or twist those results in ways you and others never intended.
OK, enough philosophy talk for the day.