我所不了解的技术转载
# 聊聊 2018 年我所不了解的技术(转载)
# 前言
本来是个人博客不应该出现转载文章的,但是今天看到这个Redux作者Dan Abramov的这篇博客让我延伸了不少思考,我看的时候是英文版,现在被翻译成9种语言了。博客原文 (opens new window)
# 原文
大家总以为我懂得许多技术,但实际情况并非如此。我不是在抱怨什么,这也不是什么坏事。 (尽管少数派朋友们有来之不易的证据,但他们总是受到偏见,这就比较恶心了。) 在这篇文章中,我将列出一份大家经常误以为我很了解的编程主题列表。 我并不是说你不必学习它们或者我不了解其他有用的东西。 但由于我现在的立场并不弱,所以我可以开诚布公地谈。
以下是我认为这很重要的原因。
首先,大家有个不现实的期望,认为经验丰富的工程师就该了解所在领域的每一项技术。你应该见过囊括了上百个库和工具的「学习路线图」吧?它很有用 - 但令人望而却步。
更有甚者,无论你经验多丰富,你可能还是会时而感觉良好、时而信心不足(冒名顶替综合症(Impostor syndrome)),时而过度自信(Dunning-Kruger 效应)。这取决于你所处的环境,你的工作,个性,队友,精神状态,做事的时间等等因素。
老练的开发者有时会公开表示他们的不安,以鼓励初学者。但其实二者有天壤之别,就像一个经验丰富但仍会紧张的外科医生,和一个第一次拿手术刀的学生!
听见别人说「我们都是初级开发者」挺丧的,就像是对着与你有知识差距的学习者空谈。像我这样善意的从业者也并不能用多好的口述解决这个问题。
尽管如此,即使是经验丰富的工程师也存在许多知识缺口。这篇文章写了我的知识缺口,我鼓励那些能够接受类似不足的工程师们分享你们的经验见解。但分享的时候,记住不要低估我们的价值。
我们可以大方承认我们的知识缺口,但也要记得我们仍然拥有宝贵的专业知识,这些需要多年努力积累才能获得。
先说好免责声明,以下是我不了解的一些东西:
Unix 命令和 Bash(Unix commands and Bash) 我记得 ls 和 cd, 但其他命令我也得查了才会用。我理解管道(piping)的概念,但我只在简单的场景下使用它。我不知道如何使用 xargs 创建复杂的链(chain),如何组合并重定向不同的输出流。我也从来没有系统地学习过 Bash,所以我只能编写非常简单(通常是错误的)shell 脚本。
低级语言(Low-level languages) 我知道 Assembly 能将内容存储在内存中并跳转执行代码,但我了解的仅此而已。我写过几行 C,明白指针是什么,但我不知道如何使用 malloc 或其他手动内存管理技术。从来没玩过 Rust。
网络堆栈(Networking stack) 我知道计算机有 IP 地址,DNS 是我们解析主机名(hostname)的方式。我知道有像 TCP/IP 这样的低级协议来交换数据包(可能?)以确保完整性。我就知道这么多 - 并且对细节认识比较模糊。
容器(Containers) 我不知道如何使用 Docker 或 Kubernetes。 (它们有关系吗?)我对它们一个模糊的认知,知道它们能让我以可靠的方式启动一个单独的 VM。听起来很酷,但我还没试过。
无服务(Serverless) 听起来也很酷,但没试过。我不是很明白该模型如何改变了后端编程(也许它并没有)。
微服务(Microservices) 如果我理解没错的话,它只是意味着「许多 API endpoints 间相互通信」。我不知道这种方法的实际优缺点是什么,因为我没用过。
Python. 我不是很喜欢它- 我已经用 Python 工作了好多年,而且我从来没有费心力去学它。它的导入(import)行为等很多东西对我来说是完全的黑盒。
Node 后端(Node backends) 我知道如何运行 Node,使用像 fs 这样的 API 来构建工具,并且能使用 Express。但我从来没有用 Node 连接过数据库,也不知道如何用它编写后端。我也不熟悉像 Next 这样能实现「hello world」的 React 框架。
原生平台(Native platforms) 我曾尝试学过 Objective C 但是没有成功。我也没有学过 Swift, Java 也是如此。(虽然我可以学习 Java,因为我会 C#, 但是我并没有学习它)。
算法(Algorithms) 我会的最多就只有冒泡排序以及快排了。如果它们与特定的实际问题联系在一起,我能进行简单的图形遍历。我理解 O(n) 符号,但我的理解并不比「不要在循环中嵌套循环」深刻多少。
函数式语言(Functional languages) 除非算上 JavaScript,否则我不会流畅的使用任何传统函数式语言。 (我只精通 C# 和 JavaScript - C# 的知识我差不多都忘了)。阅读 LISP 风格(如 Clojure),Haskell 风格(如 Elm)或 ML 风格(如 OCaml)的代码也让我觉得吃力。
函数式术语(Functional terminology) 就我而言,Map 和 reduce 是最重要的。我不了解 monoids,functors 等。我知道 monad 是什么(但也许是我的幻觉吧 🤣)。
Modern CSS. 我不了解 Flexbox 或 Grid。Floats 才是我的菜。
CSS 方法论(CSS Methodologies) 我用过 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. 我理解类型(types)的概念,可以看懂注释,但从来没有写过它。我试过几次,遇到了困难。
部署和 DevOps(Deployment and devops) 我可以通过 FTP 发送文件或杀死进程,但我的 devops 技能仅限于此。
图形(Graphics) 无论是 canvas,SVG,WebGL 还是低级图形,我都没有高效使用过。我了解整体想法,但需要学习原语(primitives)。
当然,这份清单并非详尽无遗。 我不知道的还多着呢。
讨论这些可能看起来很奇怪,甚至这篇文章都写得有问题。 我吹嘘自己的无知吗?不,我想表达的是:
即使是你最喜欢的开发者也可能不知道很多你知道的东西。
无论你的知识水平如何,不同时期你的信心都会有很大差异。
尽管存在知识缺口,但经验丰富的开发者术业有专攻。
我知道我的知识缺口(至少是一部分)。 如果我对某个技术感到好奇,或者项目需要用到,我之后可以学习它。
这不会使我的知识经验贬值。 我可以做很多事情。 例如,在需要的时候再去学它。