NeoVim 删除用户数据:违背 Raskin's First Law
"They had no concept of a duty of care to their users."

计算机科学家 David Chisnall 分享了他对 vim 和 NeoVim 的使用经历。他高度赞赏 vim 的 Persistent undo 功能,该功能在二十多年的版本迭代中始终可靠,完美践行了 Jef Raskin 提出的 Raskin's First Law:程序不得损害用户数据。然而,当他尝试 NeoVim 时,该程序直接删除了原有的 vim 撤销文件,导致历史数据丢失。当开发者辩称 Persistent undo 格式不稳定、用户不应依赖时,Chisnall 意识到这暴露了开发者对用户数据缺乏基本的 Duty of care。这一事件提醒我们,软件开发者必须时刻敬畏用户的数据安全,任何以技术迭代为借口破坏数据完整性的行为,都是对用户信任的背叛。
他们的行为表明,他们完全没有对用户数据尽到应有的 Duty of care。
HN 评论区
299- jeremyjh
这个故事没有任何参考资料支持作者对事件的描述,但以下情况似乎大体属实:
1. 这一改动会破坏 Neovim 和 Vim 的撤销历史记录 [参见编辑:其实并非如此]
2. 这意味着 Neovim 会删除另一台用户电脑上由其他程序创建的数据。
3. 在功能发布之前,这一点就已经为人所知。
4. 他们还是照做了。
我认为对此真的无法进行任何事后的辩解。
https://github.com/neovim/neovim/pull/13973#issuecomment-789...
编辑:我漏掉了一个重要细节。该用户在 nvim 和 vim 中指定了相同的 undodir 路径。Vim 需要一个路径才能启用该功能——没有共享的默认路径。在我看来,用户共享路径这一情况极大地改变了故事的性质,因为现在这变成了 nvim 删除由 nvim 自身创建的数据,而不是为其编写数据迁移方案。
我仍然可以对此表示反对,但这至少让“只需使用不同路径”这样的替代方案变得更加复杂,并彻底改变了我对这一情况的看法。我认为在这种背景下,Neovim 的决定是合理的。也许他们本可以将旧撤销文件夹的内容保存到某处并通知用户——可以说那样会更有人情味,但我并不认为他们有道德义务这么做。
- gavinhoward
作为一名 Neovim 用户,这件事让我瞬间停住,痛苦地意识到:我可能也遭遇了同样的情况,只是当时没意识到。曾经有一段时间我无法撤销某些操作,而那正是在一次 Neovim 升级之后。
与 Chisnall 博士不同,我的编辑器之旅是从 Neovim 开始的,所以并没有经历那种过渡带来的坑。然而,如果持久化撤销文件的格式不稳定,且 Neovim 在无法识别旧格式时直接将其删除,那么在我看来,在更改格式后进行升级导致文件被删除是完全可能的。
太痛了。这让我开始考虑放弃 Neovim。是的,FOSS(自由开源软件)就是“按原样提供”,但如果存在替代品……
- sdcfgy
自从 Vim 首次出现在 Debian 软件源中,我就一直用它。有人成千上万次地告诉我 NeoVim 更好、更现代,解决了许多(方便地从未被引用)的问题。我只是无视了这些说法,继续用我的 Vim。此刻我感到无比地得到了验证,因为这是一个我经常使用的功能,而我完全不知道它在 NeoVim 中会是个问题。
- BarbaryCoast
根据 VIM 的修订历史,持久化撤销功能是在 2010 年发布的 7.3 版本中引入的。所以 Chisnall 可能从 2000 年就开始使用了,但他至少有两本书是在没有持久化撤销的情况下写成的。这意味着它并非“维护了近 20 年”,充其量只有 16 年。
但这确实是个不错的功能。
我是通过使用版本控制来实现的。我将其与编辑器挂钩,使得“保存”即“提交”。现在我拥有了所有状态的持久化、带版本控制的副本,独立于我恰好使用的任何工具。
- gchamonlive
我是不是漏掉了什么?人们是把持久化撤销当作备份来用的吗?
不过,这似乎更像是一个文档和用户体验(UX)的问题。Neovim 应该在删除旧撤销文件之前发出警告并征求同意,或者至少进行备份,但如果人们不使用可靠的备份和版本控制系统,那也不是 Neovim 的错。依赖持久化撤销来做这件事,某种程度上是自找的麻烦。
请使用正确的工具来完成工作。说 Neovim 开发者“完全没有对用户负有照顾义务的概念”是非常不尊重的。Neovim 的 Lua API 充满了关怀,你只需要去看看就知道了。
- natbennett
我也是 Neovim 的早期用户。
就我个人记忆而言,它的定位一直是“Vim,但带有破坏性变更”。
- dlisboa
> 这种态度,即仅仅因为某个文件是文件系统中的持久化文件且包含你可能想要的数据,就认为没有理由让他们的程序不删除它,意味着他们完全没有对用户负有照顾义务的概念。
这种看法是错误的。NeoVIM 对用户有着不同的关怀理念。他们正在优化另一种关怀,更符合现代期望,而 VIM 并不关心这一点(因此才有了分叉)。
这并非更好或更差,只是不同而已。
同样的文章也可以写成关于 VIM 没有原生 LSP 集成或自动完成功能,因此他们也没有对用户负有义务或关怀。
- RVuRnvbM2e
撤销文件和持久化撤销并不是为了那样工作的。它们只是在进程重启之间保持持久化。仅此而已。
它们位于 ~/.cache 目录中,该目录被定义为“特定于用户的非必需(缓存)数据”。
尽管这位用户拥有令人印象深刻的简历,但他只是误解了这个功能。