代码改变世界

OS之争:永不停歇的战争(二,完结)

2013-03-05 20:06  空明流转  阅读(...)  评论(... 编辑 收藏

人机界面的对战(续)

UI的帮派战争

如果说不同流派间比较算是内部的矛盾,那么流派间的竞争,可谓是帮派战争了。

帮派战争中,最激烈当属Linux为代表的CLI阵营与Windows/Mac为代表GUI阵营之间的对抗。虽然双方都会将问题描述的花里胡哨,但是这些都是“将答案准备的足够复杂以让别人找不到明显的瑕疵”的做法。撇开表现形式不谈,我们看看操作系统最原始、最主要的需求:检索及管理文件;启动程序;管理已经启动的程序(进程)。

为什么Linux和Windows的两伙人在这个问题上能斗的这么激烈,而且还不分胜负,就是因为这三个功能都足够简单,无论是GUI还是CLI都能够轻松胜任。所以说,单独在OS Native功能集合上讨论UI问题,如同两小儿辨日,是没什么意义的。

对于初学者来说,如果只是操作系统的基本功能,学习DOS/Linux和学习Windows也没有太大的区别。让用户在屏幕上打出“app Q”就能搜出所有的名字带Q的软件,也并不是什么难事。甚至因为命令更加容易记诵的关系,说不定这样用起来还更简单。但是,系统必须要有许许多多的软件来丰富它的功能。如果只用命令行的话,不仅仅在面对诸多功能时交互不方便,而且记诵的内容会爆炸性增长。只有GUI才能提供大量的上下文信息,用户可以再记忆尽可能少的情况下下达正确的指令。再加上人都喜欢漂亮直观的东西,所以GUI几乎是PC这样大众消费品的必然选择。

实际上对于任何一个经过大脑设计的软件(包括操作系统),都不会宗教信仰般的选择只选择一种交互方式。

Windows提供了Command和PowerShell,Linux有X或者是GNOME和KDE这样更上层的GUI Support;MSVC有专门的命令行,也可以键盘走天下,而且快捷键也多得令人发指,与EMACS比也不遑多让了;AutoCAD更是有这么个说法:只用鼠标的,不如一只手用键盘的快;一只手用键盘的,不如两只手用键盘的快。甚至程序员写网页,往往更喜欢手刃HTML而不是在Dreamweaver里面拖拖拉拉。因为他们选择“录入”,比选择“拖拽和调整”要更加高效。

想想王垠的两篇钓鱼贴。LaTeX为啥能流行?因为程序员擅长录入,擅长大脑排版,但是对点来点去生拉硬拽的感性东西却把握的不好。不过还是要感叹一下,LaTeX的特点也太鲜明了:语法忒差劲,排版贼漂亮。

三爷说的对,白猫黑猫,抓住老鼠才是好猫。

程序间的接合

所有Linux的粉丝们在提到这个系统的优越性的时候,都会无一例外的谈到Unix的设计哲学:小工具,长流水。尽管不同的软件协作模式不一样,但毫无疑问这个是深受平台文化之影响。软件在功能上的构件化,以及协作上的Pipeline化的确给功能组合带来了很多的好处。你可以把很多功能拼接成你需要的内容。这也是很多Linux粉丝最自以为豪的地方。实际上,Photoshop和3DS Max这样的软件也借用了这样的思路。

但是这一模式有它固有的问题:首先,如果交互很多,它的反馈效率很低;其次,如果数据不是线性的变化,而是从像状态机一样各个操作彼此呼应,那Pipeline就没辙了。

反观Windows上的软件,大都是各自为战。能在程序间共享的,就只有档案文件,剪贴板等几样有限的方式。当然,Windows上有COM/OLE来实现更低粒度的复用,也有共享内存,邮槽和管道,甚至是Socket。但是这些开发起来要么复杂,除了MS很少会有;要么大部分Windows程序都不鸟这一点。

所以Windows上的软件,都是集成式的,得高大全。面对复杂多变的用户需求,一旦功能稍有不足,就会变得非常麻烦。有问题,就会有人提出解决办法。插件系统解决了这类系统的扩展问题。可以说这和*nix的工具链是殊途同归,只不过一个是自底向上,一个是自顶向下。

至于谁用起来更方便,我们可以做一个简单的假设:

总操作成本 =  软件内的操作成本 + 软件之间的协作成本

我们可以这样想:如果所有功能都在一个软件中无缝完成,那么协作成本就是0。而Linux选择了一个比较低的协作成本,但是这个成本始终存在;而Windows下的软件大部分情况下协作成本是0,但是一旦需要协作,可能就会变得很高。不过总的来说,我们可以认为它们的成本期望是差不多的。

这两种协作模式也是相互借鉴与融合的:插件减少了软件外协作的几率;一些GUI Shell(典型的包括TortoiseSVN)和Batch提高了软件功能的内聚性,减少了软件协作的次数。

在这一点上,Linux与Windows也是风格迥异,战无可战。

IDE与Debugger

不管Linux多么高效,Windows多么普及,Mac多么漂亮,OS之间的战斗从来都不会在普通用户间发生。这些看网页、玩游戏、编辑文档、看电影的大众用户们,要么Windows要么Mac,不会有什么人缺心眼来选Linux。所以OS的争论从来都是在程序员之间进行。

所以OS之争的战火经常也会烧到软件开发上。最常见的争斗,大概是在IDE和Editor派的斗争中进行。甚至连智能提示和代码补完都经常成为无辜的牺牲品。之前我经常见到的论调就是,智能提示会降低程序员的智商。

抛开价格问题不谈,VS毫无疑问是IDE中的翘楚。咱们可以回顾下IDE的作用:

  • 就是,有个方框给你打字;
  • 打的不对了,或者打到一半,可以给你提示一下;
  • 搜索(查找声明,符号查询,普通查询,从项目中翻阅文件);
  • 醒目的内容(关键字)帮你高亮一下;
  • 格式不对,帮你整理一下格式;
  • 很方便的把写好的内容编译并运行。

这就完了。剩下的Debug什么的,就要看Debugger的了。喷VS的人,你们可以来说一说,以上几点,VS哪里做的不好?当然,VS把手伸的更远,将Linux上Conf/Make的工作也包揽了。不过你愿意也可以用命令行工具。我以前在公司就用Jam负责编译,然后VS只管写代码和调试。

随着时间变化,眼见着VS的快捷键也有越来越多,甚至还有Emacs的快捷键支持和VIM编辑模式的扩展;Editor的功能也越来越强大,从早期的Tag到Sublime Clang,对语言本身的支持和提示也越做越好。但是从完成度上来说,无论是Eclipse+CDT,还是XCode,都和VS有一定的差距。只不过你需不需要那样功能多样的IDE,这是另一个问题了。

开发除了码字,还有一个花费时间的就是Debugger。之前在群里面聊天的时候,一直有人说GDB如何如何好用。不过VS的Debugger也不见得难用。无论是Stack,还是Watch,或者是Register,Breakpoint,VS的Debugger都是合格的。VS的Debugger也可以用命令行操作。此外,在Windows下还有功能更丰富,短命令的WinDbg可用。

如果硬要比较的话,算上GDB的Visualizer,比如DDD,在可视化调试方面GDB不如VS Debugger;功能丰富性上,和WinDbg差不多。不过GCC的符号有时候会有一些问题,GDB有时候也不是那么稳定。并且GDB Attach的效率一直都比较慢。也许以后LLDB可以脱颖而出成为一个不错的跨平台工具。从VS2003之后,GCC想战翻VS已经不太可能了,Clang这个有钱的后期之秀倒是潜力大大的。

  • 与硬件的沟通

人机界面是操作系统的外功,对硬件资源的管理是操作系统的内功。Windows将整个GUI部分都并入到内核中,多少影响了一些效率。这使得对不用GUI的网络服务来说,Windows可能还是有一些吃亏的。但是一旦用上GUI后,Windows的优势就体现出来了。今天的Linux花了不少力气试图以C/S模式的提供GUI服务,例如X Windows,但是实际上他们和OpenGL一样,解决的都是昨天小型机上的古老问题,在现代PC上看不出多少优势来。

现在我们还使用的富GUI的系统,即便是Linux魔改,也不会遵循X Server/X Client这样的分离框架,而是直接建立在内核之上的。Mac OS X的Aqua,或者是Android的UI,都是整合与折中后的产物。

当然,对于一些用户来说,UI是可有可无的累赘。

于是乎,论战变成了:Windows好用!Linux安全稳定快。Windows应用程序多!Linux安全稳定快。Windows用户广!Linux安全稳定快。Windows向前兼容!Linux安全稳定快。Windows贵!Linux安全稳定快。对啊,还便宜!你不说我还忘了!

Linux安全吗?攻击他的人少罢了。而且真正薄弱的环节,多不在系统。你看CSDN,用啥系统也解决不了明文密码的问题。

Linux稳定吗?当然稳定。但是不知道为什么我的Ubuntu用着用着就崩溃了。不过Linux不同的发行版,素质也各有不同。

Linux快吗?快。很多场合比Windows有一些性能优势,比如文件系统。长时间运行下的内存管理和进程管理也要比Windows好一些。

无视Windows的其它特性,让Linux“安全稳定快便宜”包打天下多少是不妥的。

Windows另一个被人诟病的地方就是补丁多。实际上Linux的补丁也不少,而且也有一些是Bug和安全补丁。不过Linux一般都叫:升级。同样是升级,Windows的渐增升级显然比Linux升着升着就得重新编译内核的办法要高明一些。特别是硬件驱动,可能内核一升级,驱动就挂了。要么重新编译,要么重新安装。这点上Linux对用户的体恤程度比Windows要差不少。

这点在Android上就要好得多。毕竟是有这VM和Java Library作为隔离,即便是版本升级之后以前的API废弃了,也不敢轻易去掉。

所以说,单论服务器这种交互少,变更少的应用而言,Linux还算是合适的。但是要是频繁更新,硬件兼容性和应用兼容性来说,那显然Windows是甩开Android几条街的。iOS和Mac OS X是另一条路子,专硬专用。王垠在博客上提到说Photoshop在Mac OS X上的移植难度比Windows大很多并推理成Mac OS X比Windows烂,是不合理的。这不完全是团队的水平问题。而是从一开始Apple就没有将可移植性作为重点来抓。毕竟这样的升级要许多年才会遇到一次。花大工夫在不太需要的特性上显然是一种过度设计和浪费。

API及其它争论

对于Windows和Linux,Mac OS X上来说,还有很多类似与API好不好看一类的问题。这么说,UI相关的API是Windows和Mac原生的产物,Linux上需要算上X Windows。Windows和X相比较,前者要更加成功一些;Mac的UI比较固定,所以Cocoa的框架集成度很高(还有一个抽象层次更低一些的Carbon);Windows在界面上需要一定的灵活性,所以比较复杂难用,看起来也经常不雅观。

有需要就会有功能强大,结构复杂的东西出现。例如Mac的字体渲染就比Windows好;Windows的Open Type也能完成正常的渲染工作,而且uniscribe的排版也很强大;Linux就弱许多。此外,像IME/TSF这样要应对各种语言,各种区域需求的功能,API很难做的干净简单。

除此之外就是文件系统、内存、进线程和网络API,这实际上是Linux,POSIX与Win API的竞争。整体来说,该有的功能,大家都有。用起来的难度/复杂度也不相上下。你能给我找个在某个系统下写的顺畅的功能换一个系统就狗屎不如的例子吗?

结语

断断续续磨洋工写了两天。本文的宗旨就是添油加醋和稀泥,发表一个完全是废话的观点:现代系统都差不多。

最后推荐两首歌:

《Fantastic Chindren》的插入曲和ED:

Voyage:

http://www.xiami.com/song/1769616092

水のまどろみ

http://www.xiami.com/song/1769616118