When I work on a project and I hear advice from others, I’m reminded of all the advice I heard the year my first son was born. Often one recommendation would directly contradict another. They couldn't all be right, could they? In the end, I decided there are multiple correct ways to raise a child so I followed my own instincts each time I had to make a decision.
Software design and development are full of decisions – some big and some small. We argue passionately over these decisions. We agonize over them, sometimes even after we make them. Here are just a few examples
- Web forms or MVC?
- ASP.Net or Silverlight?
- ADO.Net or ORM?
- Web Services or Remoting?
- Visual Basic or C#?
- .Net or Java?
- Comments evil or comments good?
But are these decisions worth agonizing over? In many cases, they are not.
In my professional life, I have argued vigorously many times for architectural points I believed were correct. Some choices were small and some were large. Sometimes I won and sometimes I lost these arguments. But I accepted those decisions because I recognize that there are multiple right answers to almost every question. In almost every lost argument, the decision we settled on was good enough to get the job done.
I recognized that the important thing was to commit to a plan of action and move forward with it as a team.
Occasionally I’ve seen colleagues pout over a decision they did not buy into and use that decision as an excuse for failure. This is a self-fulfilling prophecy. A divided team is unlikely to succeed regardless how they design their project.
I am not trying to justify bad decisions. Some mistakes can be fatal and are inexcusable. These should be escalated up the command chain. But the vast majority of software project decisions are not life-threatening – even if they go against our thinking. We may grumble that our path is not optimal, but a decision that moves the project forward is acceptable.
There is very little dogma in software development. Your view works for you but it may not be best for the team or the project. And even if it is best, that doesn’t mean other views will not solve the same problem. Here are some guidelines that I use.
- Time-box your decisions. Commit to a decision by a certain date.
- Don’t feel the need to explore every alternative. Generally speaking, time will not permit this.
- Pick a good solution that meets your needs. Don’t be swayed by those who insist it is not the absolute best. It’s better to move forward with a workable solution than to delay a project indefinitely in search of the best solution.
- Debate openly and honestly. Be respectful but recognize the pros and cons of each alternative.
- Don’t make it personal. Just because someone disagrees with you doesn’t mean he is attacking your intelligence or integrity.
- Keep an open mind. Consider that there may be an alternative solution with advantages you have not considered.
- What worked on another project might not be appropriate for this project. Always consider decisions in the context of your current needs.
The overarching theme of this list is you should find a solution that works for your problem and move on, without wasting excessive time doing so.
And for the record, my newborn son is not 18 years old and had turned out better than I ever hoped.