Whenever we’re learning something new, we are faced with a learning curve.
In order to improve, we must first admit that we don't already know everything there is to know about a particular subject. This may seem obvious, but often when we achieve a level of mastery in something, it can be challenging to go back and embrace the beginner's mindset, especially when new skills require us to abandon the old skills that worked for us in the past. This is why true masters are humble: They know there's always more to learn and room to improve.
I believe that in a hundred years we will look at the way we currently build software and laugh. We’ll look at today’s programmers the way we now look at witch doctors: They meant well, but they had no idea what the real cause of disease was, so they couldn't effectively treat it. We mean well, but we really don't understand the true nature of software yet. And that's no wonder, because software is so radically different from everything else in the world. We’re still figuring out how to build it effectively.
Regardless of how effective a new practice is, there's usually still a learning curve involved. Extra effort is required during this learning curve, if only to consider whether applying a practice will be beneficial. The idea is that this extra effort will pay off when we make the practice something that we do all the time.
You were not born with the ability to walk. It took time and effort to learn. You probably don't remember, but I'll bet you fell down more than a few times. That did not daunt you. Walking took more effort than crawling at first, but you didn't give up, and today you reap the benefit of this new skill all the time.
We all have to go through the learning curve, and as we do, we get better at whatever it is we're learning about. In software development, we're constantly learning new skills because we have to. Technology and its associated best practices are constantly changing, but this is a good thing—it means our industry is evolving quickly.
It also means we are constantly on the learning curve. Most people stop learning at an accelerated rate when they get out of school, but in software development, we are constantly learning. Personally, this is one of the things that attracts me the most to the field of software. I love learning new things, and there's no shortage here.
After awhile you get used to learning new things, and it becomes far less difficult—and maybe even pleasurable. Learning new things also means that we're keeping our minds active, and just like with exercising a muscle, if you don't use your brain power, you begin to lose it. Writing software as you get older is like learning a foreign language. It stimulates neural activity and keeps your mind sharp and alert.
However, constantly learning can be a challenge for software developers because we're expected to produce software on the job, so often learning has to happen on our own time.
Twenty years ago, there were not a lot of good books on software development. Today, it's a different story. There are many vitally important books that developers should read and understand. Yes, there are books on frameworks and languages, but there are also now books on development methodologies and approaches to problem-solving in software that I think are vitally important for professional software developers to read.
Some of my favorite books for software development are Refactoring: Improving the Design of Existing Code, by Martin Fowler; Design Patterns Explained: A New Perspective on Object-Oriented Design, second edition, by Alan Shalloway and James R. Trott; Working Effectively with Legacy Code, by Michael C. Feathers; and my own book, Beyond Legacy Code: Nine Practices to Extend the Life (and Value) of Your Software.
These books focus on the core practices of professional software development to help us understand the guiding principles that drive us to create high-quality, maintainable code. Sadly, the vast majority of books published about the field of software development are beginner books, which is a real shame because our industry is full of professionals who need and want to be constantly learning.
Still, books can only get you so far. Learning software development from a book is like trying to learn brain surgery from a book. You can get grounded in theory, but in order to actually do it well, you have to practice it.
So, here's the secret to becoming a master in any subject: Allow yourself to be a beginner and constantly learn, read, and practice.