编写规范代码的检查清单
- 代码是按照编码指南编写的吗?- 代码能够按照预期工作吗?- 文件是不是在合适的位置?- 支撑文档是不是充分?- 代码是不是易于阅读、易于理解?- 代码是不是易于测试和调试?- 有没有充分的测试,覆盖关键的逻辑和负面清单?- 名字是否遵守命名规范?- 名字是不是拼写正确、简单易懂?- 名字是不是有准确的意义?- 代码的分块是否恰当?- 代码的缩进是否清晰、整洁?- 有没有代码超出了每行字数的限制?- 代码的换行有没有引起混淆?- 每一行代码是不是只有一个行为?- 变量的声明是不是容易检索和识别?- 变量的初始化有没有遗漏?- 括号的使用是不是一致、清晰?- 源代码的组织结构是不是一致?- 版权信息的日期有没有变更成最近修改日期?- 限定词的使用是不是遵循既定的顺序?- 有没有注释掉的代码?- 有没有执行不到的代码?- 有没有可以复用的冗余代码?- 复杂的表达式能不能拆解成简单的代码块?- 代码有没有充分的注释?- 注释是不是准确、必要、清晰?- 不同类型的注释内容,注释的风格是不是统一?- 有没有使用废弃的接口?- 能不能替换掉废弃的接口?- 不再推荐使用的接口,是否可以今早废弃?- 继承的方法,有没有使用 Override 注解?- 有没有使用异常机制处理正常的业务逻辑?- 异常类的使用是不是准确?- 异常的描述是不是清晰?- 是不是需要转换异常的场景?- 转换异常场景,是不是需要保留原异常信息?- 有没有不应该被吞噬的异常?- 外部接口和内部实现有没有区分隔离?- 接口规范描述是不是准确、清晰?- 接口规范有没有描述返回值?- 接口规范有没有描述运行时异常?- 接口规范有没有描述检查型异常?- 接口规范有没有描述指定参数范围?- 接口规范有没有描述边界条件?- 接口规范有没有描述极端状况?- 接口规范的起草或者变更有没有通过审阅?- 接口规范需不需要标明起始版本号?- 产品设计是不是方便用户使用?- 用户指南能不能快速上手?- 用户指南的示例是不是可操作?- 用户指南和软件代码是不是保持一致?
编写经济代码的检查清单
需求评审
- 需求是真实的客户需求吗?- 要解决的问题真实存在吗?- 需求具有普遍的意义吗?- 这个需求到底有多重要?- 需求能不能分解、简化?- 需求的最小要求是什么?- 这个需求能不能在下一个版本再实现?
设计评审
- 能使用现存的接口吗?- 设计是不是简单、直观?- 一个接口是不是只表示一件事情?- 接口之间的依赖关系是不是明确?- 接口的调用方式是不是方便、皮实?- 接口的实现可以做到不可变吗?- 接口是多线程安全的吗?- 可以使用异步编程吗?- 接口需不需要频繁地拷贝数据?- 无状态数据和有状态数据需不需要分离?- 有状态数据的处理是否支持规模水平扩张?
代码评审
- 有没有可以重用的代码?- 新的代码是不是可以重用?- 有没有使用不必要的实例?- 原始数据类的使用是否恰当?- 集合的操作是不是多线程安全?- 集合是不是可以禁止修改?- 实例的尺寸还有改进的空间吗?- 需要使用延迟分配方案吗?- 线程同步是不是必须的?- 线程同步的阻塞时间可以更短吗?- 多状态同步会不会引起死锁?- 是不是可以避免频繁的对象创建、销毁?- 是不是可以减少内存的分配、拷贝和释放频率?- 静态的集合是否会造成内存泄漏?- 长时间的缓存能不能及时清理?- 系统的资源能不能安全地释放?- 依赖哈希值的集合,储存的对象有没有实现 hashCode() 和 equals() 方法?- hashCode() 的实现,会不会产生撞车的哈希值?- 代码的清理,有没有变更代码的逻辑?
编写安全代码的最佳实践清单
安全管理
- 有没有安全更新的策略和落实计划?- 有没有安全漏洞的保密共识和规范?- 有没有安全缺陷的评估和管理办法?- 软件是不是使用最新的安全修复版?- 有没有定义、归类和保护敏感信息?- 有没有部署多层次的安全防御体系?- 安全防御能不能运转良好、及时反应?- 不同的安全防御机制能不能独立运转?- 系统管理、运营人员的授权是否恰当?- 有没有风险管理的预案和长短期措施?
代码评审
- 数值运算会不会溢出?- 有没有检查数值的合理范围?- 类、接口的设计,能不能不使用可变量?- 一个类支持的是深拷贝还是浅拷贝?- 一个接口的实现,有没有拷贝可变的传入参数?- 一个接口的实现,可变的返回值有没有竞态危害?- 接口的使用有没有严格遵守接口规范?- 哪些信息是敏感信息?- 谁有权限获取相应的敏感信息?- 有没有定义敏感信息的授权方案?- 授予的权限还能不能更少?- 特权代码能不能更短小、更简单?- 异常信息里有没有敏感信息?- 应用日志里有没有敏感信息?- 对象序列化有没有排除敏感信息?- 高度敏感信息的存储有没有特殊处理?- 敏感信息的使用有没有及时清零?- 一个类,有没有真实的可扩展需求,能不能使用 final 修饰符?- 一个变量,能不能对象构造时就完成赋值,能不能使用 final 修饰符?- 一个方法,子类有没有重写的必要性,能不能使用 final 修饰符?- 一个集合形式的变量,是不是可以使用不可修改的集合?- 一个方法的返回值,能不能使用不可修改的变量?- 类、方法、变量能不能使用 private 修饰符?- 类库有没有使用模块化技术?- 模块设计能不能分割内部实现和外部接口?- 有没有定义清楚内部数据、外部数据的边界?- 外部数据,有没有尽早地完成校验?- 有没有标示清楚外部数据的校验点?- 能不能跟踪未校验外部数据的传送路径?- 有没有遗漏的未校验外部数据?- 公开接口的输入,有没有考虑数据的有效性?- 公开接口的可变化输出,接口内部行为有没有影响?- 有没有完成无法识别来源的数据的校验?- 能不能不使用序列化技术?- 序列化的使用场景,有没有足够的安全保障?- 软件还存在什么样风险?- 有没有记录潜在的风险问题?- 有没有消除潜在风险的长期预案?- 有没有消除潜在风险的短期措施?- 潜在的风险问题如果出现,能不能快速地诊断、定位、修复?