Here are the signs that you are a skilled software developer:
When faced with a development task, your first instinct is to think, draw diagrams, and nail down requirements before starting to type any source code.
You work independently and efficiently to complete a project, without asking someone else for help, and you work well with others to coordinate and integrate your efforts.
The programming languages you are using are second-nature to you, and your full attention is focused on the problem itself and not on the details of language syntax.
You can explain how your code works to someone with zero experience, and they actually understand it. (As Einstein said, “If you can’t explain it simply, you don’t understand it well enough.”)
Others come to you for help, and you’re confident that you’re leading them down the correct path, and not just making stuff up. And you are not afraid to say “I don’t know.”
You know where to find information you need but don’t have. You realize that you can’t keep everything in your head, but you know where to get it when you need it.
You actually want to develop software, even though no one is forcing you to do it.
You truly understand how the CPU works, how memory management works, and how devices work, even if your programming languages or libraries hide all this from you.
You understand warnings and errors generated by your development tools, and you can debug your own code. When necessary, you can debug down to the machine instruction level.
You are both willing and able to test your own code effectively.
When a bug is reported against your code, your immediate reaction is to investigate and fix the problem, and is not defensiveness or finger-pointing.
If there is a QA person or team testing your code, you are grateful for their efforts and you do not treat them as adversaries. If they need guidance, you take on the role of a helpful mentor.
You can review another person’s code and provide them with constructive feedback.
You are able to overcome the “not invented here” (NIH) mentality, and embrace libraries and frameworks to make your life easier.
You sincerely care about the next person who will have to work with your code, so you develop readable, maintainable, portable code. You treat maintenance as your responsibility, even if it will be someone else’s responsibility.
You recognize that it’s not about how many languages you know, but is about how well you understand the fundamental concepts, and how easy it is for you to learn a new language and apply those concepts.
You understand data structures and algorithms, and how to compare and choose the right ones for the task at hand.
You recognize and embrace the fact that the process of learning and improving your skills will never end….ever.
You are humble enough to recognize that you don’t know everything, and that there are always others who know more than you do.
You are wise enough to have a healthy skepticism about the latest silver bullet claim, paradigm, or technology. You do your own research and form your own opinion, rather than automatically adopting the opinions of others.
You no longer need to read a checklist of signs that you are a skilled software developer. You just are.