关于开发流程的建议
纵观互联网家项目的整个开发流程,可以简单梳理为:设计->需求澄清->开发 ->测试->上线。这个也是普遍的开发流程,但是需要关注的是,互联网家的测试是黑盒测试。黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。所以它并不是基于代码的测试。
那么黑盒测试会逐渐暴露出一个什么问题呢?黑盒测试不可能覆盖所有代码,覆盖率较低,大概只能达到总代码量的百分之30,特定的程序代码无法被测试到,举个例子,程序的入库逻辑,更新或者插入某张表,那么入库逻辑是不会被测试的。再举个例子,程序的错误的校验逻辑也可能测试不出来,毕竟黑盒测试只关注输入与输出。
但是进行白盒测试昂贵的,所以为了弥补黑盒测试带来的缺陷,我建议可以在开发流程中增加代码评审环节。
代码评审就是我们所说的Code Review,通常多人协助开发下,为了提高主库代码的质量,保证良好的软件架构,促进团队的知识共享,提高团队整体水平,代码评审这一环节就显得尤为重要。
代码评审的目的
根据Google 工程团队执行代码评审活动后发现,除了捕捉bug外,还对5大无形收益。
· 代码评审促进团队和个人开放度
· 代码评审提升团队交付标准
· 代码评审激励团队协作
· 代码评审保持安全至上
· 代码评审构建社会认可
什么时候进行代码评审
代码评审最重要的一点是非常灵活,无固定形式,随时随地都可以发起的。根据github跟apache的一些开源项目的代码评审实践,往往是将PR合并到主干时进行评审并作为是否合并到master分支的一个准入条件。那么针对互联网家项目组,可以在合并到dev分支之前,也就是转测之前进行一次代码评审,评审作为是否能合并到master分支的一个准入条件。
如何执行评审
前期准备工作:
提前安排好一个小的房间或者会议室,利用投影仪和gitlab,进行Code Review,评审会议的成员为组内的相关同事,组长或者项目模块负责人,产品经理,项目经理等,成员可以灵活安排,最好三个以上。
代码作者:
· 确定待评审代码的范围
根据SamrtBear在思科的一个系统小组的研究,一个开发人员一次评审的代码在200-400之间,审查超过400行代码后效率和发现均呈下降趋势。如下图: [图片上传失败...(image-95a738-1568186532925)]
同时,一个小时审查的代码行数应该少于500行,超过500行后效率呈下降趋势。 [图片上传失败...(image-ce0b9d-1568186532925)]
· 简单描述代码的业务逻辑以及主要的业务流程
· 开放的心态接受评审的问题跟建议
代码评审者:
· 准备一个检查列表(checklist),把检查出来的问题标记出来。
· 了解业务逻辑和主要流程。
· 准备好一些问题,对于不确定或者不明白,尽量以问题形式跟作者沟通,而非质疑。
· 准备一些解决方案。在提出问题时候,同时思考更好的方法或者解决方案是什么?你的方法好在什么地方?
代码评审的关注点:
· 功能性 - 功能完整,是否严格按照产品说明书实现产品的所需的功能点
· 可读性 - 代码易读易懂,其它人能够轻松从代码中读逻辑和设计思想,命名是一个学问。
· 可测性 - 代码能够轻松被单元测试覆盖,一般来说无法被单元测试覆盖的代码不是一个好代码
· 可维护性 - 代码运行期间日志输出完整,运维人员或者其它人员可以从日志中了解应用的运行逻辑和状态。
· 性能 - 天下武功唯快不破,确保代码在可度量的数据量级下面保持一个稳定的性能表现。代码是否存在性能问题,预计峰值流量能到多少。
· 多线程,并发和锁 - 在并发或者多线程情况下,代码执行结果是否有问题。过去几个月中我们有一个应用是以Shell的方式启动任务,每一个作业一个进程。由于这种方式带来的资源利用率较低,打算改成多个作业运行在一个进程中(容器)以节省系统资源, 上线后发在存在多处线程不安全的问题,实例变量被污染导致线上问题。
· 安全性 目前虽然有很多的扫描工具可以帮助发现代码安全的问题,但更专业的开发人员在写代码就已经注意这个问题,避免基本的SQL注入,XSS跨域等问题。有兴趣的同学可以参考OWASP CODE REVIEW GUIDE
代码评审中注意事项:
· 代码评审不仅是技术,也社会学。双方沟通表达能力决定代码评审的效率和有效性。评审者需要注意问题的方式或者语气,就事论事,不上升到精神和思想层面。而作者则需秉承一切问题都可探讨或有更好的方案的想法吸收理解他人的想法,即使评审提出不合适的问题,那么你让队友知道一个正确的方法仍然是团队和组织的收获。
· 代码评审不应太过于关注代码风格,代码风格的检查完全可以通过IDE或者扫描工具SONARCube集成CheckStyle, PMD,FINDBUG实现。