截止到公元 2017 年 11 月 7 日晚上 10 点,菜单、工具栏与快捷键依然是几乎所有带图形界面的软件的标配。我们已经习以为常,每天像杂货铺的老板一样清点着它们。
这段时间,我差不多一直没停下更新一个小型的 C 库。除了功能部分经常增删之外,一些函数的名字也推敲了一番。
我将所有的 agn_xxx_alloc
函数更名为 agn_xxx
,agn
是这个库的名字。例如,要构造一个 n 维的点对象,以前的函数名是 agn_point_alloc
,现在是 agn_point
。今天,我将所有的 agn_xxx_foreach
函数更名为 agn_xxx_each
,这些函数用于遍历一些集合性的对象中的每一个元素。
之所以要修改这些函数的名字,是因为生活中的一些经验。例如,当我在家里修理一件物事的时候,如果我需要钳子,我会对妻说,「钳子」,而不是「拿把钳子给我」,也不是「你找一把钳子给我」,更不是「我需要钳子,你拿一把给我」之类繁琐的描述。
人类的语言,从一开始就没有语法。语法的存在的目的仅仅是为了消除使用语言交流过程中的误解。在确定不会引起误解的情况下,就可以扔掉语法,怎么方便就怎么来。最简单的证据就是,我们能够很熟练的运用自己的母语,并不意味着我们掌握了它的语法。agn_point_alloc
函数,它的意思是「给我分配一个点对象」,那么我将它的名字改为 agn_point
,这与上文所述的,我对妻所说的「钳子」有什么不同?同理,将 agn_list_foreach
更名为 agn_list_each
,会引起误解吗?不会。
菜单,工具栏,快捷键,其实也视为语言意义上的「词汇」,供我们和拥有它们的软件进行「交流」的过程中使用。它们可能是经过软件设计者们精心设计出来的,就像程序语言设计者设计每一个关键词一样,并且让这些关键词之间能够在符合特定逻辑的前提下进行组合。 但是更多的时候,UI 的设计注重的是功能的分类,而不是功能的组合。大部分软件里,菜单,是亚里士多德式的分类,工具栏是对菜单的简化,而快捷键是工具栏上的一些常用按钮的简化。
一开始,我之所以给「创造一个点对象」这一功能取名为 agn_point_alloc
,是模仿 GSL 库里的那些 _alloc
函数,例如 gsl_vector_alloc
。类似地,GLib 库也有一堆 g_xxx_new
之类的函数。像这样的函数命名,也都是在归类,以 alloc
为后缀的函数是向 C 语言的内存分配函数 malloc
归类。以 new
为后缀的函数则是向 C++ 的 new
归类。
分类这种行为,似乎像是我们的本能。不过,我们许多被视为「本能」的举动是由各种形式的广告塑造出来的。就像妻很担心床铺一天不清扫,就会滋生螨虫。事实上,螨虫在每个人的身体上都是存在的,就像每个人身上都有毛发,就像我们的身体里有各种各样的细菌那样寻常。
是先有的世界,后有的人类,然后才有了亚里士多德和他的分类。对于一个软件而言,功能是先有的,而菜单、工具栏以及快捷键的分类是后有的。那么,我们为什么要分类?归根结底,为了快速检索到自己所需要的东西。我们在使用任何一个带 GUI 的软件,都要扮演着一个人肉版的树状结构层序剪枝检索器。一些常用功能有快捷键,人肉版的 Hash 表检索器。
当我在家修理东西的时候,腾不开手,对妻说,钳子!这也是一种检索,命令式的。妻能领会我的意思,她去工具箱检索了一番,找到了钳子,并送到我手里。软件的 UI 设计,是不是也可以这样呢?
像这样的 UI,的确存在。我每天都要用的 Emacs 就是这样的 UI。我要写 C 代码,就命令它 M-x c-mode
,我要写 Python 代码就命令它 M-x python-mode
,我要查询并替换一些文本,就命令它 M-x query-replace
……这样的 UI 才是最自然的 UI。母语非英语的用户,记不准单词,也没有太大问题,因为 Emacs 提供了单词检索与自动补全功能。
有很多软件也有 Emacs 这样的 UI,例如 gnuplot,imagemagick。当然,还有我用过的最频繁的软件——fish shell。这样的 UI,其实就是广义的 Shell。这些依靠用户输入命令而运作的软件,长期以来被视为落后的怪物,而那些提供了一堆菜单、工具栏、对话框以及乱七八糟的快捷键的软件,却被视为先进生产力的楷模。事实上,家喻户晓的工业设计方面的专业软件 AutoCAD 除了提供菜单、工具条、快捷键,也提供了一种 Shell。
这些年,像 chrome、firefox,甚至 IE,甚至还有家喻户晓的 MS Office,都将菜单和工具栏尽量隐藏起来。品味终于有所改善,但是有些掩耳盗铃的意味。不过,说到网页浏览器,我忽然觉得 google、bing、百度之类的网页搜索引擎,其实也是 Shell,而早期甚至现在依然健在的门户网站,就像那种界面上有一大堆菜单与工具条的软件。
以后判断一个行业软件是否好用,不妨先看看它有没有提供一个 Shell。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。