Things I don't know in 2018
Hello, Habr! I present to you the translation of the article "Things I Don't Know as of 2018" by Dan Abramov .
People usually think that I know a lot, but this is not so in reality. It’s not so bad and I don’t complain at all. (Some small part of people often suffers from preconceived beliefs, despite the fact that they deserve more, which is terrible).
In this post I will show an incomplete list of programming topics that people mistakenly assume that I know. I am not saying that you do not need to study them or I do not know other useful things. But since I have not put myself in a vulnerable position, I can be honest about this.
Why do I think this is important
First, there is often an unrealistic expectation that an experienced engineer knows every technology in his field. Have you seen the "learning map", which consists of hundreds of libraries and tools? This is useful, but scary.
Moreover, no matter how experienced you are, you can still find yourself switching between a sense of ability, inadequacy (“Impostor Syndrome”) and self-confidence (“Dunning – Krueger effect”). It depends on your environment, work, personality, colleague, mental state, time of day, and so on.
Experienced developers sometimes talk about their insecurity to cheer up newbies. But there is a huge difference between an experienced surgeon who is still nervous and a student who holds a scalpel for the first time!
Hearing that “we are all beginner developers” can be discouraging and sound like an empty conversation with students who are faced with an actual knowledge gap. Confessions from benevolent practitioners such as myself who cannot overcome this.
However, even experienced engineers have many knowledge gaps. This post is about mine, and I urge those who can afford such weakness to share their own. But let's not discount our experience at this point.
We are able to recognize our knowledge gaps, we may or may not feel like impostors, and yet we have very valuable experience to say that years of hard work take development.
With this I am not responsible, here are just a few things that I do not know:
- Unix and Bash Commands I can do ls and cd , but also spy on everything else. I understood the concept of 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 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 several lines in C and I understand what a pointer is, but I don’t know how to use malloc or other methods of manual memory management. Never messed 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 that (possibly?) Guarantee integrity. That's all - I don’t 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. That sounds cool, but I haven't tried it.
- 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, this 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 It’s always bad for me to remember this - I have been working with Python for several years, and I never bothered to learn it. There are many things, such as import behavior, which for me are a dark forest.
- Node JS. I understand how to start Node, used some APIs, for example fs, to build tools, and I can configure Express. But I have 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 that didn't help me. I did not teach swift either. Same thing with Java. (I probably could have mastered them since I worked with C #.)
- Algorithms The maximum that you will get from me is bubble sort and, possibly, 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 “don't put loops in loops”.
- Functional languages. If you don’t count JavaScript, then I don’t speak any traditionally functional language. (I am only free in C # and JavaScript - and have already forgotten C #.) I can hardly read Lisp-inspired (like Clojure), Haskell-inspired (like Elm), or ML-inspired (like OCaml) code.
- Functional terminology. Map and reduce I know how much is needed. I don’t 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 began to study them.
- CORS. I am afraid of these mistakes! I know that I need to adjust the headers in order to fix them, but in the past I spent a lot of time on this.
- HTTPS / SSL. Never set it up. I don’t know how this works, except for the idea of private and public keys.
- GraphQL. I can read the query, but I really don’t know how to express things with 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 the request / response model, but that’s all I know.
- Streams. Other than Rx Observables, I have not worked with threads so close. I used the old Node threads once or twice, but always got a processing error.
- 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 ran into difficulties.
- Deployment and devops. I can send several files via FTP or kill some processes, but this is the limit of my skills in devops.
- Graphics. Be it canvas, SVG, WebGL or low-level graphics, I am not smart at 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 many things that I do not know
This may seem strange to discuss. This is not even worth writing about. Am I showing off 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 knowledge gaps.
I know about my knowledge gaps (at least some of them). I can fill them out later if I become interested or need them for the project.
This does not belittle my knowledge and experience. There are many things that I can do well. For example, to study technologies when I need them.