0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux系统坚持30年不变的研发过程,存在哪些弊端和好处?

如意 来源:架构头条 作者:Glauber Costa 2020-10-12 11:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Linux 从诞生至今,已经快有 30 年了。这期间 Linux 一直延续着通过邮件来提交变更、审查、讨论直至批准的研发过程,这一流程非常费时费力,不仅成为新人的进入门槛,也成了可持续生产的障碍。那么,为什么 Linux 一直要坚持遵循这一过程呢,它能带来什么好处?存在哪些弊端?有什么解决办法吗?

在早期,由 Linus 自己手工管理大家贡献的代码,不借助任何版本控制系统。而现在,已经使用 git 了。

然而,有一件事在整个过程中却从来都没有变过:代码被发送到一个(或多个)邮件列表中,然后直到做出最终判定之前,要进行一系列的审查和讨论。

尽管 Linux 是成功的,但这一过程却一直饱受诟病。微软的 Sarah Novotny 最近在社交媒体上发表了一篇文章,称 Linux 所使用的协作工具早已过时,如果这个社区想要吸引新鲜血液,最好换掉这些工具。

我认为我对此有一定的发言权:近十年来,我就在用类似的工作流程为 Linux 和其他项目编写代码。就职于 Red Hat 的时候,我为 core x86 基础设施、KVM 管理程序和 QEMU、Xen 管理程序和其他系统贡献过代码。虽然,我因为把主要精力投入到了 Seastar C++ 框架和 ScyllaDB 数据库上,在大约 7 年的时间里没有过多接触过 Linux,但它们采用的开放方式却与 Linux 非常相似。现在我是一名 Datadog 公司的工程师,该公司遵循的流程与其他网络公司几乎完全不同。

那么我的立场是什么呢?首先,我的态度很明确:我不喜欢 Linux 的开发过程。我坚信,这一过程不仅是进入的门槛,是可持续生产的障碍(尽管并不是因为电子邮件),也是令人产生沮丧情绪的源头。我不打算在任何项目中遵循这一流程,如果我能决定这些项目怎么做的话。

但与此同时,似乎许多对 Linux 过程持批评态度的人认为,它的捍卫者之所以如此顽固地墨守成规,只是因为 Linux 充斥着一些不愿做出改变的坚守者。尽管我相信的确存在这样一些个别人,但事实上真正的原因并非如此。Linux 所遵循的开发过程提供了一些独一无二的重要优势,这些优势对于任何其他组织也均有裨益。

除电子邮件以外,任何其他自以为是的工具化都会迫使 Linux 抛弃这些好处,大家不愿意舍弃的是这些好处,而不是电子邮件。工具化应可以降低进入的门槛,改正过程中那些令人沮丧的方面,同时能够让组织实现 Linux 所具备的真正推进软件开发的好处。

这样的优势有很多,但是由于时间的关系,我会着重来谈其中我认为最重要的那一个。我将尽最大努力向你解释它是什么,为什么尽管它有优点却又如此令人沮丧,为什么它只是对其他组织有益,但对 Linux 却至关重要。

1. 提交消息和补丁

Linux 有一条规则,要求将变更的代码拆分为单独的补丁。每个补丁都必须做一件事,且只做一件事,而且每个补丁都应该有自己的描述性提交消息。提交消息比代码变更本身还要长得多的情况早已司空见惯。

透过这个例子,可以发现大多数组织往往忽视了什么。在 GitHub 上,我看到大多数现代项目的提交信息都类似于“8 月 25 日,检查点”,或者稍微好一点(但也仅仅稍微好一点)的是“实现 X 函数”。如果别人之后需要查看这些代码,将无法理解为什么要按照当时的方式来完成这个变更。有些缺陷非常微妙,而且很容易重复出现。只看简短的、非描述性的提交消息,不一定有人能知道在什么条件下会出现错误。

举个简单的例子,看看我的好朋友 Johannes Weiner 的 Linux 提交,不难想象,一些其他项目可能只会草草写下“删除警告”之类的。而再看看这段信息,阅读它我能知道为什么删除这些警告很安全(说明了当前情况很安全的原因),以及如果我在未来更改这段代码时应该要做些什么。我相信,很多组织也会有人这么做。但是由于 Linux 过程是强制执行的,所以我百分百确信通过阅读提交消息能理解本次变更的所有相关信息。如果我们讨论的是一个 bug,我就会知道它出现在哪些系统,发生在什么条件下,为什么没有影响到其他的系统,以及我应该做些什么来避免再次犯同样的错误。

无论对于哪个组织,这都是值得的:它能使别人(包括将来的你)更容易理解为什么要做这个变更,为什么代码以这种方式运转,这可以使新人更快速地成长,可以防止重复出现相同的 Bug,减少因偷偷挟带无关的代码而造成破坏的风险。

而对于 Linux 来说,这却是至关重要的,原因有两个:

很多人有着不同的背景、来自于不同的公司,这些公司有着不同的动机和议程。公司内部的大型项目可以使用其他机制来传递信息和确保职责。很少有开源项目能像 Linux 那样庞大、长寿,受着这么多人的影响。

Backport:鉴于其规模和重要性,分支一直是 Linux 的常态。即使是现在(2020 年),一些发行版也可能是在它们视为 LTS 的版本上加上自己的补丁。即使现在这种情况相比 2000 年初有所下降,也只是因为 Linux 本身开始有了自己的 LTS 系列,发行版可以以这些版本为基础了。

许多现代线上公司不需要保持产品线的兼容性,通常不存在 Backport 的问题。他们只关心交付即可。但是如果涉及到 Backport,事情就变得比较复杂了。开发人员(很可能不是作者)可能必须要选择如何对代码进行微调,以适应略有不同的、较旧的代码库。若要将风险降至最低,可以只 Backport 大变更的某些部分,大家通常都这么做。假设,一个 2,000 行的代码变更中有 5 行修复了一个 bug。再设,该 bug 的修复可能是在 API 重构之后。你是愿意基于一个大变更来做 Backport 呢,还是愿意基于一个文档非常完善、描述得很充分、做过合理拆分的补丁来做 Backport 呢?作为一个做过无数次 Backport 的人,我很清楚我的选择是什么。

Backport 还是不 Backport 呢,它有好处,但也伴随着阶梯式的成本。现在程序员不仅要关心代码,而且还要关心如何重组和调整这些代码。

其中有一些重组很容易:你可以使用 git add -p 选择哪些部分可以添加到每个变更中。当开始发现代码片段之间出现循环依赖时,就变得有点复杂了。假设有一个函数,它返回的对象类型是以后才引入的。那么你不得不添加一些代码处理这一情况,这些代码最终并不会出现在这个项目中,它们只是作为临时粘合剂。

这一切的一切都很令人沮丧,但却也不是不可避免。假设,你将所有工作都进行了完美分解,使其很容易得以处理。当人们进行代码审查时,就开始出现真正的问题了。任何组织做代码审查都大同小异。大家阅读代码并提出修改建议 (或要求)。

假设,评审意见是我在第一次变更中添加的方法应该有一个额外的参数。再假设,我在以后的所有补丁中都使用了这个方法。

现在我不得不回到第一个补丁添加参数,于是,所有后续的补丁都无法正常使用了。现在我不仅要开动脑筋找出原因,还要手动修正所有的错误。如果我以前已经测试过某个补丁了,那么现在那个测试已经无效了,我必须重新测试。

重组只是一个小问题。但为现有工作重新建立基线是一个真正的大问题。

我希望 Linux 社区和朋友们能够理解:显然,这么做并不是不行。但如果这都不算是进入的门槛,我就不知道什么才是了。大家不得不花费时间、精力、脑力和计算机来重组、重写、返工,没有人想做这些事情。我还发现有时大家会争论:“……但对于优秀的程序员来说会没有问题的”或者“但是它迫使你以这种或那种方式思考,优秀的程序员应该这么思考”,这种观点脱离实际毫无用处:上帝,我刚才已经承认了这个方法的所有好处,并且发现重组这些代码绝对是对灵魂的摧残和折磨。我们以打扫家庭卫生为例:一个人可以随时宣扬保持房间清洁的好处(我完全同意),并且完全有能力用吸尘器打扫房间(我也完全同意),但通常我不会这样做。原因很简单,我还有其他我认为更重要的事情要做。这就是为什么我对我的 Roomba 很满意,它让我实现了保持房间清洁的所有好处,但又不必我亲自动手。这引出了我下面的观点……

但是我也希望 Linux 圈外的人能够理解:Linux 所遵循的过程有着切实的优势。没有一种工具能完全胜任这项任务。以 GitHub 为例,它的工作流程非常好,原则上总是基于现有代码添加新的代码。但它可以强行 push 分支,使 commit 上的评论变得毫无意义,使讨论变得毫无意义。

现代开发工具使许多事情变得更容易:你可以触发动作、集成 CI/CD 流水线、给变更的相关人员发通知等等。但在客观上,它们使得我们更难拆分工作了。纯文本的电子邮件使许多事情变得更麻烦,但它也并不会妨碍施行能得到理想结果的过程。

即使可以客观、准确地说出 Linux 放弃这个过程将赢得多少、将失去什么,仅这一点它就是完美的,有理由继续贯彻这个一直运转良好的过程。

2. 有解决办法吗?

我由衷地相信,如果我们有工具可以让一个组织实现 Linux 过程中同样的好处,那将是每个人的巨大胜利。面对着这样的工具,甚至 Linux 也可能不再使用纯文本电子邮件了。

我不知道这样的工具会是什么样的。但也许我可以大胆地设想一下:

Git 是一个源代码控制系统,本质上源代码控制系统希望添加历史,而不是重写历史。然而,GitHub 中的开发过程却把两者混为一谈了,开发和评审以 git 提交为准,而纯文本 Linux 开发人员是在他们自己的本地 git 树中开发的,不断在重写历史。也许我们需要将其一分为二,允许在单独的工具中进行开发和评审,这样本质上周期会更短暂,代码更容易得到处理。Git 用来存储结果。一个很好的类比是,CSS 允许 HTML 开发人员将表示层与逻辑层分离。还记得 CSS 出现之前的 HTML 吗?不好,我是不是暴露年龄了……

接上述内容继续扩展,可能逐行描述补丁差异会使每件事情都很难开展。我们是否可以有一个系统,在这个系统中,我们可以在更高的层次上描述我对代码所做的那些更改,并明确这些变更能够应用到其他什么地方?例如,我可以说“将 create_bar() 函数移到 create_foo() 之前”或者“在 create_bar() 参数列表最后添加一个名为 y 的整型参数”。即使后续的变更会在代码环境中添加一些东西,破坏了逐行差异,这样系统仍然能够将变更应用到虽被修改但只是版本稍有不同的代码库上。也许我太天真了,这是不可能的,但 GPT-3 取得了一些令人大开眼界的进步,看到这些我觉得可能也并不遥远。

或者如果没有那么大的野心,也许有一种中间解决方案,那就是总是对追加的代码进行代码审查。如果所有部分都得到了认可,那么此时此刻,也仅在此时此刻,历史才被改写。更简单、更易用的工具可以帮助维护者确保与已批准的代码不存在差异,以核实所做的变更都是围绕重组进行的。
责编AJX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217972
  • 操作系统
    +关注

    关注

    37

    文章

    7328

    浏览量

    128628
  • 电子邮件
    +关注

    关注

    0

    文章

    110

    浏览量

    15672
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    变电站视频及环境监控系统:建立多维感知防护体系

    为什么现在的变电站从有人值守转变为无人值守?无人值守的好处在哪里?其弊端又是什么呢? 随着智能化技术和自动化设备的快速发展,现代变电站正逐步实现从传统的有人值守向无人值守的转变。无人值守变电站通过
    的头像 发表于 11-05 18:17 1067次阅读

    芯片研发过程中的两种流片方式

    芯片在研发过程中一般包含4个阶段:芯片设计、生产样片、测试验证和大规模量产。在完成芯片设计后,工程师们需要先拿到一些芯片样片,用它们进行测试和验证,来判断新研发的芯片在功能和性能上是否符合设计要求
    的头像 发表于 09-09 15:04 1118次阅读
    芯片<b class='flag-5'>研发过程</b>中的两种流片方式

    Linux系统性能优化技巧

    经过10一线运维经验,我发现大多数工程师只掌握了Linux优化的冰山一角。今天分享的这些秘技,能让你的系统性能提升200%以上!
    的头像 发表于 08-27 14:34 629次阅读

    Linux系统性能调优方案

    关键要点预览:本文将深入解析Linux系统性能瓶颈的根本原因,提供可直接落地的调优方案,让你的系统性能提升30-50%!
    的头像 发表于 08-06 17:49 589次阅读

    华为工程师总结Linux笔记

    30 过去了,我们收获了什么,得到了什么,到底是在追求什么?方向又在哪里呢? 在生活中各种挫折、感情、生活以及很多零碎的事情,让我们很难静下心来学习,当我们某天突然惊醒,年少已不在。所以今天就下
    发表于 07-14 15:28

    请问节点上蓝牙网状网络的信息保存在哪里?

    另一个带有 “Mesh Demo Dimmer Self Config” 示例的目标时,它必须保存网络数据。 但是,我想知道它保存在哪里,以及哪个函数负责保存数据。 我已经搜索过它,但我 CAN找不到它。 当 “网状演示嵌入式配置器” 连接到网络时也是如此;我不知道网络数据保存在
    发表于 07-04 06:22

    使用CY7C65213开发过程中,应该用哪个interface进行uart通信?

    在使用CY7C65213开发过程中,我想用CyUartRead读数据,但是好像没有接口的deviceType是CY_TYPE_UART,想请问我应该用哪个interface进行uart通信? 是否有相关指导文件,或描述符指导?
    发表于 06-03 07:04

    如何坚持做难而正确的芯片研发

    如果一件事在别人眼中是坐冷板凳,是做脏活、累活,你是否还会坚持做下去呢?以下视频来源于格致论道讲坛石侃·中国科学院计算技术研究所副研究员格致论道第117期|20251月18日北京大家好,我是来自
    的头像 发表于 04-18 10:01 989次阅读
    如何<b class='flag-5'>坚持</b>做难而正确的芯片<b class='flag-5'>研发</b>?

    鸿道Intewell操作系统Linux实时拓展方案

    鸿道Intewell操作系统是科东软件自主研发的新型工业实时操作系统,历经30多年研发积累,采用业界领先的微内核架构,具备高实时、高安全及强
    的头像 发表于 02-27 10:08 617次阅读
    鸿道Intewell操作<b class='flag-5'>系统</b>的<b class='flag-5'>Linux</b>实时拓展方案

    linux下开发过程中, DLP4500 GUI无法连接光机怎么解决?

    linux下开发过程中, DLP4500 GUI 无法连接光机,出现错误提示如下: open device_handle error: Is a directory opening path
    发表于 02-20 08:41

    MES系统对SMT贴片线管理的好处

    MES(制造执行系统)对 SMT(表面贴装技术)贴片线管理具有以下诸多好处: 1. 实时监控与追溯:能够实时掌握 SMT 贴片线的生产状态,对产品的生产过程进行精确追溯,快速定位问题环节。 2.
    的头像 发表于 02-08 11:35 657次阅读

    如何在日常开发过程中提高代码质量

    。 提高代码质量是一个系统工程,本文主要介绍开发人员如何在日常开发过程中提高代码质量。 01 什么是代码质量? 代码质量一般用于衡量代码的“好”和“烂”:“好”代码表示代码质量高,“烂”代码表示代码质量低。虽然目前
    的头像 发表于 01-23 09:09 1027次阅读
    如何在日常开<b class='flag-5'>发过程</b>中提高代码质量

    充分考虑设备的体验性易用性 蓝鹏设计部将这一理念贯穿于整个研发过程

    关键字:蓝鹏测控设计部,蓝鹏测控测径仪,蓝鹏测控专利,测径仪专利, 蓝鹏设计部在研发过程中充分考虑设备的体验性和易用性,这一理念对于提升产品的市场竞争力具有重要意义。 蓝鹏设计部在研发设备时,始终
    发表于 12-24 14:07

    深入探讨Linux系统中的动态链接库机制

    本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。 引言 在软件开发过程中,动态库链接问题时常出现,这可能导致符号冲突,从而引起程序运行
    的头像 发表于 12-18 10:06 934次阅读
    深入探讨<b class='flag-5'>Linux</b><b class='flag-5'>系统</b>中的动态链接库机制

    DAC3482存在杂散怎么解决?

    了一块故障单板,发现故障单板近端依旧存在杂散 2、将故障单板和好的单板的DAC3482_DIGVDD_1V2的电源芯片(TPS74801)对调后测试,发现好的单板和故障单板近端都出现了杂散 2)之后将电源
    发表于 12-16 06:23