发货前还是发货后重构?

Posted

技术标签:

【中文标题】发货前还是发货后重构?【英文标题】:Refactor before or after ship? 【发布时间】:2011-04-11 09:30:17 【问题描述】:

在大多数发布日期由业务需求决定的世界中,程序员通常会发布有效的代码。通常,当您知道代码有效时,所交付代码的结构和效率就变得没有意义了。除非指定了生产质量(例如算法的 API),否则对于运行到几百行的代码,可交付的代码等于有效的代码。

我的问题是:给出一个功能的 ETA,你会在功能工作并完成之前编写代码吗?或者你会让它尽快工作并重构发布质量吗?

我倾向于后者,尽管这听起来需要更多的工作。当为了算法效率和模式而将有效的代码分开时,将它们放在一起是一种快乐的体验。此外,它得到了所有非功能性的喜爱——更少的错误、高性能、可扩展、安全。我认为我不擅长第一次编写最好的代码。所以这种方法对我很有效。

我想知道哪个是首选,为什么?我不是在寻找全行业的方法,只是在寻找个人倾向,以便我可以衡量思想的相似性。

【问题讨论】:

【参考方案1】:

我更喜欢在发布之前进行重构。

将任何重构推迟到发布之后,听起来非常像您可能永远实际上不会这样做(通常情况下,会出现更关键的业务)。但是,即使您在发货前完成了它,您的代码也不是完美的,而且您已经没有什么可以改进的地方了。之后也是如此(只要代码保持到任何程度)。

对我而言,将代码重构为更简单、更简洁的代码是任何软件开发工作持续且自然的一部分。

编辑:显然,在给定时刻决定how much and for how long you refactor 时,您需要考虑业务限制。

编辑 2:关于“如何说服我的经理进行重构”的问题(请参阅 cmets),这里有一些资源可能会有所帮助:

Explaining Refactoring to ManagementInfoQ Martin Fowler 的开创性著作重构(似乎是available online in its entirety)有一个标题为“What do I tell my manager?”的部分。实际上,无论如何我都建议阅读本书的前几章,因为它们比我所见过的任何其他内容都更清楚地解释了有关重构的基本思想。

【讨论】:

我完全同意持续重构的概念。问题是,你多久能说服你的经理你需要更改代码,因为你需要重构。 IMO,经理应该在这些事情上信任开发人员(并考虑将重构作为开发的一个组成部分,这不是他的业务)。当然,开发人员也应该值得信赖,不要用未经测试或未经审查的更改破坏主干/生产分支。 如果您的经理热衷于微观管理此类事务,请考虑寻找更好的经理和工作场所。它们存在。 :-) 是的,但我想坚持自己的立场并证明它所带来的不同。一年过去了,变化确实发生了。部分问题可能是没有人愿意接触的遗留系统。 @batta:这当然取决于您拥有什么样的经理,但我在答案中编辑的资源可能有助于说服他。顺便说一句,如果您正在处理大型遗留代码库,这实际上可以更容易地证明首先重构会使修复/增强更快【参考方案2】:

如果您正在进行测试驱动开发。通常,您首先编写最简单的东西,然后在添加附加功能时进行重构(AKA Red、Green、Refactor)。

不过,这个问题显然存在很大的灰色地带。如果您正在交付无法维护的混乱,那么也许您应该首先查看您是如何编写代码的。应该出于某种目的进行重构——例如使代码更灵活以允许新类型的产品。不要仅仅因为你觉得你应该重构。

【讨论】:

因此,在您了解功能符合规范后,您会不会退后一步寻找效率和模式?我不认为我的意思总是重构。您是否应该在发货前查看。 正如其他人所说,这取决于业务限制。我不是说不要重构。我是说如果它会影响你的时间表,就不要重构。我经常标记诸如 TODO: Refactor to pattern X 或 TODO: 这应该封装在它自己的类等中。【参考方案3】:

在我们的团队中,我们认为未重构的代码还没有“完成”。换句话说,“代码已被重构”是我们完成的定义的一部分,它是我们可交付代码的标准之一。

【讨论】:

【参考方案4】:

问题是,如果您倾向于只在发布后重构,您将永远不会这样做;)

我倾向于看到“完成”,包括精心设计的代码。

如果存在涉及大量工作的非常大规模的重构,则此规则有例外。为了满足最后期限,您可以推动下一次开发迭代。

【讨论】:

在发布后(在主干/主分支中)修复问题的主要问题是很难从发布分支合并回修复。【参考方案5】:

我希望在发货前进行重构。你是对的,我的第一个代码通常不是最好的设计。但是如果你的代码通过了测试,那么之后直接重构应该没有什么风险。

稍后再做的问题只是“如果在发布之前,则在发布之后”。根据我的经验,没有理由希望在发布后有时间进行清理。

【讨论】:

【参考方案6】:

对我来说,重构应该在交付后进行,确保所有功能都正常工作,并将其留给代码构建的下一次迭代。如果您在发货前开始操作代码,您最终可能会做很少的优化并最终留下无效代码。

【讨论】:

【参考方案7】:

我最初尝试编写最好的代码,但始终发现一旦进入生产环境,重构是不可避免的。由于用户反馈,通常在代码发布后进行重构已成为常态。

【讨论】:

用户反馈与重构无关——重构只是改变了实现,而不是功能

以上是关于发货前还是发货后重构?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone X大屏版曝光;发货日期再提前丨资讯100秒

急急急!!!delphi中修改了DBGridEh中一列的值,希望在另一列显示修改的当前日期

SAP RETAIL 寄售模式的公司间STO发货过账后的物料凭证的特殊点

批量发货阻塞启示:深挖系统薄弱点

中通/顺丰空运西藏林芝黑苹果礼盒装/钻石礼盒装,西藏林芝转拉萨发货!5天左右发货!

加入发货后订单数量翻倍