作者: 宋立新
Email:[email protected]
做了几年 Linux 底层嵌入式开发, 有一些心得, 这里记录下来,作为进一步学习 Linux 之前的一个总结。
Daily Build 是指利用自动化脚本,每天从版本库里提取代码及相关工具,生成可以下载到板子的系统镜像。大的公司比如Nokia/Microsoft等,都采用了该机制。是终端产品开发中一个Best Practise. 其好处有:
ü 构建脚本在一定的稳定周期后可以保证无差错的编译出版本。 避免人工编译的偶发性错误。
ü 节约人力成本。DailyBuild通常在深夜执行。不占用白天宝贵的人力、机器时间。
ü 便于版本回溯。出了新问题时,只要取出历史版本,进行二分查找,即可快速定位问题的初现版本。
ü 可以快速推出版本。 必要时,可以人工执行脚本。
相信很少有人开发软件不使用版本管理工具。版本管理是每日构建,快速开发的基础。
目前可选的版本管理工具有: CC/Git/Svn
ü CC 由于没有深入研究(没有机会进行服务器端管理及二次开发等),目前个人看到了两个缺点:
1. 价格昂贵,一般只有 Windows 客户端, 很难获得符合要求的 Linux 客户端(比如, 某版本只支持 Redhat Linux)。 所以,提交等操作必须在 Windows 下执行。而我们的代码都是在 Linux 主机上编译的。 手工地进行 Windows/Linux 拷贝容易出问题。比如, 链接文件问题。
2. Windows 下的 CC 无法支持事后取出每个版本(指以 commit 为最小区分的版本,也可能是我不知道, 至少我请教过的所有人都不知道)这导致在出了问题时很难快速定位。
ü Git 的好处是非常快速, 由于所有代码都在本地,任何操作都不依赖服务器。缺点有:
1. 不支持权限管理。由于任何一个客户端其实就是服务器端得一份拷贝。所以人都对等地获得所以源代码。
2. 不支持子目录操作。 你无法只是取出某个感兴趣的子目录。 (Android 在 Git 的基础上使用了 Repo)
ü Svn 的好处是支持非常精细的权限管理(当然,可能不如CC, 但足够了),可以控制某个人对某个目录的权限。缺点有:
1. 由于基于 CS (客户、服务器)架构,如果服务器崩溃了,则历史信息就丢失了。这一点跟CC类似。Git 则没有此问题。
通常, 我们对版本管理工具的需求有:
1) 支持 Dailybuild/Autobuild, 因为人工操作经常出错,我们应该尽量把能够自动化的操作交给脚本自动执行。
2) 支持高效的回归测试。
3) 支持权限管理。
4) 支持 linux/windows 双操作系统下的便捷操作。
目前看来, Svn 比较合适。
现在应用层开发单元测试的思想已经很流行,有人提出了测试驱动开发。 其实我认为底层开发同样适合使用测试驱动的方法。 测试可以是一个脚本, 一段代码,或者一个过程描述。
可以运行/执行的测试程序比一份使用说明更加令人放心,一个驱动的测试代码可以用作:
1) 应用层开发人员代码集成时的示例代码。
2) 测试人员进行测试时的起点代码。
3) 后续维护人员熟悉代码的切入点。
4) 原作者在添加新代码后检查新代码是否会有影响的工具。
5) 硬件同事用来测试硬件特性的工具。
单元测试可以分为功能测试,性能测试,稳定性测试等。丰富的单元测试用例是开发人员给自己的代码加上的一道保险,也是提高系统迭代效率的利器。
工作过程中的很多细节,包括测试数据,调试信息,查到的参考资料,想法等,事后再去回忆,其实是很难跟当时一样详细的。 养成记录的好习惯,对以后整理文档、 复现问题、工作交接等都有很大的帮助。
在实现了产品定义的基本功能后,我们就开始做优化了! 优化就是定义一些关键指标,然后将这些指标做的足够好。
Linux 下已经有很多工具,可以帮助我们来实现基于度量的优化。这里不讲细节,只是强调要有优化意识。脑海里总是想着该如何能够做得更好,一有想法要尽快去尝试,不断把事情做得更好。
优化不仅仅局限于把一个模块、一个产品做好, 流程、工作方式的优化是更重要的优化。
山外有山,人外有人。身处信息时代,我们每天都可以快速获得全世界的信息。
新的技术、新的工具可以提高我们的开发效率。有时你正在努力制造的轮子其实别人已经提供了一个完美的版本。
技术进步实在太快,我们应该努力跟上。也唯有持续学习,才能保持旺盛的工作能力,立于不败之地。