Overreacted

聊聊 2018 年我所不了解的技术

2019 M01 1 • ☕️ 2 min read

大家总以为我懂得许多技术,但实际情况并非如此。我不是在抱怨什么,这也不是什么坏事。 (尽管少数派朋友们有来之不易的证据,但他们总是受到偏见,这就比较恶心了。)

在这篇文章中,我将列出一份大家经常误以为我很了解的编程主题列表。我并不是说不必学习它们 - 或者我不了解其他有用的东西。 但由于我现在的立场并不弱,所以我可以开诚布公地谈。

以下是我认为这很重要的原因。


首先,大家有个不现实的期望,认为经验丰富的工程师就该了解所在领域的每一项技术。你应该见过囊括了上百个库和工具的「学习路线图」吧?它很有用 - 但令人望而却步。

更有甚者,无论你经验多丰富,你可能还是会时而感觉良好、时而信心不足(冒名顶替综合症(Impostor syndrome)),时而过度自信(Dunning-Kruger 效应)。这取决于你所处的环境,你的工作,个性,队友,精神状态,做事的时间等等因素。

老练的开发者有时会公开表示他们的不安,以鼓励初学者。但其实二者有天壤之别,就像一个经验丰富但仍会紧张的外科医生,和一个第一次拿手术刀的学生!

听见别人说「我们都是初级开发者」挺丧的,就像是对着与你有知识差距的学习者空谈。像我这样善意的从业者也并不能用多好的口述解决这个问题。

尽管如此,即使是经验丰富的工程师也存在许多知识缺口。这篇文章写了我的知识缺口,我鼓励那些能够接受类似不足的工程师们分享你们的经验见解。但分享的时候,记住不要低估我们的价值。

我们可以大方承认我们的知识缺口,但也要记得我们仍然拥有宝贵的专业知识,这些需要多年努力积累才能获得。


先说好免责声明,以下是我不了解的一些东西:

  • Unix 命令和 Bash(Unix commands and Bash) 我记得 lscd, 但其他命令我也得查了才会用。我理解管道(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)。

当然,这份清单并非详尽无遗。 我不知道的还多着呢。


讨论这些可能看起来很奇怪,甚至这篇文章都写得有问题。 我吹嘘自己的无知吗?不,我想表达的是:

  • 即使是你最喜欢的开发者也可能不知道很多你知道的东西。

  • 无论你的知识水平如何,不同时期你的信心都会有很大差异。

  • 尽管存在知识缺口,但经验丰富的开发者术业有专攻。

我知道我的知识缺口(至少是一部分)。 如果我对某个技术感到好奇,或者项目需要用到,我之后可以学习它。

这不会使我的知识经验贬值。 我可以做很多事情。 例如,在需要的时候再去学它。

更新: 在 UI 工程的元素中,我写了一些我掌握的技术。