如何向欧拉操作系统社区提交一个好 PR?
什么是 PR?借用知乎上的一个回答:用类比的方法来解释一下 pull reqeust。想想我们中学考试,老师改卷的场景吧。你做的试卷就像仓库,你的试卷肯定会有很多错误,就相当于程序里的 bug。老师把你的试卷拿过来,相当于先 fork。在你的卷子上做一些修改批注,相当于 git commit。最后把改好的试卷给你,相当于发 pull request,你拿到试卷重新改正错误,相当于 merge。
pull request 简称为 PR,在不同的系统中 PR 有不同的名字,有些系统中使用 MR 即 merged request 来表示 PR。
以 Gitee 为例,一个 PR 由以下几部分:标题、内容以及其评论、提交的代码和文件组成。
为什么说 PR 很重要?
首先,PR 是质量保证体系的基石。因为 PR 是真正合入代码,合入更新的入口,直接影响到项目最终交付件的质量。
其次,PR 是大规模协作开发的基石。欧拉社区的协作是在一个互不相见的“虚拟世界”,PR 几乎是大家交流最重要的通道了。是一种“交流”的语言。
最后,由于社区不会删除任何的 PR,每一个 PR 都记录在历史中,是社区文化的传承载体之一。PR 的规范与否将会成为社区的一种社区文化,对社区的发展起着至关重要的作用。
糟糕的 PR 是什么样子?
既然 PR 如此重要,那么我们应该如何提交一个好的 PR 呢?在回答这个问题之前,先给大家看一下一个糟糕的 PR 是怎样的。
通过上面这个示例展示的是最糟糕的 PR 了,我们从 PR 标题可以看到,这是是一个要添加 zhongkeyi 作为一个 Maintainer 的 PR。PR 的内容几乎就是把标题复制了一遍,没有其他任何有效信息。
那么如何将这个非常糟糕的 PR,变成一个符合社区 PR 提交规范的 PR 呢?以下几个方面供参考:
-
标题只讲了添加 zhongkeyi 这个 Maintainer,需要讲清楚为什么要添加这个 Maintainer。 -
目前该 SIG 组的项目并不是很多,Maintainer 已经足够多了,为什么还要引入这个 Maintainer ? -
这个 Maintainer 在后续项目中的分工和工作是什么?
以上这些信息都需要在 PR 中讲清楚。我将这些信息反馈给提交的 PR 的开发者,得到了如下的回复:
-
目前该 SIG 组有两个 Maintainer 负责硬件加速模块,新加入的 Maintainer 和 SIG 组的其他两个人负责软件加速。 -
后续考虑增加压缩库、hyperscan 等迁移工作,然后拓展其他项目,并且这位 Maintainer 非常积极,所以申请将他增加为 Maintainer。
这是非常糟糕的一类 PR 了,开局一个标题,其他全靠猜。
接下来让我们看一下第二个例子。
上面这个 PR 的标题完整,PR 的内容也对要建仓的这个软件做了一些比较简短的描述,对于该软件的用途也做了简短的说明,看起来没有任何问题。
但是既然是要创建一个软件仓库,那么首先要回答的一个问题就是:为什么要建立这个仓库?是对这个软件有重量级的开发需求?现在加入的是 GCC 10.3 ,那么以后的 GCC 11.3 的时候,是不是还是要建仓?是不是通过分支来进行版本控制更为稳妥,而不是一个版本建立一个仓库 。
让我们看一下第三个例子。
这个 PR 看起来几乎是一个完美的 PR,标题描述清晰、内容描述详实,PR 关联的 issue 也都完整。
从 PR 情况来看,这个软件不错,但是需要回答另外一个问题:为什么要引入这个软件,软件好显然不是一个理由,因为好软件成千上万,为什么我们要单单引入这个软件?
从 PR 的提交者的回复来看,这个软件是来自于中国邮政的一个业务需求。需要欧拉操作系统合入并且做一些适配工作。把这段话加入到 PR 的开头,就是一个非常完美的 PR 了。
糟糕的 PR 带来的影响
一个糟糕的 PR 必然会:
-
使工作效率降低,增加了无畏的资源消耗。 -
延长审批的时间,增加 commiter 和 Maintainer 双向不满。 -
会影响发行版的质量。 -
极大增加了工程师白头、秃头和肥胖性工伤的几率。
总结:如何写一个好的 PR?
总结一下,如果你想让自己提交的 PR 快速让 Maintainer 合入,以下几点你可以尝试一下:
-
一个 PR 对应一件事儿,不要把不同的事情放在一个 PR 中,保持 PR 的总结。举个例子:你不能把增加 Maintainer 和增加软件仓这两件事儿放到一个 PR 中,这种 PR 的一定会被拒绝掉的。 -
PR 首先要说清楚“为什么”。为什么会提交这个 PR?这个 PR 解决了什么问题? -
PR 中的描述要清晰明了,讲清楚 commit 中的要点。 -
最好采用分行等形式将 PR 整理清楚,便于阅读。 -
一般来说,一个 PR 必须要有一个 issue 对应。这样才能够形成需求和开发代码之间的对应关系。
下面让我们来看一个比较好的 PR 的例子。
从上面那个 PR 可以看到:
-
标题很清晰:更新安全委员会成员名单和例会周期 -
可读性很好:分了三段,每一部分做了什么都很清晰。 -
需要谁来检视写得很清楚。
总的来说,一个 PR 写得好的码农未必能成长为一个伟大的码农,但是一个 PR 写不好的码农注定无法成为一个伟大的码农。
让我们从写好每一个 PR 开始。
参考:
1. https://www.zhihu.com/question/21682976/answer/79489643
本文分享自微信公众号 - openEuler(openEulercommunity)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用 perf 解决 JDK8 小版本升级后性能下降的问题【毕昇JDK技术剖析 · 第 1 期】
编者按:在升级 JDK8U 的小版本后(从 8u74 升级到 8u202),遇到性能剧烈下降的问题(性能下降 13 倍)。该应用是一个非常简单的 Web 应用,且应用在 JDK 升级前后并无任何发布修复。通常来说 JDK 小版本升级都是问题修改,不影响功能和性能使用,而应用性能剧烈下降一定是 JDK 的内部 bug。对于这样明确由 JDK 引起的性能问题,该如何解决?最常见的方法是通过工具分析 JVM 执行过程,检查函数执行的情况是否发生变化,如果找到变化,则可以深入分析哪些因素引起了变化,并进一步得到根因。笔者使用 perf 工具分析 JVM 执行时的热点函数,并对出现问题的函数进行剖析,使用函数插桩来分析函数的执行次数,发现不同版本行为差异的根源,并找到了引起问题的根因。希望读者遇到性能问题时可以参照本文使用 perf 工具对问题进行定位。 工欲善其事,必先利其器。程序员在定位性能瓶颈的时候,要是有一个趁手的性能调优工具,能一针见血地指出程序的性能问题,可谓事半功倍。 Linux 中最常用的性能调优工具 Perf(Linux 系统原生提供的性能分析工具),使用 perf 先对应用(...
- 下一篇
StratoVirt:下一代轻量级虚拟化VMM
StratoVirt 是什么 Strato,取自 stratosphere,意指地球大气层中的平流层,大气层可以保护地球不受外界环境侵害,而平流层则是大气层中最稳定的一层;类似的,虚拟化技术是操作系统平台之上的隔离层,既能保护操作系统平台不受上层恶意应用的破坏,又能为正常应用提供稳定可靠的运行环境;以 Strato 入名,寓意为保护 openEuler 平台上业务平稳运行的轻薄保护层。同时,Strato 也承载了项目的愿景与未来:轻量、灵活、 安全和完整的保护能力。 StratoVirt 是计算产业中面向云数据中心的企业级虚拟化VMM,实现了一套架构统一支持虚拟机、容器、Serverless 三种场景,在轻量低噪、软硬协同、安全等方面具备关键技术竞争优势。StratoVirt 在架构设计和接口上预留了组件化拼装的能力和接口,StratoVirt 可以按需灵活组装高级特性直至演化到支持标准虚拟化,在特性需求、应用场景和轻快灵巧之间找到最佳的平衡点。 为什么选择 Rust 在项目成立初期,我们调研了业界成熟基于 C 语言开发的虚拟化软件-QEMU,统计了在过去十几年中 QEMU 的 CVE...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7,CentOS8安装Elasticsearch6.8.6
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装Docker,最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境