Dan Abramov, lead contributor to React, in a post listing the various technologies, languages, etc. that he doesn't know:
Still, even experienced engineers have many knowledge gaps. This post is about mine, and I encourage those who can afford similar vulnerability to share their own. But let’s not devalue our experience while we do that.
This is an excellent post topic. It is true that many assume that programmers know so much more than many of us do. There may be a few superheros out there that have the time and interest in learning "everything" but I can tell you in 25 years I've never met one. Even the most brilliant minds in our field usually have a focus.
I also appreciate that Abramov points out that minorities (and I'll take the liberty of adding women to the list) suffer from the opposite issue - people (read: white men) generally assume they know less. It is terrible but true. Perhaps just 6 years ago or so I've come to realize that all people I encounter in life, in general, know much more than I do. Sometimes they know more than I do about things I know, sometimes they know more than I do about things I don't know. I wish I had learned this earlier in life.
For instance, a carpenter may say that "you computer guys" are smarter than he is. They may not come out and say it, but they say it indirectly all the time. I can't tell you how many times in my life people have said things like "let Colin do it he's the brainiac". Programmers aren't smarter people than carpenters. They just know different things. Hand most programmer's a miter saw and ask them to cut molding for a room and they will waste a lot of wood getting it right.
Another topic Abramov touches on:
What’s more, no matter how experienced you get, you may still find yourself switching between feeling capable, inadequate (“Impostor syndrome”), and overconfident (“Dunning–Kruger effect”). It depends on your environment, job, personality, teammates, mental state, time of day, and so on.
I feel this mood swing all the time. Some days I feel like I can do anything. Other days I feel so far behind "the industry" I wonder if I should give it all up and be a wilderness tour guide.
I've mostly been able to battle this by totally giving up on knowing everything. I did this a long time ago. Which is why I think Abramov's post resonates with me. I'm interested in everything, and I am willing to dabble in anything, but I'm only focused on knowing what I need to know to accomplish my current project.
So what about my list? What are the technologies that I don't know? Honestly, I think the list would be too long to write out. I consider myself a master of absolutely nothing. It is probably why my bio has read, for years now, "Reverse Engineer". I do not deeply know very many technologies. I focus on learning only what I need to get my current task done. And I optimize as much as I can after that. But, the moment a project needs a specialized approach to grow or deal with scale, I ask for expert help.
Rather than a specific list of technologies I'll focus on disciplines within my skill set and my general competence in them.
Programming - I am a mediocre programmer. I understand the basic principles of programming, I've built many, many apps for web, desktop, and mobile. Many of which shipped and ended up in customer's hands. But, the moment they needed to scale I've always hired expert help to take the codebase to the next level. My greatest skill is taking an idea from zero to minimum viable product (and perhaps a bit beyond, say, a few public releases) before knowing I'm going to be out of my league.
Design - I'm getting much better at this over the last few years. I used to say I was terrible at this. My previous co-founder Kyle Ruane really brought me along. He told me to stop thinking of myself as "not a designer". Everyone contributes to the design process in their own way. Rather than focusing on the "art" of design I've been focusing on the "principles" of design. I'm becoming more and more confident in this aspect of my work. But I still have to swallow very hard before I say I do any type of design.
Sys-Ops - I'm not the guy you want doing sys ops. I can set up a Linux server and get it to serve a web page or app. I can even log into AWS or Azure and set up an environment there. But anything too complex with load balancers, DMZs, multiple database or web servers, etc. is better left to someone else. I do, however, listen very closely to these discussions as they happen because there are times when I can lend a few details to the discussion on how best to handle aspects of this. Also, I know when an infrastructure is wholly inadequate for the job at hand and so I know when to invest in this area of a business or not.
One last topic that is in a similar vein to Abramov's post is that all people that work on computers know everything about everything that connects to a computer. This is something I've been frustrated by my entire life - just because I work on a computer doesn't mean I know how to get your printer to print on multiple sides. I can, and am willing to, figure it out but I don't know how. So often the random technology issues I help people solve could be resolved if they were willing to fiddle with it, or do a search, for more than 60 seconds.
Great topic to blog about. I hope others do too.