Being reclusive seems to be no small part of working in intellectual fields, and programming is no exception. The need for focus and a controlled environment borders on the neurotic in many of the programmers I know - myself included. I've been known to blow up quite spectacularly when people show up at a point where I want to be left to my own devices.
I bring this up for one simple reason: to underscore just how totally bizarre it is that I, of all people, am about to say what comes next. Remember, my telecommuting job consists essentially of sitting in my darkened apartment all day, in complete isolation - and I love it.
It's the People, Stupid.
I've been doing the programming thing long enough to remember more than one fad. A few of them have succeeded, more or less, like Java. Some have crawled away back into obscurity to die in shame. Others have clung to a dwindling yet rabid fan base, yelling loudly to anyone hapless enough to come within earshot that someday the world will wake up, see the truth, and everything will be beautiful and perfect; they exist in perpetual denial over the fact that their time has come and gone, and nobody cares anymore. (I won't name any names; the Kool-Aid drinkers might get offended and stab me in my sleep or something.)
So it's really no surprise to me to watch the Fad Cycle occuring with Agile development: first, it rises from obscurity and enjoys a massive surge in popularity. Then, a few people become openly critical. Next, polarization occurs: those who are "for" the fad line up on one side, and those "against" on the other. The two sides then proceed to throw things at the neutral, undecided people who wander around in between. More often than not, in an attempt to be persuasive, each camp begins chucking large and dangerous items, or even explosive devices.
Eventually, the proponents and opponents work their way up from paper cups to grand pianos to hand grenades. All the neutral people either flee to one side randomly just to escape the devastation, or they get impaled with a flying harmonica and decide to go to law school.
Once the polarization phase is done, both sides decide (for the most part) to just go about their business and leave those crazy "other people" doing their thing. A few vocal people will stick around and halfheartedly lob free convention pens and stress balls at each other for a few months.
Then, the disillusionment phase begins. This is typically accompanied by a massive resurgence in the controversy around the fad, but this time the rats are starting to flee the burning ship. The vocal get louder, the proponents become fanatical, and everyone insists that everyone else is wrong, deluded, stupid, and going to bungle their project if they don't wake up and smell the enlightenment.
After a while, enough people leave the fad to restore a form of equilibrium. In most cases, a few stragglers enter the denial phase, and huddle up in a corner in a fetal position, rocking gently back and forth and whispering about how aspect-oriented programming will return to save us all.
Right now, I think Agile is in the beginnings of the disillusionment phase. The controversy and fighting is becoming louder and more bitter, with no new, intellectually significant contributions on either side of the debate. This is where the shouting match escalates; we've stopped debating the subtleties of chocolate versus the nuanced richness of vanilla, and now we're just yelling and throwing ice cream cones around like blitzed apes.
It's only a matter of time before the 31 flavours run out and we have to resort to using feces.
So what's the deal? Why do people go through this cycle, roaming from one fad to another, in endless search of a magical solution that we all know (deep down) probably doesn't even exist? Brooks told us decades ago that software development is hard, and there's no magic recipe for making it not-hard. Why do we insist on plugging our ears and pledging our souls to the first shyster with a good methodology sales pitch? Are we so addicted to the search for silver bullets that we convince ourselves that we might actually find one?
How can otherwise perfectly rational, intelligent people so devote themselves to what amounts to a massive unicorn hunt? I think the explanation is actually rather simple, albeit a rather depressing commentary on the state of our culture.
Methodology fads, like self-help fads and get-rich-quick schemes, share a single point in common. No, I'm not talking about instant-gratification selfishness, although that does play a role. Underneath the surface, all of these things have one goal in common: to supress the human element.
Humans are imperfect; we're prone to failure. We screw stuff up. We make mistakes. We can be lied to, deluded, or innocently mistaken. We routinely bungle things on all scales, from wearing the wrong colour socks to killing innocent people.
Methodology fads have an unspoken but powerful allure: they promise to mitigate the human factor. They whisper in our ear that if we only embrace the One True Way, we'll stop making mistakes. We'll stop screwing up. We'll stop having to have brutal, embarassing code reviews with that one guy who loves to smugly poke holes in our modules.
We latch on to these fads because, at a fundamental level, we want to stop being imperfect.
This is the fundamental allure of Western commercialism. We're all familiar with the superficial promises made: drink this substance, and women will strip naked and pounce on you on a daily basis. Eat at this restaurant, and your family will love you forever. Wear this brand of clothing, and everyone will respect you. Drive this car (or truck, more often), and you can do anything. Buy this book, and all your difficulty in life will go away.
Fads, commercials, and even cults appeal to a lot of things: self esteem issues, public image issues, skill deficincies, social dysfunction, and so on. For virtually any problem under the sun, you name it, there's probably a 10-step book describing just how to kick it.
Clearly, all of this stuff is bullshit. If it weren't, we'd all be perfect little Buddhas walking around in glowing white robes. The fact that the universe has not suddenly transformed into a utopia is a fairly good indicator that our "cures" are not as effective as we would like to believe. Further evidence is the fact that the cures follow fad patterns: they surge in popularity, then dwindle into obscurity fairly quickly. True cures are timeless and everlasting; they don't disappear from public consciousness as soon as they drop off the New York Times Bestseller lists.
The one thing all these ineffectual half-cures have in common is that they promise us that they will remove our failure. We will stop being imperfect. We will stop making mistakes, causing problems, screwing things up.
All such promises are deadly lies. People will never be perfect. I've known some incredible, remarkably great people, and they're not perfect. Everyone knows it, whether they want to admit it or not. Because of this, we'll never stop making mistakes. We may get lucky, make a good run, have a strong streak - but eventually, no matter how big or small, we'll botch something somewhere along the line.
The real deadliness of fad-cures strikes here, after that first failure. If we have bought into a cure fad, we've probably convinced ourselves that we've gotten it right and we won't screw it up. So, when we inevitably do, it can be devastating. We'll question the fad, ourselves, and anything and everything around us in a desperate attempt to recover. The most insidious fads will tell us that we should expect to screw up, and just be persistent in following the magic recipe; this engenders rabid loyalty. People think that they simply didn't try hard enough, or believe hard enough, or want it bad enough. Maybe they misinterpreted some subtle wording in Step Three and they should go back and try it again. This time, it'll work for sure!
Usually, people will tolerate only a limited amount of this nonsense before moving on to other things. Sadly, some do not; they dig deeper into the dogmatic hole of blind faith, and swear to themselves and everyone around that they're still right - you'll see! Just give it time! They are Linus, passed out in an empty field in the dead of night, still believing that the Great Pumpkin will fly out and deliver joy and perfection to everyone around. Many go to their graves convinced that the Messiah of their choice is just around the corner, and when he shows up, by golly everyone'll be sorry for doubting.
As a species, we've spent thousands of years trying to find the magic recipe. Every group of more than three people in history has eventually started speculating about the answers to Life, the Universe, and Everything. (The enlightened among us are, of course, perfectly aware that the answer is not the hard part.) We all look for our silver bullets, not just in software development but in all of human life. We want to patch off the last of the imperfections and quit having to deal with the icky, slimy, dirty mess of people.
Fallible, flawed human beings can be sticky and grimy. Our baggage, issues, and quirks can make a pretty nasty sludge at times. Is it really any wonder that we crave a way to escape that? Is it surprising that we want to be rid of it?
Yet time and again, we've shot ourselves with various shiny bullets. They look sort of like silver, so we hope they're the ones that will finally slay our demons. And time and again, we discover that the bullet wasn't silver, but merely polished up stainless steel or whatever, and now we've got a gaping bullet wound to deal with on top of the demons, who are now having quite a go at us for being so silly.
The search for silver bullets, in software engineering as in life, will never end up with a cure for our imperfections. All it can do is put a lot of bullet holes in a lot of people.
The most successful people in history are not those who have attained perfection. On the contrary, the successful people are those who have learned to handle failure. Our collective consciousness is slathered with pithy quotes from Newton, Einstein, Edison, and a horde of others; they speak of standing on the shoulders of giants, of dogged persistence in the face of apparent defeat, of sweat and work and getting back up after we've been kicked down and beaten a little bit.
All the great people became great not because they had some magic recipe for perfection, but because they had mastered fallibility.
I am convinced that, in software engineering and everywhere else, we could see dramatic changes in the world if we simply learned to accept the fact that we are not perfect beings. We're not likely to ever become perfect. Expecting and seeking perfection is ultimately destructive and harmful; there are ample tales of warning. I daresay pretty much everyone has had a personal brush with that truth as well.
Instead of trying to find the methodology that will make every software project everywhere instantly perfect, we should focus on what we've got. We're so caught up in the hunt for the Big Answers that we ask stupid questions just so they will line up with the answer we want to use. We get things horribly out of order, and try to organize our lives and projects to fit some idealistic end goal, often without any real consideration for what it is we're doing.
The problem is, it often works... sort of. Someone out there is bound to get lucky, and just happen to have the Big Answer work out for their particular question. These are the people who become the rabid proponents of the fads, the ones who write the breathless testimonials and make keynote speeches at big conferences. They're the ones who write the books, go on tours, and tout their experiences as gospel proof that their fad of choice is the One True Way.
Worse yet, some people will be on the fringe, along the hazy border between the area where the Answer works and where it doesn't. They'll modify the answer a bit (just a bit - not enough to piss off the Holy Prophets) and then go off and become cheerleaders themselves. They supposedly prove that if you just adhere to the spirit of the Answer rather than the letter, and adapt it to your situation, it'll work for you, too! So don't question it, because it can't be wrong; you just haven't suitably adjusted it for your particular situation.
If shooting ourselves in the head with would-be silver bullets was a total failure, we would have stopped millenia ago. There wouldn't be Agile fads and goofy late-night infomercials for machines that will make your unsightly flab go away by whispering Shakespeare to it. The problem is, every time we pop a round in our cranium, we happen to lodge some lead in the pleasure center, and we get a rush. We're blowing our brains out, a chunk at a time, but it just feels too damn good to quit - we're so sure that Next Time it'll work out. The Next Fad will be the One with the Real Answer.
And so we continue to fail to deal with the reality of the situation: that we're not perfect, and mutilating ourselves won't change that.
Let me tell you one thing that will save your bacon a million times over in today's world of cargo-cult fads: nobody can give you genuinely valuable advice if they haven't sat down and listened, extensively, earnestly and honestly, to your specific situation. I don't care how many degrees or years of experience your guru has; if he hasn't taken the time to learn the nuances of your personal circumstances, any advice he gives you is arbitrary. If it happens to work, it's not because he was right or wise or brilliant or Jesus reincarnated - it's because he got lucky.
There's a whole field of people who thrive on convincing people they know more than they do, using linguistic tricks and statistics. That is the domain of con men, TV psychics, and pyramid schemers. Good advice - good guidance - can come only from someone who is intimately familiar with your case. Not one that was very similar. Not one that vaguely involved something related. Yours.
This has two important corollaries. First, and most obviously, any methodology fad is going to work for some people, and not for others. Depending on how lucky the prophets of the fad are, it may work for more people than it doesn't work for; these are the most successful fads. This explains the typical fad-cycle described earlier.
Secondly, and most importantly, the real answer is to look for answers within, not from outside. If your project is struggling, don't immediately run out and try to find a book that addresses your problem. Don't look for a fad that might fix it. If your team is dysfunctional, behind schedule, over budget, or simply playing too much Unreal Tournament on work hours, don't rush around for the first convincing slogan and set of 10 magic steps that sound promising.
Look internally first. Understand and know your own problem. Know the people you are working with. The tools, location, and other stuff is likely irrelevant periphery; we must truly understand that our people are the most significant factor. It's easy to put on a poster, but we must make sure that we truly understand, believe, and practice this.
Know thyself; and, once you know, do what you can, with what you have, where you are.
Adapt to the imperfections of the people you have. More importantly, adapt to their strengths. Sometimes you'll need to add, replace, or even remove some people. Sometimes you may well need to seek the advice of someone who can, from experiential wisdom, suggest how best to make use of who you have. Just make sure the focus is on using what you've got.
Take care of your people, first and foremost. If you're taking care of them, they'll take care of you. It is typical of command-and-control culture to expect people to be amorphous blobs that can be reconfigured to suit our whims; employees and team members are cogs, Lego bricks; they can be reassembled and modified freely for some larger purpose. This is not at all true, and it is a shameful abuse of human beings. Get to know your people, and fit them into the team based on their strengths and weaknesses.
Every team, every project, every situation will be unique. If we focus too much on the generalities that are common to many situations, we will always fall prey to the devil in the details.
If, on the other hand, we learn to master the details, the pecularities which separate our particular situation from all others, we have eliminated the problem. The way to conquer imperfection is not to wish for it to go away.
The way to conquer imperfection is to accept that it exists, and adapt accordingly.