This blog is named after my favourite meme, the wonderful “I have no idea what I’m doing” dog. Surely there is no greater role model! Look at her, ignoring the constraints of what she’s good at, eagerly trying new things! I love this meme. I used to have a picture of this dog taped above my monitor. I’d glance up at it all “you and me both, dog!” as I struggled through some difficult new thing.
Our industry doesn’t talk much about learning. Clearly we’re all doing it all the time: there’s an enormous range of things we need to know, and the rate of change is phenomenal. Every day there’s a new framework, a new piece of infrastructure, a new way of thinking. Suddenly everyone’s namedropping some technology and it’s like “Did I miss a public service announcement?” Old ideas become new again, but with subtle differences and different names. For all that we try to build APIs and encapsulate concepts, our abstractions are leaky and we need to know details about everything we use. Being successful in software means constantly learning. But we don’t talk much about it.
I think that’s a problem. When we don’t explain how we know all the things we know, we’re not admitting that it took work to get there. For newer people in the industry, that creates unrealistic expectations.
It’s the instagram problem, where everyone else’s life looks effortlessly perfect. We don’t see the work done to create the image, the untidiness hidden just out of sight, the twenty pictures that got discarded before the one that came out just right. We don’t show the knowledge being acquired, the documentation that was incredibly unintuitive, the ideas that took weeks before they clicked.
If everyone else just magically knows a bunch of stuff, and you don’t, it can feel like you’re not meant to be here. It can amplify impostor syndrome. We should learn out loud.
In a talk I gave our interns earlier this year, I said that the main job of a senior engineer is to ask the stupid questions. “Wait, what does that word mean?” “Can you explain this like I’m five?”. (And “why are we doing this?” and “what problem are we trying to solve?”, but that’s a different blog post :-) ). I have been known to ask questions in meetings when I already know the answer if I’m pretty sure that other people don’t. It’s safer for senior people to ask.
For the same reasons, I try to learn publicly. I post about it on Twitter. I block out learning time in my work calendar: two hour blocks designated for a specific topic.
Here’s some stuff I’ve learned in the last few months. What Springboot is. What Ansible is. How to deploy something on Kubernetes (and how not to. Whoops.) How to write an OpenAPI spec. What git rebasing is (but not how to do it without feeling scared). Why distributed databases are hard. What MPLS is. How Raft works. Why TLS 1.3 is cool. What Couchbase is. The difference between machine learning and AI.
I bet most people reading that will think at least one topic on that list is obvious. Surely everyone already knows that thing! But I bet the one that’s obvious will be different for different people.
Learning is a skill on its own, something you get better at as you figure out the methods that work for you.
For example, I used to spend time trying to find the ‘best’ place to start from — what are the most important aspects of this new topic I’m learning about? I’ve concluded that it works just as well (for me) to start reading an arbitrary article or wikipedia page on the topic, then choose something I didn’t understand and go read about that. Repeat. If I keep doing that for a couple of hours, I will build up a good picture of what matters.
Learning from reading is hard for me though. I can only read for so long before my brain stops paying attention. One way I can make it more engaging is by immediately using what I just read, by writing a blog post or an internal document. If I’m writing a conference summary, I can easily spend hours reading about topics I didn’t entirely understand. (Look, isomorphic web apps!) My brain has infinite patience for reading about things that I want to write about.
The other way I make things engaging is easier: using tutorials with exercises. lynda.com is very good for this. (It’s $300/year, but a lot of workplaces have team subscriptions so try to get it for free :-) Some libraries also have subscriptions that you can use if you’re a member; check out their websites!) For folks who are new to CS, or who feel like they’re missing fundamentals, see.stanford.edu is fantastic. And of course there are a ton of other online classes.
Julia Evans (who does talk about learning, and that’s why I love her blog) has a great post on how to learn and why it’s important to learn at work: https://jvns.ca/blog/2017/08/06/learning-at-work/
I think the most important realisation in tech is that everything is learnable. Some of this stuff is difficult, and there’s a lot of it, but none of it is magic. If you’re a junior person, don’t feel bad if it takes you longer than you’d hoped to understand whatever you need; it will come with time. If you’re a senior person, please show that you’re learning too! Share resources, ask questions, and tell people the cool stuff you just found out. We’ll make our industry better if we admit that we’re always learning — and that it takes a ton of time.