人们总是认为我懂的很多。 这种想法并不那么差劲,所以我对此并不排斥。 (不过有少数人尽管知识渊博,但他们往往遭受相反的偏见,这很糟糕。)

在这篇文章中,我将提供一个不完整的编程主题列表,关于这些东西,人们总是错误地认为我很懂。 我并不是说你不需要学习它们,或者我不知道其他有用的东西。 正是因为缺乏这些知识对自己造成了一些困扰,所以我认为这很重要

首先,经验丰富的工程师通常会不切实际地想要了解他们所在领域的每项技术。你可能见过一个由100个库和工具组成的“学习路线图”,虽然它很有用, 但也令人生畏。

更重要的是,不管你有多少开发经验,仍然可能会发现自己在感觉能力不足(“冒牌货综合症”)和过度自信(“邓宁 - 克鲁格效应”)这两种状态之间切换。这取决于你的环境、工作、个性、队友、精神状态,还有在一天中的所处的时间等。

经验丰富的开发人员有时会公开自己的短板,以此来鼓励初学者。你懂得,不管是经验丰富的外科医生还是第一次拿手术刀的医学生都会感到紧张!

听到别人说自己“是初级开发人员”可能会令人沮丧,这听起来像是空谈。来自像我这样善意的从业者的良好口供不能弥合它。

尽管如此,即使是经验丰富的工程师也存在自己的知识短板,我鼓励大家能够分享自己的知识短板。但是,在我们这样做时,不要贬低我们的经验。

我们可以承认自己的知识差距,也许这让自己看起来像是一个冒牌货,但是我仍然拥有需要多年努力发展的宝贵的专业知识。


有了这个免责声明,我就可以公开下面这些我不知道的一些事情,同时也是我需要学习的东西:

  • Unix命令和Bash。我会用ls和cd,至于其它知识嘛,我可以去google。 我知道管道的概念,但只能在简单的情况下使用。 我不知道如何使用xargs创建复杂的链,也不知道如何组合和重定向不同的输出流。 我也从来没有系统地学习过Bash,所以我只能编写非常简单的(通常是错误的)shell脚本。

  • 低级语言。我知道Assembly允许你将内容存储在内存中并跳转代码,但也仅限于此。 我写过几行C并理解指针是什么,但我不知道如何使用 malloc或其他手动管理内存的技术。 也从来没玩过Rust。

  • 网络协议栈。我知道计算机有IP地址,DNS是解析主机名的方式。 我知道有像TCP/IP这样的低级协议来交换数据包(也许是这样的?)以确保完整性。 就是这样 —— 我对细节很模糊。

  • 容器。 我不知道如何使用Docker或Kubernetes。(这些是相关的吗?)我有一个模糊的记忆,他们让我以可预测的方式启动一个单独的VM。 这听起来很酷,但我还没试过。

  • 无服务应用架构。 听起来也很酷,不过没试过。 我不清楚该模型是怎样改变后端编程的(如果确实如此的话)。

  • 微服务。如果我理解的正确的话,这只是意味着“许多API端点相互通信”。 我不知道这种方法的优点或缺点是什么,因为我没有用过它。

  • **Python。**我觉得它很糟糕 —— 在工作中我已经使用Python好几年了,但是我从来没有费心去学习过它。有很多东西对我来说是完全不透明的,比如import。

  • Node后端。 我知道如何运行Node,怎样使用像fs这样的API来构建工具,并且可以设置Express。 但我从来没有在Node中涉及过数据库,也不知道如何用它编写后端。 我也不会用像React这样的框架写一个“hello world”。

  • 原生平台。我曾经尝试过学习Objective C,但是放弃了,我也没有学过Swift,关于Java也是如此。 (因为我使用C#,所以可能会接受它。)

  • 算法。没有什么比美好的一天被冒泡排序或者快速排序毁掉更糟糕的事了。 如果它们与特定的实际问题联系在一起,我可以完成简单的图形遍历任务。 虽然知道O(n)符号是怎么回事,但我的理解也仅限于“不要在循环中放置循环”。

  • 函数式语言。我不了解任何一种函数式语言,除非你把JavaScript算进去。(我只会C#和JavaScript —— 不过我已经忘记了C#中的大部分内容。)我很难看懂LISP启发(如Clojure),Haskell启发(如Elm)或ML启发(如OCaml)编写的代码。

  • **函数式术语。**就我而言,Map和reduce才是最重要的。 我不知道什么幺蛾子半群,算子之类的东西。我知道什么是monad,不过也许这是一种幻觉。

  • **现代CSS。**我不知道Flexbox或Grid。 Floats才是我的菜。

  • CSS方法论。我使用BEM(仅仅是CSS部分,而不是原始的BEM),这就是我知道的一切。我没有尝试过OOCSS或其他方法。

  • **SCSS/Sass。**从来没有学过它们。

  • CORS。我担心这些错误!我知道需要设置一些headers来修复它们,但这总会使我浪费好几个小时。

  • **HTTPS/SSL。**永远别想设置它。 除了私钥和公钥,我不知道它是如何工作的。

  • GraphQL。我能够读懂一个查询,但我真的不知道该如何表达node和edges之类的东西,还有什么时候应该使用fragments,以及怎样处理分页。

  • 网络套接字。我的理解是他们让计算机使用请求/响应模型之外的其它方式互相通信,这就是我所知道的一切。

  • **streams。**除了Rx Observables之外,我还没有密切关注过streams。 我曾经用过一两次古老的Node streams,但总是把错误处理搞得一团糟。

  • **Electron。**没用过。

  • **TypeScript。**我理解类型的概念,可以阅读注释,但我没有用它写过什么东西。 我曾经试过几次,但是遇到了困难。

  • **部署和DevOps。**我可以设法通过FTP上传一些文件或杀掉一些进程,这就是我devops技能的极限了。

  • Graphics。无论是canvas、SVG、WebGL还是ow-level graphics,我都没有办法提高运行效率。 最后我有了一个终极方案,但是需要学习原语。

当然,这份清单并非详尽无遗。 还有很多我不知道的东西。

可能看起来这些讨论很奇怪,甚至觉得哪里不对劲。 我是在吹嘘自己的无知吗? 我从这篇文章中得到的意思是:

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

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

  • 尽管存在知识差距,但经验丰富的开发人员具有宝贵的专业知识

我知道自己的知识差距(至少知道其中的一部分),虽然这不会使我的知识和经验贬值。但是如果有一天我变得好奇,或者我需要它们用于项目,就必须要弥补这些缺失的知识。