In this post Justin outlines in which ways software development has become easier in the past few decades and also points out the ways in which it hasn’t.
Most of the complexity of software applications accumulates in the layer that deals with business processes. However, while there are plenty of adequate or even awesome tools for dealing with complexity in lower layers, such as operating systems, programming languages, frameworks and libraries, particularly in an open source incarnation, there aren’t that many general purpose tools for managing and abstracting over complexity in the business process and UI layers of software applications.
However, quite often the solution to this problem can be to simply take a step back and think about if your run-of-the-mill CRUD application really needs to be a single-page application built on top of several microservices, a NoSQL database and a Kubernetes cluster or if it might just be enough to render HTML from an SQL database on the server-side instead.
Every tool and design pattern has its purpose. Conversely, this also means that you shouldn’t apply a particular design pattern or tool indiscriminately to every problem that presents itself.