没有人教工程师如何给出反馈。我们花了数年学习数据结构、设计模式和部署管道,然后有一天,一个同事提交了一个让我们咬牙切齿的 pull request——我们完全不知道拿这种感受怎么办。要么什么都不说(阻力最小的路),要么说出来的话像砖头一样砸下去:简短、尖刻,不知怎的就变得很个人化,即便我们并无此意。
反过来也是一样。当一个 lead 告诉你"这段代码太复杂了",或者一个同级说"我不确定这个方案",我们的神经系统会把它当作威胁。防御机制启动。我们辩解、转移话题,或者在整个 sprint 里默默积怨。这两种反应都不能帮助我们成长。
本指南是那段对话两端的实战手册。我们会探讨什么让反馈真正有效,给出可直接使用的应对脚本,以及如何在接受批评时不失去从容。无论你是第一次做代码审查的应届毕业生,还是想让团队的反馈氛围更安全的高级工程师,这里都有你需要的内容。
为什么反馈感觉那么难
反馈是一种穿着职业外衣的社交行为。表面上它是关于代码或设计决策的。在表面之下,它常常触及身份——我们讲给自己听的关于自己有多能干的故事。当有人质疑我们的工作时,大脑的威胁检测机制往往分不清"这个函数太长了"和"你不够好"。
两种恐惧往往占据主导:
- 对冲突的恐惧(对给予者)。如果他们反驳怎么办?如果变得尴尬怎么办?如果他们觉得我不公平怎么办?偏内向的工程师——我们中的很多人——往往更愿意选择沉默的暂时舒适,而不是诚实的短暂不适。
- 对显得无能的恐惧(对接受者)。尤其是当你是初级工程师、刚加入团队,或者正处于证明自己的阶段时,批评可能感觉像是对你最担心的关于自己的事情的佐证。
这里有个令人不舒服的真相:回避反馈并不会让那些感受消失,只是让问题不断积累。从不得到诚实信号的初级工程师会持续建立同样的习惯。设计决策从未受到质疑的高级工程师会交付越来越脆弱的系统。回避艰难对话的团队终究还是要面对它们——只是在最糟糕的时刻、最大的压力下。
关于心理安全感的研究——最著名的是 Amy Edmondson 在谷歌和哈佛的研究——始终表明,允许发声的团队优于不允许的团队。不是因为那些团队总是达成一致,而是因为他们能快到足以修复的速度发现问题。被压制的反馈是一种隐性债务:不可见,直到累积成代价高昂的东西。
好消息是,给出和接受反馈是技能,不是天赋。它们可以练习,一个在措辞或回应方式上的小小改进,对你的工作关系会产生可测量的影响。
好反馈真正的样子
在进入脚本之前,先理解我们的目标有助于方向。好反馈有四个特性:
- 具体。它指名了某个具体的东西——一个文件、一个函数、一个措辞、一次会议中的行为——而不是指向一种模糊的感觉。"这个 service 做的事太多了"是一个起点;"
UserService同时处理认证和 profile 更新,这让两者都难以单独测试"是某人可以采取行动的反馈。 - 及时。在事件发生后不久给出的反馈比数周后再说更有用,情感负担也更轻——那时上下文已经淡化,工作已经推进。代码审查评论在作者还记得推理时落地最好。一对一的观察在发生的那周说最好。
- 关于行为或工作——而不是关于人。"你总是把事情搞复杂"(对性格的攻击)和"在最近三个 PR 中,我看到数据转换逻辑被分散在多个抽象层中,这让它很难跟踪"(对工作的观察)之间有实质性差异。前者把人置于审判台,后者给他们一些可以审视的东西。
- 可操作。好的反馈暗示(或明确说明)了一条前进路径。"这很难读"让人不知所措。"把映射逻辑提取到一个有清晰返回类型的命名函数中,会让这段代码更容易理解"给了他们下一步。
SBI 模型
一个把上面四个特性都融合在一起的简单结构是情境—行为—影响(SBI)模型,最初为领导力培训开发,现在被广泛用于软件团队。你不需要在每条评论上机械地套用它,但当你不确定如何开口时,它是一个可靠的脚手架。
在实践中,SBI 听起来像这样:"在昨天的事故复盘中【情境】,当你三次打断值班工程师解释发现内容【行为】,这让团队难以跟上时间线,我注意到值班工程师之后就停止发言了【影响】。"
注意这三个部分里没有一个在评判意图("你想主导会议"),也没有赋予性格标签("你很轻视人"),也没有泛化("你总是这样")。它描述了发生了什么,客观地,以及随之而来的是什么。这就是为什么它往往能落地而不触发防御性关闭。
即可使用的脚本:从模糊到具体
我们大多数人对别人的工作都有本能反应——一种感觉到哪里不对、或者可以更好——先于我们有语言来表达它。挑战是把那种直觉转化为对方真正能用上的反馈。下面的表格展示了常见的模糊或带情绪的反应,以及更清晰、更具体的替代表达。
| 你本能想说的 | 更容易落地的表达(以及原因) |
|---|---|
| "这太复杂了。" | "parseConfig 函数做了三件事:读取环境变量、验证 schema、设置默认值。把这些拆分成独立的函数会让每个都更容易测试和理解。"——具体指出了什么是复杂的,并建议了修复方案。 |
| "我不喜欢这个方案。" | "我在想每 500 毫秒轮询一次在我们当前的流量下是否会对数据库造成太大压力——你有没有考虑过 webhook 或基于队列的方式?"——把顾虑落地到具体风险,开放了对话。 |
| "你总是遗漏边界情况。" | "在这个 PR 里我注意到 processItems 中没有处理空数组的逻辑——第 42 行会抛出 TypeError。我们能在那里加一个守卫条件或者为此添加一个测试吗?"——去掉了"总是",与具体实例挂钩。 |
| "这需要完全重写。" | "这个组件中数据层和展示层之间的耦合让修改任何一方都需要同时触碰另一方。在我们合并之前,能把数据获取逻辑提取到一个自定义 hook 里吗?"——指出了结构问题,并提出了具体的第一步。 |
| "我不同意这个。" | "我对这个决策的顾虑是它把我们绑定在了同步接口上,在高负载下可能会阻塞事件循环。你能帮我理解你权衡的 tradeoff 吗?"——陈述了顾虑,邀请了对方的推理。 |
| "干得好。"(仅此而已) | "你在 DataTable 中构建错误边界的方式非常整洁——它同时处理了网络错误和解析失败,而没有把实现细节泄露给上层树。这个模式值得复用。"——见下一节,为什么赞扬也需要具体性。 |
在发出审查评论之前,试着以作者的角度重读它。问自己:我是否清楚地知道要改什么,以及为什么?如果任何一个答案是"不太清楚",加一句具体的话。你会惊讶地发现,往往只需要加一句话,就能把"让人困惑"变成"可以行动"。
赞扬也是反馈
工程师往往更擅长指出问题,而不是承认什么在起作用。但正面反馈——当它具体时——是你能给队友的最高杠杆的事情之一。它告诉他们要继续做什么,这和知道要停止做什么同样有用。
陷阱是模糊的赞扬。"迁移干得好"比什么都没有要好,但它没有教会任何人任何东西。具体什么很棒?回滚计划的周全程度?你向利益相关者传达状态的方式?你在触碰生产之前先在 canary 上运行了迁移这个事实?这些都是不同的课,指名它们让它变得可以重复。
几个让赞扬真正落地的原则:
- 具体描述行为。使用同样的 SBI 结构:"在周三的事故复盘中,当你逐步走过失败模式时,它帮助整个团队快速理解了根本原因。"
- 指出影响。"你写的清晰回滚计划意味着当我们遇到边界情况时,值班工程师知道该怎么做。那至少为我们节省了 40 分钟的混乱。"
- 值得的时候公开说。私下的赞扬是有意义的。公开的赞扬——在团队频道、在回顾中、在集体代码审查中——向整个团队发出优秀的信号是什么样的。对接受者来说也意义重大,尤其是他们是初级工程师或公司新人的时候。
- 不要拖延。赞扬的价值和建设性反馈一样会衰减。如果你注意到某人做了某件好事,当周就说出来。
代码审查文化指南中专门提到正面评论的重要性是有原因的:一个只有批评性观察的 PR,即便所有观察都是公正的,也开始感觉像一片雷区。一条说"我喜欢这个抽象——简洁"的评论只花你五秒钟,却能改变整个审查的情感基调。
好好接受反馈
如果给出反馈很难,那么好好接受反馈可能更难。批评到来时,你对工作充满情感投入。有时它伴随着糟糕的表达——生硬、不清晰,甚至不友善。而"有人在批评我的代码"和"有人在批评我"之间的距离,从神经学角度来说比我们希望的要窄。
以下是一个有效的五步实践:
- 在被证明不然之前,先假设对方出于好意。大多数留下批评性审查评论的工程师是想让代码变更好,而不是想让你难受。先从这里出发。如果表达方式粗糙,把表达方式和信号分开——前者可以很差,而后者仍然很有价值。
- 回应之前先暂停。如果你感到一阵防御性上升,那是信息:反馈触动了某个真实的东西。不要从那个冲动中反应。深吸一口气,十分钟后再读评论。如果是当面对话,说"让我想想这个"是完全没问题的。
- 提问以澄清。如果反馈是模糊的——"这感觉过度设计了"——你有权要求具体内容。"具体是哪个部分感觉过度设计?是抽象层的数量、接口表面积,还是别的什么?"这不是挑战;这是让你得到可以行动的反馈的方式。
- 把信号与表达分开。某人可以在实质上是对的,在表达方式上是错的。你的工作是提取有用的信号,并决定是否根据它行动。你不必奖励糟糕的表达,但你也不必让它阻止你学到某个真实的东西。
- 说谢谢。即使你不同意反馈,承认某人花时间提供了一个视角是好的实践。"谢谢你指出这点——我会想想"是诚实的,关闭了循环,而不需要承诺同意。
好好接受反馈不意味着接受所有反馈。你可以不同意。关键是用证据不同意,而不是用情绪。"我理解这个顾虑,但我采用这个方案是因为 X——这解决了你的顾虑吗?"是一个健康的回应。沉默之后忽略反馈则不是——它关闭了循环,告诉给出反馈的人说话不值得费力。
向上和平级给出反馈
大多数反馈指南是从上级给下级的视角写的。但两个最重要也最少被讨论的方向是平级之间和向上反馈。
平级反馈
向同级的同事给出诚实反馈可能感觉尴尬,因为背后没有正式权威可以依靠。它可能感觉像是越界。但它不是。精心给出的平级反馈是高绩效团队中最有价值的东西之一。
几个有帮助的事情:在你不确定时把它框成问题("我注意到 X——这是有意为之吗?"),先在一对一场合给出,然后再在公开场合,聚焦于工作而不是人。如果你们有持续的合作关系,诚实反馈的投入会随着时间建立信任。总是告诉你想听的话的人令人愉快;告诉你真相的人对你有用。
向上反馈
向你的经理或技术 lead 给出反馈本来就更难。存在权力不对等,即便是心理安全感最高的团队也无法完全消除它。一些实用方法:
- 使用一对一。私下对话是合适的场合。不要在团队会议上给出触及你经理行为的反馈——那对他们不公平,也为双方都创造了一个不需要的观众。
- 聚焦于影响,而不是性格。"当 sprint 范围在最后两天改变时,我发现很难排优先级——有没有办法早一点锁定范围?"比"你总是在最后一刻改变范围"更容易被接受。前者描述了一个要一起解决的问题;后者听起来像指控。
- 具体而向前看。指名发生过一两次的事情——而不是一个泛化的模式——并描述什么会有帮助。以这种方式接受反馈的领导者几乎总是比接受模糊不满反应得更好。
- 选择时机。不要在你的经理正处于危机中、面临截止日期压力或明显有压力时给出向上反馈。一个平静的一对一——而不是董事会会议前五分钟的那个——是这个东西落地的时候。
不同背景和团队规模下的反馈
不是所有反馈都在同一设置中发生,正确的方法会根据你所在的地方而变化。
在代码审查中
对大多数工程师来说,代码审查是最常见的反馈渠道,它有自己的规范。书面评论是异步的、可重读的、永久的——这意味着它们需要更多关注,而不是更少。当面说可以的一条评论("这有点长")在 PR 中读起来可能显得冷漠或轻蔑。加一句上下文("这有点长——把验证逻辑提取到它自己的函数里可能有助于可读性")成本很低,帮助很大。更深入的内容参见关于善意地审查代码的同系列文章。
在一对一中
一对一是更个人化、更敏感或更纵向的反馈的天然家园——随时间的模式、职业方向、人际动态。同步、私密的性质意味着你可以观察对方是如何接受的并作出调整。提前准备一两个具体要点,而不是带着积累了数月的积怨清单出现。
在事故复盘(无责事后复盘)中
事故复盘是一个有一条不可谈判规则的专门反馈背景:无责。目标是理解发生了什么并改进系统,而不是把错误归咎于个人。在实践中,这意味着反馈指向流程、工具和知识缺口——而不是人。"我们的告警没有早到足以发现内存泄漏——我们应该添加一个阈值告警吗?"是正确的方式。"你为什么没发现这个?"不是。掌握无责复盘的团队在从失败中学习上会显著地进步。
按团队规模
小型团队(十人以下)往往有非正式的反馈文化——事情在对话中说,在共享的 Slack 线程里,在午餐时。那种非正式性是一个特性:反馈发生得快而频繁。风险是它也可能变得不一致或不平等,一些人得到大量诚实输入,而另一些人什么都得不到。随着团队成长,轻量级的结构——定期一对一、明确的回顾时间、书面的 PR 规范——帮助确保反馈被公平分配,而不只是沿着现有的社交关系流动。
核心要点
- 回避反馈不是中立的——它让问题积累,随着时间侵蚀信任。
- 好反馈是具体的、及时的、关于工作(不是性格)的、可操作的。SBI 模型(情境—行为—影响)给你一个可靠的结构。
- 把模糊的直觉转化为具体的观察。指名文件、函数、会议、行为——而不是泛化的感受。
- 赞扬也是反馈。具体的、公开的赞扬告诉团队优秀是什么样子的,值得有意为之地给出。
- 好好接受反馈:假设对方出于好意,暂停,提问以澄清,把信号与表达分开,说谢谢。
- 向上和平级反馈遵循同样的规则——使用一对一,聚焦于影响,具体而向前看。
- 背景很重要:代码审查、一对一和事故复盘各有其规范。无责事后复盘把反馈指向系统,而不是人。
反馈文化是一次对话一次地建立的。从你审查的下一个 PR 开始:在你的批评旁边加一条具体的正面评论,并尝试用 SBI 框架表达一个观察。几个月后,这个习惯会改变整个团队的沟通方式。当你准备好在工程文化的人文侧面投入更多时,继续阅读辅导工程师——一篇关于如何在更长的职业弧线上帮助人成长的文章。