O aumento da complexidade dos sistemas é implacável, opressivo e, em última análise, incapacitante. Para mim, como programador de gerações mais antigas, também é amargamente decepcionante.
Venho programando há mais de 40 anos, tendo escrito código em 50 a 100 idiomas ou dialetos diferentes e me tornado especialista em 5 a 10. A razão pela qual posso reivindicar tantos é que, na maioria das vezes, eles são da mesma linguagem, com ajustes. Os ajustes aumentam a complexidade, tornando cada idioma um pouco diferente.
Eu implementei os mesmos algoritmos inúmeras vezes: coleções, conversões, classificação e pesquisa, codificação / decodificação, formato / análise, buffers e strings, aritmética, memória, E / S. Cada nova implementação adiciona complexidade, porque cada uma é um pouco diferente.
Eu me pergunto a mágica criada pelos artistas trapezistas voadores das estruturas da Web e aplicativos móveis, de como eles podem produzir algo tão bonito em tão pouco tempo. Então percebo o quanto eles não sabem, o quanto precisam aprender sobre dados, comunicações, testes ou threads ou o que for antes que o que eles façam se torne útil.
Aprendi meu ofício na era das linguagens de quarta geração, onde acreditamos genuinamente que produziríamos uma sucessão de linguagens de níveis cada vez mais altos para capturar progressivamente cada vez mais partes repetitivas do software de escrita. Então, como isso acabou, exatamente?
A Microsoft e a IBM eliminaram essa idéia retornando ao C para escrever aplicativos para Windows e OS / 2, enquanto o dBase / Foxpro e até o Delphi definhavam. Então a web fez novamente com o seu trio final de linguagens assembly: HTML, CSS e JavaScript / DOM. Foi tudo ladeira abaixo a partir daí. Sempre mais linguagens e mais bibliotecas e mais estruturas e mais complexidade.
Sabemos que deveríamos fazê-lo de maneira diferente. Sabemos sobre CoffeeScript e Dart, sobre Less and Sass, sobre modelo para evitar a necessidade de escrever HTML. Nós sabemos e fazemos de qualquer maneira. Temos nossas estruturas, cheias de abstrações vazadas, e vemos que maravilhas podem ser feitas por alguns poucos escolhidos que aprendem os encantamentos misteriosos, mas nós e nossos programas estamos presos às decisões tomadas no passado. É muito complicado mudar ou recomeçar.
O resultado é que coisas que deveriam ser fáceis não são fáceis, e coisas que deveriam ser possíveis são quase impossíveis, devido à complexidade. Posso estimar o custo de fazer alterações para implementar um novo recurso em uma base de código estabelecida e ter certeza de que estarei certo. Eu posso estimar, mas não posso justificar ou explicar. É muito complicado.
Em resposta à sua pergunta final, aconselho vivamente os programadores mais jovens a começar o mais alto possível sobre o bolo de camadas e mergulhar apenas nas camadas inferiores, conforme a necessidade e o desejo forneçam o ímpeto. Minha preferência é por idiomas sem loops, pouca ou nenhuma ramificação e estado explícito. Lisp e Haskell vêm à mente. Na prática, sempre termino com C # / Java, Ruby, Javascript, Python e SQL porque é onde as comunidades estão.
Palavras finais: a complexidade é o inimigo final! Bata isso e a vida se torna simples.