This insight is not only based on my personal observations, but also confirmed by the so called Dunning-Kruger-Effect. One implication of the Dunning-Kruger-Effect is that we should have at least one excellent software developer in each team.
Don't get me wrong, not all software developers have to be top-skilled-super-hero-guru-software-engineers, but it is important to have at least one excellent software developer in each software development team - to get good, sustainable solutions and high performance during development.
The rationale for this need is the so called Dunning-Kruger-Effect - which explains that the ability to assess quality and correctness of a solution (metacognitive competence) strongly depends from own skill level.
In practice this effect means that low-skilled developers tend to mistakenly overrate their own and others abilities. They are not able to recognize what they do something wrong.
A dozen "junior skilled" developers may not find a problem which is obvious for a "senior skilled" developer.
One interesting result is the observation that the actual and perceived test score shows a systematic over estimation of skills in the group of low-skilled persons. Top skilled persons tend to underestimate their own results. In Figure 1 this trend is show for one of the studies.
One root cause for this Dunning-Kruger-Effect may be the fact that the skills needed to have a good perception of own skill are identical with the needed skills to have good test score. For example the needed skills to write correct English grammar are the same as the skills needed to find own errors (sorry for my English).
The more a person knows about a specific topic, the more he/she knows about own weaknesses, so skills increase the metacognitive competence. Low-skilled people tend to overestimate their own and others skills. They will recognize the previous lack of skills, in case they attend training.
The stupid are stupid and do not even know it!
Top 11 Things Every Software Engineer Should Know' (my personal 50 cent) and/or other sources like 'What can a technically proficient senior software developer study to keep improving'.
There is not one single list, because the needed skills for a software engineer are strongly dependent from the task, domain, technology, tools, or many other factors.
One thing is clear. Every software developer has to learn complete new things in his/her work life, because every decade we are faced with one or more paradigm changes in software development. So, it is necessary to leave the expert domain and start as a beginner in a new domain - several times in work life change.
Every time we do new things we are a potential and likely victim of the Dunning-Kruger-Effect. The most dangerous time starts after something new is the time when we think we have already learned the basics.
You are maybe clever in one topic, but stupid in the next new topic!
Don't trust your code, design and/or solutions without critical reflection. It is a good idea to talk with experts and/or more experienced people. Try to staff in every team at least one expert. If it is not possible to have them full time, then take them just for reviews, coaching and critical decisions.
Have a critical view on your own (old) work. If you see the solutions you developed 2, 4 or more years ago, you will find a lot of bad things. Remember that at the time you did this, you have been convinced that you did good work.
Self-assessment will help you to get more genuine modesty - start today!
 Justin KRUGER and David DUNNING; Unskilled and Unaware of It: How Difficulties in Recognizing One's Own Incompetence Lead to Inflated Self-Assessments; http://mastercodeprofessional.com/library_files/Kruger-Dunning---Unskilled_and_Unaware_of_It_(2009).pdf; Psychology, 2009, 1, 30-46; Published Online December 2009 (http://www.scirp.org/journal/psych)