【英译中】知识的债务

Amir Rachum
Amir Rachum

原文作者:Amir Rachum
原文发布时间:2016 年 9 月 15 日
原文链接:http://amir.rachum.com/blog/2016/09/15/knowledge-debt/


如果你是位程序员,就会发现有太多的东西需要学。想想当你写出第一个“Hello,World!”程序时的情景吧。我写 Hello World 时还在读四年级。我们当时在学 C++,老师用手把程序代码写在黑板上供我们抄写。那时我们使用的是 Turbo C++,我们把它复制到一张软磁盘中,以便在家里做编程实验。1

那时候,我并没把 Turbo C++ 当做一个代码编辑器,也没把它当做一个集成开发环境(译者注:IDE — Integrated Development Environment)。对我来说,Turbo C++ 就是 C++。就我当时的想法来看,这是编程的唯一途径。那时候我真不知道什么叫“编译”,也不知道为什么需要写上一行 #include 。我不知道 main 是做什么用的,以及为什么 printf 可以接受不限数量的传入参数。我只是从黑板上把程序抄下来,然后点击 Run 得到屏幕上的输出。

这很好。编程就该这么教。你就该早早地把事情做起来,以后再去弄清楚它的工作原理。在那段时间里,你应该刻意对那些分散你注意力的细节保持“无知”。

这么学下去,你就会逐渐成长起来。当你在自己去写第一个“大型”项目时,你会知道 #include 做了什么;你会知道从 shell 运行可执行程序时,main 函数的输出结果去了哪里;当你了解了可变参数以后,你还会了解 printf 处理参数的原理。


知识的债务并不是为了四年级学生在编程世界里迈出第一步而存在。当初用 C++ 编程的时候,我还不理解共享库的工作原理;我曾经开发过一个 Web 应用程序,那时我还不了解底层 Web 服务器如何处理请求;我还曾做过嵌入式 Linux 编程,那时我还不知道如何编译出一种适用于不同的目标平台的编译器;直到我我创建了一个 Android 应用程序之后,我才能跟你说明白什么是“应用程序的生命周期”。再次强调,这是 很 OK 的。在你写出第一个 python 应用程序之前,你绝对 不该知道 metaclass 的概念(有些人甚至会这么说——永远用不着知道)。

这些都是我在职业编程生涯中负担了很久的“知识债”。对它们置之不理,让我进步地很快而不是持续遭遇到各种技术细节的轰炸。但尽管如此,知识债正如技术债,应该是暂时的。

就现在而言,你应该刻意且 战术性地 决定对哪些信息不管不顾。但你也应该刻意且 战略性地 决定何时偿还那笔债。

知识债就像金融债。它是一种工具——你需要明智地使用它来赚取利润。想象一下,你想创办一家小企业。预先负担一些债务以便未来赚到更多,就是个很好的决定。但是,就像金融债一样,你需要根据自己的实际情况,合宜地定义你的债务指标。负担太多债务可能是危险的,但负担太少一样有危险。同样重要的是决定何时,以及如何支付债务。负担债务的时间太长,可能会让你付出太多利息,而如果想大笔大笔地还钱,可能会拖垮你的进度。

与金融债一样,知识债并不仅仅适合初学者。大公司举债与小企业主一样多,甚至比小企业主更多。不仅如此,大公司还负担相对更高额的债务。正如四年级的我需要推迟了解编译器,年龄更大时我需要推迟了解 CPython 解释器的内部实现。

成为一个程序员就等于要处在持续的学习状态中。放任知识债的 积聚 可能会慢慢地让你的职业和生产力陷入停滞。如你在某个领域里负担了一项与工作密切相关的知识债务,你可能会发现写一个新功能需要投入很多的时间和精力,远远大于修复一些程序 Bug 所需的时间和精力。还清这些债务所用的时间越长,你付出的“时间利息”也会更多。

投入时间去理解你工作用技术的内部运作原理,会让你工作得更快,更省力,并且对自己的专业能力更具 自信

我相信知识债能够把 伟大的 程序员与平庸的程序员区分开。伟大的程序员不会满足于不求甚解,但他们也没有那种“现在必须学”的强迫倾向。 他们处于持续不断的 “举债,意识到债务存在,并且在合适的时机回来还债” 的循环中。


现在就开始吧,识别 你的 知识债务——发现那些你 需要 学会它们才能把工作做得更好的知识。然后不断寻找机会偿还债务,更上一层楼。


感谢 Hannan Aharonov, Shachar Ohana, Yonatan NakarRam Rachum 审阅本文的草稿。

  1. 是的,为了获得这个屏幕截图,我安装了 Turbo C++。没错,它看上去很棒。 请到这里下载,你知道它值得珍藏。

发表评论

电子邮件地址不会被公开。 必填项已用*标注