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