现在的位置: 首页 > 综合 > 正文

我为什么喜欢 UNIX(转贴)

2013年09月26日 ⁄ 综合 ⁄ 共 6674字 ⁄ 字号 评论关闭

我为什么喜欢 UNIX

Created: Fang lungang(方伦钢) 11/13/2007 Modified: Fang lungang 12/16/2007 16:29>

0 声明

既然谈到优点,自然要有对比;既然谈的是操作系统,最普及的 Windows 自然会被拿来做比较的对象;既然谈的是 UNIX1 的优点,自然对比的结论有利于 UNIX。

但是这并不表示我认为 Windows 不好,我所提到的好坏都是有前提的。千万不要断章取义。举例来讲,下文中我会说很多命令行界面(CLI)相对图形界面(GUI)的优点。那决不表示我认为 CLI 在任何情况下都比 GUI 好。简单来说,我认为 Windows 还是挺好的,特别是在娱乐功能上。

1. 为叙述方便,本文用 UNIX 来统称各种类 UNIX 操作系统(例如 Solaris、 FreeBSD、Linux 等等)。

1 引言

进入公司前,我一直是在 Windows 操作系统下干活。看到 workstation 上那黑乎乎的命令行终端,再想到上一次接触 CLI 还是十几年前学 DOS 的时候,我立刻就泄了气:没想到公司还这么落后。

然而随着自己对 UNIX 的渐渐熟悉,我越来越喜欢 UNIX。可能有人会想:“真BT,怎么会喜欢 UNIX ?使用起来一点也不方便。用户友好性(user-friendliness)比 Windows 差了不知多少。” 我想说的恰恰相反:对程序员而言 UNIX 比 Windows 使用起来方便多了。真的!本文就讨论一些日常工作中能直接感受到的 UNIX 的便利之处。对于需要专门测试才有发言权的安全性、稳定性、运行效率之类的话题我就不人云亦云了,因为我从来没有做过此类测试。

2 关于用户友好性(user-friendly)

先得搞清楚什么是“方便”。这个问题似乎根本不值一提,但其实存在着普遍的误解。

2.1 user-friendly != beginner-friendly

不要把用户友好(user-friendly) 和初学者友好(beginner-friendly)搞混了。大家平常说什么 Windows 下什么软件好用、用户友好时,通常是指这个软件容易上手,容易学(大部分时候其实根本不需要学)。但那只是beginner-friendly。真正的 user-friendly 则是完全另外一码事。某个软件 user-friendly 应该是指当你掌握这个软件后,会觉得它用起来很方便,能提高工作效率。两者没有必然联系,但 UNIX 下的工具通常给人感觉它们忽略了前者。

举例来讲,作为文本编辑器,notepad 就属于 beginner-friendly,而Emacs (当然还有 vim) 才是 user-friendly。notepad 上手太简单了,打开就会用。而 Emacs 则是不花上几个小时甚至是半天、一天不可能用它们来干活。要想得心应手,就要花更多时间了。然而用熟了以后,notepad 和 Emacs 工作效率就不可同日而语了。所以 Emacs 是典型的 not beginner-friendly but user-friendly。

2.2 beginner-friendly != 傻瓜化

实际上认为 UNIX 下的工具不 beginner-friendly 也是不公正的。考虑到用户群(程序员、系统管理员),考虑到功能,UNIX 下的很多工具(包括前面的提到的 Emacs)其实还是比较容易上手,比较 beginner-friendly 的。

造成误解的原因之一是很多人被 Windows 惯坏了,养成了不看手册的习惯,一个从没用过的软件,也不愿花上五分钟看看手册,宁愿在菜单栏上折腾。所以如果没有傻瓜式菜单来引导自己,就觉得这个软件“一点也不 user-friendly”。

另外 windows 下和 UNIX 下的一些操作习惯不一样也会造成误解。例如 Emacs 里 copy/paste 分别是 Mata-w/Ctrl-y 就让很多新手不习惯。

2.3 user-friendly vs beginner-friendly

如果真的是“鱼与熊掌不可兼得”,我们该选择怎样的软件呢(如果有的选的话)?

如果只是偶尔用用,只需要最基本的功能,当然选 beginner-friendly 的。但天天都用的就应当选择 user-friendly 的了,既便要花些时间来学习也值得。例如作为程序员,花一些时间掌握一个强大的代码编辑器就是一项投资。或许整个职业生涯都能受益。

3 命令行界面

从这一节开始,说说让我喜欢上 UNIX 的特性。说起来有意思,最吸引我的UNIX 特性是当初让我感到失落的 CLI (Command Line Interface)。CLI 或许算不上 beginner-friendly,但很多时候绝对比 GUI(Graphical user interface) 方便很多。

3.1 表达力强

我认为 CLI 相对于 GUI 最大的优点是表达力强。应用程序有 CLI 就可以写脚本。 CLI 就是语言,写脚本就像是在和计算机说话。意思复杂就多几句,简单就少几句。而用 GUI 就像是在打手势,想要表达复杂的意思就麻烦了。

有一次,我在肯德基看到老外点餐,他和服务员之间交流就属于 GUI 模式。肯德基的柜台都有引好图片的菜单(menu)。老外拿过来,往某个套餐的照片一指,服务员点点头表示明白。整个点餐过程就结束了,既不需要老外懂汉语,也不需要服务员懂外语,确实很方便快捷。

但是如果老外的要求稍微复杂一点会怎样呢?假设他想要“两份XX套餐,其中一个可乐不加冰,另一个可乐多加冰”,这一句话他得费多少力气才能比划清楚呢。

现在很多中餐馆也有带图片菜单,也一样不用说话就能点菜(GUI)。但如果哪天我们暴发了,想到饭店去甩阔,要“拣最贵上,先上一桌”,在菜单上指指点点怎么才能达到同样的目的?自己一页一页的找?

所以,新闻组上有个人说得好:

GUI just makes simple things simpler, but complicated tasks impossible.

再举个实际工作中的例子:

程序出问题了,日志格式如下:

3XXXXXXXXX
2XXXXXXXXX
1XXXXXXXXX
keyword1=valueX
1XXXXXXXXX
2XXXXXXXXX
3XXXXXXXXX
xxxxxxxxxxxxxxxxxx
~~~~~~~~~~~
xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx
3XXXXXXXXX
2XXXXXXXXX
1XXXXXXXXX
keyword1=keyword2
1XXXXXXXXX
2XXXXXXXXX
3XXXXXXXXX
xxxxxxxxxxxxxxxxxx
~~~~~~

分析日志时需要将包含关键字一却不包含关键字二的行的上下三行的内容提取出来。用 GUI 怎么办?靠肉眼一个个挑出来么?在 UNIX 下,一行脚本就搞定了:

grep -C3 'keyword1' test.txt | sed '/^--$/s/--//' | /
awk -v RS='' '{if ($4 !~ /keyword2/) print $0}'

再举一个例子。临睡前,我偶尔会躺在床上看一两集电脑放的VCD。对于我这样居住条件仍然艰苦的人来说还是挺惬意的。但碟放完后爬起来关机时就不太爽了。好在 UNIX 下有命令行界面的媒体播放器,用下面的命令就可以顺序播放 film1, film2,然后关机。

mplayer film1 film2; sudo shutdown -p +1min

类似的,下载完东西在自动关机也可以

wget -c ftp://foo.bar.com/foo.bin; sudo shutdown -p +1min

有人也许会为 GUI 辩护:在 GUI 里加一个完成后自动关机的选项不就行了!没错,这样是可以,而且我记得确实有带自动关机功能的下载工具。但是这种做法从灵活性、移植性、维护性各方面来讲都差很多。例如如果我想先删除文件再关机呢?

mplayer film1 film2; rm film1 film2; sudo shutdown -p +1min

而且,一个媒体播放器或是 FTP 客户端和关机功能联系到一起不是挺突兀的么?

多说两句。实际上由于 GUI 在这方面的缺陷导致很多 Windows 下的软件有一大特点:一个软件里除了主要功能外,还集成了一大堆乱七八糟的功能,也就是所谓的 monolithic 软件。而写程序的人都知道程序要模块化、结构化才好开发、维护。UNIX 哲学的一个重要原则就是每个程序只做一样事情,并且做好;各个工具再组合到一起完成各种各样复杂的任务。

3.2 操作方便性

我应该算是个 "touch typist",所以对我来说 CLI 相对于 GUI 的另一个好处是操作键盘比操作鼠标方便。也许有人不同意这个观点。但是想想为什么快捷键被称为 快捷 键就能理解我的观点还是有一定道理的。

我见过一些同事鼠标用的很熟练。尤其佩服他们的手不停地在键盘和鼠标间切换,速度快得我简直目不暇接。不过大部分同事的水平和我差不多,想必关于鼠标他们也有和我一样的感受,因为我发现他们也喜欢用快捷键。有的软件功能多了,鼠标操作就需要在一个又一个长长的弹出式级联菜单中准确地选中目标。我感觉比较烦人,而且速度也慢。还有时候目标太小,我总也点不中。也许是很久没练扫雷的缘故 :) ,我总要试个两三次才能点中 Eclipse 文本编辑框沿上那直径不到两毫米的小圆点。

不过一直在键盘上打字或一直用鼠标指指点点相对来说还算好的,最让人头痛的是在鼠标和键盘间频繁切换:敲几个字母然后手从键盘上挪开,摸一下鼠标,然后又挪回来。而且,这期间视线还得跟着。

3.3 CLI + GUI

当然最好是同时具有完美的 CLI 和 GUI。很可惜,以 GUI 为主的程序的 CLI 都做的很简陋。估计想把它们的 CLI 做得好点也不太容易。给 CLI 程序加一个 GUI 前端倒是很容易,所以倒是能见到一些这样的软件。

4 便利的联机帮助和丰富的文档

对于程序员,这是 UNIX 系统的一个极大优点。不论是函数、API 还是工具,有什么问题直接用 man 或 info 查联机文档(online document)就行了,很方便。如果是用 vim 和 Emacs 写程序,根本就不需要切换窗口就可以查看到这些文档。而且不用担心版本问题。如果是自行到网上、图书馆去查资料,既麻烦,还要提防文档的版本和你想查的不一致,

如果联机帮助还不够,我们尽可以再去找各种教材、书籍。UNIX 的历史比 Windows 久远;UNIX 在 计算机科学家眼中的地位也比 Windows 高;所以很多书籍都是以 UNIX 系统为原型来讲解知识点的。而且,相对于 Windows 自成一体的做派,UNIX 一般都遵守各种标准,顶多在标准之上做些扩展。所以在 UNIX 下编程,资料应该要比 Windows 的详实。

5 开放性

5.1 标准化

前面已经提到,UNIX 系统下的大部分程序遵守相应的规范、协议,所以只要按照协议来就可以和它们进行交互。

5.2 纯文本的世界

UNIX 还有一个传统是“纯文本”。首先,纯文本是真正跨平台的。其次,你可以根据需要使用不同的工具来处理纯文本文件。事实上,UNIX 有不少传统工具用来处理纯文本文件十分方便。最后,纯文本文件不象二进制文件那样一旦损坏就很难辨识、修复。纯文本文件即使损坏了,我们也可以用文本编辑器打开来查看,获取一些有用信息,甚至是手工修复它。

6 自由

6.1 mechanism, not policy

自由首先来自于 UNIX 社区的理念: "mechanism, not policy"。

有的程序写好以后后,不但实现了某个功能(mechanism),而且你怎么使用(调用)这个功能也同时确定了(policy)。表面上看是你在运行某个程序,但实际上是你在程序预先指定的方式下工作,你没有主导权。如果这预设的 Policy 设计得恰好对你的味还行。否则你就难受了,因为你没法按照自己喜好给它加上前端。

UNIX 程序则相反,它们提供 mechanism,它们也提供 policy,但是 mechanism 和 policy 之间分得清清楚楚(松耦合)。如果默认的 policy 不合你的意,你可以自己去写一个。既便你没那水平,若有高人与你有同感,他们会写一个的。举例来讲,cscope 默认的是 CLI,但是有人给它写了 GUI 的前端。虽然我认为没必要,但是对于认为有必要的人,这就给了他们按照自己的方式操作 cscope 的自由。同样,vim 的粉丝为它加了 vim 接口。Emacs 粉丝则更热情高涨,写了 N 个接口(我最喜欢xcscope.el)。

总结起来自由不自由首先是:是你指导机器干活还是机器指导你干活。我喜欢我的地盘我作主,所以我喜欢 UNIX 。在 UNIX 上工作,你不用担心被迫按照软件作者喜欢的方式来操作软件。

6.2 自由软件

其次,自由来自于自由软件(Free Software)。这里的自由并不是指自由(免费)下载、分发2,而是强调自由地修改与共享。

由于 UNIX 开放的传统、悠久的历史,它也成了自由软件的大本营。服务器上装的软件版本太老?自己装个最新版的。软件文档不完善?直接看看代码呗。缺了什么功能?在力所能及的范围内可以自己动手来修改源代码。甚至可以只是阅读源码来提高自己的编程水平。

2. 当然实际上你也有这个自由。

7 简单

UNIX 社区有一个有名的口号:

KISS: Keep It Simple Stupid

所以 UNIX 的程序一般都是尽量保持简单:没有乱七八糟、毫不相干的额外功能,没有花里胡哨的界面。一句话:该干嘛干嘛。

8 简洁

UNIX 社区还推崇“沉默是金” (Silence Is Golden)。有的程序一起来,一堆一堆的垃圾提示信息,什么用没有,反倒是淹没了真正有用的信息。典型的有什么 “正在启动”,“正在初始化XXX”,“已连接到XXX”之类。谁关心这些?记到运行日志里去不就行了?我下个命令,你就给我运行,出错了报告一下,没出错就老老实实运行不就得了,何必 JJYY ?

例如 Windows 下每次删除文件都弹个对话框有必要么?反正对我是没有用,每次都是想也不想就直接确认了,该误删除的还是一样被误删除。

UNIX 下也有做得不好的。 amule 就是一个,每次启动都打一堆垃圾信息,我从来不看。有一次,下了命令后,我就干别的去了。回来一看,因为锁文件已经存在(用读写锁好一点?)所以启动没成功。设想一下,如果不是每次都有垃圾信息,我怎么会忽略调锁文件已存在的错误提示呢?不过在 UNIX 系统上,犯这个毛病的程序毕竟还是少数。

A.1 参考书目

 

抱歉!评论已关闭.