软件开发中的道歉

谢益辉 2019-04-10

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

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

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

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

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

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