Hi, Habr! I present to your attention the translation of the article "Things I Don't Know as of 2018" by author Dan Abramov .
People usually think that I know a lot, but this is not true. This is not so bad and I do not complain at all. (Some small part of people often suffer from preconceived conviction, despite the fact that they deserve more, which is terrible).
In this post I will show an unfinished list of programming topics that people mistakenly assume that I know. I do not say that you do not need to study them or I do not know other useful things. But since I did not put myself in a vulnerable position, I can be honest about this.
Why I think it matters
First, there is often an unrealistic expectation that an experienced engineer knows every technology in his field. Have you seen the "learning card", which consists of hundreds of libraries and tools? This is useful, but scary.
Moreover, no matter how experienced you are, you may still find yourself switching between a sense of ability, inadequacy (“Impostor Syndrome”) and self-confidence (“Dunning – Kruger effect”). It depends on your environment, work, personality, colleagues, mental state, time of day, and so on.
Experienced developers sometimes talk about their insecurity in order to cheer up newbies. But there is a huge difference between an experienced surgeon who is still nervous and a student who is holding a scalpel for the first time!
To hear that “we are all novice developers” can be discouraging and sound like a hollow conversation with students who are faced with an actual gap in knowledge. Confessions from benevolent practitioners like me who cannot overcome it.
However, even experienced engineers have many gaps in knowledge. This post is about mine, and I urge those who can afford such a weakness to share theirs. But let's not depreciate our experience at this moment.
We are able to recognize our gaps in knowledge, can or cannot feel like impostors, and yet have very valuable experience to say that years of hard work are taking place on development.
With this, I am not responsible, here are just a few things that I do not know:
- Unix and Bash commands. I can ls and cd , but I also look at everything else. I understood the concept of the pipeline (piping), but used it only in simple cases. I do not know how to use xargs to create complex chains or how to compose and redirect various output streams. I have never studied Bash properly, so I can only write very simple (and often buggy) shell scripts.
- Low level languages. I understand that Assembly allows you to store things in memory and navigate through the code, but that’s all. I wrote a few lines in C and understand what a pointer is, but I don’t know how to use malloc or other methods of manual memory management. Never dabbled with Rust.
- Network stack I know that computers have IP addresses, and DNS is how we work with host names. I know that there are low-level protocols, such as TCP / IP for packet exchange, which (perhaps?) Guarantee integrity. That's all - I do not understand the details.
- Containers. I have no idea how to use Docker or Kubernetes. (Are they related?) I have a vague idea that they allow me to deploy a separate virtual machine. It sounds cool, but I have not tried.
- Serverless. Also sounds cool. Never tried it. I do not have a clear idea of ​​how this model changes backend programming (if it does it at all).
- Microservices. If I understand correctly, it simply means that "many API endpoints communicate with each other." I do not know what the practical advantages or disadvantages of this approach are, because I did not work with it.
- Python. I always feel bad about remembering this - I have been working with Python for several years, and I never bothered to study it. There are a lot of things, such as import behavior, that for me is a dark forest.
- Node JS. I understand how to run Node, used some APIs, such as fs, to build tools, and I can configure Express. But I never communicated through Node with a database and I don’t know how to write a backend in it. I am also not familiar with React frameworks, such as Next, further "hello world".
- Native platform. I tried to learn Objective C at some point, but it did not help me. I did not learn Swift either. Same with Java. (I could probably master them, since I worked with C #.)
- Algorithms. The maximum you can get from me is bubble sort and, perhaps, quick sort (quicksort) at best. I can probably perform simple graph traversal tasks if they are related to a specific practical problem. I understand the O (n) notation, but my understanding is not much deeper than “do not put cycles in cycles”.
- Functional languages. If you do not count JavaScript, then I do not speak any traditionally functional language. (I am free only in C # and JavaScript - and already forgotten C #.) I hardly manage to read Lisp-inspired (like Clojure), Haskell-inspired (like Elm), or ML-inspired (like OCaml) code.
- Functional terminology. Map and reduce I know how much you need. I do not know monoids, functors, etc. ... I know what a monad is, but perhaps this is just an illusion.
- Modern CSS. I do not know Flexbox or Grid. Floats is my everything.
- CSS methodologies. I used BEM (meaning as part of CSS, not the original BEM), but that's all I know. I have not tried OOCSS or other methodologies.
- SCSS / Sass. I never tried to study them.
- CORS. I am afraid of these mistakes! I know that I need to adjust the headers to fix them, but in the past I spent a lot of time on it.
- HTTPS / SSL. Never set it up. I do not know how it works, except the idea of ​​private and public keys.
- GraphQL. I can read the request, but I really don’t know how to express things using nodes and edges, when to use fragments and how pagination works there.
- Sockets In my understanding, they allow computers to communicate with each other outside of the request / response model, but that's all I know.
- Streams. Other than Rx Observables, I didn’t work with threads so closely. I used the old Node threads once or twice, but I always got an error in processing.
- Electron. Never tried it.
- TypeScript. I understand the concept of types and can read annotations, but I never wrote it. I tried several times, but I encountered difficulties.
- Deploy and devops. I can send several files via FTP or kill some processes, but this is the limit of my skills in devops.
- Graphics. Whether it's canvas, SVG, WebGL, or low-level graphics, I'm not smart about that. I understood the general idea, but I do not need to learn simple things.
Of course, this is not a complete list. There are a lot of things I don't know.
This may seem strange to discuss. This is not even worth writing. Am I bragging about my ignorance? My conclusion to this post is as follows:
- Even your favorite developers may not know many things that you know.
- Regardless of your level of knowledge, your confidence can be very different.
- Experienced developers are very competent, despite the gaps in knowledge.
I know about my knowledge gaps (at least some of them). I can fill them in later if I am interested or need them for the project.
This does not detract from my knowledge and experience. There are a lot of things that I can do well. For example, learn technology when I need them.