在年初的那一篇《开发者体验 —— 内部工具的“最后一公里”》里,我们讨论了什么是用户体验?如何进行用户体验的设计?还有开发者体验的六要素?在先前的文章里, 我们已经介绍了文档体验的设计,结合最近学习某技术的不好的开发体验,所以重新思考了一下好的错误呈现应该是怎样的。
开始之前,先让我们转换一下视角,让我们思考一下开发者是如何处理错误的?
经典玩笑场景下,一旦开发者接收到错误时,会通过以下的三种方式解决:
所以,从模式来说,我们应该要能满足前两种场景的需求:告诉开发者足够多的错误信息,以让开发者能够寻求帮助。
诸如于,我们遇到:Segmentation fault (core dumped)
的错误时,它是由于内存不当操作造成的,如空指针、野指针的读写操作,数组越界访问,破坏常量等。遇到这一类的问题,如果返回的错误信息太少时,我们需要详细潜在的错误原因,并像大海捞针一样去解决。所以,debug 成了这时最好的解决手段之一。
基本的处理错误机制,可以告诉开发者,你可以尝试用 --help
来解决:
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
优秀的错误机制,则可以告诉开发者更多的信息,建议开发者使用类似的方式解决。
这里主要介绍两个案例,一个是 Rust 语言,一个是 Scoop(Windows 下的命令行安装器)。
在我使用过的多数语言里,Rust 的编译器抛出的异常,大概是最为“友好的”,毕竟它是一个新世纪的语言。所以,在编写 Rust 的时候,我们相当于是“编译器驱动开发”。
首先,先简单来编写一个缺少 main
函数的程序,然后运行它,就会报错:
error[E0601]: `main` function not found in crate `lumos`
--> src/main.rs:1:1
|
1 | / pub mod store;
... |
10 | |
11 | | }
| |_^ consider adding a `main` function to `src/main.rs`
For more information about this error, try `rustc --explain E0601`.
error: could not compile `lumos` due to previous error
在这个错误里,告诉了我们:
main
函数,可以考虑在 src/main.rs
文件的 11 行里,添加一个 main
函数 rustc --explain E0601
,这里的 E0601
是一个错误码而在 IDE 里,则可以 Rust 语言的插件,来直接添加 main
函数。
随后,从 Rust 的源码 compiler/rustc_passes/src/entry.rs
中的 no_main_err
函数里,我们可以发现更多的细节,这里就不展开了。在 Rust 的编译器里,设计了自己的错误码机制,使用错误码 + markdown 的方式来展示。在执行上述的 explain
参数之后, 可以读取相关的 markdown 文件,并展示相关的内容。所以,初步的总结下来,它包含了:
Scoop 是我先前从朋友圈看到的一个开源项目,它提供了一个自动化错误处理方案。诸如于,我们在安装工具、软件的时候,出现了异常。它会提供:
示例:https://github.com/ScoopInstaller/Main/issues/2711
详细可以参见对应的 GitHub Actions: https://github.com/shovel-org/GithubActions
我尝试性的整理出第一个版本的错误处理四要素:
基于这四个要素,我们可以思考一些潜在的错误呈现模式。
依据于上述的几个原则,我尝试性地整理了一些相关的模式,未来将更新在:https://dx.phodal.com/ 上。
从开发者的角度来思考问题,当开发者遇到问题时,他们会使用怎样的方式去解决。常见的几种方式是:
针对于不同的情况,再提供优化手段,如在命令行提供高亮语法功能,以便于开发人员截图。
当开发者遇到一些常见的问题后,接建议用户尝试某些方案来解决。这个已经被广泛应用在用户体验上,毕竟普通用户是更大的受众。
针对于工具来说,由于安全因素,可能会存在一些离线用户,这时就需要提供诸如于 Rust 的错误码文档内置的方式来解决。
如上述的 Scoop,通过 GitHub Action 构建自动化机器人,以实施 issue 的自动化处理。
如采用开源的形式,开发者可以针对错误内容进行贡献。
诸如于常见的 FAQ 等,也都是一些不错的模式。
围观我的Github Idea墙, 也许,你会遇到心仪的项目