(4)抽象流程
作为一个软件的主流程,这好像应该是软件主程序员应该负责的事情。其实,作为某一个模块的程序员,我们也可以从中学习到一些东西。就拿我经常说的一个例子来说,假设现在我们需要设计一个音频播放器,它需要支持mp3、wav、ogg等多种音频格式文件。看到这里,大家可以先考虑一下,这个软件应该设计?在这个地方,我们应该思考一下,所有的文件操作有什么共性的地方,能不能在各种音频文件之上构造出一个通用的文件访问流程。有了这个抽象的访问流程之后,那我们对各种音频的处理就是一个简单的注册和解析工作了。即使我们写的程序不正确,也不会影响原来主流程的运行过程。有了这一层抽象之后,可以极大提高我们工作的开发效率。
(5)单元测试
单元测试是一种非常好的方法。本质上说,代码设计者应该是代码的最终负责人。可是在实际工作中,我们把软件的质量问题过多地放在了测试人员身上。好多人认为软件测试是一个非常无趣且单调的工作。其实,情况并非如此。对于功能性测试,我们应该尽可能采取自动化测试的方法,实现版本的每日构造和每日冒烟测试。而对于模块的测试,那就要进行代码的单元测试。就我个人的经验而言,如何设计stub函数,如何设计单元测试是非常考验人的一件事情。随着单元测试用例的增加,我们的代码会越来越健壮,整个模块也会越来越稳定。可是在很多公司,单元测试做的很不足,或者说很多公司干脆彻底就不做了。
(6)自己编写测试工具
平时测试软件的时候,我们的方法其实不多。有的人习惯使用windows的性能分析工具,或者如果公司比较富裕一点,会自己购买pure coverage等工具。但是,其实很多时候我们是可以自己编写测试工具的。这些工具的编写不复杂,比如说
a)可以利用malloc重定向的方法,统计malloc的内存个数,看看内存有没有泄漏
b)利用开源工具gcov测试代码覆盖率
c)自己编写脚本解析模块,灵活地对代码功能进行测试
d)利用assert属性,捕捉一切异常的属性等等
(7)仿真工具
在嵌入式开发中,实际环境常常是非常有限的。所以,创建一个有效的仿真平台是什么重要的。就拿android来说,我们就是在windows上面开发一个android的仿真环境,那么app的开发者就不需要每次开发一个版本之后,到实际phone上下载之后才能看到实际的运行结果。有了pc的仿真之后,他在pc上看到的结果基本上就是在phone上看到的效果。这中间没有别人的打扰、没有实际环境的搭建,工作的效率自然而然就可以提高上去了。当然不仅GUI可以仿真,原则上只要不和具体硬件相关的操作都可以而且应该放在pc上来解决。
上面很多的内容都是我个人的一些总结和意见,欢迎朋友们多多交流看法。