因此,我有一个程序要追溯到2011年,直到2012年为止,但最后一个版本是2011年12 月。我一直在积极地研究它,但是特征蠕变吸引了它丑陋的头,现在它充满了许多未完成的特征。
不好的部分是,随着我实现一项功能,一个新的功能应运而生。为了避免将来出现功能蠕变,我该怎么做,以便实际上可以在一年内发布它?
该项目基于iOS,过去每个iOS版本更新都有发行版本,但最后一个版本是5.1(2011)。我希望能够恢复到稳定的发布周期,但是事实证明这太困难了。
因此,我有一个程序要追溯到2011年,直到2012年为止,但最后一个版本是2011年12 月。我一直在积极地研究它,但是特征蠕变吸引了它丑陋的头,现在它充满了许多未完成的特征。
不好的部分是,随着我实现一项功能,一个新的功能应运而生。为了避免将来出现功能蠕变,我该怎么做,以便实际上可以在一年内发布它?
该项目基于iOS,过去每个iOS版本更新都有发行版本,但最后一个版本是5.1(2011)。我希望能够恢复到稳定的发布周期,但是事实证明这太困难了。
Answers:
以我的经验,最简单的方法是开发和发布节奏不会妨碍您完成工作。这是我的操作方法:
这样,您可以根据需要在每个功能之后推送一个版本...或等待提供所需版本值的汇总。
注意:
答案很陈旧,而且常常是不可能的:拒绝添加其他功能。
更深入地讲,答案实际上归结于是什么使新功能落入功能爬虫箱?如果我们假设蠕变特征是添加到项目中的特征,尽管它们的功能仅与项目的预期用途相切,并且蠕变特征是有用的,而不是多余的,那么答案就是将它们分开,但相关工具。使用Unix的哲学,即构建正交工具并将其粘合在一起。
从项目管理的角度来看,答案是可比的。确定您愿意花多少时间用于下一个版本并设置截止日期。估计功能并削减足够的时间以达到最后期限。如果除了您之外还涉及其他利益相关者,请让他们选择最重要的利益相关者。
可以在Joel on Software上找到有关调度的良好概述:
开发中最重要的课程之一就是知道何时停止。
开发人员通常会添加功能。反过来又激发了更多的想法。因此,添加了更多功能。就是说,正如您所说的那样,项目成为蒸气产品的一种方式。开发人员永远不会将项目视为“完成”,因此永远不会发布。
您想养成的习惯是停止将发布/版本视为“完成”项目。而是将开发视为一个长期过程。将发布视为您一天希望该程序实现的里程碑。因此,发布/版本只是您在长期过程中所处位置的快照……经过完善和测试的快照。
从实际的角度来看,您可以做的是坐下来,确定下一个版本。它不必非常彻底。写下3-5个您认为对下一版本至关重要的主要功能。(功能的实际数量可能会因应用程序的类型而异,不包括错误修复或gui的微小更改)。如果您有其他想法,那很好...只是做笔记并在以下版本中实现它们。完成这3-5个项目后,您的发行版即可进行Beta版测试。
当我启动一个新的应用程序时,我通常会考虑该应用程序的最终“愿景”。对我而言,这就是我在该应用程序第3版中想要的。通过该基准测试,我对什么将使固体版本1产生了想法-仅是基础知识。
摘要:
每个版本都不必是项目的最终“愿景”。这只是实现这一愿景的一个里程碑。
使用版本控制系统,在该版本中,为某些想法创建分支并不昂贵,并将其置于发布路径之外。例如,在中git
,您可以“吸收”一些想法,然后将git stash
其删除。稍后,您可以查看这些存储库,并以看起来有趣的顺序来挑选它们。
对于较大的功能,请创建一个真实的分支(以便您可以进行多次提交)。恰当的例子:当我想向垃圾收集器添加后代支持时,我做了一个分支。杂物很好地捕获了分散注意力的小东西。大功能可以从存储开始,然后变成分支,然后在准备好时最终合并。
使用存储和分支机构,您可以盘点您的想法,对其进行优先级排序,并为您的单独项目的发布确定范围,就像托管团队项目一样。
看,当您有了一个主意时,它必须走到某个地方,最好的地方是代码:回购。爬行功能胜过忘记好主意。但是,当然,如果您将所有功能都放到同一个主线中,它将继续延迟发布,除非您削减不完整的发布,其中充满了半成品,必须警告用户不要使用。