---
title: 软件开发中的道歉
date: '2019-04-10'
slug: software-apologies
---

遥想 2012 夏天，我在新泽西的 AT&T 实验室美其名曰实习，其实是捣鼓了两个多月 knitr 包。有一天我收到锐扑厉教授的邮件，严令我向他道歉。我现在不记得当时 knitr 在 CRAN 上出的是什么问题，但那是我生平第一次因为软件代码问题被别人要求道歉，所以很是诧异。打那以后，我每次上传新版本的 knitr 包到 CRAN 时都心里发毛，不管会不会出问题，我都在提交说明中预先无条件道歉，以防惹恼这位主子而把我封禁。[三年后](https://www.weibo.com/2514669664/CaScK6Srx)，我也不记得 knitr 里什么问题又招惹到他了，他直接甩给我一句：你通常不道歉，CRAN 不欢迎你这样的人！又吓得我不要不要的，简直比窦娥还冤，不管错在哪里，赶紧先跪为敬。

其实我这些名义上的道歉都不真心诚意，我只不过是慑于他的权力而已。要是我不跪、非要争论是非黑白，我唯一的下场就是被封禁，就像那些每次吵架都吵赢了女朋友的人最后都凭实力单身了一样。再过了一年多，锐扑厉大人终于从 CRAN 的龙椅上下来了，现在我也敢写这些事了（但还是请各位客官看看就好、不要转播）。这些假道歉告诉我们，一个人如果权倾朝野，那么他下面的文武百官为了自保，会很麻溜地给他虚构出一个他想要的世界。道歉这事儿，还是不要强迫为好，尤其是手握大权时。锐扑厉教授维护 CRAN 辛不辛苦呢？我想是辛苦的，但具体怎么个辛苦法，外界一点也不知道。他既是运动员又是裁判，而且规则还总是变，又拒绝外界帮助，这让作者们很是头疼，只能多害相权取其轻，也就是低头作口是心非的道歉。这对双方而言都是巨大的悲剧。

托教授严酷训练的福，我在开发软件过程中向用户道歉已经到了张口就来、一点也不觉得违和的熟练程度。当然，这些道歉通常并不是装模作样、虚情假意，而是我真觉得给用户添了麻烦。我之所以说这是福，是因为道歉毕竟还是违反人的本能的；不经过刻意训练的话，对不起三个字可能还真没法轻易说出口。傲娇的人怕道歉损失颜面，实诚的人可能会因为羞愧而回避道歉。

<!-- https://github.com/r-lib/devtools/issues/1979 -->

前日 Travis 的 R 包检查程序出了个问题，导致很多 GitHub 上的 R 包都通不过 Travis 的自动测试。这部分 Travis 检查程序是我们厂一位同事写的。我注意到这个问题后，发现相关的 R 包当日刚在 CRAN 上更新过，然后顺藤摸瓜到 GitHub 事项里发现已经有人提交了报告。这不是关键，关键是我再往前翻，发现两个多月前就已经有用户提交了一个报告提醒这个问题，而他似乎并没有看，结果不幸被那位用户言中：他向 CRAN 更新了这个包，Travis 就崩掉了。随后他十万火急再向 CRAN 更新了另一个包来修补这个问题，并径自关掉了那个预言事项，而没有采纳事项中提到的正确修补办法。这在我看来十分不妥：既然早有人提醒这个潜在问题，之前没看到也就罢了，之后看到了却什么都不说、也不采纳别人的正确建议、愣给人关掉了。岂不让用户寒心？后来那位用户见这个事项被粗暴关闭，又回复说不知道为什么毫无解释就关掉了，也不修正问题。我们这位同事到了第二天把正确的修正提交了上去，但仍然什么都没说。我非常想提醒他起码去说句谢谢并致歉，但我觉得这种事情似乎提醒了比不提醒更尴尬，所以我把话憋了回去。我不知道他心里到底怎么想的，感觉他似乎觉得这个错误太低级了、被人早早发现但自己没修正，可能有些羞耻感。这就回到我前面说的《[理智与情感](/cn/2018/12/open-wars/)》了：开发软件过程中，要尽量丢弃这些小心理；只论对错，不论荣辱。如果别人明显对、自己明显错，那就二话不说上前扑通一跪就好了嘛，这一点也不丢人。男儿膝下没有黄金，最多不过是有条秋裤，别想多了。

其实我们可以拿锐扑厉教授对比一下 R 社区的头号人物——哈得力大人。教授的贡献其实也是巨大的（尽管他在暗部），但几乎没人喜欢他，充其量我们只能痛苦地承认并千恩万谢他的贡献，而哈得力为什么看起来这么得力、这么能赢得人心呢？以我的经历和观察来看，教授有个特点，就是从不道歉——他对了就咬，错了就跑。不知是不是活在一个幻觉世界里，神经性地掩盖自己错误的一面。哈得力大人说对不起则是家常便饭，他经常把自己的身段放得很低，关心黎民苍生的大小疾苦，毫不掩饰自己的错误。他越是为自己的错误坦诚地道歉，就越能获得民心，从而获得更多有价值的反馈，把事情做得更好。反观教授，我只能叹叹气：既然你什么都对，那就让你活在什么都对的幻觉里好了，我们别自找麻烦非得把你叫醒了。话说连 [Linus 都醒了](/cn/2018/09/linus-apology/)，我们有生之年能否目睹教授醒来的一天呢。

就像我在《[穷查理宝典笔记](/cn/2018/08/poor-charlies-almanack/)》中提到的“并不是说诚实是最好的道德品质，只不过诚实是最好的策略”一样，如果我们理解了道歉是最好的策略、你的颜面毫不值钱，那么就不会犹豫跪不跪了。
