This battle happens at many different levels: operating systems ; database, application and web servers ; development platforms, tools, frameworks and libraries. Is it worth fighting it?
First, let us bear in mind that there are some strong rationale in unifying the different technologies in an IT landscape. Here are a few:
- Limited and simplified licensing and support contracts negotiations,
- Facilitated software maintenance and operations,
- Improved interoperability and potential for re-use.
- Golden hammerism: Forcing the use of technologies into scenarios where they are not adequate,
- Team entrenchment: any technological choice usually satisfies as much people it displeases,
- Kool-aid intoxication: single vendor dependency often reduces options and opportunities for using better fitted approaches.
I will not discuss the advantages of single server operating systems strategies: despite the clear advantage in term of resource management, the raise of virtualization platforms have somewhat made a multi-OS environment an easier possibility. Narrowing the discussion to developers, who have the tough job of taking decisions in a world where every day brings a new and promising tool, what is the actual risk of letting them make choices?
My experience in the matter taught me that:
- No project gets doomed by its technological choices: I have seen more harm done by the abuse or misuse of a particular framework, than by the framework itself. And yes, this also holds true for projects condemned to use Entity Beans.
- Applications designed on the same platform do not inter-operate by the sole fact of being developed and run on the same platform.
- Similarly, re-use does not happen by unifying technologies (except if you develop for portals and want to re-use widgets without resorting to HTML scraping).
- Paid-for support for open source projects is seldom useful (while "quick-start" consulting gigs are valuable).
- Practice quality over dependencies uniformity: more than the usage of a common set of libraries, improving code readability, test coverage, application design and build practices have the biggest impact on the maintainability and evolutility of a particular application.
- Loose coupling over platform uniformity: an IT landscape greatly benefits from systems that have clear contracts between each other, interact in well defined and contained manners and can gracefully survive if their neighbors have temporarily fallen in digital limbos.
- Operation friendliness over environment uniformity: applications that are developed while having operations in mind have a happier life in this world. Targeting a particular server or database or OS does not automatically translate into an application that will be easily handled by the production team of a company.