Years ago, I worked on a pretty large failed project. There are many ways for a project to fail. Some never get delivered. Others are delivered, then discarded. These are obvious failures, and companies try their best to hide them. This project failed in a slightly less obvious way, by being late, over budget, and buggy as hell. It's still an obvious failure, but since the project was actually delivered, management called it a success and blamed everybody else for any problems.
I was really inexperienced (at the time I had only worked as a professional programmer for just over a year), but because I was a pretty good coder, my boss made my technical lead for one of the trickier parts of the project. This basically meant I had full responsibility if anything went wrong, but absolutely no authority for making sure things worked. I took the job. I was an idiot.
My boss, you see, was an idiot too - and a much bigger one at that. He was also a jerk. An arrogant, rude man, he ignored the opinions and ideas of everyone else. Since he began his professional life as a programmer, he though he knew everything better than anybody. He set impossible schedules, accepted ridiculous feature requests, and dismissed the ideas of source control, configuration management, requirements management, and quality assurance as impractical and unnecessary. He made every possible mistake (kind of impressive, when you think about it). It was actually a valuable - if painful - learning experience. A few years later, as a project manager, I found that all I had to do for the project to be an incredible success was just the exact opposite of everything he did.
The reason I just remembered this fun period of my professional life (rated just above poking my eyes with a sharp stick) is that I just read Johanna Rothman's "Schedule Games" posts (via Coding Horror.) Johanna has great insights about project management, but I got to thinking about what to do when you're a developer stuck in such a project, or working for such a boss (I did mention he was - and still is, from what I hear - an idiot, didn't I?)
From my experience, if you identify yourself in such a situation, you have four options:
- Do as you're told. This is what's called in Hebrew "Rosh Katan" (little head). Basically, it means you do your work, avoid any responsibility, and try to find satisfaction elsewhere, since clearly you're not going to get any at work.
- Work until you're too depressed to live. If it still hurts, you're not there yet.
- Ignore your boss, do what you think is right, and hope he doesn't notice.
- Walk away.
The only option that really works is the last one. Trust me - I've tried options #2, #3, and #4, and know a lot of people who are still stuck in #1, #2, or #3. They have good reasons, such as families to support. And what's all this nonsense about job satisfaction? A lot of our parents spent their lives doing something they hated just so they can put food on the table.
But programming is different. Most, if not all, programmers love it. They'd write code even if they had other jobs. We're very lucky to be able to have jobs doing something we love, and we should make every effort to keep it that way.