我已经尝试过预先计划一些事情,但是直到开始编写一些代码之前,我似乎无法真正预见到一切。
诱人的是,认为完美的计划可以为您提供完美的软件设计/体系结构,但是事实证明,这绝对是错误的。这有两个大问题。首先,“在纸上”和“代码”很少匹配,其原因是因为很容易说出应该如何做而不是实际去做。其次,无法预见的需求变更在开发过程的后期就变得显而易见,而这从一开始就不可能被考虑。
您听说过敏捷运动吗?这是一种思考方式,我们重视“响应变化”而不是“遵循计划”(除其他事项外)。这是宣言(快速阅读)。您还可以阅读有关Big Design Up Front(BDUF)的内容以及存在的陷阱。
不幸的是,企业版“敏捷”是一堆虚假的东西(认证的Scrum管理员,以“敏捷”为名的繁重流程,强制Scrum,强制100%代码覆盖率等),并且通常会导致asinine流程更改,因为管理者认为敏捷是一个过程和一个灵丹妙药(两者都不是)。阅读敏捷宣言,听鲍勃叔叔和马丁·福勒这样的人发动这项运动,不要被“公司敏捷”的废话所吸引。
特别是,通常您只需要对科学代码进行TDD(测试驱动开发)就可以摆脱困境,并且您的软件项目很有可能会表现得很好。这是因为成功的科学代码大多具有超可用的界面,其性能是次要的(有时是竞争的)问题,因此您可以摆脱“贪婪”的设计。TDD迫使您的软件具有超强可用性,因为在实际实现之前,您要编写(理想情况下)如何调用它们的代码。它还可以通过小的接口强制执行小的功能,这些接口可以通过简单的“输入” /“输出”方式快速调用,并使您处于重构的良好位置 以防需求改变。
我认为我们都可以同意这numpy
是成功的科学计算软件。它们的界面小巧,超级可用,并且所有功能都能很好地配合使用。请注意,该numpy
参考指南明确建议使用TDD: https ://docs.scipy.org/doc/numpy-1.15.1/reference/testing.html。过去,我曾将TDD用于SAR(合成孔径雷达)成像软件:而且我还可以断言,它在该特定领域非常有效。
注意: TDD的设计部分在难以进行基本重构(例如确定您的软件需要高度并发)的系统中效果不佳,例如在分布式系统中。举例来说,如果你要设计的东西,如Facebook,你有几百万的并发用户,进行TDD(驱动设计),将是一个错误(仍是好的使用后,你有一个初步的设计,只是做“测试第一发展”)。在跳入代码之前,请考虑一下应用程序的资源和结构,这一点很重要。TDD绝不会引导您使用高度可用的分布式系统。
我如何才能避免总是觉得自己完全从头开始重建程序,会做得更好呢?
鉴于上述情况,应该可以很明显地看出,完美的设计实际上是不可能实现的,因此追求完美的设计是愚蠢的。你真的只能接近。即使您认为可以从头开始重新设计,也可能仍然存在一些隐藏的需求,这些需求并没有显示出来。此外,重写至少需要花费开发原始代码的时间。几乎可以肯定它不会更短,因为新设计可能会遇到无法预料的问题,而且您还必须重新实现旧系统的所有功能。
要考虑的另一件事是,只有需求改变时,设计才真正重要。如果没有任何改变,设计有多糟糕都没关系(假设它在当前用例中是完全可用的)。我在一个具有22,000行切换语句的基线上工作(该函数甚至更长)。这是糟糕的设计吗?哎呀,太可怕了。我们解决了吗?不。它可以正常工作,并且系统的那部分从未真正引起崩溃或错误。在我参与该项目的两年中,它只被触摸过一次,您猜到有人在开关中插入了另一个盒子。但是,花时间去修复如此少见的东西是不值得的,事实并非如此。让不完美的设计保持原样,如果它没有破裂(或不断破裂),则不要修复它。所以也许您可以做得更好... 但这值得重写吗?你会得到什么?
HTH。