软件对你说真话的唯一时刻
平时,软件的界面是精心装修过的:图标圆润,配色舒服,文案经过打磨。但出错的那一刻,装修会突然塌掉,露出里面的毛坯房——「Error 500: Internal Server Error」,或者更糟的,一长串普通人看了会心跳加速的英文堆栈。
所以我说报错是软件最诚实的时刻:它是系统内部状态不小心说漏了嘴。而这个时刻,恰恰也是用户最脆弱、最需要被好好对待的时刻——事情已经出错了,用户已经有损失了(时间、数据,或心情),这场对话怎么处理,决定了他还信不信你。
一条好的错误提示只有三个问题
别看错误提示只有一两行字,它要回答的问题其实非常固定。用户看到报错的瞬间,脑子里只转三个念头:
- 出了什么事?——用我听得懂的话说。
- 是我的错吗?——我需不需要内疚、需不需要改什么?
- 现在怎么办?——给我下一步,别把我晾在这儿。
拿这三问去量一下最常见的错误提示,你会发现它们几乎全部不及格:
- 「Error 500」——三个问题一个都没回答。它甚至不是一个句子,是系统内部的房间号。
- 「操作失败」——回答了第一问但约等于没答(我知道失败了,我看见了),后两问全无。
- 「参数非法」——第二问的回答是「是你的错」,但不说错在哪,等于只说「你错了」却不判卷子。
而一条及格的错误提示长这样:「没保存成功——是网络断了,不是你操作的问题。你写的内容都还在,网络恢复后点这里重试。」三个问题全答了,而且顺序都对:先说事,再摘清责任,最后给出路。
大白话:好的报错像一个好护士。「只是皮外伤(出了什么事),不怪你,地太滑(谁的错),先坐这儿,我给你包扎,两分钟就好(怎么办)。」坏的报错像一张贴在急诊室门口的纸条:「故障代码 502。」
为什么工程师写不出人话报错
这不是文笔问题,是位置问题。错误提示通常写在代码的「异常分支」里——那是工程师最不想待的地方。写主流程的时候他意气风发,在实现一个激动人心的功能;写到出错处理时,他只想赶紧兜住别崩溃,于是随手把系统内部的错误码抛了出去。
于是用户看到的报错,其实是工程师在最低落的时刻、对着系统(而不是对着人)说的话。「Error 500」根本不是写给用户看的,它是工程师写给三天后排查问题的自己的备忘录,只是不小心显示到了屏幕上。
理解了这一点,改法就清楚了:错误提示不是代码的附属品,它是产品文案的一部分,应该用写首页标语的认真程度去写。有些团队甚至有一个规矩——每一条会显示给用户的报错,都要过一遍「三个问题」检查,过不了不许上线。这个规矩几乎零成本,但它把无数个「用户对着屏幕不知所措」的瞬间,变成了「哦,那我再试试」。
比报错更好的是不报错
当然,最高明的错误处理是根本不让错误到达用户。这一层也有讲究:
- 能自动重试的,悄悄重试,别声张——网络抖一下就弹窗,是把系统的神经质传染给用户。
- 能提前拦的,提前拦——密码要八位就在输入框旁边写好,别等他提交完才说。
- 实在要报错的,按三个问题好好写。
你会发现这三层背后是同一种东西:设计者提前替用户想到了会出什么事。这种东西有个听起来很软的名字,叫同理心。但下一章我要说的是,同理心在这行里不是态度,是一门可以拆解、可以施工的技术。