This is a short-form summary of a much longer post: Things I Learned to become a Senior Software Engineer.

Learn good habits of mind

Thinking well is a meta-skill that can power software engineering. So are strategic improvements that help improve day-to-day quality of life.

Some examples:

  • Invert the problem. How would you avoid doing the opposite?
  • Never leave a meeting without making the decision / having a next action
  • Decide who is going to get it done. Things without an owner rarely get done.
  • Document design decisions made during a project

Acquire new tools for thought

Tools for thought help you think better about specific problems. For example, Javascript can teach you about asynchronous programming and callbacks, and how to think about this. Haskell can teach you about functional programming and the advantages of pure functions (like easy testability).

They are a new lens to see your problems with.

Protect your slack

When there is slack in your environment, you get time to experiment, learn, and think things through. You don’t have to rush to get everything done. Rush is the mind killer. Doing things too quickly can lead to incorrect assumptions and bugs.

Ask questions

Questions help you learn.

Start from the ground up, notice when you don’t understand things, and don’t be afraid to ask questions about things you don’t understand.

One good question to ask is the meta: When someone tells you the answer to your question, ask them: “How did you figure this out?”. This helps you get a deeper understanding, or learn how to find the answer yourself the next time.

Notice confusion

Every time you hear something that sounds weird, and you rush to explain why it must be true, you’re pushing confusion under the rug.

This is a pretty cool skill to have. People hate feeling confused, and have developed mechanisms to not feel this way. These mechanisms, while good for survival, throw away valuable information when you’re seeking the “truth”.

Become a force multiplier

A complementary skill to a 10x developer is becoming a force multiplier. Instead of 10x’ing your output, can you 10x your team’s output? Sometimes, this means focusing on what your team mates need, instead of getting your task done.

Embrace fear

Fear is information. A state of no fear for long periods of time means you’ve grown too comfortable. Perhaps you’ve stopped growing. Seek, and put yourself in situations where you feel fear.

When writing code

  1. Don’t write code you don’t understand
  2. Prioritise learning whenever possible
  3. Preserve context for future you
  4. Aim for a level 2-3 understanding of code your team owns
  5. Code reviews help keep your mental models up to date

When testing

  1. With optimisation problems, measure instead of assuming.
  2. Have a clean staging environment. Containerisation is cool.
  3. Optimise for 0 false positives.
When designing systems
  1. Every system design is about trade-offs.
  2. There’s limited technical components to every design.
  3. People have definite lenses with which they approach design, just like mental models.
  4. Preserve context when designing: write down your constraints and trade-offs.
  5. When replacing old systems, have a clear migration path.

Super powers

Just like in a video game, there are a few power ups you can obtain. These help give you powers in the real world. They’re hard to achieve, and have a huge impact, hence superpowers.

  • Getting into the source code when documentation isn’t enough
  • Quickly build a mental model for the code you’re looking at
  • Embracing fear
  • Confidence to express ignorance