linux开发者的一天

Linux内核是一项浩大的工程,在全球拥有众多贡献者。她广泛的用途和领先的优势每天源源不断地吸引新的用户加入她的阵营。可是有时候用户会发现代码中存在问题,还有些用户会觉得必须在内核添加他们自己的功能才能满足需求。无论你是一个需要帮助的用户还是一个想要增强内核功能的开发者,知道linux社区里有些什么人以及他们是怎样工作的都是有好处的。

本文为linux初学者介绍linux社区的特性以及各个开发者在其中所扮演的角色。本文还将着重介绍每天linux开发者从事的日常工作,并对这些工作是如何在社区里开展的做一个概要介绍。

1 引言

你是否想知道linux内核开发者是怎样度过他们一天的?我相信很多人会浮现出这样一个场景:在母亲地下室的角落里,一个脸色苍白,胡子拉碴,穿着拖鞋的家伙笼罩在LCD屏幕发出的光罩里,驱动程序,调度器和内存分配器的C代码源源不断地从他指尖缓缓流出。这幅图景不能说完全不对,可是相对整个个社区来说,只能算是冰山一角。先不说参与者自身的千差万别,单单是其中形形色色的角色就远远不止一个远离阳光的开发者那么简单。

1.1 为什么感兴趣

你也许会问,那又怎么样?很多人只满足于使用Linux(无论直接还是间接)而不关心诸如它是怎么演变而来的或它是怎样持续发展的之类的细节问题。可是一件事情你必须知道,Linux内核是一个拥有数百万行代码的庞大工程,聚集了上千名外围开发者,数百名正规开发者,以及数十名核心开发人员。Linux内核开发是对复杂项目管理的探索,通过观察Linux开发过程可以从中汲取很多宝贵的经验教训。

除了开拓个人的智慧,还有很多现实的理由驱使我们去了解linux究竟是如何开发的。一个linux的直接使用者必然会遇到问题,这时他可能得关注这个问题是否解决。另外,很多系统中linux是其中一个组件。工作于这种系统上的开发人员可能想要知道这个社区是如何运作的,这样不仅有助于问题的解决,而且可以知道如何把他的代码集成进linux里交由社区来维护,并从这种维护方式中获益。最后,你可能想要成为Linux社区中活跃的一员,这有很多理由,包括能够“随心所欲,自给自足”,或者可以让这个世界变得更美好,或者仅仅为了朔造你的公众形象。

1.2 有何不同

诚然这个世界上许多公司封闭地开发了许多软件;自然也就有许多人知道怎样开发软件。可是这种开发过程和开源社区之间还是有关键的不同之处。一些重要的区别包括:利益所处的地位,权力的层次结构,以及技术问题的决策过程。

其中最明显的一点就是利益在开源社区所处的地位。利益在社区里不是主要的动力。很多人之所以加入纯粹是出于个人爱好,然而还有一些人的加入是为了他们特殊的渴求:这样可以“随心所欲,自给自足”。当然还有人很实诚地相信他们在开源社区可以使这个世界更美好。这些人的参与为开源社区注入了和普通封闭软件公司截然不同的活力。

另一个传统软件开发方式和开源社区的显著的区别是开源社区没有一个核心权威人物。即使是Linus Torvalds在他个人能力和涉足领域之外也没有什么天生的特权。假如哪一天Linus Torvalds的决策变得不理性或根本就失去了对linux内核的兴趣,这个社区很快就会围绕在一个或多个其他领导人周围。开源社区需要通过领导能力这种的良好素质(而不是个人权威,译者)来招募和聚集贡献者,这也是她和传统软件开发的主要区别之一。

最后一个值得关注的不同之处是开源社区信奉能力主义。在传统的软件公司,任何一个比较大规模的项目很快会划分成多个组成部分,每个部分会被分配到个人或团队。这些团队各自独立地努力工作,直到有一天他们承担的部分完工了就提交到最终的产品中,在这期间只有很少或几乎没有外部评审。但是在开源社区,贯穿整个开发阶段,直到最终的代码集成以前,公开评审都是流程的一部分。很多情况下,多种可供选择的实现方案相互竞争,贡献者们根据技术价值和个人需要在其中做出选择。传统软件公司无法忍受这种人力上的浪费,可是开源社区是如此之大,完全负担得起,而且能更强有力地支持这种方式。(作者是想说,传统软件公司里项目组以外的人是没有发言权的,无论他能力高低;但在linux社区,不管你从事何种工作都可以参与到公开评审中来,只要你有这个能力。译者)

1.3 开始吧!

希望到此为止你已经你已经树立了这样的观点:开源社区特别是linux社区是很值得深入研究的。那么接下来就探讨一下都是哪样的人活跃在社区里,他们扮演了怎样的角色。同时也要讨论一下他们使用的工具,以及他们是怎样打发时间的。最后还要花点时间说说实际开发过程中使用的流程以及他们互相之间是如何交流的。本文结束,读者应该对是谁,什么时候在社区里做什么,为什么要这么做,怎样来做有一个较好的概念。

2 谁,为什么,干什么

很多原因使得来自世界各地的人们参与到linux社区中。他们拥有各自不同的能力,在社区里扮演了多种不同的角色,而且很多角色不直接涉及到编写软件。有不少工具使他们的合作更加便利。为了引导读者了解这个社区,现在就对这些做一个概述。

2.1 动机

也许无法一一列举成为linux贡献者所以可能的动机,然而大部分动机还是可以粗略划分为几类。这些动机从商业目的到志愿行动,从个人兴趣无私奉献,涵盖了很广的范围。

参与linux社区最有名,最经常挂在嘴边的理由是“随心所欲,自给自足”。如今几乎每个人都离不开软件,同时很多人和组织所需的软件不是没有就是没钱从软件厂商购得。在这种情况下,这些组织只好自己开发和部署所需的软件。

软件的特性是一旦存在,复制和发布的成本低到可以忽略。尤其是当别人已经把软件的发行版本制作完成时,这一点表现的更为突出。这些发布出来的软件使得有相同需求的人互相认识,互相帮助,互相共享资源,从而为最广泛的用户开发和改进软件。随着用户的增加,这种广泛共享所带来的好处日益凸显出来。由于Linux内核是基于linux系统的核心模块,在Linux社区里向往“随心所欲,自给自足”的贡献者非常普遍。

很大一部分linux的贡献者工作在运行linux内核的商用软件上,比如说受雇于红帽子的开发者。另外还有许多专注于嵌入式或专用软件领域的小软件商也在为内核做贡献。他们通常是解决些小的缺陷或开发专用驱动程序,不过也可能包括通用组件比如文件系统,压缩算法,网络子系统等等。和“随心所欲,自给自足”的贡献者一样,商用软件开发者也意识到了在社区里开发和维护内核组件的价值所在。

另外还有一些参与社区的动机。一些贡献者以承接开发项目为生,包括为一些以产品为导向的公司做短期工作,开发Linux内核的特殊功能。另一些贡献者比较幸运,他们可以在公司或捐赠者的资助下按照自己的方向开发Linux内核。最后,一些贡献者开发linux是因为他们相信这样可以使这个世界更加美好或者出于其它无私的理由。

2.2 角色

在基于社区的软件开发项目里,你必须意识到不是每个人都在写代码。尽管这是个很重要的技能,不过对于一个成功的项目来说是远远不够的。必须有人测试软件并报告缺陷,写代码并开展评审,管理代码,编写代码相关的文档。在社区里以上每个角色都很重要。

2.2.1 缺陷报告员

在社区里一个最重要的角色是缺陷报告员。尽管很多人会运行新内核,并且他们之中很多会遇到这样或那样的问题,几乎没有人会报告这些问题,更不会有人提供有用信息并长时间保持旺盛的精力来找到解决办法。这些人对生产和开发高质量软件是毫无用处的。

2.2.2 测试员

从某种意义上说,每个用户都是测试员。但是实际上大部分用户只关注软件片段的核心功能。真正的测试需要重现问题,撰写文档,以及要有技能和献身精神。测试员不仅要发现问题还要协助分析这些问题,界定问题的范围。测试员是社区里非常有价值的成员。

2.2.3 程序员

程序员是社区里最出名的成员。程序员通过修改代码解决问题或者实现新功能。程序员提供了linux内核的原始材料。很显然没有程序员项目将不会存在。

2.2.4 评审员

社区里一个常被忽略的人就是评审员。当程序员工作时,会把他的产品(比如说补丁)发到邮件列表里。评审员评估他的修改,对改动的形式和影响作出评论,经常会提出改正和优化方面的建议。评审员在保证初期代码质量方面扮演着重要角色。

2.2.5 维护员

维护员是社区里的“长者”。他们的责任是拿到程序员的代码,判断评审者是否给出了有价值的建议,然后将这些成果合并到上行版本(即那个不断向前推进的版本,译者)树中。与此同时维护员通过与测试员,缺陷报告员和其他人员沟通来确保代码质量保持在较高的层次,并且遵守了良好的流程。维护员的定位相当于传统软件公司的经理或组长。

2.2.6 技术写作员

技术写作员的作品是关于内核技术细节的文档,主要包括内核内部使用的API的文档以及用于和用户进程通信的API的文档。没有这些文档工作,开发社区将难以可持续发展。

2.2.7 记者

维持一个社区很重要的一方面是让贡献者知道社区里发生的事情。Linux内核是一个巨大的工程,你很难知道哪些新项目正在进行中,哪些旧模块正在更新或删除掉。在邮件列表里跟踪所有相关的邮件是一件非常繁琐的事,况且你还有编程或测试的工作要做。社区的记者可以让贡献者们与时俱进,知道什么正在发生,什么将会发生。

2.3 工具

软件社区使用许多工具使其保持平稳运行并不是件奇怪的事情。在此有必要列举一些工具并讨论一下它们的使用方法。重要的工具包括沟通交流工具和特点的软件开发工具。

2.3.1 Email

Email是社区里最重要的工具。Linux社区散布在世界各地。很难将这么分散的人聚集到一个地方或者召集起来开一个简单的电话会议。因此讨论只能在邮件列表中进行。这样还有个好处,就是可以把讨论记录下来并归档,还可以使讨论简单直接。

2.3.2 Bugzilla

Bugzilla以及其它缺陷跟踪工具用来跟踪缺陷。内核有她自己的Bugzilla实体,同时Linux发行版本已经其它与内核相关的项目也有自己的缺陷跟踪器。这些工具帮助组织缺陷报告信息,将不同缺陷报告隔离开,并将缺陷报告和邮件列表里的讨论隔离开,以免造成邮件列表过于吵闹。

2.3.3 IRC

IRC供活跃的贡献者实时交流用。聊天填补了Email和电话的不足,使贡献者能够及时直接进行精确交流。

2.3.4 Wiki

Wiki在开源软件开发中类似于文档工作,因而它也很符合Linux内核社区的理念。项目的很多部分就使用Wiki来编写文档,包括设计,用户界面,API变化,以及其它与用户或别的开发人员有关的信息。

2.3.5 代码分析工具

审查大段大段的代码是件很艰巨的工作;一行一行分析代码来寻找细微的编码缺陷既繁琐又容易出错。幸好很多这样的问题可以通过固定的算法来定位。内核提供了一个工具叫checkpatch.pl,它可以用来查找很多简单的问题,特别是与编程风格有关的问题。还有些工具象Sparse经常用来做更加深入的代码分析。

2.3.6 Git

如果不提到Git,对linux社区工具的讨论是不全面的。Git是社区里使用的版本控制工具。与传统的版本控制工具不同,Git使用了分布式开发模型。也就是说,这意味着git数据库的每一个备份都可以独立工作。此外,你可以在任何时候把这些独立的数据库合并起来,从而让开发按照既定的计划向前推进而不必与内核的上行版本保持同步。Git可能是今天社区里正在使用的最重要的工具。

2.3.7 Patch

还有很重要的一点必须指出的就是补丁。补丁是对源代码的部分修改。通常补丁通过Email发出来给大家评审,然后就添加到git的一个版本树上,从而作为将来开发的基础。(除了改动部分)补丁还包含修改的少量上下文用来帮助定位修改在原代码中的位置。这样有助于将它和未涉及到的代码区别开来。

补丁最大的意义在于它将注意力集中在改动过的代码上,从而能够让大家直接评审代码修改的部分,而不必花大力气先去定位和识别哪些是修改过的代码。使用简单的补丁而不是整个修改过的文件对于大规模分布式软件开发来说不失为一种简洁有效的技术手段。

3 什么时候,怎样做

既然我们已经弄清楚了参与者的动机,他们扮演的角色,以及他们使用的工具,接下来看看在工作中起协调作用的开发流程。我们将讨论如何确定开发需求,审查补丁的流程,以及补丁是历经怎样的途径进入正式的Linux内核的。

3.1 确定需求

可能不用说都知道,任何开发的第一步都是确定需求。很多时候,这些需求源自缺陷报告,比如Bugzila,缺陷跟踪器,Email以及IRC。另一种情况是来自外部项目的需求比如为新的设备开发驱动程序或为新的应用程序开发网络子系统。还有一种情况是别的操作系统有的功能要求linux也能提供。最后,在很多情况下开发需求来自于有人说“假如有功能肯定酷毙了”。不管怎样,需求一旦确定,下一步就是写代码或提交补丁。

3.2 开发周期

很多人觉得linux的开发流程很繁琐,实际上很简单,甚至人的个性让它变得很不起眼。最基本的流程是创建并向适当的邮件列表里发送补丁。幸运的话这将唤起一些人来审查你的补丁并作出评论,有些评审者只是给出个‘ACK’表明他们已经同意了。多数情况下你需要对补丁做出修改再提交到同样的邮件列表里。这个过程可能会反复几次直到维护员接受你的改动为止。

很多时候新来的贡献者对上面的流程望而却步或者不相信这样会有效利用时间。一个看似‘诱人’的做法是关起门来开发,直到开发者很自信地觉得补丁已经很健壮为止。千万别犯这种错误!不管怎样总有人能在或重要或轻微的补丁里找到真正的问题。省去评审-修改-再提交这个周期仅仅是浪费点开发者的时间,以及补丁发出后在开发者和社区之间制造点麻烦而已。

3.3 走过版本树

一个被采纳的补丁进入的第一站是维护员的版本树。维护员所维护的不同的子系统有不同的版本树,比如网络,SCSI,一些特性如SELinux/Realtime,以及处理器架构象ARMMIPSSPARC等等。维护员的版本树通常只限内部开发人员或有特别需求的用户使用。

为提高测试的覆盖性和社区的公开性,有的版本树会将来自其它维护者维护的版本树集成进来。以前这一角色主要由Andrew Morton -mm版本树扮演,现在另一棵叫做linux-next的版本树用得更普遍。Linux-next树将许多(可能是大部分)维护员手里最新的树拖过来,创建整个内核的一个预览。这个预览很快就能在‘官方’发布的linux内核中获得。

Linus会周期性地宣布一个新内核版本准备就绪,可以发布。在此之前维护者已经将这个版本包含的修改准备就绪并且能够用linux-next版本树获得这些修改。新版本发布之后,Linus将花费2周时间集成维护员准备好的补丁。从集成结束到下一发布之前,只有必要的缺陷的修改可以集成到Linus的这个‘官方’版本树中。其它任何非必要的修改将由维护者准备好进入下一个发布版本中。这一过程将持续数周,在此期间随着缺陷的逐步发现和修正,内核将经受更多的测试。2-3个月后,Linus宣布下一个内核即将发布,新一轮发布周期开始了。(对于Linus来说,接受新的修改是很谨慎的,因为一旦他接受新代码,他将冒着在他的余生维护这些代码的风险。如果让坏的代码流入,维护linux内核将变得极其困难。各种原因使得接纳新代码进入linux上行版本树的门槛非常高。译者)

4 结论

对于linux内核是如何开发的,读者已经获得了一个整体的了解。我们讨论了为什么贡献者要加入其中,他们都干了什么工作。我们讨论了为社区管理自己使用的许多工具并着重讨论了补丁的重要性。

Blablabla后面基本是废话,不再浪费时间翻译。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值