Published on 19 Dec 2018 06:11PM / 1542 words
It honestly came as a surprise a post on Overreacted by Dan Abramov. He lists all the things he doesn’t know as of 2018, in an attempt to “devalue” in the eyes of newbies any experienced developer by showing off the gaps in knowledge that usually we take for granted, expecially from those developers that work for big companies and who went through a harder interview process. Considering the number of likes and retweets the post received, I’m far from being the only one surprised.
Dan is proficient in React at Facebook, and I did assume he would be strong in fundamentals, frontend (obviously), and somewhat good/very good in devops. My imposter syndrome is a constant struggle, an everyday one I admit, and I was taken back by the quantity of concepts I thought a programmer of the experience level of Dan would know that he admit not knowing while I do. Truly way beyond what I would have hoped.
Therefore, as a symbolic pat on my back, for once, I would like to go through his list of technologies and programming concepts and write what I know as of 2018. I promise to be fully honest, of course. Thus, in the same order as Dan’s:
Unix commands and Bash. I have been using Linux as my main system for nearly 2 decades. I can tar/untar by heart and even rsync into another computer without checking the syntax. After around one hundred Bash scripts written, considering those I since deleted as not useful anymore, I’m fairly confident in Bash (4.0 and after included) syntax, redirections and other moderately advanced topics. I do have difficulties in finding topics I need to deepen my knowledge often here.
Low-level languages. I did my tiny share of Assembly back in the time. C was mostly at high school, I have kept of it the concept of pointers and a vague understanding of manual memory allocation but that’s about it. A few years back I wrote and interface for checking MPD status and pass it to a Lua interpreter (here) and it was a good refresher of C. But that’s about it. I know nothing about Rust.
Networking stack. In high school I was fairly proficient in how IP, TCP/IP and even more esoteric protocols worked (ICMP, ARP and a few others). I keep a general understanding of what each does what and how they interact between themselves but never actually used this knowledge in practice. Some details as remembering there’s a payload, a checksum, Ipv4 and Ipv6 differences are in my memory though. I would be able to keep a discussion on the Networking stack with experts. Perhaps.
Containers. I have played with Docker in the past. Somewhere in my external hd I still have a Docker file for a barebone Archlinux development installation but I have never actually used it. I am aware I’ll be using Docker in the future but not eager to. Kubernetes are unknown to me.
Serverless. I like the idea. I never implemented anything of this model.
Microservices. Not sure what they actually are. It may be I actually wrote something similar to a microservice without knowing. It’s a vague concept still.
Python. Python used to be the first and only language I considered proficient in. It is the one I started true programming, outside school and Bash. I do use it from time to time when I need to try something quickly and don’t plan to mantain it. Concept-wise, list comprehensions, Python3vs2 differences and the difference between a list, a tuple and a dictionary are what I am confident I know very well. More advanced topics I have probably used once and now forgot. Could easily relearn everything in a week if I wanted.
Node backends. I’ve only recently started working with Node so I’m a junior, at most. I am implementing a backend for a Bootstrap/jQuery project of mine. I wrote a couple of scripts, thus using it instead of Bash/Python, and it was fine. Currently learning to work with MongoDB from Node and it is not hard at all. Plan for 2019 is to fully learn it to a job-ready level.
Native platforms. I tried Java a decade ago, not a fan of it. Thought about learning it again for job reasons. Other languages as Swift and Objective C I know what they are used for and that’s about it.
Algorithms. I used to implement a couple of algorithms for each language I was going to learn. That included even Common Lisp, for instance. I could write a quick bubble sort after looking up some pseudocode on Wikipedia but other algorithms are lost to me today. I can surmise the wrong approaches to loops by looking at the code but couldn’t translate it to Big O(n) notation.
Functional terminology. As with Dan’s post, Map, filter and reduce are fine; monoids, functors, monads are quite fuzzy instead.
Modern CSS. I’ve been playing with Flexbox and Grid. I like both. Not an expert, obviously. I used to write my simple html files with floats and I approached the “I’ve mastered it” level.
SCSS / Sass. Never used them and never understood their usefulness.
CORS. CORS are still that thing that complains in my Firefox Web Console but the site works fine :) No, really, I know the meaning of those errors and have implemented at least one project changing the HTTP headers to avoid CORS errors but nothing more than this.
HTTPS / SSL. Theoretically I’ve a good understanding of how the protocol works but I’ve never implemented anything with it. Looks like something easier to write than thought at first.
GraphQL. On my to learn list for 2019.
Sockets. Never truly understood how they work. I’ve used Unix domain sockets with Go a couple of years back and knew enough to make them work without knowing the details. I wouldn’t be able to write anything using them today without extensive research.
Streams. I stumbled upon them in Node nowadays. Very little I know of how they work.
Electron. I know zero about it.
TypeScript. Understand its concepts and can read it, but never used it myself. Not even tried it so I don’t know how hard would it be.
Deployment and devops. Probably I’ve SIGTERMed and SIGKILLed far more processes than I like to admit as a Linux user. Sometimes I like to fg and bg a process, successfully. I can easily install/reinstall any Linux distro and have been partitioning my hard drives with cfdisk since time immemorial. Not truly sure what all the devops skills should be but probably I know more of them than I realize.
Graphics. I know what SVG, canvas and WebGL are and have used the former, at least. Not really needed to know more than the very basics so far.
Go. That’s the second language I’m the most proficient at the moment, after Python. I love how it is barebone but also “ordered”. Not missing generics. Probably I am at an intermediate level in it but never used it for a job.
And that’s it. That’s all I know about computers as of 2018. It will be nice to rewrite the same list at the end of 2019 and notice the differences.
Ah, I was forgetting about SEO and writing. I’ve been honing my skills of both with my non-technical blog of Paper Sounds and can hold my opinion in a SEO discussion between experts. Long tail and short tail keywords, CPC, CPM, CTR and researching keywords were concepts I didn’t know at the beginning of 2018 but have been using it daily for the past few months. I like SEO and I like writing even more.