首页 > 其他分享 >软件开发的一些思考

软件开发的一些思考

时间:2023-03-20 11:04:20浏览次数:38  
标签:思考 软件开发 代码 程序 测试程序 测试 设计 测试代码 一些

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

标签:思考,软件开发,代码,程序,测试程序,测试,设计,测试代码,一些
From: https://www.cnblogs.com/badnumber/p/17235539.html

相关文章

  • 关于存储的一些知识
    1一些概念 SATA,IDE,SSD,HDD, AHCI,IntelRST,IntelVMD,Raid,PCleNVmeSSD,从接口类型分硬盘,SATA或者IDE首先说SATA(SerialadvancedtTechnologyAttachment......
  • 算法思维:思考问题的一种方式
    方法论:万物皆朴素的第一性原理几乎任何领域的任何问题的解决方案,都可以看作是“某个结构上的朴素方法的优化“。计算机只能处理规模有限的问题,在给定规模且不考虑效率的......
  • KMP算法思考
    第一个全匹配没有价值,从第二个开始    采取每次匹配的最大值,则next数组为 计算next数组时也用了KMP算法,因此当不匹配时,j=next[j]; ......
  • 一些算法思想 及一些算法基础
    分治算法分治算法是一种高效的算法思想,它将问题分解成更小的子问题,通过解决子问题来解决原始问题。它的核心思想是将问题分解成若干个规模更小但结构相同的子问题,并且通过......
  • nchan 集成keydb简单测试&一些说明
    因为keydb是完整兼容redis的,所以对于单机版本的兼容是很简单的,配置就行了参考单机运行docker-compose文件version:'3'services:db3:imag......
  • #yyds干货盘点#对于babel的一些理解
    Babel是一个JavaScript编译器Babel是一个工具链,主要用于将采用ECMAScript2015+语法编写的代码转换为向后兼容的JavaScript语法,以便能够运行在当前和旧版本的浏览器......
  • 光场原理及一些算法代码实现
    2023.3.18好久没有写过博客了,感觉自己比以前更菜了\(//∇//)\好不容易的更新,是为了把最近看的几篇光场论文写个自己的整理和理解,后面可能会写一些用C++实现的光场处理算......
  • 在Eclipse中,当移动鼠标悬停到一些标签时标签名会暂时消失?
    刚开始使用eclipse软件学习Java时,发现它的工具栏的图标实在是太小了,怎么解决呢?你开始打开浏览器,在搜索栏中敲入“eclipse的工具栏的图标太小怎么办?”,你浏览了很多的方法,突......
  • golang中关于死锁的思考与学习
    1、Golang中死锁的触发条件1.1书上关于死锁的四个必要条件的讲解发生死锁时,线程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行。在讨论处理死锁问题的各......
  • Linux进程调度的思考
    a.进程怎么载入到CPU中运行?b.当前进程正在运行,怎么确定是否要切换下一个进程?c.怎么选出下一个进程?d.选择进程的算法和优先级?e.介绍一下常用的算法调度逻辑?f.从......