如何克制自己的压倒性冲动重写一切?

Sco*_*aad 43 language-agnostic

建立

你有没有经历过一段代码来做一个看似简单的改变然后意识到你刚刚进入一个值得认真关注的荒地?这通常会在官方的FREAK OUT时刻跟进,在那里,重写一切在视线中的压倒性感觉开始蔓延.

重要的是要注意,这个糟糕的代码不一定来自其他代码,因为它可能确实是我们过去编写或贡献的东西.

问题

很明显,有一些严重的代码腐烂,可怕的架构等需要处理.与此问题相关的真正问题是,现在不是重写代码的合适时机.可能有很多原因:

  • 目前处于发布周期的中间,因此任何更改都应该是最小的.
  • 现在是早上2点,大脑开始关闭.
  • 它可能会对时间表产生看似不利的影响.
  • 兔子洞可能会比我们目前眼睛能够看到的深得多.
  • 等等...

那么我们应该如何平衡不断改进代码的责任,同时又是一个负责任的开发人员呢?我们如何避免对破窗理论做出贡献,同时也意识到行动以及可能造成的潜在鲁莽行为?


更新

很棒的答案!在大多数情况下,似乎有两种思想流派:

  1. 不要抗拒这种冲动,因为它是一个好人.
  2. 不要屈服于诱惑,因为它会把你烧到地上.

知道是否有更多人认为存在任何平衡将会很有趣.

Chr*_*rts 25

我是制作名单的忠实粉丝!

一旦这种冲动让你重新写东西 - 花10分钟制作一份需要重写的东西清单.关注所有需要注意的代码,并将其列入需要注意的代码中.

希望在相对较短的时间内,您将拥有以下两种情况之一:

  • 一个非常长的列表,完全让你想要再次重写任何东西.
  • 一个实际上不长的列表,为什么不放纵自己去重写?!

  • 该列表也可用于决定重写的内容和顺序,例如,如果您决定以多个步骤重写应用程序(即重构). (2认同)

Pau*_*lin 17

我发现花两个月修复由于"无害"重写而导致的错误,足以让我无法做出这些事情,而没有明确的授权/项目计划.


Chr*_*ris 13

对我来说这个最令人难忘的项目发生在大约4年前,当时我被叫到一个远程办公室"帮助"一个项目,该项目在一周内完成,主要向客户介绍并且根本没有工作.该项目主要是向印度提供支出,IMO项目管理失败导致大量意大利面条代码过于分散,无法以目前的形式正常运作.

经过一整天的审查,我向管理层提出了我的意见,即项目只需要批量重构和重组,否则它将无法正常运行.这次讨论的结果是6天20小时工作/ 4小时睡眠,其中2个我实际上在公司大厅的沙发上睡觉,因为开车回酒店时浪费了时间.

代码的主要改进包括:

  • 命名标准的应用
  • 进入源代码管理
  • 开发构建过程
  • 各个组件的文档

大多数原始代码都留在原地,但只需移动和重组/重构,以使其长期可持续.这周是地狱吗?当然.它是否使项目更成功?是的.

我不能忍受意大利面条代码,我经常捐出自己的个人时间来解决它.


Ori*_*rds 10

如何克制自己的压倒性冲动重写一切?

变老*

因为这发生在我身上,我逐渐失去了重写一切的冲动.为什么?

  • 一旦你完成了几次,你就会意识到你最终会比你开始时更糟糕.
  • 即使你是上帝给编程的天赋,你的精彩重写也没有引入新的错误,你根本就没有注意到或实现了大约30%的小边缘特征/错误.这将花费你几个月的时间来修复
  • 没有什么能像时间一样磨损你的非理性繁荣.通常这是一个悲伤的损失,但在这种情况下,这是一个胜利.

*(如果你没有空闲时间变老,更多经验也可能是合适的替代品)


Von*_*onC 8

重写的冲动是正义的,条件是:

  • 你"冻结"现有的代码(带有标签)
  • 您在一个单独的分支中开始重写尝试
  • 你首先准备一些单元测试,以确定当前的行为,并确保你重现现有的功能......

也就是说,您必须在重写过程与遗留代码的度量稳定性之间取得平衡.
"如果没有损坏,请不要修理它";)


Bil*_*win 7

你完全正确的是,正确的时间和错误的时间来重写(和破坏稳定)代码.

让我想起了一个我认识的工程师,他有一个潜水的习惯,并且在他想要的时候进行重大改写.这促使QA工作人员将他的产品推上了墙 - 如果他报告了一些关于微不足道的错误,那么这个错误就会得到修复,但是工程师在修复这个错误时会注意到的东西的重大改写会引入另外五个错误,其中然后质量保证人员需要追踪.

因此,一种让自己能够改写重写的诱惑的方法就是在质量保证工程师的脚下走一步,他必须测试,诊断并报告所有这些新错误.也许甚至可以让自己去QA部门几个月,以了解他们所做的工作类型(如果你从未这样做过).

另一个建议是为自己制定一条规则来编写注释来描述任何变化.当您检查源代码控制的代码更改时,也许发布这些注释.您可能有动力以这种方式尽可能减少更改.


Shr*_*saR 7

这不是一个答案,但阅读美丽的文章 小代码差异的自恋可能会有所帮助.


Ken*_*Ken 5

只是不 - 兔子洞总是太深.进行任何小的局部更改,使得该位置比您发现的更干净,但是当您处于警戒状态并且有足够的时间进行刻录时,请进行大量重构.

sourcemaking.com上以小阶段解决大型重构问题的一个很好的启动:

你必须像汉塞尔和格莱特尔一样啃食,今天一点点,明天多一点


dkr*_*etz 5

  1. 重新阅读“重构”。
  2. 拿一张纸,逐项列出“不良气味”列表。
    (对于BadSmells()中的每种气味,{
    printodor.name;
    }
  3. 将注释添加到代码中,包括列表中的项目。
    while(odorPersists()){
  4. 遍历列表,一次聚焦于一种气味。
    }