Or at least some of the things I know I don’t know

I started my software engineering career in 2014. So that’s coming up to (counts on fingers) 7 years.

Nowadays I have “senior” in my title, but I feel like I don’t know anything, a feeling which will never go away (which is a good thing), and it took me a while to be comfortable with that. Now that I am comfortable, I am able to see very clearly those, usually more junior, who are pressuring themselves to know everything, and who end up crushingly disappointed and self-conscious when they inevitably can’t. Because knowing everything is impossible, and wouldn’t life be so dull with nothing left to learn?

The problem in the tech industry is that we are all so very clever. And we are so caught up in that cleverness and comparing our cleverness to others’ that we put unreasonable expectations on ourselves (and others if you are unfortunate enough to work in a place which encourages that sort of toxicity).

Imposter syndrome is most keenly felt in an industry like ours because of the vaulted status of computer programming skills; there are endless memes and comics on the “programming sucks”/”I am dumb” theme.

The reality is that yes, when you see someone talking confidently and intelligently about a highly complex engineering concept, damn does it look impressive. And because others then blithely join the conversation like it is the easiest thing in the world, you feel like a fool because you can’t, and you stay silent and hate yourself.

I recently told someone that the biggest challenge was not spending all night learning a thing, but to be able to say, without justification or apology: “I don’t know this yet”.

(And if you work in a place where you are made to feel bad for saying that, where nobody will help you learn that thing, then I am really sorry. Fuck those people.)

A while ago I read a blog post by a senior dev who listed everything he did not know, and I found it very comforting. I cannot remember where it was or find it now, sorry about that.

So here is a list of things I know that I don’t know. Despite saying above that you should be able to say “idk” without justification, I will explain this: I am criminally lazy, and I will really only learn something a) when I need to know it, or b) if I find it fascinating.

My job mostly falls into category (a). Dinosaurs, astronomy and physics fall into category (b). All my learning and knowledge about programming has come while on the job, learning what I needed to in order to get it done to the best of my ability. In my free time I tend to not code. Sometimes I do, because it can be fun, but I never feel bad when I don’t.

Learning exclusively on the job is 100% acceptable. And honestly learning is 50% of what your job is for, because obviously you would not be in that job if you already knew everything about it, right?

Phew that riff went longer than I expected it to, here is my list of what programming skills I do not have. When I need to know these things, I will figure it out, and so will you; trust your own intelligence.

  • Maths. I mean, I know some maths, but I am not that great at it. There are bits that I used to be very good at, like mental arithmetic, but since I quit my illustrious career as a bartender to become an engineer I feel those skills slipping. A case of “use it of lose it”, as my “counting on fingers” bit above illustrates.

  • Anything about computer theory. I think. This falls into the “I don’t know what I don’t know” category, as I am sure I have picked up some by accident over the years, but I wouldn’t know to recognise it as computer theory as taught in university. Because I don’t have a CS degree. A few years ago I asked a senior dev whether they thought I should go back to school to get that formal training. I was junior and feeling insecure that I did not have that knowledge. They said it would be a waste of time; I already had a lot of experience which applied that theory just by being on the job.

  • How to code professionally in any language other than Go (and Bash. Bash is my jam). Ruby was the first language I learned, but never used it beyond those initial 4 months. I have dabbled in JavaScript, Typescript, Python, Rust, C++ and C, but these were just learnings out of curiosity, or short-lived personal projects, or because I had to submit a quick fix in a repo which used one of those languages. Every job I have had so far has required me to work in Go, so that is my native and only professional language. When/If I get a job which gives me the chance to write in something new, I will figure it out, because that is what happens when you use something every day.

  • Anything about web development. And I mean anything. Ask me to build you a website and you are taking your life in your hands. I have never worked as a web developer, so this area of tech is something I have never needed to know. APIs are different, as they are ubiquitous across all engineering disciplines, but doing anything specifically for the web is a big blank space.

  • Databases. Related to the above. I once (and only once) applied for a standard back-end web dev role, thinking I should branch out from my cloud-computing/container runtime/devops comfort zone. I spent 2 hours before the tech interview cramming all the most googleable database and web development info and shockingly made it into the next round. In the end I dropped out: it’s just not for me. I am pretty sure that databases and how to use them in a web app is something I may never learn, and this is fine with me as I am just not that into it.

  • How to Leetcode. Again, something I am just not interested in. For a while I did things like Project Euler and Rosalind, which I suppose are sort of like Leetcode but with actually relevant and interesting framing. I am not into competition, or learning something I will never use again for the sake of an interview, and companies which interview like that are places I will never work.

This is where I ran out of things off the top of my head, so I have googled “what should programmers know?”. Let’s see if I pass:

  • Data structures and algorithms. Hmmm this is a sort of “yes” and “no” for me. No CS degree, no Leetcode. So, do I know them by heart? No. Can I figure them out when I need them? Yes.

  • IDEs. Nope I use NeoVim (a text editor).

  • Database and SQL. Already mentioned above as a “Nope”. I do know some SQL, but definitely not enough to wield with any sort of competence.

  • Microsoft Excel. Lolwhat? Absolutely not. Internet you are hilarious. (jk I am sure there is a time and a place for this sort of thing.)

  • Networking. I know some, probably a lot more than the basics by this point. But I know it is a weak area for me, mainly because I have never had to know most things until now; at work I am picking up more because that is where the project is taking me.

I am sure I missed loads, because really my skill-set and knowledge base is quite narrow (and yet I am still employable). If there is something you want to know if I know, please shoot me an email, and if it turns out I have no idea what you are talking about I will add it to the list.

I leave you with this excellent and beloved comic from xkcd. alt text “Saying ‘what kind of an idiot doesn’t know about the Yellowstone supervolcano’ is so much more boring than telling someone about the Yellowstone supervolcano for the first time.”