Several years ago, I was asked to rate myself on my level of expertise with different programming languages and frameworks. Several people were surprised when I did not rank myself at the highest possible level for knowledge of Java, especially when several developers with far less software development in general and far less Java experience in particular rated their own Java skills at the maximum level. I explained to them that I too would have at one time ranked myself at the highest possible level but that I had learned enough since that time to realize how much I still needed to learn. There was no way I could in good conscience rate myself at the highest level knowing how many areas of the Java ecosystem I lacked experience and depth of knowledge in. I believe there are numerous advantages to always understanding what one doesn't know (or working to discover what one doesn't know) and will outline some of these advantages in this post.
Ability to Consider New Options
When one thinks he or she already knows everything, that person has no incentive or interest in considering anything new or different than what he or she has done before. This can backfire because the same solution or approach rarely fits every problem a developer will encounter. It might seem easiest to shoehorn a particular problem into the solution we know best, but that does not make it the best or even an appropriate solution. By admitting that I may not know everything and have much still to learn, I will be more willing to listen to others' ideas and consider other perspectives. I still may end up going with my initial solution, but I will have thought out its benefits and costs and weighed them against the benefits and costs of the alternatives.
Ability to Learn New Things
If I think I know everything already, I have no need to waste time learning anything new. Learning new things can be tiring and even frustrating, but I am more apt to invest the time and effort in my own knowledge if I realize that there is so much still to learn.
Ability to Challenge My Own Assumptions and Biases
The person who knows everything (or at least thinks he or she is omniscient) has no reason wonder if what he or she is doing is correct for a given situation. The person who understands that he or she doesn't know everything is more willing to question his or her own actions and measure the results of those actions. If a course change is necessary, the person who understands his or her limitations is more likely to identify that need and do something about it. I have written before about the importance of confidence to a software developer. I think confidence is one of the most important traits of a successful software developer, but true confidence (as opposed to arrogance) does not preclude one from understanding that he or she is not necessarily always correct.
The Cost of Not Realizing There is Much More to Learn
I have seen many individuals who believe they have all the answers and make silly statements or, even worse, make unnecessarily costly decisions because of their arrogance and lack of understanding of their own limitations. By not having at least an idea of what one doesn't know, one is not able to sufficiently consider other ideas, to question the correctness of one's own decisions, and to realize the importance of learning new things.
The More We Learn, the More We Realize That We Don't Know
I have found that the more I learn and understand a particular subject, the more I realize how much more I still have to learn. It seems that I can only understand the bigger picture of a language or framework once I have begun to understand specific details of that language or framework. As I immerse myself in a new language or framework, I'm more likely to notice relevant articles posted on DZone or Reddit. Better yet, the more I learn about something, the more these blogs and articles make sense to me and the bigger the possibilities become.
As an example of this principle, consider a person learning the Java programming language. He or she may at first think only of the programming language itself and focus on keywords, syntax, and so forth. As the person gains familiarity with Java SE, he or she may start to be more exposed to Java EE principles. Similarly, the developer may start to learn about other languages on the JVM. In addition, that developer may start to learn about frameworks and libraries available for use. During all this, that developer continues to learn the Java APIs and how vast they are. What seemed like a simple language turns out to be a complex, ever-changing ecosystem.
The interesting phenomenon here is that because I have repeatedly realized how much more I still have to learn after I have learned substantially new information, I assume that I will continue to realize that I have even more to learn as I continue to learn and gain experience. In other words, the absolute amount of knowledge I would like to learn to be more effective is likely to only get larger, even as I learn new things. It's not that I realize that I need to learn more despite my current learning; rather it's precisely because I'm learning that I realize how much more I still need to learn.
When one understands that he or she may not be always correct, he or she is more likely to catch their own mistakes early before they are most costly, is more likely to listen to and seriously consider alternative approaches, and is more likely to keep bettering himself or herself. I am realizing that it is actually a good sign when I understand how much I still have to learn -- this often means that I'm starting to get a much better understanding of the big picture and how things fit together.