If you’ve ever spent time around small children, you know that they can be very egocentric. They only talk in first person and everything revolves around them. It’s not their fault, they don’t yet have the experience to contemplate the world from any other perspective than their own. As they grow older, their scope of the world expands and they’re able to consider close family and friends. Then, they think about their community, their city, their country, and finally their place in the world. In psychology, this is known as Piaget’s stages of cognitive development.
In software engineering, there are similar stages of skill development that can tell us where a person is in their career based on how they think.
You don’t write code, but you want to. You’re taking classes or teaching yourself, but you can’t write a functioning todo list on your own yet.
You made it! You’re a developer!
When you’re a junior developer, you’re focused on making your own code work. Most likely, you’re still learning the ropes and are happy just to get a function that executes correctly. Your code is pretty sloppy and hard to maintain, but it gets the job done. For example, it probably looks like one large procedural function.
There is no design step, you just dive into the code.
In stage 2, your focus expands from your own code to your team’s code. You realize you’re part of a larger team, and you want to write well-written code that’s considerate of the rest of your team. This means you’re writing smaller, re-useable methods, commenting your code, and following style guidelines so that your coworkers can reason about and benefit from your code too.
Your design step involves understanding the surrounding code so you can fit in and play nice.
Now that you’ve mastered helping your team write quality code, your focus expands to your organization. Just as you realized you were one member on a team, now you realize you’re one of many teams in a company. You notice how each team is repeatedly solving the same problem, and you want to write code that’s considerate of the rest of your organization. This might present itself in a few ways. First, you’re writing re-usable libraries or services that can benefit more than just your team. Second, you’re writing thorough documentation of code, APIs, processes, and decisions, so others can apply your team’s work. The mark of a senior engineer is that you make work for people around you easier and more enjoyable.
Your design step involves understanding the actual problem and how it can be solved with minimal complexity.
By stage 4, you’re outputting high quality, re-useable, well documented code that your entire organization is benefitting from. What’s next? Finding your place in the world. How do you make the world a better place?
Beyond solving meaningful problems and open-sourcing and maintaining code to help the whole community, you spend your time mentoring other developers. You go from being a “10x developer” to 100x by helping 10 other developers become 10x developers.
These stages of engineering are marked by an expanding focus from self all the way to the world, kind of like circles in a tree trunk1. However, just because you’ve reached a certain stage doesn’t mean you never write code from an earlier stage. For example, a senior engineer might still write hairy procedural functions for a hack. What matters is how you approach the design step and what your priorities are.
So, what stage of engineering are you at?
This paradigm of expanding circles of focus can be used to measure much more than child and engineer development too. For example, this interesting (but very long) article discusses self-awareness and spirituality in a similar fashion. ↩