截至 2018 年我不知道的那些事
December 28, 2018
人们常常以为我懂得的东西远比实际多。这并不是个坏问题,我也没有抱怨。(许多少数群体成员即使凭借努力获得了资历,反而经常遭遇相反的偏见,这真的很糟糕。)
在这篇文章中,我会列出一份不完整的编程话题清单,这些内容常常被人误以为我很懂。 我并不是说你不需要学这些——也不是说我没有掌握其他有用的知识。只是因为我现在并不处于脆弱的位置,所以可以坦诚面对这些。
我认为这很重要,原因如下。
首先,人们常常对有经验的工程师抱有不切实际的期望,觉得他们应该掌握领域内的所有技术。你见过那种包含上百个库和工具的“学习路线图”吗?它确实有用——但也很让人望而生畏。
更重要的是,无论你有多资深,依然可能在自信、无能(“冒名顶替综合症”)和过度自信(“达克效应”)之间反复切换。这取决于你的环境、工作、性格、团队成员、心理状态、一天中的时间等等。
有经验的开发者有时会坦露自己的不安,以鼓励初学者。但一位经验丰富的外科医生依然会紧张,与一名第一次拿手术刀的学生之间,还是有天壤之别!
当学习者面临真正的知识差距时,听到“我们都是初级开发者”这样的说法,反而可能让人沮丧,觉得只是空话。像我这样的好心从业者的自我坦白,并不能真正弥合这种差距。
尽管如此,即使是资深工程师也有很多知识盲区。这篇文章讲的就是我的这些盲区,也鼓励那些能够坦诚面对的人分享自己的。只是在分享时,我们不必贬低自己的经验。
我们可以承认自己的知识盲区,可能会或不会感到“冒名顶替”,但依然拥有那些需要多年努力才能获得的宝贵专业能力。
说完这些免责声明,以下是我不懂的部分内容:
-
Unix 命令和 Bash。 我会用
ls
和cd
,其他的都要查。管道的概念我懂,但只在简单场景用过。不知道怎么用xargs
组合复杂命令,也不会组合和重定向不同的输出流。我也没系统学过 Bash,只能写非常简单(而且经常有 bug)的 shell 脚本。 -
底层语言。 我知道汇编可以把东西存到内存里、跳转代码,大致就这些。我写过几行 C,知道指针是什么,但不会用
malloc
或其他手动内存管理技巧。Rust 也没玩过。 -
网络协议栈。 我知道计算机有 IP 地址,DNS 用来解析主机名。知道有 TCP/IP 这样的底层协议用来交换数据包,可能还能保证完整性?仅此而已——细节我就模糊了。
-
容器。 我完全不会用 Docker 或 Kubernetes。(这俩有关联吗?)大致知道它们能让我以可预期的方式启动一个独立的虚拟机。听起来很酷,但我没试过。
-
Serverless。 也很酷,但没用过。我也不清楚这种模式是否真的改变了后端编程。
-
微服务。 如果我理解没错,就是“很多 API 端点互相通信”。我不知道这种方式实际的优缺点,因为没接触过。
-
Python。 这个我有点愧疚——我确实有几年用过 Python,但从没认真学过。比如导入机制等很多东西对我来说完全是黑盒。
-
Node 后端。 我知道怎么运行 Node,用过一些 API(比如
fs
)做构建工具,也能搭 Express。但没用 Node 连过数据库,也不太会写后端。我对像 Next 这样的 React 框架也只停留在“hello world”层面。 -
原生平台。 我曾经试着学过 Objective C,但没学成。Swift 也没学过。Java 也一样。(不过我用过 C#,应该能上手。)
-
算法。 我最多会冒泡排序,运气好能写出快速排序。简单的图遍历如果和实际问题相关也许能做。我懂 O(n) 这种复杂度表示法,但理解也就停留在“不要在循环里再套循环”这种层面。
-
函数式语言。 除了 JavaScript,其他传统函数式语言我都不熟。(我只精通 C# 和 JavaScript——C# 其实也快忘光了。)LISP 风格(如 Clojure)、Haskell 风格(如 Elm)、ML 风格(如 OCaml)的代码我都读不太懂。
-
函数式术语。 map 和 reduce 是我的极限。monoid、functor 等等都不懂。monad 我好像懂,但也许只是错觉。
-
现代 CSS。 我不会 Flexbox 和 Grid。float 才是我的主场。
-
CSS 方法论。 我用过 BEM(只是 CSS 部分,不是原版 BEM),其他像 OOCSS 等方法论都没试过。
-
SCSS / Sass。 没学过。
-
CORS。 我最怕遇到这种错误!知道要设置一些 header 才能解决,但过去在这上面浪费过好几个小时。
-
HTTPS / SSL。 没配置过。除了知道有公钥私钥,其他原理都不懂。
-
GraphQL。 我能看懂查询,但不会用节点和边表达需求,也不知道什么时候用 fragment、分页怎么做。
-
Socket。 我的理解就是它能让计算机跳出请求/响应模型直接通信,仅此而已。
-
流。 除了 Rx Observable,没怎么用过流。Node 的老式 stream 用过一两次,但总是搞砸错误处理。
-
Electron。 没试过。
-
TypeScript。 我懂类型的概念,也能看懂注解,但没写过。试过几次都遇到困难。
-
部署和运维。 我最多能用 FTP 传文件、kill 一些进程,这就是我全部的运维技能了。
-
图形。 不管是 canvas、SVG、WebGL 还是底层图形,我都不熟。大致懂原理,但要用还得从基础学起。
当然,这个清单远非全部。我还有很多不会的东西。
这话题看起来有点奇怪,写出来甚至觉得不太对劲。我是在炫耀自己的无知吗?我真正想表达的是:
-
你喜欢的开发者,可能有很多你会但他们不会的东西。
-
无论你掌握多少知识,自信心都可能大起大落。
-
有经验的开发者即使有知识盲区,依然拥有宝贵的专业能力。
我很清楚自己的知识盲区(至少一部分)。如果以后感兴趣,或者项目需要,我可以再去补。
这并不意味着我的知识和经验就没有价值。我依然有很多擅长的事。比如,需要的时候快速学习新技术。
Pay what you like更新:我还写过一篇我知道的一些事。