I often ponder my work and where I want to head with it. Thus, it's only logical to understand what I need to learn to get there. Moreover, the more I think of things I don't know, the more assured I grow about the importance of admitting them instead of hiding them.
Many people in the tech industry suffer from a misconception of needing to be a supreme developer who knows everything and can't burn out. As a result, we've seen job ads ridiculously detached from the real world for years. These ads require candidates to have more than 5 years of expertise with more than 10 different techniques.
Product and business owners demand more throughput with fewer resources. Recruiters fail to hire the right people when they don't interview the existing developers about the skills needed in their daily work. Venture capitalists build and live in their imaginary worlds filled with engineers who can mine raw diamonds daily while working 60–80 hours a week.
We developers are not innocent either. Without a hint of criticism, we tend to share these massive learning roadmaps about skills we need to master before being entitled to some rank.
Don't even ask where all the impostor syndromes are coming from.
Meanwhile, we should support demographical minorities to start their careers in tech. For some of the major tech companies, it's enough to change your profile pictures on social media to include a fancy rainbow, and everything is given. You are welcome to be a member of our toxic work culture if you fill this list of 20 unrealistic conditions imposed on you.
We have a severe problem, and we as professionals are responsible for fixing it by admitting to the world that you don't need to know everything.
This post was sparked into life by a similar list from Dan Abramov and the far-spread dumpster fire on Twitter about so-called "10x engineers".
The aim of this post is not to give a bad picture of myself. You can find out plenty of the things I'm good at by following my blog and social media accounts or talking to me. Nevertheless, let's keep it out of the scope of this post.
Without further introduction, here we go.
The Definitive List of Things I Don't Know (2022)
Remembering programming language syntax, algorithms, module usage, and many other things without looking up Internet cheat sheets. Do you think I'm a supercomputer with infinite storage and processing capacity?
Remembering what I worked on more than a week ago, which is especially troublesome when the code you wrote is pushed to production three weeks later for you to support. Did I really write this? Oh, according to version control, I did. Well, let's see…
Avoiding bugs. We all create them. No need to stress about it. The least I can do is to catch bugs as early as possible in the process when they are the cheapest to fix.
Naming variables, functions, classes, and other concrete parts of the application. Often I can give elements their proper and final names only after seeing how the application as a whole works best. There is no shame in that because refactoring is essential for every codebase. Before refactoring, enjoy reading my cryptic signatures such as
const appleSauce = (something: any): any.
Updating documentation as I code. The software documentation, by definition, is always outdated, anyway, so this is not a big issue.
Writing code using an incredible repertoire of Vim macros and achieving a glorious 100 lines of code per second typing speed. I've configured my editor with the most essential shortcuts, but I still need to reach for the mouse to move a cursor to its proper place from time to time. I'm waiting for the future where I can navigate the codebase by tilting my head.
Estimating the time required for a feature to be completed. Estimations are never accurate and should not be held as promises. The more accurate you attempt to build your estimations, the more process waste you create. Do you want story points? Wait a moment so I can roll you a handful with my D&D dice set. Bring your best deck to the meeting.
Creating beautiful UIs. I can align web page elements with CSS using
margin rules and pick a lovely font pair from Google Fonts. Anything beyond that, like complex frontend frameworks, grid systems, and flexboxes, beats me.
Designing user interfaces. I've learned some design tools (Sketch, Lunacy, Invision) while searching for a way to quickly do cover images for this blog — look what I draw for this post! So, I know how to place shadowed text on a background with some additional clipart. I'm eternally grateful that for most projects I work on, there are professional designers to help me out.
Writing low-level code. Especially when it's targeted for embedded systems. I took a few C/C++ courses during my studies. Still, I've happily forgotten most of it after steering my career path to web development. For example, I can create a fancy marquee text on an LED display by programming I/O signals. Still, I'll probably forget to free all the memory, and your device will crash or set ablaze.
Writing mathematical code. Lately, I've been investing time in image analysis. I can only roll my eyes while trying to understand all the fancy data science scripts made with Python.
Developing on mobile platforms. I once tried to create something on Android, but I quickly noticed that I didn't know the dark magic of Java IDEs and gave up. However, I've heard that Kotlin is a pleasant language to work with Android, and Swift UI greatly helps iOS development. So, I might be interested in jumping on that bandwagon later.
Developing video games. I've studied game design and written about games, but I don't know how to develop them. The most advanced thing I've accomplished is a Pong (1972) clone following a tutorial. All my adventures in the land of Unity have ended with me pulling my hair out.
Being an IT support. The messy world of drivers, peripherals, consumer operating systems, and different network stacks is so large that I'm constantly overwhelmed. If you call me to fix your printer or home router, I can only ask you to turn it off and on again. I might establish a remote desktop connection to reinstall whatever drivers are available.
Working with hardware. Related to the above, the most advanced thing I've done to my PC is to replace the new SSD and graphics card, which took me a couple of hours wrenching, sweating, and swearing. I dread using PCs other than laptops and prefer the convenience of MacBooks.
…and there are many more things I haven't yet thought about. When I discover them, I shall update them here.
None of us engineers is a "supreme developer", "rockstar coder", or "agile ninja". Not even in the wildest dreams of these half-witted VCs. If your HR department thinks that it's an essential part of the job to survive without looking things up on the Internet, please pass my name from the list of heads to hunt. I'm not good at all things, and that's fine.
But the one thing I'm exceptionally good at? Admitting when I don't know something and asking for help. I hope you are like me.