知识卡片
健壮性没有立竿见影的解法:测试覆盖不等于质量保证,谨慎发明轮子
内容
相比可维护性和性能,健壮性(代码在用户输入、并发、网络I/O这类常见特殊场景下的容错能力)是一个没有找到立竿见影解决方案的领域——常规的测试方法确实能发现代码里的一些Bug,但到了复杂的真实生产环境中,总会冒出一些完全没有被预料到的问题。面对这个没有捷径的困境,能给出的建议只有两条相对谨慎的方向。第一条:不要把”测试”和”质量”简单画等号——做更多测试的目的是保证代码质量,但测试本身不等于质量,即使做到了覆盖80%场景的测试,剩下那20%没有被测试覆盖到的地方,依然完全可能出问题;测试覆盖率是一个有用但绝不完备的质量保障手段,不能因为测试覆盖率数字好看就误以为代码已经足够健壮。第二条:谨慎发明轮子——对于UI库、并发库、I/O Client这类已经有大量成熟方案的领域,在能满足业务需求的前提下,应当尽量优先采用现成的成熟解决方案,而不是自己重新实现;”成熟”这个词本身就意味着这套方案已经在大量真实使用场景中经受过反复检验,这种经过实践检验的效果,往往比自己团队短期内能做到的测试覆盖要更可靠、更全面。这个案例提示了一条应对”没有确定性解法”的领域的现实态度:不是所有工程问题都存在一个明确的方法论可以直接套用去彻底解决,健壮性正是这样一类问题——面对这类问题,与其焦虑地寻找一个不存在的万能解法,不如接受它的不确定性,转而采取一些能持续降低风险(提高测试覆盖但不迷信它完备、优先复用经过大量验证的成熟方案而非自己造轮子)的务实做法。
参考来源
- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.7 系统运维之如何应对烂代码"节,"5.7.2 改善性能与健壮性"(源文件:_epub-src/OEBPS/Text/Chapter5_7_3.xhtml)
- 结论依据:原文说明"对于健壮性来说,我并没有找到什么立竿见影的解决方案……做更多测试的目的是保证代码质量,但测试并不等于质量,你做了覆盖80%场景的测试,但在那20%测试不到的地方还是有可能出问题……谨慎发明轮子……在能满足要求的情况下尽量采用成熟的解决方案",直接支撑本卡片结论。
- 原始内容:对于健壮性来说,我并没有找到什么立竿见影的解决方案,因此,我只能谨慎地提出一点点建议:做更多测试的目的是保证代码质量,但测试并不等于质量……谨慎发明轮子。例如UI库、并发库、I/O Client等,在能满足要求的情况下尽量采用成熟的解决方案。