Knowledge Gaps: 2022 Edition
The more you learn, the more you realize you don’t know… I wanted to share some things I don’t know (but probably should) in 2022.
This post is heavily inspired by Dan Abramov in his blog Overreacted. It is a great idea to admit your faults and identify your gaps in understanding. It might give you some areas of focus to improve your skills in your field and it’s also a good reminder that you don’t know everything. No one can know everything and even the most experienced may have gaps or incorrect mental models.
Personally, I am constantly in flux between the so-called
Imposter Syndrome and the
I AM A CODER GOD overconfidence. I try to remind myself that there is a TON I don’t know… but there is also a lot that I do know and skills that I have built up over the years that have turned me into a valuable engineer. As long as you are aware of your knowledge gaps and are willing, or better yet, excited to learn new things and become better than you were yesterday, you will find success.
I thought Dan showed a lot of bravery in opening up about his knowledge gaps and possible insecurities so I decided to do the same in this post. Here are a few of my knowledge gaps in the software world:
Performance Profiling: As a software engineer, I have to care about performance in systems and web apps. I know some basic optimization techniques like using indexes on my database tables or memoizing computationally expensive tasks. When it comes to actually profiling and doing performance or load testing, I just don’t have a great grasp on the tools and techniques used to do this profiling. Browser dev tools has stuff built in right? Never really used it.
K8s & Helm Charts: Just no… Why do helm charts have to be so confusing and hard to write/maintain? At my company, all the Helm charts are templated out for me and I can just copy and paste in what I need. Do I actually understand what they are doing? Not exactly and the crazy Go template syntax doesn’t help. I should probably write some helm charts from scratch one of these days, for now, I will stick with
docker compose up.
Computer Graphics: I have done a little work with Unity and other game engines. The physics and how computer graphics actually work are kind of lost on me. It always amazes me how game programmers are able to render and animate millions of polygons or procedurally generate entire worlds with unique patterns and properties. We web developers have a hard time building good forms. Kind of kidding, there are a lot of tough problems in the web world and the constraints are vastly different between the two industries. Still, the core elements and techniques about how computer-generated graphics can be rendered on a screen are lost on me. Also, why do game programmers call their arrays
vectors? Aren’t they just arrays?
iOS & Android Development: iOS has its app store in a tight grip. Google Play and Android… I guess I have no real complaints other than there are too many versions of the Android OS. Why can’t we build everything in web tech and make it look native? Mobile apps are overrated, why do I have to go to another app to find and download the app I want, wait for it to finish, and then go through the entire authentication flow again to get to the content I need? Apple please improve your support of PWAs, I need push notifications in Safari!
Dynamic Programming: Those algorithms always left me confused at the end. I think the basic premise is to break down the problem and solve parts of it until you can solve the whole thing. I don’t remember any real dynamic programming algorithms… Maybe my Comp Sci degree just failed me here.
Reactive Programming: Operating on a stream of events/data and mapping control flow to it seems like a really nice way to process and operate on said data. I just haven’t had the need or motivation to dive into this style of programming and get into tools like RxJS. The use cases I have seen it used for in the wild felt like they didn’t warrant the need for a full paradigm shift. It introduced too much complexity to solve a problem that could have a simpler solution, but I am sure there are specific problems that could be better solved using this style of programming. I want to learn more here. Web sockets + reactive or Kafka + reactive seems like they would go well together.
Serverless Functions: I get the basic idea. I have this block of code or small program that I want to spin up and run only when it’s needed using some shared computing resource. Never have I written or deployed one though. Is this the same thing as
Edge Computing? I feel like there is a lot of Jargon around this topic that I have yet to sift through.
CSS & SVG Animations: I am just not comfortable in the world of CSS animations or just animations in general. Recently, I have used some spring-based JS animation libraries that I was starting to understand but when it comes to complex SVG animations or complex keyframes in CSS… I am definitely copying something from Stack Overflow or GitHub. I just don’t have enough knowledge here.
JS Bundlers: Just run
npm run ejectin your Create React App project and you will see what I mean. Configuring Webpack is hard. I get the need for bundling and transpiling JS, I just think maybe we take it too far. Managing code and its dependencies is not easy no matter what software you might be working on. I have started using vite as a build tool for my JS apps and it’s a breath of fresh air. A lot of the config is still hidden and built-in though. Maybe I should write my own bundler?
Vim, Emacs, & Other Terminal Editors: Through SSH I use Nano when I can, and Vim when I have no choice. I can barely remember how to save and exit. VSCode is my editor of choice. I never touched a Vim config or plugins and am not inclined to sink time into it. Sure, maybe if I spent a few weeks setting up a config and then another year in the editor, I might be more productive when writing code. Honestly, I like to use my mouse to point and click, highlight, interact with the file system, and scroll inside files. I put in some effort to learn some nice shortcuts in VSCode and there is probably more I could do but I think I have gotten productive enough. Besides, typing code is the easy part of software, thinking about and solving problems is the difficult part. Give me a Vim shortcut to do that, then maybe I’ll switch.
There is still so much more I have not included on this list but those are some of the highlights. I encourage you to take some time and think about where your knowledge gaps are. Always remember that if a project or task comes up that requires some knowledge, you can always learn and start to fill these gaps. These gaps don’t at all devalue the skills you do have. Play to your strengths as much as possible and slowly start to fill these gaps as needed. I think in a year or two, I will write another post to see how my gaps have changed as my career progresses. I imagine the list will get longer.