跳到主要内容

起点:地图、学习与提问

这一章讲三件事: 一名新工程师从哪儿出发、要走到哪儿;路上靠什么学、怎么问; 以及两个会让人停在原地的自我认知陷阱。 读完你会拿到全书的地形图——后面十一章讲的全是这张图上的一段路。

1. 这一章讲什么

学校教会了你写代码,但没教你另外一半:代码怎么变成团队里的交付物,以及你自己怎么变成团队里可依靠的人。原书开场就说,知道如何编写代码仅仅是「战斗的一半」,剩下那些技能学校里没有教授1。这一章补的就是这个缺口的第一段:起点在哪里、怎么走。

本章在全书链条里的位置:它是那张旅程地图本身。后面各章按「接手旧代码 → 写新代码 → 管依赖 → 测试 → 评审 → 交付 → 值班 → 设计 → 架构 → 计划 → 晋升」的顺序,把地图上的五个站点一段段走完。

2. 顶层全景:五个站点,一张地图

原书把职业起步期画成一条有五个站点的航线,你现在在第一站2:

新手营 ──→ 试炼之河 ──→ 贡献者之角 ──→ 运维之海 ──→ 胜任之湾
(熟悉环境 (分担真活 (独立开发 (把代码交给 (独立负责
提问学习) 学会流程) 大些的特性) 用户并值班) 小项目/做设计)

图说:五个站点不是职级,是「团队能把什么事放心交给你」的五个档位。
每一站对应原书的若干章;本书的拆解章就按这条线排。

目的地也有明确定义。原书把「资深工程师」拆成四项可对照的能力:技术知识(会用构建、调试、测试、监控这套工具链)、执行力(能构建并部署中小型特性,分担值班)、沟通能力(能给予和接受反馈,能写出清晰的设计文档)、领导力(能在指定范围内独立工作,能帮助新人融入)3。注意:四项里有三项不是纯技术——这就是「战斗的一半」具体长什么样。

3. 核心原理

3.1 先认清起点:能力的四个阶段

先看现象。很多新人入职后有两种相反的强烈感受:一种是「周围的每个人都比我强,我大概是混进来的」;另一种是「公司的技术栈也不过如此」。原书开篇用一个模型同时解释了这两种感受。

教育学者布罗德威尔把人的能力分成四个阶段4:

阶段状态你会感觉
无意识的无能力做不了,而且不知道自己做不了还没意识到差距
有意识的无能力做不了,但知道差在哪焦虑、自觉是冒牌货
有意识的有能力能做,但要花力气、全神贯注累但可控
无意识的有能力轻松胜任已经不需要想

新工程师几乎都落在前两个阶段——哪怕你在学校里很强,公司的流程、工具、代码库也全是新的5。所以第一种感受(觉得自己是冒牌货)其实是第二个阶段的正常体征,不是能力的证据;第二种感受(觉得公司技术不行)则是第一个阶段的体征:你还没有足够的信息来判断。

原书给的目标很直接:尽快到达第三个阶段6。而这本书剩下的所有章节,讲的就是怎么到。

判断(我们的,不是书里的): 这个四阶段模型真正的用法,不是给人贴标签,而是给「什么时候该求助」定标尺——处在第二阶段的人最容易犯的错是硬扛,因为他以为自己「应该会」。判据很简单:如果你说不出自己不知道的是什么,你在第一阶段,先去补信息;说得出,你在第二阶段,直接去问。 如果错,会错在: 如果差距是「熟练度」问题而不是「知识」问题(比如代码都会写但写得慢),那么问人治标不治本,该做的是刻意练习,四阶段模型会把这类人引向过度求助。

3.2 学习是一门手艺,不是一种天赋

这一节回答:没人给你排课了,学习怎么自己组织?

原书列了七种手段,并且开头就给了警告:不要同时全上——那样只会倦怠,要按自己的现实情况挑7。我们按「花的是谁的时间」分成三类:

花工作时间,向公司学的:

  • 前置学习:入职头几个月专门去搞懂一切如何运作,而不是急着上线。原书举的极端例子是 Facebook 曾让新人花 6 周时间只练基本功、不接活(著名的 boot camp)8——前期慢,是为了之后参与设计讨论、值班、评审时不拖后腿。
  • 运行实例代码:文档会过期、同事会记错,但跑起来的代码不会骗你。调试器(能让程序暂停、逐行查看变量(程序里存值的具名格子)的值的工具)和日志(程序往外部输出的运行记录)是最常用的两件武器9
  • 阅读:先读团队文档和设计文档建立整体概念,再去钻与任务相关的子系统。读代码时有一条反直觉的忠告:注释会说谎,源代码不会——原书引用了程序员罗恩·杰弗里斯的话「代码从不说谎。注释有时却会」10
  • 跟班与结对:跟着资深工程师做事、记笔记、提问;反过来让资深工程师跟着你、给你的工作当安全网。两名工程师轮流打字一起写代码的方式叫结对编程,原书称它是相互学习最快的方式之一11

花业余时间,向行业学的:

  • 讲座与会议:讲座可以 1.5 倍速看但要记笔记;会议则要挑剔——原书把会议分成学术会议、兴趣聚会、供应商展示会三类,指出它们普遍「有价值的内容占所有内容的比例」(信噪比)很低,供应商展示会每年超过一次就接近浪费12
  • 副业项目与开源(公开源代码、任何人都能参与贡献的项目):用你想学的工具,去解决你真的有兴趣的问题——原书特别强调「不要根据你认为需要学的领域选项目」,内在兴趣才撑得久13

几乎不花时间,但最容易被忽略的:

  • 在真代码上学:原书作者德米特里曾花数周逐行啃一份变量名全叫 a、b、c 的 Java 代码,心生敬佩;午餐时同事告诉他,那其实是反编译器的输出——正常人不那么写代码14。教训不是「别认真读代码」,而是:为理解而阅读,永远不要相信变量名称。这份故事还有下半句:对代码库的复杂程度心存敬畏之前,先确认它真的是「设计出来的复杂」。

3.3 主走查:一个问题是怎么被问出来的

这一章第二个承重机制是提问。原书的判词很硬:所有工程师都应该提问题,试图自己解决所有问题「既慢又没有效果」15。但提问不是开口就行——它有三个步骤,我们拿原书自带的例子走一遍全程。

背景: 工程师潘卡遇到一个测试(测试就是一段自动验证代码行为的代码)反复失败,要去问同事艾丽斯。原书给了他两版邮件16

第 1 步:先动手调查。 在开口之前,自己先找。原书列了调查的去处:文档、内部论坛、自述文件(README,随代码交付的说明文件)、源代码、错误跟踪器;如果是代码问题,试着把它做成一个能复现的最小测试17。走查里潘卡已经做了这些:他单独运行过这个测试,排除了「测试之间互相干扰」的可能;他在源代码里翻过,没找到能解释失败的东西。

第 2 步:设置时间限制。 开工前就定好「我打算自己啃多久」,到点就求助——原书称这需要自律,因为止损对象是你自己18

第 3 步:写下全过程。 这是两版邮件拉开差距的地方。坏版只有一句「你知道为什么 testKeyValues 会失败吗?」,听上去还像在怪罪艾丽斯19。好版长这样(细节是原书原文里的):

我在调查 testKeyValues 为什么失败(在 DistKV 代码库中)。
现象:大约每执行 3 次失败 1 次,看似随机。
已排除:单独运行仍然失败 → 不是测试之间互相影响;
肖恩在他机器上循环跑,无法重现 → 与本机环境无关;
源代码里没找到明显原因。
我的猜想:某种竞争条件(两个执行流争抢资源导致的错误)。
影响:不算紧急,但每次发生要花 20-30 分钟重跑,所以想解决。
附件:失败日志和环境设置。

结果对比: 艾丽斯拿到好版,不需要追问任何背景就能开工;而且她会记住「潘卡是可靠的」——原书明确说,这样的请求会建立提问者在同事眼中的可信度20。同一件事,坏版消耗信任,好版生产信任。

判断(我们的,不是书里的): 「写全过程」的本质是把你的调查成果变成别人能用的跳板——即使被问的人也不知道答案,你的排除清单仍然缩小了搜索范围。所以这份笔记不该在提问时才写,它本来就是第 1 步的调查日志。 如果错,会错在: 如果团队规模小到人人共享全部上下文,写全过程的收益会小很多,那时直接开口可能更高效——三步法是为「提问对象并不了解你的问题」的场景设计的。

3.4 通道问题:问,但别打断

三步之外还有一件事:从哪条通道问。原书的原则是先看对方的状态——耳机是通用「请勿打扰」标志;走进去当面问,即使对方只回答「很忙」,你也已经打断了他21

替代方案是把通信里的两个概念搬过来:异步(消息发出后对方可以稍后处理,不需要立即响应)和组播(发给一个组而不是一个人)22。也就是:把问题发到群组频道里,在帖子里@具体的人。这样有三个好处——对方在自己方便时回答;答案是公开的,以后别人也能搜到;你获得帮助这件事是显眼的。

对确实需要来回讨论的复杂问题,原书的办法是把同步请求攒起来一次问:和技术负责人约定固定的答疑时间(「办公室答疑时间」),把问题清单攒着带过去,期间继续自己调查23

3.5 两个会把你停在原地的循环

最后一节讲自我认知。原书指出两个常见障碍,方向正好相反24

冒充者综合征(觉得自己的成就靠运气、迟早被拆穿)是一种会自我强化的循环:每一个错误都被当成能力不足的证据,而每一项成功都被解释成「冒充得成功」25。原书给的反制手段有三种:觉知(认出这个循环)、重塑(把「我不得不求助达里亚」改写成「我联系了达里亚,现在我学会了」)、以及把成就写下来——哪怕是小事26。它 1978 年首次被两位心理学研究者描述,而且最初研究对象全是高成就女性——客观证据改变不了这个感觉,这恰恰说明它不是能力问题27

邓宁-克鲁格效应(觉得自己比实际强)是反方向的偏见:处在「无意识的无能力」阶段的人不知道自己不知道什么,于是到处批判公司的技术栈、回绝所有反馈。原书给的识别信号很锋利:完全自信标志着盲点28。反制手段包括:找一位受尊敬的工程师问他「我做得怎么样」并且真正听进去;专门去讨论那些你不同意的决策,问问当初为什么这么做29

两个循环共用同一个出口:定期、主动地找可信的人要真实反馈。这件事的机制在第 12 章会展开成一套可操作的框架(反馈怎么要、怎么给)。

4. 作者的判断与证据

  • 「新人该尽快到第三阶段」:这是作者的教学主张,依据是四阶段模型加他们带新人的经验,不是实验数据。
  • 删库故事:克里斯实习时按资深工程师的说明盲目执行了版本控制系统的合并操作,毁掉了整个代码库,团队通宵恢复30。原书用它支撑两个判断:错误不可避免;降低风险是团队和管理者的职责。这是轶事证据。
  • 反编译代码故事:支撑「为理解而阅读」的判断,同样是一次亲历。
  • 提问三步与两版邮件:这是原书里少数「可操作、可对照」的示范,属经验总结而非研究。
  • 有两处引用了外部研究:四阶段模型出自布罗德威尔的文章;冒充者现象出自 1978 年克朗斯与艾姆斯的论文31

5. 边界与局限

  • 硅谷口径。原书在前言里自己交代:书中经验取自「快速成长的、由风险投资公司资助的或者准上市的硅谷公司」32。本章里 Facebook 让新人花六周只练基本功这类做法,不是每家公司都有条件复制。
  • 七种学习手段没有给出「先做哪个」的顺序,只给了「别全做」的警告——排优先级要靠读者自己的处境判断。
  • 四阶段模型是教学经验总结,不是测量工具;你不能靠内省精确判断自己在第几阶段,原书也没给判据。
  • 书出版于 2021 年,文中没有涉及 AI 辅助编程对「学习方法」的改变。

6. 可带走的

  1. 会写代码只是战斗的一半;另一半(流程、协作、运维)是这本书要补的;
  2. 新手感到「我是冒牌货」是能力第二阶段的正常体征,不是能力差的证据;
  3. 学习要挑手段,不要全上:前置学习、运行实例、阅读、跟班结对、讲座会议、副业开源;
  4. 读代码别信注释、别信变量名,信源代码本身;
  5. 提问三步:先调查、设时限、写全过程——好问题本身就是你的信用;
  6. 求助通道选异步+组播,别当面打断;
  7. 完全自信是盲点的信号;完全自卑是第二阶段的信号——两个都要警惕;
  8. 入职第一周就能做的小事:把会议内容、入职流程写进文档,等别人来纠正——坎宁安定律(在网上得到正确答案的最好办法,是先发布一个错答案)的应用,见原文地图;
  9. 对地图的用法:不知道自己该读哪一章时,回来看第 2 节那张五站图,你现在在哪一站。

7. 原文地图

主题原书章原文位置
战斗的一半前言text/06-fm.txt:8(搜「战斗的一半」)
四项能力第1章 前面的旅程text/10-ch01.txt:18(搜「技术知识」) · text/10-ch01.txt:30(搜「沟通能力」) · text/10-ch01.txt:37(搜「领导力」)
五站地图第1章 前面的旅程text/10-ch01.txt:45(搜「新手营」) · text/10-ch01.txt:49(搜「胜任之湾」)
坎宁安定律与自行车棚第1章 前面的旅程text/10-ch01.txt:95(搜「发布错误的答案」) · text/10-ch01.txt:103(搜「自行车棚的材料问题」)
小到只改一行注释第1章 前面的旅程text/10-ch01.txt:113(搜「更新一行」)
四阶段模型第2章 步入自觉阶段text/11-ch02.txt:8(搜「无意识的有能力」) · text/11-ch02.txt:18(搜「第三个阶段」)
学习手段与警告第2章 步入自觉阶段text/11-ch02.txt:37(搜「倦怠」) · text/11-ch02.txt:50(搜「新手工程师训练营」)
调试器与实例代码第2章 步入自觉阶段text/11-ch02.txt:98(搜「调试器」) · text/11-ch02.txt:109(搜「入口」)
代码从不说谎第2章 步入自觉阶段text/11-ch02.txt:125(搜「Code never lies」)
结对编程第2章 步入自觉阶段text/11-ch02.txt:242(搜「结对编程」)
信噪比与三类会议第2章 步入自觉阶段text/11-ch02.txt:197(搜「信噪比」) · text/11-ch02.txt:202(搜「供应商展示会」)
副业选题第2章 步入自觉阶段text/11-ch02.txt:264(搜「选择项目。找到」)
反编译代码故事第2章 步入自觉阶段text/11-ch02.txt:173(搜「反编译」)
提问三步第2章 步入自觉阶段text/11-ch02.txt:283(搜「明确的问题」)
调查的去处第2章 步入自觉阶段text/11-ch02.txt:292(搜「错误跟踪器」)
时间限制第2章 步入自觉阶段text/11-ch02.txt:301(搜「预期花费的时间」)
坏问题/好问题邮件第2章 步入自觉阶段text/11-ch02.txt:321(搜「testKeyValues」) · text/11-ch02.txt:341(搜「竞争条件」) · text/11-ch02.txt:356(搜「可信度」)
别打扰与异步组播第2章 步入自觉阶段text/11-ch02.txt:372(搜「打断了他们」) · text/11-ch02.txt:378(搜「组播」)
批量同步请求第2章 步入自觉阶段text/11-ch02.txt:397(搜「办公室答疑时间」)
冒充者综合征第2章 步入自觉阶段text/11-ch02.txt:424(搜「冒充者综合征」) · text/11-ch02.txt:439(搜「自我强化」) · text/11-ch02.txt:438(搜「重塑」)
邓宁-克鲁格效应第2章 步入自觉阶段text/11-ch02.txt:469(搜「完全自信标志着盲点」) · text/11-ch02.txt:474(搜「权衡利弊的心态」)
删库故事第2章 步入自觉阶段text/11-ch02.txt:74(搜「VCS 代码库」)

Footnotes

  1. 出处:「前言」第 8 段(text/06-fm.txt:8,搜「战斗的一半」)。原文:知道如何编写代码仅仅是「战斗的一半」,你还需要那些学校里没有教授过的技能。

  2. 出处:「第1章 前面的旅程」第 45 段(text/10-ch01.txt:45,搜「新手营」)与第 49 段(text/10-ch01.txt:49,搜「胜任之湾」)。原书用「新手营—试炼之河—贡献者之角—运维之海—胜任之湾」五站比喻整个入行过程。

  3. 出处:「第1章 前面的旅程」第 18 段(text/10-ch01.txt:18,搜「技术知识」)、第 25 段(text/10-ch01.txt:25,搜「执行力」)、第 30 段(text/10-ch01.txt:30,搜「沟通能力」)与第 37 段(text/10-ch01.txt:37,搜「领导力」)。

  4. 出处:「第2章 步入自觉阶段」第 3 段(text/11-ch02.txt:3,搜「布罗德威尔」)与第 8 段(text/11-ch02.txt:8,搜「无意识的有能力」)。四个阶段的英文名依次是 unconscious incompetence、conscious incompetence、conscious competence、unconscious competence。

  5. 出处:「第2章 步入自觉阶段」第 16 段(text/11-ch02.txt:16,搜「操作流程」)。原文:即使你对软件工程了如指掌,也必须学习公司的那些具体操作流程和规范。

  6. 出处:「第2章 步入自觉阶段」第 18 段(text/11-ch02.txt:18,搜「第三个阶段」)。

  7. 出处:「第2章 步入自觉阶段」第 37 段(text/11-ch02.txt:37,搜「倦怠」)。原文警告:切勿试图同时做本章列出的所有事情,那样会让你感到倦怠。

  8. 出处:「第2章 步入自觉阶段」第 50 段(text/11-ch02.txt:50,搜「新手工程师训练营」)。这个为期 6 周的营在原书里叫 boot camp。

  9. 出处:「第2章 步入自觉阶段」第 97 段(text/11-ch02.txt:97,搜「堆栈跟踪信息」)与第 98 段(text/11-ch02.txt:98,搜「调试器」)。

  10. 出处:「第2章 步入自觉阶段」第 125 段(text/11-ch02.txt:125,搜「Code never lies」)。原文引罗恩·杰弗里斯:「代码从不说谎。注释有时却会」。

  11. 出处:「第2章 步入自觉阶段」第 242 段(text/11-ch02.txt:242,搜「结对编程」)。

  12. 出处:「第2章 步入自觉阶段」第 197 段(text/11-ch02.txt:197,搜「信噪比」)与第 202 段(text/11-ch02.txt:202,搜「供应商展示会」)。原文:供应商展示会「每年超过一次就可能是在浪费时间」。

  13. 出处:「第2章 步入自觉阶段」第 264 段(text/11-ch02.txt:264,搜「选择项目。找到」)。

  14. 出处:「第2章 步入自觉阶段」第 173 段(text/11-ch02.txt:173,搜「反编译」)。德米特里敬佩的「原作者」其实不存在,他读的是反编译器输出的代码。

  15. 出处:「第2章 步入自觉阶段」第 281 段(text/11-ch02.txt:281,搜「试图自己解决」)。

  16. 出处:「第2章 步入自觉阶段」第 318 段(text/11-ch02.txt:318,搜「糟糕的提问方式」)与第 159 段(text/11-ch02.txt:159,搜「比较」)。原书用潘卡写给艾丽斯的两版邮件做对照。

  17. 出处:「第2章 步入自觉阶段」第 292 段(text/11-ch02.txt:292,搜「错误跟踪器」)与第 293 段(text/11-ch02.txt:293,搜「单元测试」)。

  18. 出处:「第2章 步入自觉阶段」第 301 段(text/11-ch02.txt:301,搜「预期花费的时间」)与第 310 段(text/11-ch02.txt:310,搜「及时止损需要自律」)。

  19. 出处:「第2章 步入自觉阶段」第 327 段(text/11-ch02.txt:327,搜「懒惰」)。原文说坏版「听起来隐约像是潘卡在责怪艾丽斯」。

  20. 出处:「第2章 步入自觉阶段」第 356 段(text/11-ch02.txt:356,搜「可信度」)。

  21. 出处:「第2章 步入自觉阶段」第 372 段(text/11-ch02.txt:372,搜「打断了他们」)与第 366 段(text/11-ch02.txt:366,搜「耳机」)。

  22. 出处:「第2章 步入自觉阶段」第 378 段(text/11-ch02.txt:378,搜「组播」)。原文把通信中的 multicast(组播)与 asynchronous(异步)概念搬到了人际沟通上。

  23. 出处:「第2章 步入自觉阶段」第 397 段(text/11-ch02.txt:397,搜「办公室答疑时间」)。

  24. 出处:「第2章 步入自觉阶段」第 412 段(text/11-ch02.txt:412,搜「两个常见的障碍」)。

  25. 出处:「第2章 步入自觉阶段」第 439 段(text/11-ch02.txt:439,搜「自我强化」)。原文:每一个错误都会被看作能力匮乏的证明,而每一项成功都是优秀「冒充者」冒充的证据。

  26. 出处:「第2章 步入自觉阶段」第 438 段(text/11-ch02.txt:438,搜「觉知」)与第 438 段(text/11-ch02.txt:438,搜「重塑」)。

  27. 出处:「第2章 步入自觉阶段」第 425 段(text/11-ch02.txt:425,搜「1978」)与第 435 段(text/11-ch02.txt:435,搜「客观证据」)。原文:众多的成就似乎并不影响冒充者的信念。

  28. 出处:「第2章 步入自觉阶段」第 469 段(text/11-ch02.txt:469,搜「完全自信标志着盲点」)。

  29. 出处:「第2章 步入自觉阶段」第 472 段(text/11-ch02.txt:472,搜「并真正地倾」)与第 474 段(text/11-ch02.txt:474,搜「权衡利弊的心态」)。

  30. 出处:「第2章 步入自觉阶段」第 74 段(text/11-ch02.txt:74,搜「VCS 代码库」)。克里斯的新手故事还包含管理者的处理方式:把他拉到一边,告诉他错误难免发生。

  31. 出处:「第2章 步入自觉阶段」第 425 段(text/11-ch02.txt:425,搜「1978」)。冒充者现象出自克朗斯与艾姆斯《高成就女性中的冒充者现象》;布罗德威尔的四阶段出自其文章《为学而教》(同章第 3 段,text/11-ch02.txt:3,搜「为学而教」)。

  32. 出处:「前言」第 31 段(text/06-fm.txt:31,搜「硅谷公司」)。原文自称「这是一本有态度的书」。