如何设计出好用的基础软件
如果无法正常显示,请先停止浏览器的去广告插件。
1. 如何设计出好用的基础软件
可交互性和可观测性
黄东旭
PingCAP 联合创始人兼 CTO
2. 关于我
• 黄东旭
• PingCAP 联合创始人,CTO
• 工程师,分布式系统 / 数据库
• TiDB / TiKV / Codis
• 编程,画画,弹琴
• h@pingcap.com
3.
4. 灵魂拷问:
你能够熟练使用 gdb 吗?
(Without Google)
5. 系统软件斯德哥尔摩综合症候群
• 可能是系统程序员群体对于精密的复杂有着特别的感情
• 我曾经觉得我不能记住所有的 gdb 指令是我智商不行…
• 也曾在能够熟练使用 vim 的时候觉得自己很牛逼
• 终于算一个合格的程序员了?
• 但是现在我觉得这些软件应该向我道歉(确实太难用了)
6. 都21世纪了
为什么你们程序员
就不能把东西做得好用一点?
(vscode 不香吗?)
7. 我们认知外部世界的模式
8.
9.
10. 需要跨越的两条鸿沟
• 执行的鸿沟
• 评估的鸿沟
11. 01
跨越执行的鸿沟:可交互性
12. 可交互性 - No Surprise! 的概念模型
• 想象一个例子:汽车
• 人对事物通常有预设的心理模式
•
当我们看到 $ _ 或者 > _ 的时
候,想到了什么?
•
通常简单/自洽的概念最容易被人
记住(自然映射)
13. 可交互性 - No Surprise! 的概念模型
看几个好例子:
UNIX 的概念模型
TiUP
• 一切皆是文件 •
• 数据是流 Telegram botfather
• Pipe 来串联流 •
一切皆是组件
对话
在写一行代码之前,就想好用户如何使用(概念模型)
14. 例子:控制器 - 控制对象
一些好的 控制器 - 控制对象 的例子:
redis-cli
• 映射到 redis 的概念模型:一切皆是 KV
• 交互命令操作模式(甚至修改配置都是)
MySQL(或者其他流行的 SQL Database)
•
SQL 本身就是一个很好的模型
大忌:控制器的对应关系混乱
“一个电视机应该只有一个遥控器”
15. 可交互性 - 没人读文档(探索式学习)
在开发者心目中:文档约等于字典
灵魂拷问:你小时候学汉语是通过看字典学会的吗?
接触一个新东西的时候,开发者正常的内心活动:
• “Quick start 在哪里?”
• “找到了”
• “哪里有深色背景的等宽文字?(注:通常是 install script)"
• “太好了!找到了,让我贴到我的 shell 里看看会发生什么吧!”
16. 可交互性 - 没人读文档(探索式学习)
Quick start 的第一行 shell 命令至关重要,决定了后续还有没有后续
通常来说,心理接受度排序如下:
apt / yum / pacman / brew … > curl xxx | sh >= pip / go get / cargo > Docker >>>> npm
第一行顺利成功以后,最好引导用户到一个可交互环境(告诉用户下一步该干嘛)
论补全的重要性
17.
18.
19.
20. 例子 : Telegram Botfather
21. 可交互性 - 多想一步,告诉用户半步,让用户自己走半步
重要决定不要代替用户做
重要操作请提供 DryRun 的
mode
出错以后怎么办?
一般人遇到软件错误会怎么办?
例子:Terraform 的 Dry Run
22. 例子: Rust 的编译错误提示
23. 可交互性 - 正确的反馈
正常人的反应时间为0.15秒-0.4秒
超过的这个时间,就会有明显的延迟感
反馈是可交互性中最重要的一环,也是软件让人产生愉悦感的重
要来源
24. 可交互性 - 反馈 3 定律
●
●
●
不要暴露内部概念!不要暴露内部概念!不要暴露内部概念!
用精简的人话暴露进展和状态
○ 不要说废话,更不要不说
反馈必须即时
25. 一个关于反馈的坏例子:
TiDB 的一个报错信息如下:
MySQL [test]> SELECT COUNT(1) AS count,
SUM(account_balance) AS amount, trade_desc
AS type FROM b_test WHERE member_id =
"22792279001" AND detail_create_date >=
"2019-11-19 17:00:00" AND
detail_create_date < "2019-11-28 17:00:00"
group by trade_desc;
ERROR 9005 (HY000): Region is unavailable
26. 一个关于反馈的好例子
27. 可交互性 - 关于配置
修改配置文件是一个慢反馈过程
● 配置文件需要在正确的位置
○ /etc/…. /home/xxx/.config
● 启动的时候检查和告诉用户配置信息(在日志中打印)
● 对于分布式系统,全局的配置中心会是一个更好的体验
● 热更新好于重启(回想当年 windows 修改配置)
● 提供可交互式工具(控制器)用于配制检查和热更新
● 提供模版(--print-config-sample),甚至自动生成工具
配置的心智负担(从小到大)
环境变量(通常适合 flags) < 命令行参数 <= 控制器(管控平台) < 配置文件
28. 可交互性 - 你不用重新发明轮子
• 世界上有很多很好例子,抄就完了?
• Docker CLI
• kubectl (现在难用主要是因为 k8s 太复杂了,以及 yaml
带来的问题)
• Redis CLI
• tiup
• ...
29. 02
跨越评估的鸿沟:可观测性
30. 可观测性:谁在观测
•
•
人,可是我们真的做到以人为本了吗?
•
我们曾经的一个‘卖点’:我们有几千个监控项
人同一时间大概能跟踪的对象数:4
31. 可观测性:区分噪音和信息
什么是有用的信息?
我的经验:跟着关键资源走
什么是关键资源:
•
•
•
•
•
CPU:都哪些线程在工作?这些线程都在干嘛?这些线程各自消耗了多少 CPU Time?
内存:当前内存中存储了哪些东西?这些东西的命中率情况?(通常我们更关注业务缓存)?
网络 I/O:QPS/TPS 有异常吗?当前主要的网络 I/O 是由什么请求发起的?带宽还够吗?请求延迟?长
链接还是短链接?(衡量 syscall 的开销)?
磁盘 I/O:磁盘在读写文件吗?读写哪些文件?大多数的读写是什么 Pattern?吞吐多大?一次 I/O 延迟
多大?
关键日志:不是所有日志都有用的,人也不会读,只有包含特定关键字的日志,人们才会关心。所以
,有没有特定的关键字的日志出现?
32. 可观测性:利用人的直觉
如何把‘噪音’变成有用信息:结合业务的上下文 + 人的直觉
33. 可观测性:利用人的直觉
例子:
●
TiDB Key Viz
34. 例子: Golang pprof
35. 练习: TiDB TopSQL
试着在我不告诉你这个是什么功能的前提下,从界面上提取信息
36. 可观测性:周期
●
●
脱离周期谈可观测性都是耍流氓
越贴近业务周期越好用,例子:
○ 为什么我们需要全链路监控
37. 可观测性:事后观测
●
可观测性什么时候能救命?
● Profile 什么时候是有用的?
● 持续 Profiling
38. 谢谢 ?
参考资料
The Design of Everyday Things: Revised and Expanded – Don
Norman
Don't Make Me Think – Steve Krug
产品故事地图 – Donna Lichaw
UNIX 编程艺术 – Eric Raymond