Esta respuesta tiene una excelente cobertura y enlaces sobre por qué diferentes idiomas pueden proporcionar beneficios distintos a un proyecto. Sin embargo, hay algo más que la idoneidad del idioma involucrado en por qué los proyectos terminan usando múltiples idiomas.
Los proyectos terminan usando múltiples idiomas por seis razones principales:
- Beneficios de costo de reutilizar código escrito en otros idiomas;
- La necesidad de incluir y acomodar código heredado;
- Disponibilidad de codificadores para idiomas específicos;
- La necesidad de idiomas especiales para necesidades especiales;
- Sesgos de lenguaje heredados; y
- Mala gestión de proyectos (uso no planificado en varios idiomas).
Las razones 1-4 son razones positivas en el sentido de que abordarlas directamente puede ayudar a que un proyecto concluya más rápido, más eficientemente, con un producto de mayor calidad y con un soporte a largo plazo más fácil. Las razones 5 y 6 son negativas, síntomas de resistencia al cambio necesario, mala planificación, manejo ineficaz o alguna combinación de todos estos factores. Lamentablemente, estos factores negativos son causas comunes del uso "accidental" de varios idiomas.
La razón 1 , los beneficios de costo de la reutilización, se ha convertido en una razón cada vez más poderosa para permitir el uso de múltiples idiomas en un proyecto debido tanto al mayor papel del software de código abierto como a las capacidades mejoradas para encontrar los componentes de código correctos en la web. La filosofía de "codifiquemos todo internamente" de las últimas décadas continúa desvaneciéndose ante las realidades económicas, y esencialmente nunca es el enfoque más rentable para ningún proyecto nuevo. Esto a su vez hace que las oportunidades para la aplicación estricta del uso de un solo idioma dentro de un proyecto sean menos comunes.
Especialmente en el caso de un proyecto que reutiliza componentes de código abierto bien administrados, el uso de múltiples idiomas puede proporcionar enormes beneficios de costos generales porque los componentes reutilizados están ocultos detrás de interfaces bien diseñadas y son mantenidos de forma independiente por grupos externos de costo cero. En el mejor de los casos, mezclar idiomas a través de este tipo de reutilización no es más costoso para el proyecto que usar componentes del sistema operativo. No conozco mejor ejemplo del valor de este enfoque que la adopción a gran escala de Microsoft de software de código abierto en sus navegadores.
La razón 2 , la necesidad de acomodar el código heredado, se ignora bajo el riesgo de cualquier proyecto grande. Sin embargo, pueden causar muchos problemas el código heredado, suponiendo ingenuamente que puede reemplazarse fácilmente con un nuevo código en un nuevo idioma puede ser increíblemente arriesgado. El código heredado, incluso el mal código heredado, a menudo incluye lo que equivale a un "contrato" implícito de características que la comunidad espera que utilice el producto heredado. Esa comunidad a menudo es una fuente importante de ingresos para una empresa, o el objetivo principal de soporte para el software gubernamental. Simplemente descartar ese contrato implícito puede perseguir a clientes conscientes en masa y puede llevar a la bancarrota a una empresa de la noche a la mañana si hay otras opciones disponibles.
Al mismo tiempo, no reemplazar el código antiguo en un idioma antiguo puede ser tan peligroso como reemplazarlo al por mayor. El peor de los casos es la Administración de Veteranos de EE. UU., Que tiene una gran cantidad de sistemas vitales codificados en un lenguaje llamado MUMPS (no es broma) que fue diseñado por médicos, no por científicos de la computación. Nadie quiere aprender MUMPS, y aquellos que lo saben están literalmente muriendo. Por lo tanto, los programadores deben acomodar MUMPS incluso cuando intentan avanzar hacia el uso de otros lenguajes más comunes, más potentes y mejor mantenidos.
Este tipo de uso multilingüe requiere una planificación cuidadosa. Esa planificación debe navegar el filo de la navaja entre perder décadas de conocimiento del cliente por un lado, y perder la capacidad de soportar el software por el otro. Las técnicas que aíslan el código antiguo detrás de interfaces bien definidas y que permiten que un código nuevo y más poderoso reemplace el código antiguo después de que sus comportamientos hayan sido bien documentados, pueden ayudar. Pero este escenario heredado nunca es fácil, y ha sido (y seguirá siendo) la causa de la desaparición de muchas empresas y organizaciones en un amplio espectro de tamaños.
La razón 3 , la disponibilidad de codificadores para varios idiomas, es un factor pragmático que los proyectos ignoran a su propio riesgo. Por mucho que los organizadores del proyecto sientan (correcta o incorrectamente) que un idioma en particular es el mejor para sus objetivos, si ese idioma está en conflicto con el grupo de expertos en idiomas disponibles para ellos, tanto el horario como la calidad del producto se verán afectados por el aprendizaje. Curva de programadores que intentan aprender un nuevo idioma.
Un enfoque más racional es analizar las necesidades lingüísticas del proyecto en función de las áreas funcionales. Por ejemplo, mirar cuidadosamente el proyecto puede mostrar que solo hay un pequeño "vértice" de código de alto valor, por ejemplo, para implementar algún algoritmo patentado, que requiere experiencia en codificación en un lenguaje menos comúnmente usado. Otras partes de cualquier proyecto grande a menudo se acomodan fácilmente con lenguajes más comunes, o (aún mejor) con productos de código abierto bien administrados. Analizar un proyecto por necesidades lingüísticas puede proporcionar un enfoque mucho más realista y rentable para contratar o alquilar experiencia especial en idiomas especiales, y también puede ayudar a agudizar las interfaces entre idiomas dentro de un solo proyecto.
La razón 4 , que usa diferentes lenguajes para diferentes necesidades, sigue de manera inmediata y sin problemas la realización de ese tipo de análisis de las necesidades del proyecto. También se debe tener cuidado en esto, ya que seleccionar demasiados idiomas para soporte dentro de un solo proyecto puede causar una explosión combinatoria de complejidad tanto en soporte como en interfaces entre componentes. La ruta más segura en cuanto a costos es siempre encontrar primero las máximas oportunidades de reutilización, especialmente si existen buenos paquetes que puedan satisfacer las necesidades del proyecto a través de poco más que la personalización. A continuación, se debe tomar algún tipo de decisión sobre un pequeño número de idiomas que puedan abordar la mayoría de las necesidades identificadas. En el desarrollo intensivo de reutilización, esto a menudo será un tipo de código de pegamento.
Por lo general, no es una buena idea elegir varios idiomas con capacidades muy similares solo porque a algunos miembros del proyecto les gusta uno y a otros. Sin embargo, si hay un subconjunto de capacidades bien identificado y bien definido que se beneficiaría de habilidades lingüísticas especiales, esa puede ser una buena razón para usar múltiples idiomas para el desarrollo de nuevos códigos.
La razón 5 , la resistencia a los cambios necesarios en los idiomas utilizados, puede ser una causa de interrupción severa del proyecto y conflictos internos. Como usuario DaveoEn un comentario sobre esta respuesta, el cambio puede ser muy difícil para algunos miembros del personal del proyecto. Al mismo tiempo, la resistencia al cambio nunca es un problema simple, y es precisamente por eso que puede causar mucho conflicto. El uso de habilidades de lenguaje heredado puede ser un poderoso impulso para la productividad de un proyecto si el lenguaje heredado es lo suficientemente poderoso y puede conducir a un producto con excelente calidad en un equipo que funciona sin problemas y respeta la calidad. Sin embargo, las habilidades lingüísticas heredadas deben equilibrarse con el hecho de que muchos idiomas antiguos ya no pueden completarse con idiomas más recientes en términos de características avanzadas, disponibilidad de componentes, opciones de código abierto y compatibilidad con el kit de herramientas inteligente.
Tanto entonces como ahora, el argumento más común (e irónicamente, con mayor frecuencia correcto) para continuar usando un lenguaje heredado más débil, menos legible o menos productivo ha sido que el lenguaje más antiguo permite la producción de un código más eficiente. Este es un viejo argumento, que se remonta a la década de 1950, cuando los usuarios del lenguaje ensamblador resintieron, a menudo amargamente, la aparición de la programación en FORTRAN y LISP. Un ejemplo en el que incluso ahora el argumento de eficiencia del código puede tener validez se puede ver en el código de procesamiento intensivo, como el núcleo de un sistema operativo, donde C sigue siendo el lenguaje de elección sobre C ++ (aunque por razones que van más allá de la simple eficiencia).
Sin embargo, en los entornos de proyectos del nuevo milenio, conectados en red a nivel mundial y poderosamente respaldados por máquinas, la eficiencia del código como argumento principal para elegir un lenguaje de proyecto se ha debilitado aún más. La misma explosión de hardware informático y de redes que ha permitido el mercadeo masivo de aplicaciones de inteligencia artificial también significa que los costos de la programación humana pueden fácilmente eclipsar los de la relatividad en la ejecución de código ineficiente en hardware y cloudware espectacularmente baratos. Cuando eso se combina con la mayor disponibilidad en los idiomas más recientes de las bibliotecas de componentes, las opciones de código abierto y los kits de herramientas inteligentes avanzadas, el número de casos en los que mantener un idioma solo por razones de eficiencia se vuelve muy limitado. Incluso en los casos en que se aplica,
Una razón más convincente para que un proyecto permanezca con idiomas heredados ocurre cuando, por cualquier razón, un proyecto tiene pocas o ninguna opción para cambiar su personal. Esto puede suceder, por ejemplo, cuando una importante línea de productos heredados se codifica por completo en un idioma con el que solo el personal existente habla con fluidez. En tales casos, el proyecto debe continuar por el camino de intentar programar en el idioma antiguo o intentar capacitar al personal existente sobre cómo usar un nuevo idioma.
Capacitar al personal de idiomas heredados en un nuevo idioma puede ser un peligro en sí mismo. Todavía recuerdo un caso en el que un miembro de un proyecto que acababa de ser entrenado y en transición de C a C ++ se quejaba con toda sinceridad de que simplemente no entendía las ventajas de los métodos orientados a objetos. Cuando miré su código, había convertido sus funciones 103 C anteriores en 103 métodos para una sola clase de objeto C ++ ... y con razón no vio cómo eso ayudaba en nada.
El mensaje más profundo es que cuando las personas han programado en un solo idioma y estilo de lenguaje durante años o décadas, la dificultad para lograr que "piensen" de nuevas maneras puede volverse casi insuperable, incluso con buenos programas de capacitación. En algunos casos, puede no ser otra opción que atraer a diseñadores y programadores más jóvenes que estén más en sintonía con las tendencias y métodos actuales.
La razón 6 , mala gestión de proyectos, habla por sí misma. La selección y uso del idioma en un proyecto siempre debe considerarse y evaluarse explícitamente, y no debe permitirse que ocurra solo por accidente. Como mínimo, la selección de idioma puede marcar una gran diferencia en el destino a largo plazo y los costos de soporte de un proyecto, por lo que siempre debe tenerse en cuenta y planificarse. ¡No te conviertas en MUMPS!