原文作者:Dan Abramov
译者:UC 国际研发 Jothy
写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。
编者按:今天这篇文章是 React 团队成员、Redux 作者 Dan Abramov 新编写的一篇文章,这篇文章非常不错。在 2019 到来之际,谨以此文祝大家元旦快乐!
大家总以为我懂得许多东西,而实际情况并不是这样的。我不是在抱怨什么,这也不是什么坏事。 (尽管少数派有来之不易的证据,但他们总是受到偏见,这就比较恶心了。)
在这篇文章中,我将列出一份大家经常误以为我很了解的编程主题列表。 并不是说你不必学习它们 - 或者我不了解其他有用的东西。 但由于我现在的立场并不弱,所以我可以说实话。
以下是我认为这很重要的原因。
首先,有个不现实的期望认为,经验丰富的工程师就该了解所在领域的每一项技术。你应该见过囊括了 100 个库和工具的“学习路线图”吧?它很有用 - 但令人望而却步。
更有甚者,无论你经验多丰富,你的情绪还是可能会在感觉良好、信心不足(“冒名顶替综合症(Impostor syndrome)”)和过度自信(“Dunning-Kruger 效应”)之间切换。这取决于你所处的环境,工作,个性,队友,精神状态,在上面时间等等因素。
老练的开发者有时会公开表示他们的不安全感,以鼓励初学者。但其实二者有天壤之别,就像一个经验丰富但仍会紧张的外科医生,和一个第一次拿手术刀的学生!
听见别人说“我们都是初级开发者”挺丧的,就像是对着与你有知识差距的学习者空谈。像我这样善意的从业者并不能用多好的口述解决这个问题。
尽管如此,即使是经验丰富的工程师也存在许多知识缺口。这篇文章写了我的知识缺口,我鼓励那些能够承受类似漏洞的人分享他们的。但分享的时候,记住不要低估我们的价值。
我们可以大方承认我们的知识缺口,但也要记得我们仍然拥有宝贵的专业知识,需要多年努力积累。
先说好免责声明,以下是我不知道的一些东西:
- Unix 命令 和Bash。我记得 ls 和 cd,但其他命令我也得查了才会用。我理解管道(pipe)的概念,但我只在简单的场景下使用它。我不知道如何使用xargs 创建复杂的链(chain),如何组合并重定向不同的输出流。我也从来没有系统地学习过 Bash,所以我只能编写非常简单(通常是错误的)shell 脚本。
- 低级语言。我知道 Assembly 能将内容存储在内存中并跳转执行代码,但我了解的仅此而已。我写过几行 C,明白指针是什么,但我不知道如何使用 malloc 或其他手动内存管理技术。从来没玩过 Rust。
- 网络堆栈。我知道计算机有 IP 地址,DNS 是我们解析主机名的方式。我知道有像 TCP/IP 这样的低级协议来交换数据包(可能?)以确保完整性。我就知道这么多 - 并且对细节认识比较模糊。
- 容器。我不知道如何使用 Docker 或 Kubernetes。 (它们有关系吗?)我对它们一个模糊的认知,知道它们能让我以可预测的方式启动一个单独的 VM。听起来很酷,但我还没试过。
- Serverless。听起来也很酷,但没试过。我不是很明白该模型如何改变了后端编程(也许它并没有)。
- 微服务。如果我理解没错的话,它只是意味着“许多 API endpoint 相互通信”。我不知道这种方法的实际优缺点是什么,因为我没用过。
- Python。我不是很喜欢它- 我已经用 Python 工作了好多年,而且我从来没有费心力去学它。它的导入行为等很多东西对我来说是完全的黑盒。
- Node 后端。我知道如何运行 Node,使用像 fs 这样的 API 来构建工具,并且能使用 Express。但我从来没有用 Node 连接过数据库,也不知道如何用它编写后端。我也不熟悉像 Next 这样能实现“hello world”的 React 框架。
- Native平台。我曾尝试学过 Objective C 但是没有成功。我也没有学过 Swift,Java 也是如此。(虽然我可以学习Java,因为我会C#,但是我并没有学Java。)
- 算法。我会的最多就只有冒泡排序以及快排了。如果它们与特定的实际问题联系在一起,我能进行简单的图形遍历。我理解 O(n) 符号,但我的理解并不比“不要在循环中嵌套循环”深刻多少。
- 函数式语言。除非算上 JavaScript,否则我不会流畅的使用任何传统函数式语言。 (我只精通 C# 和 JavaScript - C# 的知识我差不多都忘了)。阅读 LISP 风格(如 Clojure),Haskell 风格(如 Elm)或 ML 风格(如 OCaml)的代码也让我觉得吃力。
- 函数术语。就我而言,Map 和 reduce 是最重要的。我不了解 monoids,functors 等。我知道 monad 是什么(但也许是我的幻觉吧🤣)。
- 现代 CSS。我不了解 Flexbox 或 Grid。Floats 才是我的菜。
- CSS 方法论。我用过 BEM(意思是 CSS 部分,而不是原始的 BEM),但我就知道这么多了。我没有尝试过 OOCSS 或其他方法。
- SCSS/Sass。从来没有学过。
- CORS。我超怕这些错误!我知道得设置一些首部字段(header)来修复它们,但过去我浪费了几个小时做这事情。
- HTTPS/SSL。从未设置过。不知道它如何使用私钥和公钥工作。
- GraphQL。我会使用 query,但我真的不知道如何使用 node 和 edge 等表达,何时使用 fragment,以及分页的原理。
- Sockets。我的心智模型是他们实现了计算机在请求/响应模型(request/response model)之外互联,但我就知道这么多。
- Streams。除了 Rx Observables 之外,我还没有密切关注过 stream。我使用一两次旧的 node 流,但总是搞乱错误处理。
- Electron。没试过。
- TypeScript。我理解类型的概念,可以阅读注释,但从来没有写过它。我试过几次,遇到了困难。
- 部署和开发。我可以通过 FTP 发送文件或杀死进程,但我的 devops 技能仅限于此。
- 图形。无论是 canvas,SVG,WebGL 还是低级图形,我都没有高效使用过。我了解整体想法,但需要学习原语。
当然,这份清单并非详尽无遗。 我还有很多事情都不知道。
讨论可能看起来很奇怪,甚至这篇文章都写得有问题。 我吹嘘自己的无知吗?我的意图是:
- 即使是你最喜欢的开发者也可能不知道很多你知道的东西。
- 无论你的知识水平如何,不同时期你的信心都会有很大差异。
- 尽管存在知识缺口,但经验丰富的开发者术业有专攻。
我知道我的知识缺口(至少是一部分)。 如果我对某个技术感到好奇,或者项目需要用到,我之后可以学习它。
这不会使我的知识和经验贬值。 我可以做很多事情。 例如,在需要的时候再去学它。
英文原文
好文推荐:
Why review code?
“UC国际技术”致力于与你共享高质量的技术文章
欢迎关注我们的公众号、将文章分享给你的好友