平台之争:Windows还是*nix
平台之争:Windows还是*nix
本文摘自于渊编写的《orange's:一个操作系统的实现》一书
读到这里,读者可能发现书中经常出现“如果你用的是Windows”或者“如果你用的是Linux”这样的字眼。有时这样的字眼甚至可能影响到你的阅读, 如果真的这样请你原谅。我试图照顾尽量多的读者,但是对每一个人来讲,却必须面临一个选择──在什么平台下开发。本书第一版使用的是Windows平台, 而在第二版中,我投诚了。接下来你会发现,虽然以后的行文会最大限度地兼顾Windows,但总体是以Linux为默认平台的。
其实在什么平台下开发,有时纯粹是口味问题,或者是环境问题──你开始接触计算机时使用什么,很大程度上取决于你周围的人使用什么,而这往往对你的口味产 生巨大而深远的影响。然而最早接触的未必是最适合的,在我亲身体会和比较之后,我决定从Windows彻底换到Linux,我想在这里说说为什么。请注意 这不是布道会,更不是你开发自己的操作系统必须阅读的章节,我仅仅是谈谈我个人的体会,希望能对你有所启发,同时解释一下为什么第二版会有这样的改动。
在第一版成书的时候,我已经在使用Linux,但是用得并不多,主要是觉得用不习惯,而现在过了两三年,我已经基本不用Windows,在Windows 下我会觉得很不习惯。我的这一经历至少有两点启示:第一是Linux不好用是个误解(有一种说法是Windows的桌面更好用,这是个复杂的误解),好不 好用是习惯问题;第二是如果你有兴趣使用一样你不熟悉的东西,不要因为刚开始的不习惯而放弃。
其实对于Linux和Windows的误解有很多,我把这种误解归结为操作系统文化上的差异。其实在提起两种系统时,人们往往拿一些具体的事情来做比较。 比如比较它们的安装过程、使用方法,甚至是界面。但实际上隐藏在表面背后的是两种完全不同类型的文化,或者称之为不同的理念。
对于Windows而言,它的文化植根于微软公司的愿景,“让每个家庭的每个桌面上都有一台电脑”,当然他们希望此电脑内运行的是Windows操作系 统。这个理想加上Windows作为商业软件的性质,决定了Windows具有相当程度的亲和力,用户界面显得相当友好。岂止友好,它简直友好到每个人 ──无论儿童还是老人,受过高等教育还是只念过小学──都能比较容易地开始使用电脑,这无疑是微软对这个社会的巨大贡献。但是界面友好并不一定就完美了, 这一点暂且按下不表,我们先来说说Linux。
Linux的文化很大程度上来源于UNIX,UNIX所倡导和遵循的文化也被称为UNIX哲学[8],其中很重要的一条原则叫做“做一件事并做好 ”[9],这听上去跟Windows的界面友好说的不是一码事,但其实仔细分析起来大有关联。做一件事并做好意味着两件事情,第一件事就是工具之间可以协 同作战,不然各人做各人的,无法完成复杂应用;第二件事就是接口要统一,不然无法做到协同。这个统一的接口就是文本流(text stream),这也就意味着,命令行是UNIX文化的核心。而Windows的做法大有不同,因为要界面友好,于是不能指望用户开始就知道怎么把工具串 接在一起,所以Windows选择任何应用都自己完成所有功能──至少让用户看起来如此,这使得每个工具都各自为战,从而增加了每个程序的复杂性和开发成 本。不仅如此,由于功能都是软件开发者定好的,所以你基本上不能指望大部分的程序具备可扩展性,而在UNIX下,大部分的程序都可以跟其他程序协同起来完 成程序不曾“设计”的功能。这也是上文我说“界面友好并不一定完美”的原因,友好是有代价的。
那么UNIX是一个“不友好”的系统吗?这个问题其实没有看起来那么简单。首先是UNIX下流行的桌面环境正在越来越“友好”,你甚至可以将其配置得看上 去跟Windows别无二致,不过关键点不在于此,而在于长期来看,UNIX的学习成本并不比Windows要高,但收益却要高得多。我们刚刚提到,友好 是有代价的,而且代价比想像中要高。对于一个初学者,开始的简单容易使他产生错觉,认为电脑是个简单器械,但实际情况并非如此,一旦遇到麻烦,用户很容易 陷入束手无策的境地,一旦有一件事情没有现成的软件可以解决,你马上一筹莫展。而UNIX不同,它的学习曲线比较陡峭,但是你一旦入门,就会发现自己的工 作可以变得如此轻松而且有趣。在Windows中,虽然使用一个工具第一步往往很容易,但很快你就容易迷失在一堆嵌套很深名字晦涩的菜单里面,学习这些菜 单可不是一件容易的事情,而且在一个工具里学会的东西到了另一个工具里可能就变了样。如果你想看看程序的帮助,有时也是件困难的事情,因为为了达到“友好 ”的效果,帮助经常也是一层一层的,很难找到自己需要的内容。而在UNIX中,所有的工具都有个手册(Manual),可以通过统一的命令“man”来查 看,而且这些手册都是平坦的,你可以一口气从头看到尾,可以随时查看你所要的关键字。此外,除了少数极其复杂的工具,手册基本上是够用的。简而言之,在 UNIX中,软件使用看起来复杂了,实际上如果你想真正掌握一个东西,用的时间不会比Windows中更多。况且,在Windows中你很难真正掌握一个 东西。
我并非故意贬低Windows,我说过它对社会的贡献巨大。对于一个平常只用电脑来收收邮件看看电影的用户,它的易用性绝对是巨大的优点,但你我不是这样 的用户。我相信阅读本书的人都是程序员,而且都是像我一样喜欢探索的程序员──不喜欢探索的程序员很难有心思写自己的操作系统做消遣。一个程序员的要求和 普通用户是不同的,程序员需要了解他的电脑,掌握它,并且可以熟练地让它帮助自己完成工作,从这个角度上讲,UNIX无疑具有巨大的优势。它里面的每个工 具都很锋利,你可以组合着使用,持久地使用,而且许多年都不会过时。
在这里我可以举一个我自己遇到过的例子。在我编写操作系统的文件系统时,需要多次查看某几个扇区的内容,并对其中的数据进行分析。在Linux中,我可以 很容易地将od、grep、sed和awk等工具[10]}串在一起完成这项工作,我也可以编写一个简单的脚本,将命令放在脚本中方便取用。而在 Windows中,我通常只能在窗口间反复地单击鼠标,费时费力而且效率低下。类似的例子不胜枚举,你一旦熟悉了这些工具,就会发现通过组合它们,你能得 到比任何图形界面工具都多的功能。而在Windows下就不得不看具体菜单的眼色了。不仅如此,UNIX下的工具往往学习一次就能长久使用,很少过时。比 如刚才提到的几个工具大部分有20年以上的历史,到现在它们依然被广泛使用,即便它们学起来会稍微难一点,平摊在20年里面,成本也是极低的。这就是 UNIX哲学,你不需要重复学习,每个工具都好用,而且可以因为跟其他工具结合而发挥多种作用。
大多数Windows下的软件都有个毛病,它经常试图隐藏一些东西。它的本意是好的,就是让界面更“友好”,但这对程序员有时是件坏事,因为它让人难以透 彻地理解软件的所作所为。或许你会说,如果你想理解,你总能理解的。没错,这跟“在UNIX下能做的事情在Windows下都能做”是相似的命题,甚至 于,只要安装一些额外的软件(比如Cygwin),你可以在Windows下使用UNIX的命令。问题是即便能做,你也未必去做,这就是所谓文化的力量。 理论上你在任何地方都能读书学习,但效率最高的地方还是教室和书房,在客厅舒服的沙发上,你不自主地就拿起了电视遥控器。
所以以我自己的体会而言,一个程序员最好还是使用类UNIX的操作系统。它能在日常生活中帮你提高自己的水平和工作效率。这一点与摄影有点类似,市面上数 量最多的是傻瓜相机,但一个专业的摄影师总是会选择功能复杂的专业级设备,不是傻瓜相机不好,而是适应的人群不同,如果你想成为好的摄影师,那么上手容易 的傻瓜相机一定不是你的最终选择。不是好不好的问题,是适不适合的问题。
上面论及的是两类操作系统文化上的差异,其实即便是纯粹应用层的,也有诸多误解,比如以下几条:
误解一. Linux难安装。如果你曾被Linux的安装难倒过,我建议你下次试试Ubuntu。在本书第一版开始写作之时,Ubuntu的第一个版本还没有发布 [11],但短短几年时间,它已经变成全世界最流行的发行版[12],这与它的易装和易用性是分不开的。笔者本人大规模地使用Linux也是从 Ubuntu开始的,它的安装过程一点也不比Windows的难,而且中文资料也相当丰富,很容易找到志同道合的人。Ubuntu的另一特点是它的驱动程 序很丰富,支持很多的硬件,大部分情况下驱动程序都能自动安装好,甚至不需要用户参与,在这一点上它甚至比Windows更“友好”。
误解二. Linux难学。希望你永远记住,电脑不是个简单器械,无论是硬件、操作系统还是应用软件,都经常比看上去复杂得多。所以易用未必是好事,它肯定向你隐瞒 了些什么,花一点时间绝对是值得的,尤其是当你想做一个程序员的时候。况且Linux也没那么难学,且不说它的图形界面越来越好用,就是完全用命令行的 话,入门也相当容易。而且Linux世界的文档齐全且易于检索,更有高度发达的社区文化,在这里你学到的往往比预期的还要多。
误解三. Linux难用。再强调一下,Linux的学习曲线是陡峭的,然而一旦你度过了开始的适应期,就会发现原来命令行可以这么好用,原来有这么丰富的工具来提 高效率,而且这些好用的工具居然都是自由的[13]!你不需要向作者付费,甚至他们鼓励你使用和传播,你甚至可以随便修改这些工具的源代码,遇到问题可以 发一封邮件反馈给作者。这在Windows下都是很难做到的,在那片土地上你很难体会什么叫“自由”。不仅如此,当你熟悉之后会发现,同样一件事情,其实 Linux下的解决方案往往比Windows下要简单。就比如我们提到过的安装Bochs一例吧,在Windows下你通常需要先到Bochs网站,在数 次单击之后找到下载链接,然后下载,再然后是双击安装程序来安装。在Linux下呢,你看到了,只需要一个命令行就可以了,即便你打字的速度再慢,也比那 些鼠标单击操作要快。
我在此并非贬低鼠标的好处,我每天都使用鼠标,它绝对是个伟大的发明。但是我们应该只在需要它的时候使用它,而不是试图用它来解决所有事情。这就好比图形 界面是个好东西,如果你的工作是图形图像处理,很难想像没有图形界面该怎么做,但并不是图形界面在任何时候都是好的。我们应该分辨每一类工作最适合的工具 是什么,而不是用一种思维解决所有问题。这也是我说“Windows桌面好用是个复杂的误解”的原因,图形界面是个好东西,Windows把它用得极端 了。
误解四. Linux下软件少。这是最大的一个误区,事实上很少有事情你在Linux下是做不到的。而且Linux的发行版通常都有发达的包管理工具,无论是关键字 查找、安装、更新还是卸载都可以用一组统一的命令来完成。这使得你在需要某种软件时,使用简单的命令就可以找到它,很多时候你能找到不止一种。如果你想看 看除了od之外还有哪些二进制查看器,在Ubuntu或者Debian下通过一个apt-cache search 'hex.*(view|edit)'[14]命令就能找到十几种,这些都是自由软件,有命令行的也有图形界面的,而在Windows下,怕是又要在浩瀚 的互联网中搜索了。
在Linux中找一些Windows下软件的替代品是很容易的,虽然这种对应有时并非必要。比如字处理软件就有OpenOffice.org、 KOffice、AbiWord等选择;图像处理软件有GIMP;多媒体播放软件有MPlayer、Totem等。如果你喜欢玩游戏,Linux下的游戏 数量也会让你大吃一惊,不信你可以来这里看一看。
其实Linux的好处还远不止这些,众所周知的一个优点是它基本没有病毒的烦恼。不是Linux中开发不出病毒来[15],而是因为Linux系统有自身 的权限机制作保障,加上软件来源都可信赖,且大部分都是源代码开放的(其中相当一部分都是自由软件),所以说Linux下没有病毒烦恼并非夸张。想想你在 与病毒做斗争的过程中浪费了多少时间吧,我已经很久没有这种烦恼了。Windows或许正变得越来越稳定,但Linux一直都很稳定,而且你不需要整天重 启你的电脑,笔者的电脑就有时几十天不重启。除非你要升级内核,否则没有很多关机和重启的理由(不管是安装还是卸载,或是对系统内的包进行升级,都不需要 重启电脑)。
作为一个操作系统爱好者,使用Linux的理由还有一条,那就是Linux的内核是“自由”的,注意它不仅仅是“开放源代码”的,你不仅可以获取其源代 码,而且可以自由地复制、修改、传播它,当然也包括学习它。如果你也想加入到内核黑客[16]的队伍,那么就先从使用它开始吧。Linux不是完美的,它 的问题有很多,但每个问题都是你参与的机会,而这种参与可能是你成为顶尖高手的开始。
笔者本人完全使用Linux来工作的时间其实很短,几年而已,但我已经深深体会到它给我带来的好处。我并非想说服你,人不能被说服,除非他自己愿意相信。我只是希望你能尝试着去用一用Linux,或者UNIX的其他变种,然后用自己的判断去选择。
如果你坚持使用Windows,没问题,两者之中都可以很容易地搭建起开发环境,本章后面的部分将会就Linux和Windows分别来做介绍。