《Unix 编程艺术》 第十一章 接口
在 Unix 接口设计的传统中,会反复涉足两个主题:
- 与其他程序通信方式的前瞻性设计
- 通俗原则:接口设计避免标新立异,也可称为最小立异原则
#11.3 接口设计评估
这里的接口,指的并非是代码的 interface
而是 UI
Unix 使用五种度量标准对接口风格进行分类:
- 简洁:一个事务处理需要的动作时间及复杂度有较低的上限,可以用点击键量,鼠标手势量和需要多少秒注意力来衡量
- 表现力:接口具有表现力是指接口可以触发相当广泛的行为。最具表现力的接口可以启动程序设计者没有预见的行为组合,并仍然给予用户有用和一致的结果。
- 易用:接口的易用性同要求用户记忆的东西成反比
- 透明:接口透明度时用户在使用接口时,几乎没有什么问题、数据或程序的相关状态需要记忆
- 脚本化能力:指接口能够容易地为其它程序所使用,可脚本化的程序通常被其它程序作为组件使用,从而减少了定制代码的昂贵需求并使得重复任务的自动化相对容易。
#11.4 CLI 和可视接口之间的权衡
商业世界通常一窝蜂地支持初学者模式,因为
- 购买决定基于冲动
- 仅仅有个傻愣愣的 GUI,用户支持工作得以降到最少。
我发现许多非 Unix 系统常常令人沮丧,因为,比如,它们不提供对成百上千的文件进行某种处理的方法;想写一个脚本,又不支持。实质的问题是他们已经假定所有的用户总是入门级的,然后非难 Unix,因为 Unix 并不迎合这种模型
—— Mike Lesk
#11.5 透明、表现力和可配置
Unix 程序员默认地使得接口富有表现力和透明,并且更愿意牺牲易用性换取这些品质。
- 这种态度常常被描述成,接口是“程序员写给程序员的”。但这过度简化了事情的某一重要方面。
- 当 Unix 程序员倾向可配置能力和表现力而不是易用性时,并不是想当然地认为他的月标受众仅仅由其他程序员构成,他们深入骨髓的本能反应是,如果不了解终端用户的意图,最好不要迁就或者放马后炮。
Unix 开发者对于不完全地支持是难以容忍地。也许 Windows 开发者会说“我们不需要支持标准地所有特征:多数用户不会在意,而且对他们来说太复杂了”,而一个 Unix 开发者可能会说“我们并不知道是不是有人永远都不会需要这种功能或者选项,所以我们必须支持它。”
当 Unix 程序员和其他程序员一起工作时,这些态度会导致冲突,因为其他程序员可能会把这种设计认为是一种冒失的主观意愿,将用户置于对他们而言含混、无意义、其至是吓人的技术细节的负担之中。Mac 或 Windows 的程序员害怕只是因为少数人的高级需求而吓跑大多数用户。
相反,Unix 程序员更愿意认为对表现力的忽视是一种逃避,或者甚至是一种对未来用户的背叛,这些未来用户对于他们自己的需求实际上会比现在的实现者还要清楚。具有讽刺意味的是,尽管 Unix 的这种态度常常被视作是程序员的一种傲慢,但它实质上是谦逊的另一种形式一-往往伴随着好多年的战争创伤而获得。
#11.6 Unix 接口设计模式
#11.6.1 过滤器模式
过滤器程序接受标准输入的数据,转换成某种格式后,再将结果发送到标准输出端。
在定义过滤器时,最好在心中牢记一些附带的原则:
-
牢记 Postel 原则:宽进严出。也就是说,尽可能自由宽松地接受输入格式,并输出结构良好的严谨输出格式。
- 前者的做法减少了过滤器在面对非预期输入时出错的可能性,以及在某种情形下(或是在某一工具链中间)崩溃的可能性。
- 后者提高了过滤器终有一天能够作为其它程序有用输入的可能性。
-
在过滤时,不需要的信息也决不丢弃:这也提升了过滤器将来能够成为其它程序有用输入的可能。丢弃的信息,在管线后面就再也不能使用了
-
在过滤时,绝不增加无用数据:避免增加不必要的信息,避免以可能让管线下游程序难以解析的格式输出。
- 任何这样的附加物都应该是可选、并由开关控制的。如果程序需要输出日期的话,良好的实践是增加一个开关以强制转换成 ISO8601 标准的 YYYY-MM-DD 和 hh:mm:ss 一或者,更好是将标准格式作为默认的选项使用。
#11.6.2 Cantrip 模式
cantrip 接口设计模式是其中最简单的。没有输入,没有输出,只被调用一次,产生退出状态数值。一个 cantrip 程序的行为只能由启动条件来控制。没有任何程序会比这种方式更具备脚本能力。
Unix 设计者学会了当 cantrip 模式足以应付需要时,绝不编写更具交互性的程序。
简单的控制台清屏实用程序 clear ,可能是最纯正的 cantrip 模式;
#11.6.3 源模式
“源”是一种类似过滤器的程序,不需要输入;它的输出只能在启动条件中控制。可以作为例证的程序是 ls。
#11.6.7 Roguelike 模式
Roguelike 程序是设计来运行在系统控制台、X 终端模拟器或视频显示终端上的游戏,使用全屏幕、支持可视界面风格,但使用字符阵列显示,而非图形和鼠标界面。
Vi 和 Emacs 即为遵循这种模式的程序。
#11.9 沉默是金
长时间的操作要提供进度条。这是个好传统一一帮助用户有效地分时利用他的大脑暗示在等待完成的过程中可以离开去阅读邮件或是干点儿别的。
不要杂乱地让 GUI 界面弹出确认消息除非必要的警示,而且进一步,父窗口最小化时应隐藏这些信息,又如果焦点不在父窗口时,应避免这些信息。界面设计师的工作是方便用户,而不是在用户面前碍眼。
通常,老是告诉用户他们已经知道的事情是非常糟糕的风格(“程序
- 接口设计作为整体应该遵从最小立异原则,但是信息内容应该符合最大惊奇原则。
- 这个原则对于确认提示有着更强的力量。不断询问的答案几乎都为“是”的请求确认会造成用户根本不假思索就点击“是”,这个习惯会带来非常不幸的结果。程序应该只在有足够理由怀疑答案可能是“不不不!”的时候请求确认。并非意外却要求确认是糟糕设计的显著标志。任何确认提示本质上也许就是接口实际上需要一个撤销命令的标志
如果为了调试,需要喋喋不休的进展消息,添加默认情况下禁用的高详细度(verbosity)选项。在发布产品时,尽可能多地将需要显示的正常消息转移到启用高详细度选项开关下。