Qué necesitan saber los ingenieros de software?

Los lenguajes son solo las herramientas para expresar lo más importante que hay debajo de todo eso: los algoritmos.

Así que siempre se aprenden algoritmos y estos son formas independientes del lenguaje para resolver problemas.

Hay tres niveles de lenguajes

  1. nivel de máquina ("Ensamblador", "GPU/OpenCL", "FPGA/Verilog")
  2. nivel de implementación portátil, lenguajes compilados ("C")
  3. lenguajes de alto nivel "HLL" lenguajes de script ("Python", "Java", "Haskell", "Lisp", "Basic", ...)

Todo el trabajo se hace en el nivel 2, mientras que muchas cosas sólo se pueden hacer eficazmente en el nivel de máquina y cada bucle primitivo debe ser revisado si no sería mejor implementado en ese nivel.

Hay dos memes (mentiras) dañinos por ahí: "los compiladores hacen mejor código que los humanos" y "HLL tiene que hacerse en HLL".

Ambos son sencillos de demostrar que son erróneos y que son mentiras dañinas. El nivel de máquina siempre es más rápido que lo que hace un compilador por nosotros. Porque

a) podemos como humanos mirar la salida del compilador y optimizarla.

b) el compilador sólo utiliza alrededor del 20% del conjunto de instrucciones de nuestros procesadores, el resto no se utiliza en absoluto, pero proporciona soluciones a nivel de hardware muy rápidas para problemas comunes. Ejemplo sencillo: ningún lenguaje HLL o compilador conoce la bandera "carry". Sumar números sobre varias columnas en Ensamblador es una cosa muy sencilla con esa bandera, en C deberías echar un vistazo al increíble atletismo que tiene que hacer el lenguaje para conseguir la información de si ha ocurrido un desbordamiento ("carry") o no.

Decirle a un ingeniero que no es importante que conozca su máquina se considera perjudicial. Tú no pondrás un pie en un coche construido por tales ingenieros, ¿verdad? Yo no lo haré. Y no quiero un ordenador que haya sido construido por el mismo tipo de ignorantes dañinos.

Ingeniero, conoce tu motor.

Así que toda la implementación ocurrirá en el nivel 1 y 2. Y por eso necesitas conocer estos dos lenguajes, que normalmente es el ensamblador de tu máquina y C. Simplemente no hay otro lenguaje que pueda hacer lo que hace C.

El tercer nivel de HLL es un lenguaje de script de llamada. Usted utiliza este nivel para la configuración y el flujo de datos, por lo que si usted tiene cambios menores en su proyecto no es necesario volver a compilar todo y usted puede enviar su producto compilado a un cliente, sin que él necesite todo el entorno de desarrollo.

Ejemplos típicos son, por ejemplo, una hoja de cálculo. Esa cosa tiene un lenguaje a nivel de aplicación (API) para programar tus hojas, pero el programa en sí está hecho en C y si te fijas en LibreOffice, pondrán el cálculo en tu GPU a través de OpenCL y utilizarán efectivamente tu hardware.

Prolog es un lenguaje de este tipo también. Prolog es el lenguaje de interfaz para un solucionador lógico. Y con eso todas las HLL son sólo scripts a nivel de API. No debes implementar cosas reales en ese nivel, pero por supuesto lo usas a diario.

Y esos lenguajes cambian rápidamente y hay una plétora de ellos por ahí. Porque cada aplicación, cada problema en torno a un núcleo de algoritmos evolucionará sus propios lenguajes. Lisp evoluciona alrededor de un motor de manipulación de listas y así sucesivamente.

Y luego están los decadentes, los lenguajes de script "universales", que proclaman ser capaces de implementar cosas en sí mismos. Toda la idea es enfermiza, desde mi punto de vista y no le veo el sentido. Pero Pascal era un lenguaje así, Modula-2 lo era, Python, Ruby, Java, C# son lenguajes así.

Con Java y C# escalando otra montaña aún más alta de estupidez para producir código completamente virtualizado. Que acaba siendo más dependiente de la plataforma que de cualquier otra cosa, sin cosechar el beneficio de eso.

Cuanto más altos son esos lenguajes, más difícil es expandir su sintaxis, su cuerpo de rutinas de librería en lenguajes reales como C. Lua es el ejemplo perfecto de un buen lenguaje de script. No implementas nada en Lua, usas el cuerpo de librerías de allí y puedes fácilmente, muy fácilmente expandirlo y es muy pequeño, con apenas 100 kb y casi sin overhead.

Basic estuvo allí una vez, muy pequeño, muy rápido, simple. Pero su objetivo era proporcionar una interfaz de programación fácil para los principiantes. Y eso lo sigue haciendo hoy, perfectamente. Basic siempre está ahí para ti. (Buscar Gambas casi significa Basic). Dos minutos desde cero hasta un cronómetro gráfico en marcha en tu pantalla, una pulsación de un botón para compartirlo con la comunidad. Eso es lo que yo llamo principiante-amistoso.

Entonces, ¿qué lenguajes son importantes para ti?

ASM, C, Lua. Considero que esos tres son la columna vertebral.

Basic, el lenguaje para principiantes para muchos. Sólo deberías haberlo aprendido alguna vez, porque todo el mundo puede entender Basic.

Python, un buen lenguaje prototipo en su cartera. Puedes hackear muy rápidamente un problema en Python. Es lento como el culo y acaparará tu memoria, pero no está ahí para ser un lenguaje de implementación. Deberías ser capaz de leer eso, porque mucha gente lo usa en este momento. Y quieres ser capaz de rescatar sus soluciones y leer sus ejemplos para principiantes.

Deberías conocer los típicos lenguajes de configuración de texto, en primer lugar el HTML. Pero no te olvides de LaTeX, que es para escribir documentación y no vuelves a mirar un Word o algo así después, luego para escribir manuales necesitas saber Roff, Groff, o algo así. Esto es realmente importante si estás escribiendo manuales, incluso si los escribes para ti mismo.

Sólo tengo que escribir "man serial" o "man compiling" o "man firewall" y obtener todas las notas que recogí y pequeños trucos. Y con este proceso universal puedes documentar cualquier cosa que hagas en tu ordenador y hayas descubierto y guardarlo para tu futuro yo. O para compartirlo con una comunidad. Si estás en lenguajes de procesamiento de texto, por favor, echa un vistazo a Postscript. Es sencillamente mega genial.

Sabiduría viva, conocimiento vivo. Los lenguajes hacen que el conocimiento esté vivo.

Lo siguiente que necesitas saber, si estás escribiendo aplicaciones web, es el lenguaje JavaScript de la API del navegador. Lo necesitas para HTML5. No es un lenguaje importante en sí mismo, muy específico en su uso y lo más probable es que desaparezca o cambie drásticamente en algún lugar pronto.

Webassembly ya está presionando en ese frente. Sí, lo sé, lenguaje de rápido crecimiento, bla, bla. Es la API del navegador. Si eres un programador web, entonces "conocer tu máquina" significa conocer JavaScript y Webasm. Pero no haces nada real en eso.

Si no eres programador web puedes ignorar esa cosa. No tiene importancia fuera de la programación web frontend.

El siguiente lenguaje importante en tu cartera debería ser SQL. Si aprendes Postgres SQL o MySql SQL o SQLite, no es importante. Para la programación de aplicaciones SQLite será tu compañero. La mayoría de los servidores web tienen MySQL funcionando y si trabajas con Python/Django y lo haces tú mismo lo más probable es que sea Postgres.

Postgres es la base de datos más avanzada (y más gratuita) que puedes elegir. SQLite es la más rápida con diferencia. Así que si no necesitas una conexión de datos IP-stack, opta por SQLite. Pero hagas lo que hagas: SQL es el lenguaje que tienes que aprender. Es EL lenguaje de bases de datos. Hay algunos otros por ahí, pero si tienes que hacerlos, te pagarán por eso, incluso por tu educación para eso.

Pero conoce SQL. De verdad. Eso no lo puedes evitar hoy en día.

Y con las muchas aplicaciones habrá un montón de lenguajes que tendrás que aprender. Siempre me pareció bueno saber Maxima / wxMaxima porque la matemática simbólica es algo, un informático necesita en una base regular. Y con eso viene otro lenguaje, por supuesto.

Y luego: el shell y los típicos lenguajes de línea de comandos.

Conoce Bash, pero apunta a Zsh para esto, conoce Awk, Perl, Bison, Flex, si estás en la construcción de compiladores o escribes parsers de alguna manera, Grep, Ack, y por supuesto los comandos matemáticos Bc, Dc, la hoja de cálculo orientada al texto Sc.

Para el trabajo de desarrollo necesitas conocer el lenguaje del enlazador Ld, Nm, Radare2, y las muchas herramientas de build-essential que a menudo vienen con su propio conjunto de lenguaje, como por supuesto Make como el más importante.

Todos esos proyectos tienen sus propios lenguajes y su propia sintaxis con ellos, si te pones en un nivel más profundo de comprensión. Sólo tienes que leer sobre linker-scripts si quieres.

Conclusión

Así que después de hacer los lenguajes básicos, tendrás que orientarte hacia la resolución de problemas. Y en ese camino es natural que aprendas los lenguajes de interfaz que necesites para esa tarea. Y eso serán muchos.

En algún momento dejarás de contarlos y verás la naturaleza de lo que son: Cosas a nivel de API que vienen con el cuerpo de la aplicación. Cambiarán y crecerán y te divertirás aprendiéndolas

Si no: cambia de campo. En informática no hay vuelta de hoja. Tienes que aprender mucho, realmente muchos lenguajes y si lo haces, tienes suerte. Si no lo haces, tienes un trabajo aburrido y estás todo el día haciendo lo mismo en un solo lenguaje. Eso es como trabajar en una cadena de montaje de principios de los años 20. Te perjudicará la mente.

Y si es realmente malo, te conviertes en un fanboi de HLL, que no es capaz de mirar por encima del horizonte de su pequeño lenguaje a nivel de API y ver que el mundo es mucho más grande que eso, mucho más grande que el pequeño conjunto de rutinas de aplicación-cuerpo del que es el rey. Y mucho más rico y bello.

Salte tantos niveles de script como quiera. Sáltatelos o hazlos durante un tiempo, pero no te quedes ahí, sigue adelante si has aprendido algo de sus conceptos. Pero conoce siempre tu máquina, conoce siempre lo básico. Mueve lo que haces en el nivel de script al nivel 2, cuando se pone interesante. No hagas las cosas interesantes en el nivel 3.

Y eso es ASM, C, y un script de tu elección, mi favorito de hoy sería Lua. Cada paso de un nivel a otro hace que tu programa sea más lento de L1 a L2 por un 50% a factor 5. De L2 a L3 por factor 5 a factor 10k, si va a una base de datos o algo así. Y por eso no haces algo de verdad en L3.

Y prueba Gambas. ¡Escribe a tus amigos una bonita tarjeta de vacaciones con eso! Todavía te quedan algunas horas y eso es suficiente para Gambas.

Oh, y no he mencionado Java y C#. Porque ambos conceptos son simplemente enfermizos. No toques esa mierda. No te acerques a ella, es tóxica.