Engineering Mindset
I recently left Google and during my last two weeks several people asked me the same question:
How did you get to where you are?
What they were asking is how I developed my software engineering skills to their current levels. Over those two weeks I refined my answer wrote it up in case it comes up again or is helpful to others.
Surface level vs deep understanding
People frequently stick to surface level thinking. Maybe not always and maybe not entirely, but often people don’t strive, knowingly or unknowingly, to dig deeper.
An example
Let’s say someone is reviewing your code. They leave a comment asking to change A to B.
The worst thing you can do is just make the change without understanding the reasoning, because you learn nothing.
The slightly better, but still not great, thing you can do is understand why changing A to B is beneficial in that particular scenario. You probably learn something, but it’s still surface level understanding because it’s unlikely you’ll be able to apply the lesson to future scenarios.
The best thing you can do is understand the principle that prompted the reviewer to leave the comment. It’s unlikely the reviewer has ever seen the exact code you sent for review. So how did they know to leave the comment? They must have consulted a larger or deeper principle, knowingly or unknowingly, to come to their conclusion.
Mental model building
Those principles are exactly what you want to collect and understand. Using those principles you can build a strong mental model of what makes good code, good technical design, good software engineering, etc. Then you can rigorously apply that mental model to future scenarios.
I used code reviews as an example, but this idea applies to any type of feedback or decision making you might encounter.
Naturally, as you do this you might collect principles that conflict with each other. That likely means that some principles you worked into your mental model in the past were too broad or imprecise. Collecting more principles allows you to revise your mental model and make it more robust and precise over time.
Learning is an iterative approach. Don’t be afraid to admit when you are wrong and revise your understanding!
Strategies
You might be thinking that this sounds great in theory, but how does it work in practice? A good strategy for collecting principles is asking questions and following up with independent research as needed.
For example, going back to the code review, let’s say you don’t understand why the reviewer thinks B is better than A. Don’t sit there wondering. Ask them why! If their initial answer doesn’t reveal the principle, then continue asking “why” questions until the principle is clear or until you’ve learned enough to do your own research on the subject.
It’s not uncommon to discover that there was no valid principle underpinning the feedback or decision, and that it was based entirely on “vibes”. Do yourself a favor and leave vibes out of your mental model.
My answer
So my answer, after explaining all that, is that I’ve always dug for the deeper principles, from my early beginnings, and that’s enabled me to rapidly grow as a software engineer.