acm-header
登录

ACM通信

Kode恶性

版本厌恶


活字数字

图片来源:Alicia Kubista

回到顶部

亲爱的KV,

我在空闲时间从事一个小型的开源项目,并试图找到一种合理的方法来编号发布。现在我们大约有10个人在做这个项目,对于什么时候应该推出项目的主号和副号,我们似乎有10种不同的意见。由于该软件仅处于alpha阶段,我认为现在提出一个编号方案还为时过早;但当别人把它发布到我们的邮件列表中时,我们决定现在就解决这个问题,这样我们就不用再想它了。当你在开发软件时,你什么时候推出一个新的版本号?
厌恶与厌恶

亲爱的厌恶,

你有10个开发人员却只有10个意见?我以为你会说你有20个意见,所以从一开始你的情况就不像你想象的那么糟。选择版本控制方案比大多数程序员真正理解的更重要,部分原因是版本控制方案是人类交流的一种形式,而人类交流……好吧,让我们这么说吧,许多程序员根本不明白这一点。


一个好的版本编号系统可以用来跟踪一个软件的功能变化。


版本控制方案有几个重要的目的。最明显的是允许用户知道他们在软件的发展中处于什么位置,但是版本号也传达了更多的信息。

一个好的版本编号系统可以用来跟踪一个软件的功能变化。一个新特性,或一个特性的主要更改,应该总是导致分配一个新的版本号。我一直对三号版本感到最高兴,或者说最不痛苦的是major . minor . bugfix,其中主要版本更改为大特性,次要版本更改为小特性,最后一个数字是一个bug修复版本。bug修复数字可能是最容易理解的。在修复了许多错误之后,您希望向该领域发布新软件,以便用户可以从您的团队所做的工作中受益。增加最后一个数字并发布一个新版本。Bug修复不应该更改库中的API,也不应该引入或显著更改某个特性。

主要版本更改和次要版本更改之间的区别可能很棘手,这取决于您所编写的软件。只要对系统没有向后不兼容的更改,就可以推出小版本。这意味着,如果你对你的软件做了一个更改,它会破坏依赖于你的代码的另一个软件,或者破坏了用户对你的系统如何工作的假设,那就需要一个主要的版本更改。添加性更改(如新的api或不破坏向后兼容性的新特性)可以合并到小版本更新中。

滑坡效应就是计算出有多少小的变化加起来会变成一个大的变化。如果你的软件有30个特性,你添加了10个新特性,即使它们没有一个与原来的30个特性相关联,难道不需要进行重大的版本更改吗?我认为应该,但不是每个人都同意。当然,那些不同意的人好吧,让我们把它放在一边,好吗?

软件版本所传达的一件事是软件的变化率。如果您的软件在一个月内从1.0升级到2.0,那么要么是您的团队在创造奇迹(我非常怀疑这一点),要么是他们在没有真正发生的情况下声称有重大变化。一个非常高的次要或bug发布率也可能表明项目中存在问题,特别是它有bug。尽管没有完美的发布速度,但随着产品的成熟,发布速度肯定会慢一点。过于频繁的发布通常意味着一个软件是不成熟的,可能缺乏持久性。

在一些项目中,另一种模式是从不发布1.0,而是发布大量的0.x。一个特别惊人的版本(双关语)是Ethereal项目,经过10多年的开发,它终于发布了0.99.5版本。据我所知,这只是将版本号向右移动的一种方法。软件本身很好,使用很广泛,但是它的版本系统很奇怪。现在这个项目已经被重新命名为Wireshark,它似乎已经转移到一个更传统的专业。版本控制的小风格。


主要版本更改和次要版本更改之间的区别可能很棘手,这取决于您所编写的软件。


版本号还应该能够将软件的相关部分联系起来。我生活中的一个烦恼是Linux版本控制系统,尽管我相信这与Linux本身的开发方式有更多的关系。事实是,现在有许多不同的操作系统内核,我可能不得不从其中选择使用一个相关的软件,这简直令人抓狂。最近的一个例子是,我必须找到正确的位,以便为新硬件使用驱动程序。标准版本是2.6.18-194.3.1。但我需要的版本是2.6.18-164.el。这些数字意味着什么?当然,我可以通过一些Web搜索来解决这些问题,但是,内核api在那些小版本中已经发生了足够多的变化,以至于驱动程序无法工作,这一事实是疯狂的。即使是查看kernel.org, Linux内核的所有内容的来源,也没有多大帮助。在撰写这篇专栏文章的时候,以下是被列为2.6版本内核的稳定内核:

ueq01.gif

现在,我问您,2.6.34是如何在2.6.33.5之前10天出现的,以及如何使所有这些都稳定?它们之间又有什么关系?

当然,不仅仅是开源项目存在版本控制问题。最大的软件公司似乎有一个最荒谬的版本方案。仅从名称来看,如何区分Windows 95、Windows 98、Windows ME、Windows NT、Windows XP、Windows XP Service Pack 2和Vista?我之所以能按顺序列出它们,只是因为我目睹了它们的来来去去,而且,令人高兴的是,我从未在自己的机器上安装过它们中的任何一个。也许如果您正确地哈希名称,那么它们将变成单调递增的版本号。

最后要注意的一点是,您不应该将自己束缚在版本控制方案上;记住,你可能需要灵活一些。我曾经开发过一个1.0.1b版本的产品。b版本是由一个不那么有趣的错误所必需的,其中一个开发人员决定,如果用户保存了一个没有扩展名的文件,开发人员将提供一个扩展名。这个扩展名是一个四个字母的单词,它被列入了乔治·卡林的“你永远不能在电视上说的7件事”清单中,而且它也绝对不应该作为一个文件扩展名。我想你已经明白了。开发人员本打算在代码发布之前删除这个特定的特性,但却忘记了,因此,我们有了1.0.1和1.0.1b版本。我们本可以发布1.0.2版本,但是,实际上,只有一个改动——尽管我相信我们应该发布1.0.1f版本。
KV

ACM队列的q戳相关文章
queue.acm.org

与史蒂夫·伯恩、埃里克·奥尔曼和布莱恩·坎特里尔的对话
http://queue.acm.org/detail.cfm?id=1454460
理解版本控制系统
布莱恩·奥沙利文
http://queue.acm.org/detail.cfm?id=1595636

回到顶部

作者

乔治·v·内维尔·尼尔kv@acm.org)是Neville-Neil Consulting的东主,也是ACM的会员队列编辑委员会。他从事网络和操作系统代码方面的工作,教授各种与编程相关的课程,并鼓励您的评论、俏皮话和与他相关的代码片段通信列。

回到顶部

脚注

DOI: http://doi.acm.org/10.1145/1831407.1831420


版权归作者所有。

数字图书馆是由计算机协会出版的。版权所有©2010 ACM, Inc。


评论


戴维。艾伦

无论您有什么版本方案,我都建议您将其记录下来并发布给您的团队和客户。在我们的一些项目中,我们遵循major.minor.bug.build的命名,并且它工作得很好。在其他情况下,我们使用sprint.major.minor.build模式。还是sprint.major.bug.build?哦。这就是我们记录它的原因——我的记忆力很差,可能的方案无穷无尽。


显示1评论

登录全面访问
忘记密码? »创建ACM Web帐号
文章内容:
Baidu
map