你不能那样做,因为我讨厌你
程序员们在争论开发者工具何时应严格执行规则,何时应顺应用户明显的意图。例子从 Python REPL 打印带责备意味的提示却不直接退出,到 Rust 工具暴露“不稳定”但有用的功能,或移除曾经可用的标志,迫使用户绕弯处理。许多人把这些现象看作工具设计缺乏同理心和用户体验意识;而另一些人则认为,过于宽松的行为、DWIM 快捷方式以及实验性选项,可能会在长期造成混乱和兼容性问题。
Python REPL exit 行为
- 争论的焦点是,在 Python REPL 中输入
exit和exit()的区别。 - 有些人认为当前的行为(通过
repr(exit)打印提示字符串)显得居高临下:解释器能看出你的意图,却拒绝退出。 - 另一些人则认为这是一个合理的折中:
- 保持语义一致(函数不加
()就不会执行)。 - 避免为特殊情况开后门,否则会破坏依赖 REPL 一致性或依赖
repr()无副作用的工具。
- 保持语义一致(函数不加
- 讨论中提出的替代方案包括:
- 仅在 REPL 中对
exit做特殊处理。 - 同时打印函数的 repr 和一个提示。
- 使用警告或仅限 REPL 的提示,而不是改动
__repr__。
- 仅在 REPL 中对
- ipython 更友好的处理方式(输入
exit就能直接退出)被用来证明,完全可以有更好的用户体验。
“按我所想做”与严格性
- 一方观点:工具应该对清晰且无歧义的意图作出响应(例如
exit、-?表示帮助、当存在--foo时使用-foo)。忽视明确意图会让人感觉像故意刁难,也浪费时间。 - 另一方观点:DWIM 行为会成为规范的一部分,引入歧义,而且一旦猜错,失败可能更糟(例如分号插入、浏览器对 HTML 的宽容处理)。
- 许多人认为,提示和清晰的错误信息优于自动修正。
Rust 工具链与不稳定特性
- rustfmt 的
wrap_comments和 cargo vendor 移除的--no-merge-sources标志是争议焦点。 - 批评者认为:把简单、明显有用的功能放到 nightly 才能用,或者移除参数却给出无帮助的信息,感觉就像“工具知道我想要什么,却拒绝照做”。
- 支持者认为:格式化和 vendor 行为有很多棘手的边界情况;标记为“不稳定”可以避免在 diff 和 CI 中引发大规模变动,而实现本身也并不简单。积压任务和优先级限制同样是真实约束,尤其是在志愿者项目中。
- 有人觉得 nightly/stable 的划分过于粗糙:一些小的实用函数或格式化选项不该需要 nightly。
CLI 交互与帮助标志
- 对那些以下行为反复感到恼火的工具:
- 拒绝
-?或-h,却又建议使用另一个帮助标志。 - 强制严格的选项顺序(
git log --stat directory)。
- 拒绝
- 许多人倾向于接受多种帮助调用方式,并采用更宽松的解析,尤其是与帮助相关的操作。
默认值、“不要糟糕”按钮与同理心
- “不要糟糕”按钮:默认关闭的选项,却能让软件表现得更符合大多数用户的预期,而且没有明显缺点。
- 这里存在张力:
- 通过更好的默认值和提示改善新手/普通用户的体验。
- 又不破坏现有用户或高级用户的工作流,也不让实现变得过于复杂。
- 一些评论呼吁更多同理心、更清楚地说明做出这些决定的“原因”,并更重视 CLI 和 API 的交互设计。