如何学习实现一半功能的正确方法?[关闭]


12

我领导一个开发团队,我想尽可能多地发布我们的产品(连续交付)。

在许多情况下,我们必须实施比发布之间的时间花费更长的时间才能实现的功能。我仍然希望人们每天提交他们的代码(持续集成)。

很多时候,实现新功能需要更改现有功能,并且即使新功能尚未完成,现有功能当然仍然需要工作。

如果开发人员使用正确的方法,则他们可以仔细调整现有功能,而上述所有都不是问题。

但是,正确的方法实际上是什么?我自己的编程知识告诉我如何处理每个案例,但是我需要了解更多信息,还需要一些阅读材料,我可以阅读并推荐团队成员阅读。或任何其他学习正确方法的方法都可以。

这就是问题所在。如何确保团队成员学习实现一半功能的正确方法?

我搜寻了自称对此有策略的人,但还没有找到,只是人们对此主题写了一些随机的想法。也许我没有使用正确的搜索词,或者也许没有人对此做出任何权威性的指导。


“现有功能当然仍然需要工作” –根据上下文,此类要求的术语可能是向后兼容没有回归错误
gnat


1
不同类型的自动化测试可以降低代码更改错误的风险。校验。我正在寻找一种用作开发人员的方法,该方法必须实现一个可能包含现有代码中的75%更改和26%的新代码的巨大功能(多余的百分比会增加神秘性)。
Niels Brinch

1
@Niels:您必须有一些出色的开发人员,他们才能在每天结束时拥有可运行的代码,这些代码可以检入主分支并通过所有测试。要么这样做,要么他们只完成最低限度的工作,这样他们就可以在一天结束时检入他们的代码。
Dunk

他们会不会称其为“功能分支”。您在分支中进行更改,然后在功能完成后将分支合并回主节点。您不应该在演示中展示半实现的功能,所以我不明白为什么这不起作用。
2013年

Answers:


14

我已经对这里的其他答案有不同的看法。我同意您的看法,您希望尽快集成开发人员的更改,并继续测试组合的代码。

但是,我不同意今天早晨开发代码的权利,只是因为我们今天下午要发布。那是让失望的顾客满意的秘诀。

解决方案是在版本控制树中有分支,并且您有一个单独的过程将经过验证的增量从develop分支提升到release分支。

这样一来,您可以两全其美。您有开发人员进行持续集成,并带来了很多好处,您有规律地向客户交付稳定的代码,并且您有一个新的过程来测试开发人员分支中已完成的功能,如果这些功能通过测试,则使其成为已发布产品的一部分。 。

我熟悉有两种工具可以很好地支持此类过程。如果您的开发结构很简单,那么带有git-flow的git会实现一个良好的分支结构,该结构在中小型团队(大约20个开发人员)中可以很好地工作。

对于较大的开发团队,或者需要更复杂的分支策略来支持产品的多个“分支”的地方,accurrev是最好的。不参与变更管理的开发人员会抱怨说,它比子版本更难……但是它确实支持复杂的开发环境。


我将非常有兴趣了解有关您所指的分支策略的更多信息。您是否有文章或其他内容的链接,可以更深入地说明您所指的概念?
Niels Brinch


git flow的关键特性是其明确定义的分支策略,这使其成为仅具有一个发行版本的产品的理想选择。Accurrev不执行分支策略,但具有灵活性,并提供了有效管理更复杂的分支树的工具。
迈克尔·肖

6

这里有两个问题:一个是实现一半功能。另一个是在持续开发过程中保持运输产品正常工作。

实现一半功能

强大的总体设计将对此有所帮助。这样一来,您就可以清楚地定义其边界来实现该功能-例如,到相邻代码位的API,对数据结构的期望以及对如何以及何时调用所实现的代码的理解。

测试可以包括该功能其他部分的模拟代码版本;这有助于您顺利实施下半年的过渡。

保持运输产品正常工作

这里有一些选择:

  1. 关闭出厂产品的功能。仅仅因为代码包含在产品中并不意味着必须执行该代码或将其呈现给用户。不利的一面是,您不会为用户提供增量价值,也不会获得反馈。
  2. 向用户显示功能的边缘。显示您所拥有的,并提供一些指示。
  3. 让用户在新功能和旧功能之间切换。有时这需要维护两个可供最终用户使用的代码路径。

最后,如果您在使用这些解决方案时遇到问题,请考虑是否已沿着正确的边界分割功能。如果您以不同的方式切成薄片,会更容易分开吗?


关闭尚未完全就绪的新功能非常容易。这是一个很好的建议。因此,所交付产品的核心问题是,如果人们在更改现有代码时未使用正确的方法,则现有功能可能会失效。
Niels Brinch 2013年

2
这就是进行良好测试的地方。如果您没有适当的代码基础覆盖,也许这可能会触发这一努力吗?
Alex Feinman

但是,我的问题的答案可以仅仅是“执行良好的代码实践并进行单元测试”等吗?
Niels Brinch 2013年

1

如何确保团队成员学习实现一半功能的正确方法?

通过教他们。(du)

学习将涉及迭代:尝试某些事物,了解其工作原理,然后修改其方法以获得更好的结果。对于这种事情,我主张设计/代码审查。您将了解半功能的设计/实现方式,并有机会提供反馈。“那样做就行不通,因为它们会破坏我们的CI; XYZ呢?”,“这里做得很好,真的很干净。”

团队进行审核将帮助每个人学习您已经直观地了解的内容。


我完全同意这一点。但是,就像我可以教别人如何进行单元测试一样,或者将它们引至“单元测试的艺术”一书中,对于这个主题,我是否可以参考类似的资源?
Niels Brinch 2013年

1

在这里对您最大的帮助是将关注点很好地隔离开,以使一个代码区域尽可能不干扰另一个代码区域。

在这里可以使用依赖注入和对接口进行编程确实有帮助,因此您可以在站点上拥有ISupportingFeature的当前实现,然后在需要创建依赖于不同实现的INewFeature时,只需使用新的实施,并维护生产中的现有实施,直到经过充分测试并可以投入使用。假设您的DI在某种配置系统上工作,这将使您可以在系统中并行使用相同的代码,并始终使用稳定的代码。

实际上,Martin Fowler将这种配置方法描述为功能切换。

当然,这个问题如果要部署只出现所有代码的所有的时间。这正是为功能分支设计的场景类型,尽管我承认福勒先生对它们不满意,但我不知道它们的坏处,特别是如果它们是按计划和经过深思熟虑创建和使用的,通过方式。


我的印象是,将所有代码提交到同一个分支并一直部署所有代码是持续集成的良好策略的一部分吗?
Niels Brinch

阅读更多有关持续交付的内容,这当然是其中的一部分。我对此有些畏缩-尽管您应该取消激活半编写的代码?也许在安全性不重要的情况下它会很好地工作,但是对于许多应用程序空间来说,这听起来像是一种高风险的方法。不过,这可能将我标记为老式的具有安全性的骗子。
glenatron 2013年

似乎有两种竞争策略,其中一个作为单个主分支,另一个针对每个任务和许多合并有一个分支……我不确定什么是最佳还是正确的,或者它是否触及我的问题的核心。
Niels Brinch

我认为这在很大程度上取决于您要制作的东西的类型-如果我对安全性有任何优先考虑并且不想冒险将未经测试的代码实际部署到可能有人发现它或偶然地将其部署的风险,我会更倾向于分支机构。已启用。因此,如果我正在经营一个银行网站,我认为CD不会那么重要,但是也许如果我正在为一个休闲/偶尔访问者经营一个高营业额的网站,那可能是理想的选择。
glenatron 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.