经典原则:伯斯塔尔法则
接受多变,输出保守。
该原理也被称为鲁棒性原理(Robustness Principle),1980 年,Jonathan Bruce Postel 在他编写的最早期的 TCP 协议规范中有提到:
Be conservative in what you send, be liberal in what you accept.
对发送的内容保持谨慎,对接收的内容保持自由。(直译)
至此之后,该原理便被称为伯斯塔尔法则(Postel’s Law),广泛应用于计算机协议以及系统控制理论中。虽然最近几年计算机界中出现了一些质疑伯斯塔尔法则的声音,但这并不妨碍其核心思想被应用于 UI/UX 的领域。
该原理表达的最核心思想是:系统/产品应保有一定程度的容错能力。
设计案例
允许用户进行任何操作,即便是错的或无效的
正如 Lyle Mullican 在《Your Website has Two Faces》中写到的,应用(或Web)应当具备两幅面孔,一幅给人看,一幅给机器看。
在给人看的那幅面孔中,应用必须接受用户所有形式的,或错的、或对的、或无效的操作。而在给机器看的那幅面孔中则必须把用户输入的那些「不靠谱儿」的命令转译成机器看得懂的内容。
人的思维和机器的运行模式截然不同,人对任意信息的理解和记忆都偏向于模糊的、可变的和多意的。比如人对数字「9」的记忆可以是「9」、「九」、「nine」、「IX」、「玖」等等,而机器只认二进制「1001」,但你的系统绝对不能只允许用户输入「1001」。
而在设计 UI 界面时,我们也应当包容用户进行的所有可能的操作,他们可能会在搜索框里输入任何奇奇怪怪的内容,但你的产品不能因为输入的内容奇怪而崩溃、闪退、强制报错。
- 案例1:淘宝搜索的各种自纠正
即便输入的是「phone」、「iphonw」,甚至是「pingguishouji」(注意输入的是 pinggui),依然能够得到想要的结果,当然这需要贝叶斯方法的协助,但不需要去了解背后实现的概率论原理,只需要知道这个结果是符合伯斯塔尔法则的。
另一方面,法则中的容错性同样体现在搜索的结果中,用户输入的是错误的信息没错,系统没有崩溃也没错,但是还不够。还需要在一定程度上智能修正用户可能输入错误的信息,并预测他们的真实意图。帮助用户修正信息和操作,是今后发展的必然趋势。 - 案例2:bilibili 安卓端头部可触发侧边栏的区域
Bilibili 的安卓端设计的也很有意思,头部区域除了「搜索栏」和其他几个按钮之外,任意地方点击都能够进入侧边栏,即使没有点击到「三条杠」,因为这三条杠实在是太小了,用户极有可能没有点击到,所以干脆扩大了可触发的热区。
对用户可以进行的操作定义边界
可是有时候就是不希望用户输入那些奇奇怪怪的内容,进行那些奇奇怪怪的操作啊。
是的,不希望用户任性的随意执行「rm -rf」,不希望用户输入数字的时候输入单词或是中文,所以需要对用户的可操作边界给出明确的定义。
案例1:步进器输入时的键盘
在进行纯数字输入时,淘宝会强制键盘只显示数字键盘,这是一种明确的边界定义。当然你也许会说还能输入符号。没错,的确可以输入符号,输入符号淘宝不会崩溃,但会提示数量超出范围。案例2:用户名/昵称的边界定义
另一个典型的例子就是设定用户名。一般情况下应用或者产品都会非常明确的提示用户用户名应该使用什么样的格式,比如几位字符,字母开头,能不能用特殊符号,可以使用哪几个符号等等。
如果操作是错的,及时给出反馈
但是定义边界明显还不够,就算给了边界,用户还是可以随心所欲的输入。用户能在淘宝输入购买 999 个 iPhone,能在设定用户名时输入任意字符,哪怕是边界之外的。
这时候就需要及时的反馈。及时的意思是指,就在用户的错误操作之后立马反馈。
案例1:淘宝提示超出范围
淘宝会提示买 999 台 iPhone 是不可能的,没那么多钱,立刻就阻止了我买 999 台 iPhone 的冲动。案例2:用户名设定提示
用户名是否可用的提示通常分为两种,一种是在用户输入用户名后实时显示该用户名是否可用,哪里不可用等;第二种是用户点完提交才会提示用户名设定错误。两者相比来说,第一种的反馈更加及时,体验感会更好一点。
注意事项
实际上输出保守通常是指程序对人的面孔可以表面笑嘻嘻,但是对机器的必须一丝不苟,即:对「机器」或「系统」输出的命令须严格、严谨,所以伯斯塔尔法则不仅是 UX 原理,也是程序员的法则。
但也可以稍微引申一下:界面对用户输出的内容同样不能随心所欲。确保用户所看到的界面整洁有序,并且保证他们能够轻易找到自己想看到的内容。
- 反面案例:Amino,过于奔放的视觉输出
总结
- 允许用户的任何操作,必要时给出操作边界;
- 无效或错误操作及时给出反馈。
- 感谢你赐予我前进的力量