Qué lenguajes de programación debería conocer todo ingeniero de software?

Obviamente no es práctico, pero aunque sólo sea para ser "útil", la mayoría de las Universidades deberían enseñar ambos: lenguaje ensamblador y Java ... aquí está el por qué.

Asamblador - Estarías obligado a aprender y entender la arquitectura de hardware subyacente. Haría que la mayoría de los programadores apreciaran lo preciosa que es la memoria (sí, incluso hoy en día), el coste de las operaciones de E/S, las IRQ, el IPC, las tareas y los hilos, el cambio de contexto, las pilas, los registros y cómo pensar y organizar tu código.

Veo a los desarrolladores junior hoy en día salir de la escuela y hacer cosas estúpidas ... aquí están sólo algunas:

  1. Desarrollar un hilo bajo demanda de trabajos. Sin ser conscientes de la sobrecarga y complejidades que introducen al hacer IPC. Cuando les pregunto por los thread pools (y la reutilización de hilos), recibo una mirada vacía como "conozco el concepto, pero dónde, cómo, por qué????".
  2. Hacen constantemente E/S en modo de bloqueo (sync). No hay una comprensión real de la E/S desbloqueada (async) y cómo tratar con ella y los eventos futuros.
  3. Tratando de leer un archivo en la memoria de una vez en lugar de progresivamente. Incluso he visto a alguien intentar leer/manipular un archivo de 1 GB en memoria. Cuando les pregunto por los archivos de memoria mapeada, no tienen ni idea de lo que estaba hablando.

Con un curso de lenguaje ensamblador y práctica en mano, aprenderían prácticamente todo lo anterior y mucho más. Específicamente, yo intentaría que aprendieran ensamblador para un Kernel/OS, que cubriría los temas que he enumerado anteriormente.

Java - Entonces, ¿por qué Java? Este es mi punto de vista sobre Java (y tengo datos que lo avalan, pero no entraré en ello porque no es el propósito aquí).

Si lees la historia de Java, básicamente se dijo que sus creadores/diseñadores (que eran extremadamente conocedores de otros lenguajes OO) querían crear un lenguaje OO con todas las mejores características y beneficios de otros (algunos obsoletos) lenguajes de programación OO, mientras que se eliminaban (o al menos se intentaba, por otros medios) todas las cosas que suelen crear problemas importantes.

Por ejemplo, creo que C++ es un lenguaje increíble... PERO, es demasiado poderoso. Una y otra vez, he visto a la gente dispararse en el pie debido a esto. Así que, dado que es increíble, cuando lo utilizaba en mis proyectos, NO permitía que mis programadores hicieran muchas cosas que creaban estragos, confusión o problemas en el futuro. Para mí, esto resultó ser un éxito.

Java fue diseñado exactamente con esto en mente. Elimina muchas de las tonterías que otros lenguajes te permiten hacer. Por ejemplo, Java será criticado por sólo se permite tener una única herencia. Esto es para forzarte y realmente pensar en tu arquitectura. Tengo que admitir que la mayoría de las veces es difícil. Pero si hicieras el mismo proyecto en C++, tus programadores heredarían de una docena de otras clases (así de simple, problema resuelto). Pero eso es un problema ENORME. Arquitectónicamente, lo más probable es que NO debas heredar de esas otras 12 clases, sino sólo de unas pocas. Así que Java realmente te obliga a pensar.

Muchas de las cosas que Java no tiene es por diseño. Algunas de las limitaciones también son por diseño. Creo que los creadores de Java realmente tuvieron mucho éxito en su intención. Algunas personas se quejarán, pero por lo general eso es porque sólo quieren la manera fácil y no realmente "pensar" de la manera correcta.

Es por eso que creo que Java es uno de los mejores lenguajes de programación que hay y no tiene rival. Y por esa razón, los programadores deberían aprenderlo. Al usarlo, generalmente se verán obligados a programar de la manera correcta. No sólo tener el poder de hacer absolutamente cualquier cosa como te permite C++.