成为一名好 RD,你该具备的研发素养 课堂笔记 | 青训营笔记

337 阅读1分钟

这是我参与「第四届青训营 」笔记创作活动的第15天

成为一名好 RD,你该具备的研发素养

代码质量

小小的代码错误,可酿成巨大的损失

小小的代码问题可能导致严重损失.png

优秀代码的特质

优秀的代码可信赖、易维护、Bug少

  1. 具备明确的语义,代码即注释
  2. 阅读代码时,无需其他联想
  3. 没有泛指,能明确知道变量名,便于调试

 function getCartTotal(cartItems) {
     var cartTotal;
     var itemPosition;
     for (itemPostion = 0; item < cartItems.length; itemPosition++) {
         cartTotal += cartItems[itemPosition].price;
     }
     return cartTotal;
 }

优秀的代码能

  1. 完全满足产品需求
  2. 功能变更时,只需要进行较小的改动
  3. 发生异常时,能优雅地报错,或者能自我恢复
  4. 对于新的场景,能够优雅地处理,即便没有提前预见
  5. 系统能够处于安全状态下,能较好的应对安全攻击

代码可维护性规则

面对庞大的代码需遵循可维护性规则

安卓系统代码多大?

几十G 都太保守了,已经 250G 惹(Android Open Source Project)

良好的开发规范

统一的编码规范:命名规范、代码格式、注释规范

【强制】所有编程相关的命名严禁使用拼音与英文混合的方式

正例:bytedance / toutiao / tiktok / taobao / shenzhen 等国际通用的名称,可视同英文(也比如加入了英语词典那些拼音)

反例:HongBao [红包] / getPingLunByName() [评论] / String sb [烧饼]

稳定的工程结构:目录清晰、模块化、组件化、依赖可控、访问权限...

可轻松在代码库中找到示例,重复使用其他人的代码

可以轻松地将新的依赖项添加到其项目,以及迁移到新的依赖项版本

依赖项稳定,并且很少破坏代码

优秀的方案实现:文档、用例、可测性、高内聚低耦合...

灵活适度应用不同架构设计思想,譬如:Binder IPC通信、IoC/SPI 解耦

可以运用自动化测试手段,保障重构的正确性

使用场景的用例考虑充分,大多数情况下不需要推倒重来

圈复杂度

Cyclomatic Complexity ,也称条件复杂度,是一种度量手段

圈复杂度 = 边数量 - 节点数量 + 2

圈复杂度 = 判定条件数 + 1

这个判定条件数是一个表达式

 for(i in list) { // 这是一个
     if (1 == 2 && 2 != 3){ // 这有两
 ​
     }
 }

圈复杂度 = 1 + 2 + 1 = 4

代码评审

Code Review 简称 CR,其目标是通过阅读源代码来检查代码是否符合编码规范,前置发现代码质量问题。能够提升代码质量(可读性,正确性,安全性),促进学习交流(经验传授,学习提升,培养开放的沟通氛围)

CR 不是要发现所有 Bug,也不是要缩减测试人员。

CR 关注的点

代码规范

命名:是否定义的清晰准确的变量名、函数名、类名

描述:CR 的描述是否准确对应到功能

风格:是否遵循统一的规范

文档:是否同时改动了文档

功能设计

设计:是否良好的设计并适用于当前系统

功能:实现是否正确

简洁:实现是否简洁,如果过于复杂是否有更简单的方式

测试:是否包含自动化测试

评判要点

设计:这段代码做什么?

功能:实现的逻辑是否与目标一致?是否覆盖了全部的场景?是否存在异常?

简洁:是否有更高性能的方式?

测试:可测试性?测试覆盖?

总结

1.CR能前置地发现代码质量问题

2.将CR做得小点能加快评审效率

3.谦逊坦诚面对不同的评审意见

重构实践

技术债

本应采用最佳方案,但妥协了,从而给未来带来了负担

公开技术债
消费技术债

重构

对软件内部结构的一种调整,目的是在不改变软件的可观察行为的前提下,提高起课理解性,降低其修改成本。

方法

封装成员变量

方法提取

一般化类型 :将封装到父类

将子类的函数移到父类

将父类的函数移到子类

方法更名

代码的坏味道,预示着即将变坏。重构就是不断对抗 Code Smell

方法运用

if -> 用数组加循环

函数参数过多:将参数封装,通过函数调用获取参数

超长函数,逻辑晦涩:提取方法,新建小的子函数

Switch-Case 爆炸:策略模式,类型抽象

逻辑嵌套:提前返回

长调用链:隐藏中间人调用

1.代码中常有技术债,理解它,处理它

2.重构是在有限范围内运用一定的方法

代码上线

分支开发模式

需要找到合适自己研发模式的分支模型

持续集成

持续集成概念

灰度发布

AB实验

干扰因素太多,代码直接上线无法量化收益,指标波动无法归因。

总结

QA

  1. 提高 Code Review 效率的方法,目前的方式有点费时间

这个投入是必须的。小的 CR 多来几次

Moble 提需求