I recently engaged in a fun discussion: Why should we (developers) follow best practices?
My first knee jerk reaction was to say "because they are best practices!" Of course someone immediately pointed out to me what a terrible argument that was. To their point, I could call anything a best practice, but that does not necessarily make it a good thing.
Best Practices: All the cool kids (wearing fedoras) are doing it.
So yes, I agree that any particular best practice should be able to stand on it's own merit. Of course this immediately brings up the next problem...
How do we train people to follow these best practices without having to prove out each and every one?
This is where we have to put our egos aside and be willing to defer to other people's opinions. When a Microsoft MVP or your team lead comes to you and says that you should do something a particular way, you probably want to consider what they have to say. This is because they have credentials, and that they have (hopefully) earned those titles and merit badges from years of experience, which would certainly imply that their opinion has value.
Am I saying that you should just defer to your senior developers / elders? No, absolutely not! Honesty goes both ways, so if something is wrong then you call them out on it! However, you should not feel the need to scrutinize every practice someone else puts forward just because you have not used it before. Again, if something is a good idea it often becomes self evident once implemented.
If you are trying to promote a best practice, start by providing a simple example or two.
Why should we have a data access layer where all of our database code goes? There are several reasons. When a change gets made to the database (and changes WILL get made to the database), there is only one place where you have to go to update your data access logic. Putting all of your logic in one place ensures that people will not rewrite the same queries over and over again. The list goes on.
If you are the trainee, please do not fall back on using arguments from ignorance.
If you are a web developer and you are asking why should I use interfaces in your MVC models, then you probably have not worked on a large project where multiple controllers (each with different models) are all rendering the same user controls. Admittedly it may take a little bit more code to implement an interface, but the reuse that it provides more than makes up for that, and when we look at this in action the advantages should become self evident.
On a related note, why do so many developers not believe in training?
Even after making it big, professional sports players still train everyday. All of the best athletes in the world still have coaches. The world's leading scientists still read new papers published by students. So what makes software engineers any different?
I encourage all developers to go out and read blogs, check out sample projects, research design patterns, attend their local user groups, and do anything to get exposed to new ideas! Remember that such things will often provide an immediate return in your every day work life. Testable code makes hunting bugs easier, it makes your integration phase shorter, it makes releases go smoother, and that makes your stress level go down!
Programming is fun, and adhering to best practices only helps make it more fun for everyone!