软件开发的一些思考

1.测试驱动开发

1)测试驱动开发是有争议的。有些人鼓吹它的好处,有些人却质疑它的有效性。鼓吹和质疑者中都不乏大佬。

2)测试贯穿开发过程(包括规划,设计过程),这个理念很对,目的在于尽可能早地发现问题。比如在设计阶段,和用户交流清楚需求的细节,可以减少无用功。当然,有些问题只有动手编码才会发现,但一发现问题就要和用户交流,澄清需求。这也可以说是一种测试,需求的测试。

3)但是,先写测试代码,看着它失败,然后写代码让它成功。这点颇为费解。某大佬就说无法理解还没写代码就写测试。另外一位大佬解释说测试意味着设计。有一定道理。就是说,写测试代码,目的是勾画出哪些功能需要通过测试保证实现。不过呢,似乎不能说只有先写测试代码,才能清楚要怎样设计。或者说,好像看不到只有先写测试代码才能实现的功能/效果。这一点我还没有得到很满意的解答。

4)大概只有和一个完美实现测试驱动开发的人一起工作一段时间,才能有比较清晰的理解。但没有这个条件,所以只能存疑。

5)测试驱动的主要意义,据说是保证程序修改后不搞坏原来工作正常的功能,而且可以自动化验证。

6)程序修改后,把原来正常的功能破坏了,这种情况是有的。通过自动化测试(运行原有的测试程序),应该能比较容易地发现这类问题。

7)不过,还有一种情况,就是修改程序后,原来的功能没破坏,但是自动化测试没通过,因为原有的测试程序需要修改才能正常运行。这也是测试驱动开发受到质疑的原因之一。就是还要花时间精力去修复测试程序。这个不productive,等于是增加了工作。Salesforce因为单元测试必须通过,否则不能部署(测试覆盖率未达到的话),所以碰到过这种情况。

8)从字面上来看,测试的意义在于什么?发现程序中的问题,应该是功能之一。但是,工作中接触到的测试代码,在我看来基本上是垃圾或者鸡肋。因为不过是测试了一个简单的数据组合,无法保证程序无错。比如说,如果输入参数为null,程序就会出错,而测试代码中,只测试了非null的输入参数,自然不可能测试出程序的bug。这些测试代码的真正用处不在测试,而在调试。我很少利用这些测试代码去检验程序是否有错,而是利用它来调试程序。我不关心最后的assert结果,而是利用测试程序提供的切入口和机制,来设断点,跟踪调试。比如测试一个dll,如果不用测试代码,需要建个工程引用它,然后跟进去调试,比较麻烦。而通过测试程序搭建好的切入口,可以比较方便地进入dll内部进行调试。Salesforce的batch apex job,如果真要运行job来测试,也比较麻烦,通过单元测试,则可以比较方便地测试(虽然性能不高)。

9)不少质疑者说,写好程序后,通过详细测试后,照样可以保证程序无措,为什么要用测试驱动开发呢?理论上说,测试驱动开发似乎意图力争在早期阶段就发现问题,而不是程序写好了才发现问题。理论上说有道理,但具体实践似乎还有疑问。

2.什么是好的代码/设计

1)我的感觉是好像很多人理解就是什么松耦合,设计模式等等一套的东西。但是,实践中觉得好像又不完全是这么一回事。

2)设计模式给我的感觉就是尽量设计得”灵活“,有需求变化时,可以尽量少改动。

3)但是,需求是难以预测的。碰到过很多次,设计得比较灵活的部分,却好几年甚至更长时间,需求都没有变化。而原来以为”不太会变“的部分,却变动频繁。当然有设计经验的问题,但需求难以预测,也是客观实际。

4)实际上,很难把所有的部分都设计得很灵活。受到时间等因素的制约,往往只能把一部分设计得比较灵活。

5)而且,设计灵活也不是没有代价的。比如,增加了程序的复杂性,由此增加了维护的困难。遇到的一个有点极端的例子,就是某项目好像实现了”教科书级“的设计,忘了有几层结构,什么数据层,数据操作层,应用层......,结果却不好维护。某老开发员同事干脆说维护不了。我硬着头皮花了两星期,总算看懂了代码,但也不想去改它,因为实在太麻烦了。

6)所以,感觉有些好的设计原则,或许是教科书上找不到的。比如程序要写的简单。易读性其实是很重要的。不怕你程序写的烂,一个函数几百行代码,只要逻辑清楚,并不是问题。而程序跳来跳去,一会儿跳到这个文件,一会儿跳到那个文件,容易调试得头晕目眩。

7)好的设计,能应付一切需求变动的设计未必是追求的目标。只要需求变动后,能够迅速做出调整,适应新的需求。这样的设计,我觉得就不错了。

8)要避免同样的逻辑出现在多个地方。因为如果需要改动,很容易遗漏,改了一处忘了改另一处。不过,有时候也有问题。比如原来有工作正常的代码。现在增加了新的需求,又要保留原来的功能。这时,如果根据同样的逻辑只出现在一个地方,就势必要修改原有代码,但这就有搞坏已有功能的危险。但如果原来的代码不动,新写代码,又会出现重复出现相同逻辑的问题。这个有时也不太好解决。一般来说,我倾向于改动原有代码,代价是需要更多时间做回归测试。但有时条件不允许回归测试。

posted @ 2023-03-20 10:51  平静寄居者  阅读(23)  评论(0编辑  收藏  举报