软件开发中的道歉
遥想 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 都醒了,我们有生之年能否目睹教授醒来的一天呢。
就像我在《穷查理宝典笔记》中提到的“并不是说诚实是最好的道德品质,只不过诚实是最好的策略”一样,如果我们理解了道歉是最好的策略、你的颜面毫不值钱,那么就不会犹豫跪不跪了。
作者暂无likerid, 赞赏暂由本网站代持,当作者有likerid后会全部转账给作者(我们会尽力而为)。Tips: Until now, everytime you want to store your article, we will help you store it in Filecoin network. In the future, you can store it in Filecoin network using your own filecoin.
Support author:
Author's Filecoin address:
Or you can use Likecoin to support author: