CL描述信息的最佳实践

翻译腔依旧

Change List(CL) 是一个公开的,包含有“修改了什么”,以及“为什么修改“的记录。它会被永久的存储在版本控制系统里。并且,不仅仅是你的组员,其他部门甚至其他公司的工程师也常常会参考这些CL描述。

如果你的CL描述过于含糊,重点不明,或者只是简单的“修复bug”,“重构”,“重排格式”,那其他的工程师将很难通过仅仅阅读CL描述来理解你做了什么。同理,当你在阅读别人的CL时,你也不想每次都阅读长长的代码,而是希望有一个简短精准的描述告诉你他/她做了什么。因此,本文档将概述如何写易读易懂的CL描述。

第一行

  • 简短描述你在CL里做了什么。
  • 完整的一句话,尽量使用祈使句。
  • 后面加一句空行

CL描述的第一行应该是一句简短且具体的做了什么的总结,和一个空行。因为大多时候代码搜索工具在显示历史树的时候,它会显示每个CL的第一行。所以第一行应该具有足够多的信息量,这样其他工程师不必点开每一个CL,阅读它完整的描述才能知道这个CL做了什么。

按照传统,CL描述的第一行应是一个完整的祈使句。比如,说“Delete the FizzBuzz RPC and replace it with the new system.” 而不是“Deleting the FizzBuzz RPC and replacing it with the new system.” 不过,除第一句外,剩下的CL描述不必都是祈使句。

正文应当信息丰富

除第一行外,剩余的描述应当提供尽量多的信息。它可能包括对要解决的问题的简要概述,以及为什么这是最好的方法。如果该方法有任何缺点,均应在CL正文中提及。如果有与之相关的设计文档,bug 号,基准测试的结果等,均应提供相应的链接。就算CL只有一行代码修改,也应尽量包含上下文信息。

最差实践示范

“fix bug” 是一种最没用的CL描述。工程师们无法获知:修复了什么bug?如何修复的?和它一样糟糕的描述还有:

  • “Fix build.”
  • “Add patch.”
  • “Moving code from A to B.”
  • “Phase 1.”
  • “Add convenience functions.”
  • “kill weird URLs.”

上述示例中都是真实案例。这些CL的作者可能相信他们已经提供了有用的信息,但是作为CL,只写这些并不足以让其他工程师们理解上下文。就好比你去读书之前,总是希望书的名字会告诉你接下来你会读的内容,比如《C++算法》就是讲C++和算法的。而《书》,《这是一本书》这种名字无疑会让读者摸不着头脑。

较好的cl描述示范

功能变更

rpc: remove size limit on RPC server message freelist.

Servers like FizzBuzz have very large messages and would benefit from reuse. Make the freelist larger, and add a goroutine that frees the freelist entries slowly over time, so that idle servers eventually release all freelist entries.

第一行用了寥寥数语描述了这个cl做了什么。正文部分描述了它解决了什么问题,为什么这个cl的实现是一个可行的方案,并交待了一些实现的细节。

重构

Construct a Task with a TimeKeeper to use its TimeStr and Now methods.

Add a Now method to Task, so the borglet() getter method can be removed (which was only used by OOMCandidate to call borglet’s Now method). This replaces the methods on Borglet that delegate to a TimeKeeper.

Allowing Tasks to supply Now is a step toward eliminating the dependency on Borglet. Eventually, collaborators that depend on getting Now from the Task should be changed to use a TimeKeeper directly, but this has been an accommodation to refactoring in small steps.

Continuing the long-range goal of refactoring the Borglet Hierarchy.

第一行描述了这个CL做了什么以及此改动与现有方案的不同。正文部分则描述了具体实现的细节,提供了问题的上下文,以及重构后依旧可能会遇到的问题。并且解释了为什么要重构。

小改动也要提供上下文

Create a Python3 build rule for status.py.

This allows consumers who are already using this as in Python3 to depend on a rule that is next to the original status build rule instead of somewhere in their own tree. It encourages new consumers to use Python3 if they can, instead of Python2, and significantly simplifies some automated build file refactoring tools being worked on currently.

第一句话描述了改动是什么,正文则提供了此次改动的背景信息。 这样读者在阅读时即可了解背景而不用去搜索“为什么要把status.py的Build Rule由Python2 更改到Python3”。

iPhone 11 pro 不专业极简测评

真是浴霸不能

自从ip7之后,我觉得换手机已经不再是一个每年秋季的常规活动了。但是随着我64G的手机被app,照片给填满,换手机又成了我今年的非常规活动。

考虑到5G在纽约还没有大面积铺开。以及就算5G彻底铺开了,其对于手机应用的影响在我来看依旧不大。加上我现在一整套苹果的全家桶用着颇为顺手,于是7月份的时候我就已经准备好买个新苹果了。

20号晚上,我终于喜提了iPhone 11 pro AKA 浴霸手机。

先聊几个比较喜欢的地方:对于第一次用刘海屏的我来说,face id的体验真的很棒。再也不会因为湿手刷不开touch id。真的是 盯~ 然后手机就开了。第二个让我觉得惊艳的就是A13,新手机上Lightroom出图真的是秒出。其三就是三摄的13mm广角效果真的是好,有小鱼眼的效果。最后一点就是每次换手机后都会短暂感受到的续航爆发式提升,一天中度下来手机还剩大概40%的电。

聊过了喜欢的地方,再谈谈不喜欢的地方:第一个ios 13上依旧有很多app没有更新适配好,包括schwab 还会闪退。第二是在刘海屏手机上,依旧有很多app没有做显示适配,所以这些app会有诡异的内容被刘海遮挡现象。第三就是新手机真的沉啊,跑步时放在口袋里打的腿疼。最后就是无home键之后很多手势操作我自己还没适配过来,还没有熟悉很多操作。

最后谈一点相对中立的,就我个人体验来看,iPhone 11 Pro的三摄与我的预期相差很远:除了广角镜头之外,另外两个镜头和iPhone 7 的双摄体验没有太大差别。软件层面上的比如夜景模式等体验也很一般,或者说和我的预期有一定的出入。当然,三个镜头调料的参数强一致也体现了苹果强大的工业水平。

Misc

北大的唱歌也挺好听

最近在搞两个事情,一个是买了 LaMetric然后自己写程序,一个是在听《乐队的夏天》。

LaMetric这个东西真的挺好玩的,给大家种个草,很方便用,又可以DIY。遇上我这个好折腾的主,真是一个好玩具。虽然某人一直怀疑我这个玩具的热度会持续多久。

乐队的夏天里有俩乐队我特别喜欢,一个是大家都爱的新裤子,他们那个别再问我什么是Disco太洗脑了,每次想起来就想问啥是Disco;另一个是Mr.Miss,是少见的人声爵士组合。让我这个爵士乐圈外自封爱好者简直浴霸不能。

说到浴霸,iPhone 新浴霸今晚就可以入手了。本来说我已经过了年年追着手机换的岁数了,但是现在的手机只有64G,基本上装几个常用的app + 照片就满了。公司用的软件都装不下。新手机有512G的我估计可以用个三年吧。顺手又买了Apple Care+。这回可以把常用的app,不常玩的游戏都装个爽了。

说到游戏,最近风花雪月通了之后没啥好游戏玩,不过前几天发现逆转裁判更了中文,又有星际锁链,又有各类动作游戏……别人家游戏烧钱,老任家游戏不仅烧钱还伤肝。

顺便,这回可以好好体验一下apple arcade了,然后等到年底又能体验Stadia。嗯不枉我给Stadia修Bug。