El aumento en la complejidad de los sistemas es implacable, opresivo y, en última instancia, paralizante. Para mí, como programador de una generación anterior, también es muy decepcionante.
He estado programando durante más de 40 años, he escrito código en 50-100 idiomas o dialectos diferentes, y me he convertido en experto en 5-10. La razón por la que puedo reclamar tantos es que en su mayoría son del mismo idioma, con ajustes. Los ajustes agregan complejidad, haciendo que cada idioma sea un poco diferente.
He implementado los mismos algoritmos innumerables veces: colecciones, conversiones, ordenar y buscar, codificar / decodificar, formatear / analizar, buffers y cadenas, aritmética, memoria, E / S. Cada nueva implementación agrega complejidad, porque cada una es un poco diferente.
Me pregunto por la magia forjada por los trapecistas voladores de los marcos web y las aplicaciones móviles, cómo pueden producir algo tan hermoso en tan poco tiempo. Entonces me doy cuenta de cuánto no saben, cuánto necesitarán aprender sobre datos o comunicaciones o pruebas o hilos o lo que sea antes de que lo que hagan sea útil.
Aprendí mi oficio en la era de los idiomas de cuarta generación, donde realmente creíamos que produciríamos una sucesión de idiomas cada vez más altos para capturar progresivamente más y más partes repetitivas del software de escritura. Entonces, ¿cómo resultó eso exactamente?
Microsoft e IBM mataron esa idea al regresar a C para escribir aplicaciones para Windows y OS / 2, mientras que dBase / Foxpro e incluso Delphi languidecieron. Luego, la web lo hizo nuevamente con su último trío de lenguajes de ensamblaje: HTML, CSS y JavaScript / DOM. Ha sido todo cuesta abajo desde allí. Siempre más idiomas y más bibliotecas y más marcos y más complejidad.
Sabemos que deberíamos hacerlo de manera diferente. Sabemos sobre CoffeeScript y Dart, sobre Less y Sass, sobre plantillas para evitar tener que escribir HTML. Lo sabemos y lo hacemos de todos modos. Tenemos nuestros marcos, llenos de abstracciones permeables, y vemos qué maravillas pueden hacer aquellos pocos elegidos que aprenden los encantamientos arcanos, pero nosotros y nuestros programas estamos atrapados por las decisiones tomadas en el pasado. Es demasiado complicado cambiar o comenzar de nuevo.
El resultado es que las cosas que deberían ser fáciles no son fáciles, y las cosas que deberían ser posibles son casi imposibles, debido a la complejidad. Puedo estimar el costo de hacer cambios para implementar una nueva característica en una base de código establecida y estar seguro de que estaré en lo cierto. Puedo estimar, pero no puedo justificarlo ni explicarlo. Es demasiado complicado.
En respuesta a su pregunta final, recomendaría encarecidamente a los programadores más jóvenes que comiencen lo más alto posible en el pastel de capas, y solo se sumerjan en las capas inferiores, ya que la necesidad y el deseo proporcionan el impulso. Prefiero los idiomas sin bucles, con poca o ninguna ramificación y estado explícito. Lisp y Haskell vienen a la mente. En la práctica siempre termino con C # / Java, Ruby, Javascript, Python y SQL porque ahí es donde están las comunidades.
Palabras finales: ¡la complejidad es el enemigo supremo! Supera eso y la vida se vuelve simple.