今日重点:🗣️ 口语——评审邮件里的每句话,拉到视频会上都要能张口说出来。 今天用 dma-buf 一场真实的 9 小时争论,拆五个说话动作: 承认没听懂、顶格反对、反问举证、预警后悔、自嘲接招。最后给你一个现场场景,逼你 30 秒内把三句话说圆。

🗣️ 现场:一次改名引发的 9 小时拉锯

/ section

背景:NVIDIA 的 Alistair Popple 发出一个 26 补丁的 treewide 系列,补丁 23 把 dma_buf_attach() 改名为 dma_buf_sgt_attach()——这个 helper 永远只做 SGT(scatter-gather table,分散-聚集表)一种映射,名字里带上 sgt 让调用方的意图一眼可见; 系列同时引入可协商映射类型的新流程。 AMD 的 Christian König 不买账:他认为新 helper 的形态走错了路。两人从 10-27 晚上 20:07 一路辩到 22:54, 同线程还牵出 TegraDRM 一个既有 bug 的支线。 下面五段引用全部是真实邮件原句,每段末尾给出来源邮件,点开可逐字对照。

🗣️ 五个动作

/ section

① 没听懂就直说,别装懂。
原句:Not sure I understand this comment...
语境翻译:这条评论我不太确定自己看懂了……
要点:Christian 一句 NO-GO 砸过来,Jason 没有急着反驳,先承认没跟上。 Not sure I understand 比 I don't understand 软一档:把「你没说清楚」的可能留在桌上,只认领「我没懂」这一半。 三个点的省略号是邮件里的自然停顿,口头说出来就是语速放慢、尾音收平。
同一招 Christian 后来也用了:I still don't see what you mean.(我还是没明白你的意思)——still 一字标明「你解释过了,但我这边还没通」,把继续解释的责任轻轻放回对方手里。
复述引导:合上原文,用 10 秒说出「我没跟上 + 请再讲一次」,不许用 sorry 开头——技术讨论里没听懂不是错,装懂才是。
来源:Jason Gunthorpe,10-27 20:39 北京; Christian König,10-27 22:28 北京

② 反对要顶格,范围要收窄。
原句:Sharing page/physical to be used with the IOMMU functions through DMA-buf is an absolutely hard NAK from my side.
语境翻译:把 page/physical(页/物理地址)经 DMA-buf 传给 IOMMU 函数用,我这边是绝对不行的。
要点:absolutely hard NAK 是内核评审里最重的反对——NAK 已经是否决,hard 再加锁,absolutely 顶到满格。 但注意后半句 from my side:否决的是我这条线,不是替整个社区宣判。 紧跟着他收窄范围:We still need to figure out how to do this between KVM, IOMMUFD and virtio so that it is limited to only those three.(这事怎么做我们还得在 KVM、IOMMUFD、virtio 之间解决,而且要只限这三家。) 顶格反对 + 精确划界,火气全在技术上,一点没泼到人。
复述引导:说一次「我坚决反对 X」,句尾必须跟一个边界——只允许谁、只在什么条件下。
来源:Christian König,10-27 20:11 北京

③ 用反问把举证责任推回去。
原句:Unless you want to see that open coded in ever driver using the more general functions, I'm not sure I see the alternative?
语境翻译:除非你想看到这段逻辑在每个调用方那里就地展开重写一遍,否则我不觉得还有什么别的办法?
要点:Christian 坚持「不该再多一个 attach 变体」,Jason 不直接说「你错了」,而是摊开代价反问: 砍掉这个 helper,26 个调用方就得各自把同一段代码 open code(就地展开、不封装)一遍。 Unless you want …, I'm not sure I see the alternative? 这个结构把「请你给一个更好方案」包装成了疑问句——球回到对方半场,话还说得客气。 (原文 ever driver 是 every driver 的笔误,邮件列表里很常见,引用保留原样,自己写别照抄。)
复述引导:对方否了你的方案,用「除非你能接受 <代价>,否则我看不到别的路?」反问一次——只摆代价,不评价人。
来源:Jason Gunthorpe,10-27 22:08 北京

④ 不喊「这不行」,改说「你将来会后悔」。
原句:I think this is something you'd regret down the road as it starts muddling up different concerns.
语境翻译:我觉得这条路过一阵子你会后悔,因为它会把不同的关注点搅在一起。
要点:Christian 提议「参数为 NULL 就默认匹配 SGT」,Jason 的反对没有落在「现在」——现在的确能跑——而是落在 down the road(往后、将来)。把反对从「你错了」换成「你将为此付出代价」,听的人更容易接住。 muddle up 是口语里「搅混、搞乱」的说法,比 confuse 轻、比 mix 贬义。 他还补了一刀可验证的标准:Implicitly doing things when other things are NULL is more indirect.(别的字段是 NULL 就隐式触发行为,太绕了。)——反对必须落到一条可检查的原则上,不能只说「我不喜欢」。
复述引导:挑一个你不同意的 API 设计,用「something you'd regret down the road because …」说一遍,because 后面必须跟一条具体后果。
来源:Jason Gunthorpe,10-27 22:44 北京

⑤ 被点名了?自嘲一句接住。
原句:Sure, I agree -- so let's say it's a bug on top of the baseline crimes TegraDRM commits :)
语境翻译:行,我同意——那就算它是 TegraDRM 日常「罪行」之上又多出来的一条 bug 吧 :)
要点:Jason 指出 TegraDRM 把 dmabuf 挂到自定义 iommu_domain「100% 违规」,作为 Tegra 维护者的 Mikko Perttunen 没有辩解,先 Sure, I agree 接住,再把自家驱动的历史包袱自嘲成 baseline crimes(底线级「罪行」)。 破折号加一个 :)——认错认得干脆,气氛一点不僵。会后他真的在删这条显式 IOMMU 路径:嘴上认了,手上也认了。
复述引导:下次你的代码被当众指出问题,先试这个句式:「同意 + 自嘲定性 + 已在处理」,三拍说完,不解释动机。
来源:Mikko Perttunen,10-27 21:40 北京

尾声:谁赢了?——到 22:54,Christian 的最后一封还是 Yeah. exactly that is a clear NO-GO from my side.(对,这恰恰就是我这边明确的否决。 见 10-27 22:54 北京)。 九个小时、十几封邮件,没人改口——但没有一句带火气。五个动作轮着用:没听懂就认、反对就顶格、代价就摊开、后果就预演、被点名就自嘲。 争论僵在技术上,恰恰是它健康的样子。

✨ 辅助彩蛋:三个能直接搬上会的词

/ section

★ 写法、时间、查找——三个词各管一件事

都是真实原文里的用法,不是仿写

① open code 把同一段逻辑在每个调用方就地展开写,不封装成公共函数,如 without having to open code it。 内核评审里讨论「要不要抽 helper」的固定用词,动词直接用。
② down the road 往后、将来某个时候,如 something you'd regret down the road。 比 in the future 口语,会上说「现在能跑,down the road 会疼」非常顺。
③ grepable 能被 grep 全树搜到,如 very readable for what the driver is doing, and grepable。 内核特有的可维护性论据:函数名直白 = 改 API 时搜得全、改得净。
记忆钩子 open code 说写法,down the road 说时间,grepable 说查找。
溯源 ①③出自 Jason 22:44 的回复, ②同邮件;①的另一处用例见 他 22:08 那封。

✍️ 今日练习

/ column
✍️ 场景:视频评审会上,维护者对你的补丁说了句「这个形态我不接受」,理由一句话带过,你没听懂。请在 30 秒内说完三句:第 1 句承认没跟上并请对方展开;第 2 句用一句话讲清你的设计意图(这个 helper 只是给 26 个调用方省掉重复代码);第 3 句用反问把举证责任推回去。要求:不用 sorry 开头,第 3 句必须是问句。
💡 显示答案
参考作答(仿写示范,非原文):I'm not sure I understand this comment -- could you unpack which part of the shape breaks the rule? The helper only saves every caller from open coding the same SGT-only flow; the negotiable path stays in dma_buf_dynamic_attach(). Unless you want to see that open coded in every driver using the more general functions, I'm not sure I see the alternative? 讲法要点:第 1 句把「没懂」认领在自己这边,unpack 比 explain 更具体;第 2 句只讲意图、不辩护,分号后补一句「新流程没被动过」;第 3 句照抄 Jason 的 Unless you want …, I'm not sure I see the alternative? 结构,摆代价不评价人。
📖 原文:It is, this is just a helper wrapper effectively to run the flow exactly as it is right now wired to only do sgt. Unless you want to see that open coded in ever driver using the more general functions, I'm not sure I see the alternative?
📎 原文引用

每日一句:Say you're lost, say your reason, ask for a better way.

仿写示范