自2018年以来我不知道的事情-Dan Abramov

原文地址哈:https://overreacted.io/things-i-dont-know-as-of-2018/

人们常常假设我知道的知识远比实际知识道的多。我不抱怨这个错误的想法。(拥有些许成就的少数群体的人们往往遭受外人遐想的偏见,尽管成就来之不易,但这很糟糕。)

在这篇文章里,我将提供一个不完整的编程主题列表,人们经常错误地假设我知道这些知识。我不是说你不需要学习它们 (或者我不知道其他有用的东西。)但由于我现在技术圈自己并不处于弱势地位,所以我可以坦诚的谈论这个话题。

这是我为什么认为这个话题重要的原因。

首先,存在一个不切实际的期望既:经验丰富的工程师通常会了解他们所在领域的每项技术。您有没有曾经看过一个由100个库和工具组成的“学习路线图”?也许它很有用 -却令人望而生畏。

更重要的是,无论你获得多少经验,很多时候你仍然到自己在,能力不足(“冒名顶替综合症”)和过度自信(“Dunning-Kruger效应”)之间切换。这取决于您的环境,工作,个性,队友,精神状态,在一天中的时间段等。

经验丰富的开发人员有时会忽略他们的不安全感,以鼓励初学者。但是,一个经验丰富的外科医生仍然会感到紧张,当他的学生拿着他们的第一把手术刀!

听到“我们都是初级开发人员”也许会令人沮丧,像是在对有着实际知识差距的初学者空谈。即便由我出于善意提起这个出发点,也不好合理化解释。

尽管如此,即使是经验丰富的工程师也存在知识差距许,不过这篇文章是关于我的,我鼓励那些能够承受类似漏洞的人分享他们自己的想法。但是,在我们分析自己的知识过程中,不要贬低我们的经验。

我们可以承认我们的知识差距,可能会让自己看起来像冒名顶了别人,这些差距需要多年努力学习获得的专业知识。

有了这个免责声明,这里是我不知道的事情:

  • Unix commands and Bash. I can ls and cd but I look up everything else. I get the concept of piping but I’ve only used it in simple cases. I don’t know how to use xargs to create complex chains, or how to compose and redirect different output streams. I also never properly learned Bash so I can only write very simple (and often buggy) shell scripts.

  • Low-level languages. I understand Assembly lets you store things in memory and jump around the code but that’s about it. I wrote a few lines of C and understand what a pointer is, but I don’t know how to use malloc or other manual memory management techniques. Never played with Rust.

  • Networking stack. I know computers have IP addresses, and DNS is how we resolve hostnames. I know there’s low level protocols like TCP/IP to exchange packets that (maybe?) ensure integrity. That’s it — I’m fuzzy on details.

  • Containers. I have no idea about how to use Docker or Kubernetes. (Are those related?) I have a vague idea that they let me spin up a separate VM in a predictable way. Sounds cool but I haven’t tried it.

  • Serverless. Also sounds cool. Never tried it. I don’t have a clear idea of how that model changes backend programming (if it does at all).

  • Microservices. If I understand correctly, this just means “many API endpoints talking to each other”. I don’t know what are the practical advantages or downsides of this approach because I haven’t worked with it.

  • Python. I feel bad about this one — I

    have
    worked with Python for several years at some point and I’ve never bothered to actually learn it. There are many things there like import behavior that are completely opaque to me.

  • Node backends. I understand how to run Node, used some APIs like fs for build tooling, and can set up Express. But I’ve never talked from Node to a database and don’t really know how to write a backend in it. I’m also not familiar with React frameworks like Next beyond a “hello world”.

  • Native platforms. I tried learning Objective C at some point but it didn’t work out. I haven’t learned Swift either. Same about Java. (I could probably pick it up though since I worked with C#.)

  • Algorithms. The most you’ll get out of me is bubble sort and maybe quicksort on a good day. I can probably do simple graph traversing tasks if they’re tied to a particular practical problem. I understand the O(n) notation but my understanding isn’t much deeper than “don’t put loops inside loops”.

  • Functional languages. Unless you count JavaScript, I’m not fluent in any traditionally functional language. (I’m only fluent in C# and JavaScript — and I already forgot most of C#.) I struggle to read either LISP-inspired (like Clojure), Haskell-inspired (like Elm), or ML-inspired (like OCaml) code.

  • Functional terminology. Map and reduce is as far as I go. I don’t know monoids, functors, etc. I know what a monad is but maybe that’s an illusion.

  • Modern CSS. I don’t know Flexbox or Grid. Floats are my jam.

  • CSS Methodologies. I used BEM (meaning the CSS part, not the original BEM) but that’s all I know. I haven’t tried OOCSS or other methodologies.

  • SCSS / Sass. Never got to learn them.

  • CORS. I dread these errors! I know I need to set up some headers to fix them but I’ve wasted hours here in the past.

  • HTTPS / SSL. Never set it up. Don’t know how it works beyond the idea of private and public keys.

  • GraphQL. I can read a query but I don’t really know how to express stuff with nodes and edges, when to use fragments, and how pagination works there.

  • Sockets. My mental model is they let computers talk to each other outside the request/response model but that’s about all I know.

  • Streams. Aside from Rx Observables, I haven’t worked with streams closely. I used old Node streams one or two times but always messed up error handling.

  • Electron. Never tried it.

  • TypeScript. I understand the concept of types and can read annotations but I’ve never written it. The few times I tried, I ran into difficulties.

  • Deployment and devops. I can manage to send some files over FTP or kill some processes but that’s the limit of my devops skills.

  • Graphics. Whether it’s canvas, SVG, WebGL or low-level graphics, I’m not productive in it. I get the overall idea but I’d need to learn the primitives.

Of course this list is not exhaustive. There are many things that I don’t know.

It might seem like a strange thing to discuss. It even feels wrong to write it. Am I boasting of my ignorance? My intended takeaway from this post is that:

  • Even your favorite developers may not know many things that you know.

  • Regardless of your knowledge level, your confidence can vary greatly.

  • Experienced developers have valuable expertise despite knowledge gaps.

我知道我的知识差距(至少,其中一些)。 如果我变得好奇或者我需要它们用于项目,我可以在以后填写它们。 这不会使我的知识和经验贬值。 我可以做很多事情。 例如,在我需要时学习技术。



你可能感兴趣的:(自2018年以来我不知道的事情-Dan Abramov)