Career
The 5 Stages of Becoming an Elite Software Engineer
- Level 1: Have basic knowledge in the language of your choice, version control, and working with others.
- Level 2: Designing systems incrementally with groups of people.
- You can’t get it right the first time for tasks of reasonable complexity. This inherent lack of perfection means we’ll have to revisit our code at some point. The code needs to be understandable, navigable, and a nice place to work for yourself and others.
- To improve… Find people to learn from, adopt TDD (forces us to deal with the consequences of our own design choices as we make them, lets us learn how to manage complexity (modular, cohesive, separation of concerns, abstraction, coupling)).
- Level 3: Structuring systems with abstraction/information hiding and managed coupling.
- Learning how to reason about a problem and how to put together a system.
- More outcome-focused rather than code-focused.
- To improve… Find people to learn from, understand your business problem, learn more about design (patterns, C4 model, DDD), learn about other systems you admire, know how to describe the system you’re working on. The model is an abstraction, not a precise/over-detailed description. Aim to make incremental progress rather than predict the future needs.
- Level 4: Applying your knowledge to things you haven’t seen before and don’t yet understand.
- Engineers are comfortable because they know how to explore and learn. They can explain the system to others (especially less technical) and have the ability to think more broadly about what’s possible and what the tradeoffs are.
- To improve… Focus on “why” rather than “how”, help others understand, build communication skills, get involved in requirements and designs, talk to architects and domain experts.
- Level 5: Being good at all the previous things. Will likely be seen as a go-to person.
- Possess deep skills in a particular area where there are no off-the-shelf solutions.
- Have the ability to help grow the team’s capabilities.
- Communication and collaboration are essential.
- To improve… Use the Feynman technique: Pick a concept, explain it in simple language, identify gaps, refine your explanation, then repeat until you have a simple explanation.
Software Design
TDD is the Best Design Technique
- TDD (test-driven development) puts you in the position of someone using the code rather than someone who’s writing it.
- Goal = well-designed code (not just having tests)
- Work in small steps (usually the hardest part for most engineers)
- Good tests express expected outcomes, never specific solutions. The tests say what the code does without saying how it does it. (It’s possible to have two implementations that make the test pass.)
- The “red” step of seeing the test fail gives you confidence that the test works (i.e., fails for the right reason).