LinusTorvalds谈软件开发管理经验
2011-10-14 14:54:20 阿炯

Linus Torvalds说,有两件事,世界上大都数人,无论是独立开发者还是公司级别的开发团队,都有普遍的错误认知。

其一:“大都数人认为可以把事情丢给其他人,让他们帮忙。在你公开你的想法后,你得假设自己一个人要干完全部的活,然后你在网上征求人们的意见,你应该询问自己该干什么,而不是他们该干什么。或许开始他们会偶尔帮助你解决一些实际问题,但是,必须从一开始就告诉自己这份工作只有你一个人负责,并且做好完成它的准备。”

如果你一开始就认为全世界的人们都会联合起来为你的项目工作,一起创造一个更美好的世界,那么你可能不会走得很远。

其二:“人们往往认为自己写的代码是最重要的东西,而事实不是这样。即使你编写了100%的代码;即使你是世界上最好的程序员并且从来不需要任何帮助。然而最重要的东西也不是你写的代码,而是代码的用户。代码本身不重要;只有当用户真正用到它的时候项目才是有用的。之所以提到这一点是因为它不只是一个程序员的问题,我见过一些公司把追求完美的程序当做事情的全部。”

Torvalds就第二个问题上继续展开言论,他说:“这就是为什么Linux内核团队无法容忍这种‘脱离本质’的东西。比如,为了“修复”某个问题而打破原来的用户体验绝对是错误的观点;千万不要这么干。如果你破坏了用户体验,或许你觉得是在修复问题,但你就犯了刚才说到的第二个错误——你以为代码质量比用户重要,大错特错。”

Torvalds最后总结道:“有太多的项目将代码质量置于用户之上,结果两边都不讨好,而且还不肯承认错误,因为他们觉得是在“修复”问题,并且一点都没错。”

关于开发工具的重要性

关于SCM(Software Configuration Management软件配置管理系统 )工具,比如,以Git版本控制系统的问题为例,他回答说:“我不认为工具是最重要的。”

“现在重要的是你的项目是否有一个好的工作流程,工具当然能够启到帮助的作用,”他说,“但是,大多数的项目其实并不是必须要使用这些工具。许多项目其实并没有那么多改动,多到必须要在他们整个工作流程中使用这些工具;如果你在每个release中只有几百个补丁,你可以随便怎么维护他们,完全手动也不是问题。”

当然,Linux就绝对不是同一个层次的了,“对于内核,我们每个release都有成千上万个补丁,而且基本上每三个月就有一个release,所以对我们来说SCM工具就尤其重要了。”他说,“但我仍然不认为这所有大的错误是因为最初几年开发的目标球和补丁,这是一个小得多的项目,而且直到很多年后是因为缺乏管理工具才显现出来。”

他还说,“一些工具积极鼓励工作流程,我认为CVS(Concurrent Versions System并发版本控制系统)”例如已经影响了很多项目,使他们有了一个概念“承诺团体”,

Torvalds继续说,“我个人认为tar-balls和补丁相比他来说要好得多,因为他们使开发者都是“平等”的。而且你不会遇到这种情况:一些开发者有委员权限而其他的人都是二级权限。有时全部人都只有二等权限要比有人有特权要好得多。”(注:Torvalds很熟悉CVS很而且非常讨厌有很多年时间了。就如他在Google Talk 2007所说的,“我讨厌带着许可证的CVS”。)Torvalds还说:“比工具更重要的是人,是维护者和他们的思想。”

如何把大家都保持在正轨上

现在的人们是怎么一起工作的呢?我向Torvalds提问了关于正在实施中的LKML(Linux Kernel Mailing List ,用来将讨论话题转发给各位开发者。)他回答说:“我认为过去在LKML上发生的讨论比现在的多。LKML中的signal-to-noise和纯信息量表明大多数开发者没有时间仔细地去读LKML——最多他们会扫一下标题栏。所以,现在我主张大多数开发者都在独自完成工作,然后他们会在一个大的开发者范围中发送email告之对方是如何完成的”。

“并不是说LKML不重要,而是说LKML已经成为了独立开发者的公共纽带。所以事情最后会变成这样:你其实只有4-5个人一同参与一个讨论,但是LKML会转发并且让其他人有机会能够参加进来,而不是让他成为一个封闭的讨论。”

接下来说说它怎么工作的,“大多数人其实不阅读LKML,他们经常让它自动存档,只对某几个关键词或关键人物参与的话题感兴趣。”它其实有点类似于某种存档机制。人们可以在日后查阅它,而且很多Bug可以通过Google找到LKML中以前报道的记录。如果某人提出了一个问题,它可能只是个别硬件问题,但如果Google后发现在LKML中已经被提交过几次了,那这个问题原因会有点不确定,但必然不是个案。”

“所以我认为LKML非常重要,但我们不是通过它来保持人们走在正轨上的。所有的开发者都非常主动积极,而且他们都有非常好的意见和想法(核心成员之所以是核心成员因为他们的自我定位)。LKML很重要,因为这是公开讨论的,即使实际中参与某些特定问题的只有特定的一小组人。在开源项目中事情就是和其他不一样。”Torvalds总结道。

关于信任,托付和保持清醒

曾经Linux是一个个人项目。现在他有成千上万的提交者和贡献者。接下来我问道:“现在有多少工作你是交付给其他人做的?对于如何分配才能保持人们思路清晰和遵循工作流程你有什么想法?”

“如果我从中学到了什么的话,那就是你必须学会放手,不要试图控制别人和他们的代码。如果你不信任别人,而一定要监视着他们的话,还是早点放弃这个负责人位置吧。”

他说:“是的,我经常会跟别人纠结一些细节,但不是因为我不信任别人或不愿分配给他们权限。而是因为一些小错误最后会闹到我头上。要么是个 Bug(而且都是一些平时忽视的小错误),要么是一些把我弄烦了的工作流程问题(就像今天早些时候我向一个分负责人抱怨开发者的名字显示不正常)。”

Torvalds还说,“你只能偶尔关注一下细节,而不是老是站在开发者后面监视他、检查他写的每一句代码。我相信分负责人做的事99%都是没问题的,然后偶尔我会大声抱怨一些东西。”比如说GNOME桌面系统正在怎么改进,或者根本没有改进。

以上就是全部内容了。这就是Torvalds怎么做的,如果你觉得你比他好,先问问自己:有创造过一个在大多数超级计算机、股票交易和类似于 Google这样的网站上运行的世界级的操作系统吗?如果你的答案是没有,如果我是你,我会重新读一遍他的答案并且好好想想自己是怎么维护项目的。

一个干净代码库的关键并不是什么类型的语言,而是维护这个代码库的人和团队,无论是设计得多么良好的代码库,用了多么先进的编程语言,如果守不住当初的原则,最终的结果就是代码腐化。

第一,C语言虽然是面向过程的语言,但是却可以实现面向对象的各个特性。C不是一个面向对象的语言,但是Linux内核却是一个面向对象的程序,到处都能看到虚函数表,内核甚至有元编程。

第二,越大型的项目越需要优秀的设计,Linux内核由以Linus为首的一大批大牛维护,在这一点上做得非常好。

第三,Linux代码库的厉害之处就在于此,一群非常优秀和有经验的程序员对代码结构和风格做了严格的定义,在Review中坚决执行。


Linus 再次严辞拒绝 Intel CPU 漏洞补丁

2020年6月,Linux 内核项目负责人 Linus Torvalds 拒绝了 AWS 工程师提交的一个补丁,该补丁的目的是减轻 Intel CPU 遭遇一种新型窥探攻击而导致数据泄露的风险。

这种新型攻击名为“探听辅助 L1 数据采样攻击”,简称 Snoop (CVE-2020-0550)。今年 3 月,来自 AWS 的软件工程师 Pawel Wieczorkiewicz 率先发现了 Intel 处理器的这一漏洞,它可能会泄露 CPU 内部存储器或缓存中的数据,涉及 CPU 包括 Intel 旗下流行的 Xeon 和 Core 系列处理器。Pawel 迅速向 Intel 报告了此问题,随后该漏洞被 Intel 定位为中等严重性漏洞。

新的 Snoop 攻击利用了 Intel CPU 多级缓存、缓存一致性和总线监听等特性,通过位于 CPU 内核中的一级数据缓存(L1D),通过“总线监听”(bus snooping)功能 —— 在 L1D 中修改数据时发生的缓存更新操作,将数据从 CPU 中泄漏出来。

以近代 CPU 的视角来说,计算机通常会采用三级缓存的设计来提高 CPU 的运行效率。三级缓存包括 L1 一级缓存、L2 二级缓存、L3 三级缓存,这些缓存都集成在 CPU 内,它们的作用是作为 CPU 与主内存之间的高速数据缓冲区。其中 L1 最靠近 CPU 核心;L2其次;L3再次。运行速度方面:L1最快、L2次快、L3最慢;容量大小方面:L1最小、L2较大、L3最大。在执行一项任务时,CPU 会先在最快的 L1 中寻找需要的数据,找不到再去找次快的 L2,还找不到再去找 L3,L3 都没有才去内存找。

而一级缓存其实还分为一级数据缓存(Data Cache,D-Cache,L1D)和一级指令缓存(Instruction Cache,I-Cache,L1I),分别用于存放数据及执行数据的指令解码,两者可同时被CPU 访问,减少了 CPU 多核心、多线程争用缓存造成的冲突,提高了处理器的性能。一般CPU 的 L1I 和 L1D 具备相同的容量,例如 I7-8700K 的 L1 即为 32KB+32KB。Snoop 攻击就是一种窃取 L1D 缓存中数据的攻击手段。

不过 Intel 的用户也不用惊慌,据 Intel 官方解释说,这种新攻击「很难实施」,并且不会泄露大量数据,毕竟 L1D 缓存中的数据非常有限,并且只有在任务运行时调用数据的短暂时间内才会存在。“我们不认为 Snoop 攻击在可信赖的操作系统环境下是一种实用的攻击方法,因为要利用这一漏洞需要同时满足很多苛刻的条件,比如攻击的时间要正好与用户打开程序的时间吻合,且程序调用的数据正好是攻击者想要窃取的数据。”

该漏洞披露之后,另一位来自 AWS 的软件工程师 Balbir Singh 为 Linux 内核提交了一个补丁,该补丁使 Linux 的应用程序能够选择在任务切换时自动刷新 L1D 的缓存,以降低 Linux 系统遭遇 Snoop 攻击的风险。

Singh 在 4 月份曾解释说:“这个补丁可以防止他们的数据在任务结束后被监听或通过旁道泄露。”他原本打算该补丁可以随 Linux 内核的 5.8 版一起发布。“如果硬件支持,该特性将允许基于可选加入的应用程序调用 prctl() 功能来刷新任务关闭后残留在 CPU 中的 L1D 缓存。”  但知名技术测试网站 Phoronix 指出,在任务结束后刷新 L1D 缓存会导致 CPU 的性能降低。Linux 内核项目负责人 Linus Torvalds 认为,这将导致使用该补丁的所有 Linux 用户(无论是否采用 Intel CPU)的 CPU 性能降低,严正拒绝了该补丁。

Torvalds 在回复该提交的邮件列表中写道:“因为在我看来,这基本上是将缓存刷新指令导出到用户空间,并为进程提供了一种方式,可以说让与这事情无关的其他人也慢了下来。”

“换言之,据我所知,这就是疯狂的 Intel 发布了有缺陷的 CPU,它给虚拟化代码带来了问题(我对此并不太在意),但现在要因为它的问题影响到本来就没有这些问题的 Linux 用户,这是完全没有意义的” 。“我不想某个应用程序跑起来就像在说 ‘哦,我是一个特别的,漂亮的,如此娇嫩的花,我想刷新 L1D 上的每一个任务缓存,无论我在什么 CPU 上,无论它是否有漏洞’。因为这个应用程序不仅会降低自身速度,还会降低其他应用程序的速度。”

在一番非常 Linus 式的回复下,Linus 对虚拟化的引用其实也是针对 AWS 的,AWS 和其他云服务提供商一样,销售的虚拟 cpu 通常启用了同步多线程(simultaneous multithreading,SMT)功能。Linus 接着指出,“在启用 SMT 的情况下,任务调度是分布式进行的,所以说,在任务结束与新任务开始之间刷新 L1D 缓存是非常愚蠢的。”

值得一提的是,AWS 的首席工程师 Benjamin Herrenschmidt 在与 Red Hat Linux 内核贡献者 Ingo Molnar 的讨论中也为该补丁的争论添加了一些背景。Herrenschmidt 承认这个补丁对 SMT 来说毫无意义,但他敦促 Linux 内核开发人员不要“把婴儿和洗澡水一起扔掉”,并反驳了这个补丁是因为 AWS 想把超线程作为虚拟 cpu 出售的说法。Herrenschmidt 说,“这些补丁并不是要解决运行 SMT 的客户 VM 内部出现的问题,也不是要保护 VM 免受同一系统上其他 VM 的攻击。”

事实上,Linus 已经不是第一次严辞拒绝与 Intel CPU 有关的补丁。在 2018 年初,为了修补 Spectre 漏洞,Intel 工程师提供了一个间接分支限制推测(indirect branch restricted speculation, IBRS)功能的补丁。Linus 当时就在邮件列表中公开指出 IBRS 会造成系统性能大幅降低,直言该补丁“就是彻彻底底的垃圾”,“Intel 真的要做这个 X 一样的东西?” 一顿口吐芬芳。而就在上个月,Linus 对自己的私人电脑进行了升级,同时公开了自己最新的主力机器配置,他把自己的 CPU 换成了 AMD Ryzen Threadripper ,放弃使用了 15 年的 Intel 处理器。


Linus Torvalds出席2022开源峰会并发表演讲 对Linux的热情30多年未减

在工作了 30 年后,Linux 之父 Linus Torvalds 依然对这款开源操作操作和未来的创新前景充满了热情。时至今日,Linux 已经成为云计算、边缘、嵌入式和物联网等技术的重要基础,为全球数十亿台设备提供着底层支撑。而从一个开发的贡献者社区,到每 6~10 周更新一轮内核版本,Torvalds 一直肩负着主要的审订职责。


Linus Torvalds 在 2022 开源峰会活动上发言

在今日的开源峰会活动中,Torvalds 与老朋友 Dirk Hohndel(Cardano 基金会首席执行官)再聚首,畅谈了从开源安全到新技术、以及大流行对 Linux 开发的影响。

Torvalds 指出,COVID-19 无疑对 Linux 社区中的许多人产生了负面影响,但情况没有往坏的方向蔓延太久。 在严格防疫的头几个月,Linux 开发者的生产力反而有所提升。毕竟他们已经习惯了电邮沟通,且大多数人都已采取居家办公的方式。其次,过去 15 年里,Linux 内核开发一直保持着相对不变。2005 年的时候,Torvalds 创建了开源的 Git 版本控制系统,以帮助实现更快、更优化的开发方法。

经过数年发展,Git 已经成为了各种开源开发项目的一项主要推动力,并为开源代码托管平台 GitHub 等服务提供着支持。

我们有着一以贯之的流程和发布时间表,从这个意义上来说,Linux 内核开发一直波澜不惊。我们希望有一个稳定的流程,这样大家就不会对所有基础设施的变化感到不安。更重要的是,在为 Linux 工作 30 多年后,尽管开发过程有些乏味、且事态基本上都可预测,Torvalds 还是对内核中不断涌现的新鲜事物感到惊讶和高兴,且其中不乏大量创新。近期 Linux 的一大变化,就是引入使用开源 Rust 编程语言开发的代码。Torvalds 表示 ——“Rust 可能会包含在下一个 Linux 内核版本中”—— 这句话在会上引来了热烈的掌声。

Linux 内核代码主要由 C 语言编写,但 Rust 能够更好地利用和保护计算机的内存资源。不过在初期,Linux 内核仅会以相当有限的方式来试水 Rust 。 Torvalds 向观众提醒道 —— 25 年前,他曾尝试用 C++ 对 Linux 内核加以修复,可惜最终还是以失败告终。 此外对于技术人员想要尝试的一些新奇有趣事物,Torvalds 认为还是悠着点来为好。

然后话题转到了最近大家颇为关注的开源安全上,Linux 基金会旗下的开源软件基金会(OpenSSF)早前表示,他们将话费 1.5 亿美元来保护开源软件的安全。而今早的一篇报道指出,大家对开源的整体安全性仍缺乏足够的信心。对此,Torvalds 并不奢望包括 Linux 内核在内的开源软件都可做到永远 100% 安全且无 Bug 。

错误总是难免,如果它们不在硬件层面上出现,软件层面也有很高的概率发生。 即使你自家软件表现稳妥,其他人的软件也不见得如此。 想要获得充分的保障,唯一可行的就是构建一套安全层。Torvalds 强调,Linux 内核只是整个应用程序堆栈的其中一层。在内核底部,进程的不同部分已具有多层安全性。对于构建整个应用程序堆栈的开发者来说,对战中的每一层都需要有一些概念 —— 如果存在安全漏洞该怎么办?以及在应用程序代码的上下层中存在漏洞的话又该怎么补救?

任何认为自己可以获得 100% 安全性的人们,都生活在其梦想的某个世界中,但现实并不是那样如你所愿的。


Linus Torvalds 谈内核社区 “老龄化” 问题

Linus Torvalds 2023年12月出席了 Linux 基金会的日本开源峰会,并与他的好友、Verizon 开源负责人 Dirk Hohndel 谈及了 Linux 的现状。

两人首先谈到了 Linux 内核版本的迭代。Linus 在飞往东京参会前发布了 Linux 6.7 的第四个候选版本,预计稳定版将在避免大家节假日加班的前提下,在圣诞节前后正式发布。他不想在 "圣诞节前后出现合并窗口,因为这会破坏我的圣诞节"。为了让准备 6.8 版本的维护人员和开发人员放心,合并窗口将推迟一到两周再打开。


就经常被提及的内核维护人员疲态和压力问题,Linus 首先否认了维护者必须是一个 “无所不能的超级开发者” 角色的说法,“要成为一名维护者,你必须有一定的品味来评判其他人的代码。其中一些可能是天生的,但大多数都需要后天的练习。你必须能够审视其他人的代码,并能够判断 ' 这是一个好方法还是一个坏方法?' 而这通常只是一个多年经验的问题。”

Linus 指出,Linux 内核现在确实拥有一些优秀的维护者。但问题在于,大家基本需要保持一个随时在线的工作状态,无法自由的安排假期,除非是可以找到能换班的其他维护者。对 Linus 自己来说,因为热爱所以保持在线不是什么问题,然而并不是所有人都能和他一样。“几个月前,我去度假的时候也带着笔记本电脑。如果没有笔记本电脑,我会觉得很无聊。这就是我的工作。但我意识到,这不是每个人都能过的生活,尤其是当你必须为之付出多年心血的时候。”

事实上,人际关系的处理也是 Linus 需要继续学习的方面。“写代码很容易。因为有确定的正确答案和错误答案。但人际关系很难,要试着与其他开发人员和维护人员一起和谐工作,尤其是当维护人员的工作目标各不相同时...... 这可能会带来很大的压力。”Linus 表示,自己的火爆脾气已经有所收敛。在吸取了一些教训之后,他已经不会再 “对一些公司竖中指” 了。

总的来说,他认为开源不仅仅是编程问题,很多时候也与交流有关。“维护者是翻译者。我指的不一定是语言,我的意思是上下文、代码的原因。这是一项艰巨的工作。但是,如果你想成为一名维护者,相信我,顶层还有空间。”

此外,Linus 还回答了一个 “Linux 内核社区的老龄化” 的问题。Hohndel 指出,如果把目光投向未来五年,很多顶级 Linux 内核人员将开始步入 60 多岁,第一批人员甚至已经接近 70 多岁。对此 Linus 坦承道," 我们中的很多人确实都已经白发苍苍了。但部分原因在于,我们的维护者已经工作了 30 多年。他们仍然存在、仍很活跃,最终仍将与我同在。We have a community where people do stick around"。

Linus 也赞同了 Hohndel 有关内核社区的老化是一把 “双刃剑” 的说法。并以 Rust 举例称:"我喜欢内核 Rust 方面的一点是,有一位维护者明显比大多数维护者年轻得多。我们可以清楚地看到,内核中的某些领域引入了更多的年轻人。例如,在驱动程序方面,你会更容易找到年轻人,而这也是我们培养大量维护者的传统方式,包括 Greg。"

双方还谈到了 Rust 语言在 Linux 内核中的应用。Linus 称:“它一直在增长,但我们还没有任何内核部分真正依赖于 Rust。对我来说,Rust 是具有技术意义的事物之一,但对我个人来说,更重要的是作为内核和开发人员,我们不能停滞不前。”

他透露,2024年将在内核中开始集成驱动程序,甚至一些主要的子系统也将开始积极使用 Rust。并表示想让 Rust 成为内核的重要组成部分,还需数年的时间。“但它肯定会成为内核的一部分”。

正在风头上的人工智能大语言模型(LLM)自然也得到了 Linus  的关注。但 Linus 并不担心 AI 威胁,"很明显,自动化一直在帮助人们编写代码。这根本不是什么新鲜事。"

他反而更希望 AI 工具能提供真正的帮助,譬如识别一些愚蠢且低级的错误。“我们实际上需要加强自动更正功能。我认为 AI 是一种可以帮助我们做得更好的工具。”

而 AI 所存在的幻觉问题在 Linus 的眼中就更不值一提了。他颇带讽刺意味的回答称,"我每天都能看到一些在没有 AI 的情况下所犯的错。所以我才不那么担心。我认为,我们自己犯错误的能力还不错。"

最后,Linus 还表达了自己对开源和开放性的概念被越来越多的人所接受的欣喜。

“我特别喜欢这一事实,因为我还记得三十年前我启动这个项目时的情景,人们会问我:' 为什么?' 人们会说,' 但你怎么赚钱?' 现在,这个问题再也不会出现了。开放已经成为行业的标准。人们理所当然地认为,当你必须开展大型项目时,无论是编程还是数据,最终都会因为项目太大而需要在公司之间共享。”