By Dan Abramov
Translator: UC International R&D Jothy
Write in the front: welcome to the “UC International technology” public number, we will provide you with client, server, algorithm, test, data, front-end and other related high-quality technical articles, not limited to original and translation.
Editor’s note: Today’s post is a new one from React team member and Redux writer Dan Abramov, and it’s a very good one. On the occasion of 2019, I wish you all a happy New Year!
People think I know a lot of things, but in fact I don’t. I’m not complaining. It’s not a bad thing. (It’s disgusting that minorities, despite their hard-won evidence, are always prejudiced.)
In this article, I’m going to make a list of programming topics that people often mistakenly think I know about. It’s not that you don’t have to learn them – or that I don’t know other useful things. But since I’m not in a weak position, I can tell the truth.
Here’s why I think it’s important.
First, there is an unrealistic expectation that experienced engineers should know every technology in their field. Have you ever seen a “learning roadmap” with 100 libraries and tools? It’s useful – but daunting.
What’s more, no matter how experienced you are, your mood can switch between feeling good and lacking confidence (” Impostor syndrome “) and overconfidence (” The Dunning-Kruger effect “). It depends on your environment, your job, your personality, your teammates, your mental state, your time on it, etc.
Experienced developers sometimes openly express their insecurities to encourage beginners. But there is a world of difference between an experienced but nervous surgeon and a student holding a scalpel for the first time!
Hearing someone say, “We’re all junior developers” can be frustrating, as it’s like talking to a learner who has a knowledge gap with you. Well – intentioned practitioners like me can’t solve this problem by dictating.
Still, even experienced engineers have many knowledge gaps. This article writes about my knowledge gaps, and I encourage those who can afford similar vulnerabilities to share theirs. But when sharing, remember not to underestimate our value.
We can freely acknowledge our knowledge gaps, but also remember that we still have valuable expertise that will take years to build.
Disclaimer first, here’s what I don’t know:
- Unix commands and Bash. I remember ls and CD, but I have to check the other commands before I use them. I understand the concept of pipes, but I only use them in simple scenarios. I had no idea how to create complex chains with Xargs, how to combine and redirect different output streams. I also never studied Bash systematically, so I had to write very simple (and often wrong) shell scripts.
- Low level language. I knew that Assembly could store content in memory and jump to execution code, but that was all I knew. I’ve written a few lines of C and understand what Pointers are, but I don’t know how to use malloc or other manual memory management techniques. Never played Rust.
- Network stack. I know that computers have IP addresses, and DNS is how we resolve host names. I know there are low-level protocols like TCP/IP to exchange packets (possibly?). To ensure integrity. That’s all I know. – And a little vague about the details.
- The container. I don’t know how to use Docker or Kubernetes. (Do they matter?) I have a vague understanding of them and know that they allow me to launch a single VM in a predictable way. Sounds cool, but I haven’t tried it yet.
- Serverless. Sounds cool, too, but never tried. I don’t quite see how this model changes back-end programming (maybe it doesn’t).
- The service. If I understand this correctly, it simply means “many API endpoints communicate with each other.” I don’t know what the actual pros and cons of this approach are, because I haven’t used it.
- Python. I don’t really like it – I’ve been working with Python for years, and I’ve never bothered to learn it. Its import behavior and a lot of things are completely black box to me.
- The Node backend. I know how to run Node, use apis like FS to build tools, and can use Express. But I’ve never connected to a database with Node, and I don’t know how to write a back end with it. I’m also unfamiliar with the React framework that implements “Hello World” like Next.
- Native platform. I tried to learn Objective C and it didn’t work. I also did not study Swift, nor Java. (although I could learn Java because I know C#, I didn’t learn Java.)
- Algorithm. The best I can do is bubble sort and quicksort. If they are linked to a particular practical problem, I can do a simple graph walk. I understand the O(n) notation, but my understanding is not much deeper than “don’t nest loops within loops.”
- Functional languages. Unless you count JavaScript, I don’t use any traditional functional languages fluently. (I am only proficient in C# and javascript-c #, which I have almost forgotten). I also struggle to read code in LISP (Clojure), Haskell (Elm), or ML (OCaml).
- Functional terms. As far as I’m concerned, Map and Reduce are the most important. I don’t know about monoids, functors, etc. I know what a monad is (but maybe I’m hallucinating it 🤣).
- Modern CSS. I don’t know about Flexbox or Grid. Floats are my thing.
- CSS methodology. I’ve used BEM (meaning the CSS part, not the original BEM), but that’s all I know. I haven’t tried OOCSS or anything else.
- SCSS/Sass. Never learned it.
- CORS. I’m so afraid of these mistakes! I know I need to set some headers to fix them, but I’ve wasted hours doing that in the past.
- HTTPS/SSL. It’s never been set. Don’t know how it works with private and public keys.
- GraphQL. I use Query, but I really don’t know how to use node and edge, when to use fragments, or how paging works.
- Sockets. My mental model is that they implemented computers connected outside of the Request /response model, but that’s all I know.
- Streams. Apart from the Rx Observables, I haven’t paid close attention to the stream. I used an old Node stream once or twice, but always messed up the error handling.
- Electron. Didn’t try.
- The TypeScript. I understand the concept of type and can read comments, but have never written it. I’ve tried it a few times. I’ve had trouble.
- Deployment and development. I can FTP files or kill processes, but my DevOps skills stop there.
- Graphics. I have never used canvas, SVG, WebGL or low-level graphics efficiently. I understand the whole idea, but I need to learn the primitives.
Of course, this list is not exhaustive. There’s still a lot I don’t know.
The discussion may seem strange, and even the article was written incorrectly. Do I brag about my ignorance? My intention is to:
- Even your favorite developer probably doesn’t know a lot of what you do.
- Regardless of your level of knowledge, your confidence will vary greatly from time to time.
- Despite the knowledge gap, experienced developers have expertise.
I know my knowledge gap (at least part of it). If I’m curious about a technology or need it for a project, I can learn it later.
This does not devalue my knowledge and experience. I can do a lot of things. For example, learn it when you need to.
The original English
Good article recommendation:
Why review code?
UC Technology International is committed to sharing high quality technical articles with you
Welcome to follow our official account and share the article with your friends