防错设计
防错设计
Poka-yoke 是精益制造(Lean Manufacturing)领域的一个概念,意思是“防错”。Poka-yoke 的概念最早是新乡重夫在丰田汽车引入的。Wikepedia 上对 Poka-yoke 的介绍:
Poka-yoke (ポカヨケ) is a Japanese term that means “mistake-proofing” or “inadvertent error prevention”. A poka-yoke is any mechanism in any process that helps an equipment operator avoid (yokeru) mistakes (poka). Its purpose is to eliminate product defects by preventing, correcting, or drawing attention to human errors as they occur. The concept was formalized, and the term adopted, by Shigeo Shingo as part of the Toyota Production System.
More broadly, the term can refer to any behavior-shaping constraint designed into a process to prevent incorrect operation by the user.
Poka-yoke 在生活中的例子,譬如柴油的加油管是插不到汽油车的加油口里的,汽油的加油管是插不到柴油车的加油口里的。当时就觉得这个设计很赞,很安全,能够防止人搞错。
输入值的及时校验
-
有特定长度的、特定格式的,有 ISO 标准的,都要在值被输入的第一时刻,对长度格式等做充分的校验,校验发现不符合标准的,直接按照 illegal parameter 拒绝掉。
-
含有非法字符的配置值,要在第一时间就校验出来并 rejec 掉,不能让它进入我们的系统。如果进来了,在生效前要做好校验。我们要有这样一种设计模式:当发现配置值非法的时候,系统能够自我保护,不加载有问题的新配置,继续使用老配置;同时,为了确保新部署的系统也能正常工作,配置要有多版本,否则,正在运行中的系统能自我保护,但一旦重启了就别无选择只能加载有问题的新配置了。
-
全角双引号是东亚(中日韩)同学特别容易遇到的问题,很多富文本编辑器(包括 Microsoft Office)都会自动的把半角引号变成全角的。所以,如果需要开一个文本临时保存一下,要用 Sublime Text、VS Code等代码编辑器。这些编辑器不会做半角/全角的自动转换。
-
容易半角全角问题的除了引号以外,还有逗号(
,
vs.,
)、减号(-
vs.−
)、括号(()
vs.()
)。这些也是很容易出问题的。文本编辑器里的字体要设置成比较容易辨识半角全角的。这个道理和识别0O
和1lI
是一样的道理。增强视觉辨识效果,是防错的一个很有效的手段。 -
各种解析和转义代码(例如,URL escape、Unicode 到 ASCII 的转换、XML/Json/CSV 等格式在序列化和反序列化时对特殊字符处理等等),尽量不要自己去写代码,尽量用成熟的二方或三方类库。要对转义有敬畏心,健壮完备的转义逻辑不是件容易的事情,是需要投入一定的时间和精力去夯实的。宁可多花一点时间去找成熟的二方或三方类库,也不要为了节省时间自己写个简单的逻辑。
-
接口和数据模型的各种字段要定义清楚:支持什么字符、不支持什么字符。需求文档如果有关于特殊字符的处理逻辑,例如“不支持特殊字符”,那必须要求需求文档完整定义清楚什么是“特殊字符”。后面要增加支持的字符,就要改需求、走一个完整的设计编码测试闭环。对于输入值,要第一时间做校验,如有不支持的字符,第一时间抛错。
开发环境与生产环境的权限隔离
-
网络隔离:生产环境的资源,例如数据库、SFTP、API 等,都要尽可能配 IP 地址白名单,只有白名单上的 source IP 可以访问。不过,IP 地址白名单这个东西本身也是很容易出错的,要非常小心,要有很好的防错设计和监控应急能力。IP 白名单一旦改错,网络访问不通,可能引起大面积的故障
-
权限隔离:访问线下环境的账号和访问线上环境的账号必须是两个。同一个账号不可以同时有线上和线下的权限,防止搞错、调串。另外,如果是授予给工程师的生产环境访问权限,要做到授权范围最小、时间最短,必须要是 JIT(Just In Time),即要用的时候申请,用完之后马上回收。对范围大、有效期长的修改权限(读权限可以适当放宽)要严格管控。