有没有办法避免这些年来出现意大利面条式代码?[关闭]
-
21-08-2019 - |
题
我做过几份编程工作。每个项目有20-50名开发人员,项目持续3-5年。
每次都是一样的。有些程序员很聪明,有些则很平庸。每个人都有计算机科学学位,每个人都阅读设计模式。意图是好的,人们正在努力编写好的代码,但几年后代码仍然变成了意大利面条。模块 A 中的更改突然破坏了模块 B。代码中总有一些部分除了编写代码的人之外没有人能够理解。改变基础设施是不可能的,并且向后兼容性问题阻碍了好的功能的进入。有一半的时间你只是想从头开始重写一切。
而比我更有经验的人则认为这很正常。是吗?一定是这样吗?我可以做些什么来避免这种情况,或者我应该接受它作为生活的事实?
编辑:伙计们,这里回复的数量和质量给我留下了深刻的印象。这个网站及其社区摇滚!
解决方案
无情勤奋具有恒定的单元测试组合是为了防止面条代码的唯一途径。即使到那时它只是一个创可贴的解决方案。一旦你不再注意了自带的面食。
很多时候我发现意大利面条的代码被引入,因为有人只是普通的懒惰的那一天。他们知道有一个更好的方式来做到这一点,只是没有时间。当你看到这种情况发生,只有一件事要做。
拨打出来就可以了,让他们去改变它
我发现一个代码审查中指出了更好的办法通常是足够让人们去。如果他们检查它,我强烈地感到,我会重构它自己。
我偶尔脱落的一点点偏心?我敢肯定,我做的。坦率地说,虽然我不介意。我不是一个关于它的混蛋,在尽可能最好的方式社会处理这个。然而让恶意代码在几乎保证,我将不得不在未来某个时间点调试它得到遏制。我宁愿花一点高射炮现在和得到正确的代码。
我也觉得单元测试的培养物也有助于防止面条代码。这是更难那么好因素代码单元测试面条代码。随着时间的推移这迫使人们保持他们的代码有点因式分解。
其他提示
我相信避免代码腐烂的关键在于健全的自下而上的设计和实现方法(我坚信这一点,因此我以它命名我的业务 - Think Bottom Up!)。这里选择的工具是:
- 按合同编程
- 分层设计
- 聚焦解耦
- 始终在构建时牢记重用,寻找通用解决方案
- 保持框架轻量、简单和专注
正如其他受访者所建议的,您需要尽早发现问题。对于绿色开发人员来说,这意味着指导(结对编程在这里很棒)和审查(代码和设计审查)。对于更多的高级开发人员来说,这意味着要保持警惕。
最重要的是,不要害怕重构。如果重构让你感到害怕,那么你已经陷入困境了。如果重构被视为“不好”,那么您的业务就存在问题。
当你修复某些东西时,要正确修复它。我使用术语“fux”来描述以错误方式完成的修复:它只是“修复”你的代码库。
干杯,
担
20至50开发可能是问题。这是相当高的,而且需要大量的管理和资源,以保持在检查一切。
我会考虑拆分项目成更小的可重复使用的部分。抽象某些层从核心系统程。
创建的代码的不同区域之间的“防火墙”。通过定义不同区域或代码的层,并限定一个单一的API(在Java中,这通常是用一个接口完成),每个层响应做到这一点。应该有裸机intefaces或类的API使用,但“知道”这些层的内部什么都没有。例如,GUI应该知道也不关心你如何存储数据,并且数据库不应该知道或不关心数据是如何呈现给最终用户。
这些API不具备石定投 - 你应该能够根据需要添加的东西,只要你确保你不会污染防火墙
。我想主要的一点是,当你说
你只是想重写一切从头开始。
只是拥抱它。结果 使用尽可能多的单元测试成为可能,然后让重构是一种常见的做法的。结果 自动化和单元测试将确保变更将不会引入回归;投入你的时间一定比例的重构旧代码(这意味着,少新功能的!)确保现有代码库不会变老,或至少不会这么快。
代码审查、编码标准和公司政策。
以下内容适用于我们的商店 - 由于我不知道您的商店类型,因此您的里程可能会有所不同。在迁移到 Team Foundation Server 时,我们的大部分重点是维护代码质量 - 或者至少以任何可能的方式帮助维护质量。我们添加的一些示例:
- 代码审查工作流程 - 强制执行代码审查作为流程的一部分。包含一项政策,如果代码未经审查,将阻止签入。
- TeamReview - 通过提供完整的“IDE 内部”体验,减少代码审查的痛苦。
- 签入策略(一般) - 许多很酷的东西可用于控制代码流。例如确保在签入之前记录公共和受保护的方法,以确保没有相应的工作项目就无法签入任何工作。
就像我说的,如果您使用不同的平台,也许可用的工具和您可以做的事情是不同的。但不要排除工具以任何可能的方式提供帮助。如果您可以使用它来改进、控制和审核您的工作流程以及其中移动的项目,那么它至少值得考虑。
请记住,流程中的任何变化都将涉及阻力。我们帮助缓解这一问题的方法是将政策构建到从旧版本控制/缺陷跟踪系统过渡的培训中。
这听起来像许多没有关注encapsualtion和良好的设计的一些基本原则。
保持的东西分离和unreliant上其他部分是必不可少的,以避免您所描述的问题。您可能需要一些更高级别的设计师或建筑师。这是人们都有道理一些苛刻的流程和变革管理的典型场景。 (我不主张)
您需要避免依赖性和相互关系,并定义和使用唯一的公共接口。这当然是一个过于简单化,但你可能会通过你的代码的一些指标学到很多东西 - 类,公共方法的复杂性,UML图逆向工程的代码等建
我觉得松散耦合,你可以用全面的依赖注入的使用得到的是一个技术特征,可以有很大的帮助。当你掰开应用程序的作品,你就不太可能得到“有趣”的再利用产生的面条。
您可能会走向过度分散,而不是,但这是另外一个问题,减少全球结构性问题。
不允许被提交代码,直到至少两双眼睛已经看到了。
<强> 重构 强>
努力保持设计尽可能干净。这是不容易的,但它是值得的。
我不认为这是正常的。这是真的很难打这个东西,当它在那里待了几年。
,以避免它的唯一方法是改变姿态:
“敏捷开发具有朝向软件设计中的姿态是外科医生具有朝向无菌过程同样的态度。无菌手术是什么使手术的可能的。没有它,感染的风险会太高容忍。敏捷开发人员觉得他们的设计相同的方式。让甚至腐烂的哪怕一丁点开始风险太高容忍。” 马丁罗伯特C. “敏捷原则,模式,和在C#实践”
我强烈建议寻找到这本书的建议。它的名字都“的设计味道”,其存在的原因,并让他们的后果。也许这将帮助你说服你的管理,目前的情况是不恰当的。
祝你好运!
在软件行业最大的问题是,编程代码的质量被认为是一个主观的问题。如果没有一些明确定义的指标,只是被排列整齐,并按照约定不足以保证质量是可以接受的。
有企图改变此,但它们不太可能获得足够的兴趣和接受主要是因为长期建立的程序员文化是拼命要远离任何类似工程的路程。规划中的“纯艺术”的理念意味着,您的20-50开发商都打算在自己独特的时尚代码枷,因此,无论个别程序员有多好,总和小组的努力总是会是“泥的大球”。
要避免这种情况,要么得到都是一样的“页”上的编码器,使您的会议的标准化代码的一部分,或者追着工作是开发团队比较小(1-3人),你是大奇卡。有一天,大车队会找到一个方法来建立更好的东西,但在那之前,即使是其中最好的是,如果他们可以得到接近6个满分10分,我们建立低质量的软件,非常幸运,因为这是我们建立我们的行业做...
保罗。
您必须遵循软件开发实践紧密结合。有必须的代码审查和单元测试constastantly确保该更新影响系统中的其他事情。 20 - 50开发者很多,但它可以做到的。实施良好的流程是,将节省您在这种环境中唯一的事情。强制编码标准也是关键。
跟踪缺陷和系统的各个部分的性能将允许你发现问题。随着系统被改变设计或写得不好的功能或模块将有缺陷率较高。当一个“问题”模块标识可以做出决定,将重写模块(而不是应用程序)。
连续的重构。您的的的重构,当您去,尤其是在设计层面。当你看到断码或设计,准备修复它。这往往是固定的东西,不破,本身的情况。除了它...它只是没有体现它的破碎......呢。
否强>
:)
通常情况下,项目并没有太多的测试覆盖率,并没有运行一个10分钟的自动化脚本,将建立和几乎完全是锻炼你的代码的选项。相反,大多数代码的结构,使其难以测试。最好的选择是然后添加简单的测试覆盖率在这里可以,同时开始以重构为使代码抽象,使得它更容易测试。
虽然球队将需要花时间提高了代码,使其干净,可测试,你可能会无法停止传递它会花时间“完成”清理。所以,你必须这样做,一步一步,同时还增加了新功能。这没关系,挑最严重的地区第一,不要指望明显的好处的时候了。坚持下去,因为最终你会到达那里。不要听那个说所有的大型项目都是不好的声音。
在短,花一点时间,每星期整理,并确保代码是更好下周比它在这个星期。
更多代码评审和或许代码所有权。
如果你只是破解一些随机代码,那么你不关心不亚于对你“自己”的代码。如果这是你的责任,以保持该项目的一个模块,想要闪耀。
和代码审查是当你告诉你的代码的时候。
开始创建单元测试,这将帮助你解耦你的代码,避免跟进bug修复错误。它你有良好的覆盖它将使您更轻松地删除未使用的代码。