OOP em si não mudou muito desde o seu início. Alguns novos ângulos foram explorados, mas os princípios básicos ainda são os mesmos. O conhecimento coletivo reunido ao longo dos anos torna a vida do programador mais fácil do que difícil. Os padrões de design não são um obstáculo; eles fornecem uma caixa de ferramentas de soluções para problemas padrão, destilada por anos e anos de experiência.
Então, por que você percebe o POO hoje como mais complexo do que quando começou a usá-lo?
Um motivo pode ser que o código ao qual você está sendo exposto se torne mais complexo - não porque o OOP se tornou mais complexo, mas porque você avançou na escada de aprendizado e conseguiu ler bases de código maiores e mais complexas.
Outro motivo pode ser que, embora o paradigma da complexidade não tenha mudado, o tamanho e a complexidade de um projeto de software comum podem muito bem ter. Com o poder de processamento disponível em telefones celulares de nível cliente que teria sido o sonho de um desenvolvedor em um servidor há menos de duas décadas, o público em geral esperava basicamente GUI animadas e lisas até mesmo para o aplicativo descartável mais barato, e os PCs de mesa mais potentes sendo mais poderosos do que um "supercomputador" dos anos 80, é natural que a barra tenha aumentado desde os primeiros dias do Smalltalk e C ++.
E há o fato de que, em aplicativos modernos, simultaneidade e paralelismo são a norma e não a exceção, e os aplicativos frequentemente precisam se comunicar entre máquinas diferentes, produzindo e analisando todo um zoológico de protocolos. Embora a OOP seja excelente como paradigma organizacional, ela tem suas limitações, como qualquer outro paradigma: por exemplo, ela não fornece muita abstração para simultaneidade (a maioria das implementações é mais ou menos uma reflexão tardia ou terceirizada inteiramente para bibliotecas) , e não é a melhor abordagem possível para criar analisadores e transformar dados. A programação moderna frequentemente se depara com as limitações do paradigma OOP, e os padrões de design podem levar você até agora. (Pessoalmente, Considero o fato de que precisamos de padrões de design um sinal disso - se o paradigma fornecesse essas soluções prontas para uso, seria mais expressivo para esses problemas e as soluções padrão seriam óbvias. Não há padrão de design para descrever a herança do método, porque é um recurso essencial do OOP; mas existe um padrão de fábrica, porque OOP não fornece uma maneira natural óbvia de construir objetos polimorficamente e de forma transparente.)
Por esse motivo, a maioria das linguagens OOP modernas incorporam recursos de outros paradigmas, o que os torna mais expressivos e mais poderosos, mas também mais complexos. O C # é o principal exemplo disso: possui raízes óbvias de POO, mas recursos como delegados, eventos, inferência de tipos, tipos de dados variantes, atributos, funções anônimas, expressões lambda, genéricos etc. originam-se de outros paradigmas, principalmente a Programação Funcional .