There is a certain comfort in linearity.
Often, I take comfort in knowing that as long as I write code in a certain way, then my program will work and there will not be any bugs in it. Having a certain goal in mind, as well as knowing the specific path to get there, allows me to concentrate on tasks more easily and work more efficiently. However, as we all know from experience, no matter how hard we try to avoid failure, it always manages to find us. Bugs will occur in your program even though you coded everything “correctly.” Problems that you thought had straightforward solutions were actually impossible to solve. A virus somehow makes its way into your computer even though you had taken all the necessary precautions.
Why is life so complicated?
Fortunately, people have figured out ways to bring linearity back into our lives. In software development, these techniques are known as design patterns. Since people have figured out the solutions to many problems, you can simply use the known solutions if you encounter those problems again. You can see then, that if we figure out all possible problems and their solutions, software engineering tasks become trivial. But that is simply impossible, since software engineering is such a diverse field with such a diverse problem set. Also, the reason why companies hire software engineers is because they want custom solutions to their problems. Who would hire us if our job was so easy?
Although we cannot figure out the solution to every problem, design patterns are still relevant, since software engineers have recognized that some problems are much more common than others. The Model-View-Controller (MVC) pattern, for example, is very popular because the problem that it solves is ubiquitous: software applications often require a user interface, a data storage, and a connection between the two components. The idea of separation of responsibilities is not new. You can find similarities in computing models such as the Von Neumann architecture. Nonetheless, the concept is very powerful when applied to software, especially web applications. I cannot recall a single instance where I had to create a nontrivial application and did not have to use the MVC pattern. But maybe that is a good thing, since it makes my life so much simpler.