At work, I'm fortunate to have a lot of conversations with accomplished, experienced engineers. I relish these chats and use them to ask as many questions as possible. I spoke with our Director of Engineering last week. After conversations with him, I generally have more questions than I came in with, and a different perspective on things I'd been pondering. I take that as a sign of a fruitful conversation.
The biggest lesson to emerge from the last conversation was the importance of reflection. No matter what you're doing, iterate and reflect as frequently as possible. The iterate part is simple - write a ton of code just to throw it away, pair with different people on the same problem, tackle the same challenge from multiple different angles. Iteration is important because it's how you get better, quickly.
The reflection part is more interesting. Reflecting on your learnings acts as a multiplier for your iterations. If iterating is putting your head down to learn new skills, reflecting is understanding where those skills are applicable, and how to combine them to solve the problem you're facing. Reflection enables you to understand why you're doing something instead of just how to do it.
Reflecting on the events of the day is surprisingly powerful. My pairing partner and I do it at the end of each day and it's as simple as keeping track of what we achieved, what we learnt, and noting anything that's slowing our progress. It feels trivial at the time, but when done consistently, you begin to realise where you're slacking and where you need to direct attention. You begin to understand which systems, habits and tools are slowing your progress, and more importantly, which ones are driving the majority of it.
Writing is phenomenal form of reflection. A consistent writing habit forces you to think, reflect and synthesise your learnings. If reflection is as powerful a tool for learning as it appears to be, nothing is more effective at wielding that tool than writing. Writing with the intention to publish helps because it forces you to refine your thoughts and seek clarity in a way that you otherwise wouldn't. Nobody wants to publish junk. Reading and learning can teach you the best of what others already know, but only writing reveals how well you understand something. Try it.
Regardless of how you choose to reflect, get into a frame of mind where you can be brutally honest with yourself. Being ruthlessly honest with ourselves is one of life's biggest challenges. It seems that we're conditioned (societally or biologically) to lie to ourselves. It takes sincere, painful effort to break that conditioning and tell the truth.
For me, acknowledging that I'm at the beginning of this journey and that I have more to learn than I'll likely ever know has been important. It's given me a sense of humility and made it easy to be honest about where I stand as an engineer. It's given me the confidence to go into conversations with senior engineers and say "I'm here and I'm desperate to learn, can you help me?" It's remarkable how willing they've been to help.
In the spirit of reflection and teaching, these are some of my favourite takeaways from recent conversations with engineers around me:
- Software is simple. If something doesn't feel that way, it's likely a lack of knowledge on my part.
- Look for opportunities to triangulate your knowledge. If you've learnt object-oriented languages, go and learn functional. If you only know statically typed languages, learn dynamically typed ones. Triangulation forces you to synthesise principles and identify threads that are consistent across multiple domains. Those are the threads of knowledge that are valuable.
- A lot of work is derivative. Find the fundamental person or idea and study that instead. You can read 100 blog posts on something, or you can find the person who created the idea and read their work. The latter approach will almost always provide you with a better mental model of how things work.
- Always ask yourself, "Can I create change here?" Despite your best intentions, a bad system beats a good person. If you can't make change, consider getting out.