摘录 Nicholas C. Zakas 的 每月精选 时事通讯(请立即注册!),经许可。
我最喜欢的东西之一是遮蔽胶带(也称为美纹纸胶带)。它看起来像一件很傻的东西:你在墙上贴一些胶带,以便在油漆时避免弄脏墙壁。这种胶带的粘性不强,因此可以从墙上撕下来而不会造成损坏。我喜欢遮蔽胶带的原因在于它背后的理念:绘画很凌乱,与其试图避免弄脏,不如用遮蔽胶带先弄脏,然后轻松清理。即使是最优秀、最有才华的画家也会偶尔溅到一些油漆,分心,或者以其他方式导致油漆涂到不该涂的地方。用遮蔽胶带覆盖油漆可能涂到的地方,然后撕掉胶带以创建干净、整洁的完成区域,这要快得多、容易得多,也减少了挫败感。这与软件工程有什么关系呢?
遮蔽胶带与一个名为 容错 的概念息息相关。与其期望一切顺利,不如期望会出现错误。当你期望会出现错误时,你做出的决定不是为了避免所有错误,而是为了在发生错误时轻松恢复。油漆涂到不该涂的地方了吗?如果该区域被遮蔽胶带覆盖,那也没关系。忘记贴遮蔽胶带了吗?现在这个错误就变得更严重了。作为软件工程师,我们可以用同样的方式思考我们编写的代码。
使你的代码具有容错性,就是要问自己一个问题:它会如何失败?不是它是否会失败,而是假设它会失败,以及它会以哪些方式失败?
很棒的类比,我喜欢。
但是,作为一名从事多年专业油漆工作的油漆工,没有一个商业油漆工使用胶带。
你对现有的工具(画笔)和技巧(角度和油漆量)变得足够熟练,可以非常快速和准确地进行油漆,而无需额外的工具。
还有另一个类比吗?由你决定。
哦,是的!遮蔽胶带就像“垃圾回收器”,一项为了清理一些开发人员在系统中懒得进行更好的规划和解决方案架构时产生的混乱而发明的功能。
也许不是商业油漆工,但在汽车、摩托车等物品上绘制复杂图案时会大量使用它。也许可以这样想——如果你正在构建静态/不太复杂的东西(比如画一块巨大的单色帆布),你需要考虑的错误就比较少。但是,随着项目的复杂性增加,你的容错能力也应该随之增长。
垃圾回收的存在并非因为“懒惰的开发人员”……它存在是因为手动内存管理既乏味又容易出错,并且这些错误存在安全隐患,而这些隐患可以通过自动方式解决。遮蔽胶带与垃圾回收不同。
商业油漆工不需要“额外的工具”,就像说“代码不需要注释”一样。
我的叔叔是一位做了大约40年的油漆工,在德国拥有自己的公司,并且经常使用胶带。窗户、插座等。
但他可能不如你那么厉害。
这个类比的问题在于,用户经常会看到过度喷涂或滴落的粗心结果。捕获问题并将其隐藏在用户面前并不能使其消失,它只会使用户的行为更加令人费解。
意外问题很困难。关键在于建立监控机制来检测它们,以便你可以修复它们。试图预测什么会失败、为什么失败、如何修复以及如何告知用户不仅是徒劳的,而且是浪费时间。或者,简而言之
“永远不要测试你不知道如何处理的错误条件。”——丹尼尔·基斯·莫兰
不向用户抛出软件错误基本上是 UX 和品牌 101。预料到故障模式不仅不是徒劳的,而且是编写远程体面软件的必要条件。记录和处理异常状态是我们可用的两个独立的非互斥工具。至于“使问题对用户更加令人费解”,我认为未能控制问题的呈现方式对任何事情都没有帮助。
我想起了今年在 CodePen 发生的一件事。我们根据查询显示项目网格。在一些罕见的极端情况下,数据中存在一些问题,导致客户端错误,并且整个网格会失败/消失。我们在各个项目周围建立了一个错误处理边界,这样类似的错误只会导致单个项目失效,而不会影响整个网格。遮蔽胶带。我们仍然记录并修复数据问题。