如何以减少完全重新工作的可能性的方式实现代码

时间:2009-06-02 00:36:40

标签: programming-languages modularity

由于一个小的规格变化,我发现了一件工作,结果证明没有正确规范。如果在项目开始时就完成了,那么大部分工作都是would have never have been needed in the first place

有哪些好的提示/设计原则可以防止这些事情发生?

或者为了在实施过程中实现功能请求或设计更改而减少重新编写代码所需的数量?

9 个答案:

答案 0 :(得分:6)

组件化。制作能够很好地完成工作的小块代码。但是,那只是一个开始。它通常是导致代码如此糟糕的因素的大量组合,需要完整的返工。从高度不稳定的要求,糟糕的设计,缺乏代码所有权的一切,列表不断。

增加其他人的成长:沟通。
您和客户,您和管理层,您和其他开发人员,您和您的QA部门之间的沟通,每个人之间的沟通是关键。确保管理层了解合理的时间表,并确保您和客户完全了解您的建筑物。

答案 1 :(得分:4)

花时间与您构建产品的客户保持沟通。制作里程碑并设置时间,以便在每个里程碑向客户显示项目。即使客户在展示时对某个里程碑感到完全失望,也可以从最后的里程碑中划掉你所拥有的东西并重新开始。这也要求你的工作建立在像Csunwold所说的那样彼此独立工作的块中。

点......

  1. 保持开放式沟通
  2. 对产品的进展持开放态度
  3. 愿意每天更改客户业务的需求和产品变更的规格。

答案 2 :(得分:2)

软件需求发生变化,除了与客户更频繁的互动外,没有什么可以做的。

然而,可以构建一个在变化时更加健壮的代码。它不会使您免于丢弃满足任何人不再需要的要求的代码,但它可以减少此类更改的影响。

例如,只要适用,使用接口而不是类(或您的语言中的等效语言),并避免向接口添加操作,除非您完全确定需要它们。通过以这种方式构建程序,您不太可能依赖于特定实现的知识,并且您不太可能实现您不需要的东西。

这种方法的另一个优点是您可以轻松地将一个实现交换为另一个实现。例如,有时候写出最愚蠢的(效率),但最快的是为你的原型编写和测试实现,并且当原型是产品的基础和实际的性能时,最终只能用更聪明的东西替换它。事项。我发现这是避免过早优化,从而丢掉东西的一种非常有效的方法。

答案 3 :(得分:2)

  • 迭代小

  • 经常迭代

  • 迭代之间的测试

  • 尽快得到一个简单的工作产品,以便客户提供输入。

基本上假设 东西会被抛弃,所以代码恰当 ,并且没有足够的东西让它被抛出需要花费很多时间。

答案 4 :(得分:2)

正如已经说过的那样,模块化就是答案。但在实践中使用它可能是一个难以回答的问题。 我建议关注:

  • 做好预定义事情的小型图书馆
  • 模块之间的最小依赖关系

首先编写接口是实现这两者的好方法(使用用于依赖的接口)。在编写代码之前,接下来针对接口编写测试通常会突出显示非模块化的设计选择。

我不知道你的应用是否是UI密集型的;这会使模块化变得更加困难。它通常仍然值得努力,但如果没有,那么假设它不久就会被抛弃并遵循冰山原则,90%的工作不依赖于UI,因此更容易保持模块化。

最后,我推荐安德鲁·亨特和戴夫·托马斯的“实用程序员”充满了提示。我个人最喜欢的是干 - “不要重复自己” - 任何代码都说同样的东西两次闻起来。

答案 5 :(得分:1)

天儿真好,

通过这里的其他答案,我注意到每个人都在提及为下一个项目做些什么。

似乎缺少的一件事就是进行清洗以找出规范的原因。不同步。满足客户所需的实际要求。

我只是担心,如果你不这样做,无论你采取什么方法来实施你的下一个项目,如果你仍然在实际要求和规范之间存在不匹配。对于你的下一个项目,那么你将再次陷入同样的​​境地。

这可能是一种简单的事情,如糟糕的沟通或客户需求蔓延。

但至少如果你知道原因,你可以尝试并尽量减少它再次发生的可能性。

没有敲响其他答案的说法,那里有一些很棒的东西,但请从发生的事情中学习,这样你就不会被谴责重复。

HTH

欢呼声,

答案 6 :(得分:1)

有时重写是最好的解决方案!
如果您正在为相机编写软件,您可以假设下一个版本也将执行视频,立体视频或3D激光扫描并包含所有这些功能的所有挂钩,或者您可以编写这样一个多功能的可扩展宇航员架构,它可以应对包括喷气发动机在内的下一代相机 - 但是它的成本,资金和性能都会花费很多,你最好不要这样做。

对新角色中的新功能进行完全重写并不总是一个坏主意。

答案 7 :(得分:0)

就像csunwold所说,模块化代码非常重要。写下它,以便如果一个部分容易出错,它不会破坏系统的其余部分。这样,您可以调试单个错误部分,同时能够安全地依赖其余部分。

除此之外,文档是关键。如果您的代码整齐且清晰地注释,那么将来重新编写代码对您或正在调试的人来说将更加容易。

使用源代码控制也很有帮助。如果您发现某段代码无法正常运行,则始终有机会恢复到过去的强大迭代。

答案 8 :(得分:0)

虽然它并不直接适用于您的示例,但在编写代码时,我会密切关注以后可以看到软件在未来发展的方式。

基本上我试着预测软件的去向,但是批判性地,我抵制了实现我能想象的任何事情的诱惑。我所追求的只是尝试使API和接口支持可能的未来而不实现这些功能,希望这些“可能的场景”帮助我提出一个更好,更具前瞻性的界面。

并不总是有效。