El aumento en la complejidad de los sistemas es implacable, opresivo y, en última instancia, paralizante. Para mí, como un programador de generaciones anteriores, también es muy decepcionante.
He programado 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 afirmar tantos es que en su mayoría son solo el 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, clasificación y búsqueda, codificación / decodificación, formato / análisis, búferes 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 que producen los trapecistas de alto vuelo de los marcos web y las aplicaciones móviles, cómo pueden producir algo tan hermoso en tan poco tiempo. Luego me doy cuenta de cuánto no saben, cuánto necesitarán para aprender sobre datos, comunicaciones, pruebas o subprocesos o lo que sea antes de que lo que hacen sea útil.
Aprendí mi oficio en la era de los lenguajes de cuarta generación, donde creíamos genuinamente que produciríamos una sucesión de lenguajes de niveles superiores y superiores para capturar progresivamente más y más partes repetitivas de 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. Todo ha sido 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 la plantilla para evitar tener que escribir HTML. Lo sabemos y lo hacemos de todos modos. Tenemos nuestros marcos, llenos de abstracciones con fugas, y vemos qué maravillas pueden hacer los pocos elegidos que aprenden los encantamientos arcanos, pero nosotros y nuestros programas estamos atrapados por las decisiones tomadas en el pasado. Es demasiado complicado cambiarlo o volver a empezar.
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 realizar cambios para implementar una nueva característica en una base de código establecida y tener la confianza de que estaré en lo correcto. Puedo estimar, pero no puedo justificarlo o explicarlo. Es demasiado complicado.
En respuesta a tu pregunta final, recomendaría encarecidamente a los programadores más jóvenes que comiencen tan alto como sea posible en el pastel de capas, y que solo se sumerjan en las capas inferiores, ya que la necesidad y el deseo proporcionan el ímpetu. Mi preferencia es para idiomas sin bucles, 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.