Frederick Brooks's article "No Silver Bullet: Essence and Accidents of Software Engineering" argues that compared to hardware, software industry hasn't experienced massive leaps in productivity nor will it ever do. While our hardware can double in performance every year, our software projects cost pretty much the same year to year. This article from 1987 is a classic that hasn't lost its relevance with modern software developers.

One of the reasons behind the "slow" progress is complexity. Often software applications deal with many more possible states compared to hardware, and unlike physicists, software engineers have to deal with inherent complexity that cannot be solved by discovering underlying theories and principles. Software is unvisualizable: we cannot simply draw out a software program, hand it over separately to two software teams, and expect the teams to ship the exact same application. Software problems are not only technical problems but also management problems.

And yet, we often find ourselves discussing ideas such as object-oriented and functional programming, micro services, or sprints as the thing that will solve everything that's wrong with software. We can create new layers of abstractions but no level of abstraction is going to make software visualizable or non-complex. No one will ever publish a book that provides a process or manual for managing software projects without quality problems and usability issues.

However, none of this means that we shouldn't try our best to keep making things better.

You can learn to accept the complexity and messiness of our industry. First, keep trying to find those small improvements that others have missed. Software is terrain where you navigate best by iterating on your tools and practices.

Last, remember the value of people. According to Brooks, "each software organization must determine and proclaim that great [software] designers are as important to its success as great managers are, and that they can be expected to be similarly nurtured and rewarded." If you agree with Brooks that software development is a creative process, you might also agree that the difference between an okay and a great software developer can be a significant one. After all, we can see the same phenomenon in other creative fields where people have to deal with rapid change and complexity.

There is no silver bullet: no best process, no best programming language or style. But there is also no end to your learning. Your journey can continue to be as exciting as it has been so far.