【译文】程序员不善于管理状态

“你有没有试过把它关掉,然后再打开?”这是与技术支持相关的最熟悉的陈词滥调之一。但作为一个经常被家人请求帮助解决设备故障的人,我发现这是我最有效的工具之一。

这个解决方案很原始,但背后的逻辑却出人意料地深刻:程序员不善于管理状态。

作为一名程序员,我直观地了解这一事实。当我编写的程序第一次启动时,它处于最原始、最完美的状态。我精心设计的每个变量和数组都是我想要的样子。如果我有自动测试,那么这就是测试最多的状态。

只有在这个初始启动阶段之后,一切才开始变得糟糕起来。用户点击了什么?用户输入了一个字段!他们怎么能这样?他们怎么能用肮脏的小手玷污我美丽、完美的程序?

不知不觉中,用户不仅点击和键入了内容,还按下了浏览器的后退和前进按钮,以及刷新按钮,而且在几周未使用后又启动了程序,导致一些数据变得陈旧,或者他们安装了更新,现在他们在本地缓存了一些为旧版本程序设计的文件……就在这时,用户遇到了无数的错误、崩溃和冻结,而这些与软件本身的状态有关,最初的程序员并没有打算这样做。

这就是为什么 “关机再开机 “如此有效。你把软件放回到程序员预想的状态,然后 “噗 “的一声,一切都能恢复正常。不过,有时你还得更进一步运用这一逻辑。

最近,我妻子在启动 Steam 时遇到了问题。她已经有几年没有运行过这个软件了,于是她重新安装了它并点击了图标,但它拒绝加载。我上网查了一下,没有找到解决办法,于是凭直觉删除了 ~/Library/Application Support/Steam 文件夹(Steam 显然在该文件夹中存储数据),然后重新启动了它。噗!成功了

还有一次,她遇到了一个网络应用程序的问题,无论她刷新多少次,都会卡在加载条上。于是我打开了方便的 Chrome DevTools “应用程序 “选项卡,点击 “清除存储”,结果你知道吗?刷新并重新登录后,一切正常。

还有一次,她的 MacBook 在更新了 macOS 之后,拒绝在我们的惠普打印机上打印任何东西。在搜索了大约一个小时的各种网络论坛后,我发现我需要运行一个名为 HP Uninstaller 的程序来删除旧的惠普软件。噗!一切正常。

用一个专门的程序来清理自己程序的文件似乎有点可笑,就像承认失败一样,但实际上我认为这有点聪明。作为一名程序员,你不可能预知程序可能会出现的所有状态。你可以使用 XState 这样的工具来帮助可视化,但当你开始将可能的状态与缓存的配置文件相乘,再与软件的不同版本相乘,再与构建每个版本的不同团队相乘……要为每种结果制定计划就变得不可行了。(更不用说为每一种可能的状态编写测试了!)因此,与其让软件无法运行,不如承认自己人性的弱点,为用户提供一种从头开始的方法。

Mozilla 的“Refresh Firefox”功能是这一原则的另一个杰出应用。如果你有一段时间没有使用火狐浏览器了,那么它会弹出一个小提醒,让你把所有东西都清空,然后从头开始。这也许是避免用户流失到其他浏览器的好方法:我相信很多人从 A 浏览器转到 B 浏览器的原因是,第一天使用 B 浏览器就感觉快多了,这并不是因为 B 浏览器比 A 浏览器更优越,而是因为 B 浏览器不会被一大堆扩展、设置、历史记录、遗留更新文件等拖累。

如果你曾经从头开始重新安装 Windows 或安卓系统,并观察到一切都突然变得异常快速和轻便,那么你可能也见过这种现象。

我没有解决这个问题的办法。软件是复杂的,除非你有能力编写可以通过正式证明进行测试的代码,否则你不可能预测代码可能出现的每一种状态。因此,也许最好的办法就是提供某种逃生舱口,这样至少可以很容易地 “关闭并重新打开”。

本文文字及图片出自 Programmers are bad at managing state

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注