Sunday, March 3, 2013

驳王垠《漫谈 Linux,Windows 和 Mac》一文

 以下蓝色部分为王垠原文。

好了,现在来一点技术性的。这段时间受到很多人的来信(大部分是菜鸟)。他们看了我很早以前写的推崇 Linux 的文章,想知道如何“抛弃 Windows,学习 Linux”。天知道他们在哪里找到那么老的文章,真是好事不出门。。。我觉得我有责任消除我以前的文章对人的误导,洗清我这个“Linux 狂热分子”的恶名。我觉得我已经写过一些澄清的文章了,可是怎么还是有人来信问 Linux 的问题。也许因为感觉到“舆论压力”,我把文章都删了

恩,继续看下去。

简言之,我想对那些觉得 Linux 永远也学不会的“菜鸟”们说:

1. Linux 和 Unix 里面包含了一些非常糟糕的设计。学不会有些东西不是你的错,是 Linux 的错,是“Unix 思想” 的错。不要浪费时间去学习它们的太多东西。那些貌似难的,复杂的东西,特别要小心分析。


2. Windows 避免了 Unix,Linux 和 Mac OS X 的很多问题。微软是值得尊敬的公司,是真正在乎程序开发工具的公司。我收回曾经对微软的鄙视态度。请菜鸟们吸收 Windows 设计里面好的东西。


真的吗?继续看下去。

3. 学习操作系统最好的办法是学会(真正的)程序设计,而不是去“学习”各种稀奇古怪的工具。所有操作系统,数据库,Internet,以至于 WEB 的设计思想(和缺陷),几乎都能用程序语言的设计思想简单的解释。


这话本身在理。

先说说我现在对 Linux 和相关工具(比如 TeX)的看法吧。我每天上班都用 Linux,可是回家才不想用它呢。上班的时候,我基本上只是“忍受”着它,尽我所能的改善它。Unix 有许许多多的设计错误,却被当成了圣经,传给了一代又一代的程序员。Unix 的 shell,命令,配置方式,图形界面,都是非常糟糕的。每一个新版本的 Ubuntu 都会在图形界面的设计上出现新的错误,让你感觉历史怎么会倒退。但是这只是表面现象。Linux 的图形界面(X window)在本质上几乎是不可治愈的恶疾。我不想在这里细说 Unix 的缺点,在它出现的早期,已经有人写了一本书,名叫 Unix Hater's Handbook,里面专门有一章叫做 The X-Windows Disaster。

说实话这段的观点是非常主观和空洞啊。
Shell/命令糟糕,请问CMD或者PowerShell是否比较优秀呢?优秀在哪呢?
想用Lisp?那我表示Scsh支持Unix和Windows(通过Cygwin)。
配置方式糟糕,这个我特别不理解。到底是GNOME/Unity没有提供图形的控制面板了呢?还是Apache的HTTPD安装在Windows下就不需要编辑配置文件了?
X糟糕我稍微可以认同,不过也有Wayland等尝试改进的工作在开展了,参见:https://lwn.net/Articles/415589/

这本书里汇集了 Unix 出现的年代,很多人对它的咒骂。我曾经以为这是一些菜鸟,他们肯定是智商太低,或者被 Windows 洗脑了,不能理解 Unix 的高明设计才在那里骂街。现在理解了程序语言的设计原理之后,我才发现,他们说的那些话里面居然大部分是实话!其实他们里面有些人在当年就是世界顶尖的编程高手,自己写过操作系统,功底不亚于 Unix 的创造者。在当年他们就已经使用过设计更加合理的系统,比如 Multics,Lisp Machine 等。可惜的是,在现在的操作系统书籍里面,Multics 往往只是被用来衬托 Unix 的“简单”和伟大。Unix 的书籍喜欢在第一章讲述这样的历史:“Multics 由于设计过于复杂,试图包罗万象,而且价格昂贵,最后失败了。” 可是 Multics 失败了吗?不。Multics,Oberon,IBM System/38, Lisp Machine,…… 在几十年前就拥有了 Linux 现在都还没有的好东西。Unix 里面的东西,什么虚拟内存,文件系统,…… 基本上都是从 Multics 学来的(有很多没有学得像)。Multics 的机器,一直到 2000 年都还在运行。Unix 不但“窜改”了历史教科书,而且似乎永远不吸取教训,到现在还没有实现那些早期系统早就有的好东西。最后 Unix 依靠自己的“宗教”和“哲学”,“战胜”了别的系统在设计上的先进,统治了程序员的世界。胜者为王,可是 Unix 其实是一个暴君,它不允许你批评它的错误。它利用其它程序员的舆论压力,让每一个系统设计上的错误,都被说成是用户自己的失误。其它系统里面某些优秀的系统设计,也许就要被历史掩埋……

一本年代久远(1994年),亚马逊上3星半的书,不必过分追捧。
http://www.amazon.com/dp/1568842031/
文中提到的至少十几年前就灭绝的系统, 好吧,我真没用过,就当他们是很牛X的吧,请问后发的Windows NT有没有继承他们的思想呢?如果没有是为什么呢?
至于Unix篡改历史,Unix是暴君……一个OS内核还有这样的能耐……
如果那些是说Unix用户,我觉得“以前的王垠”可能是大中华区最符合的了,呵呵。

我曾经强烈的推崇 FVWM,TeX 等工具,可是现在擦亮眼睛看来,它们给用户的界面,其实也是非常糟糕的设计,跟 Unix 一脉相承。他们把程序设计的许许多多的细节,无情的暴露给用户。让用户感觉有那么多东西要记,仿佛永远也没法完全操纵它。实话说吧,当年我把 TeXbook 看了两遍,做完了所有的习题(包括最难的“double bend”习题)。几个月之后,几乎全部忘记干净。为什么呢?因为 TeX 的语言是非常糟糕的设计。它的设计者几乎完全不明白程序语言设计的基本原则,不明白什么叫做“抽象”。

TeX好不好用和Unix有什么关系?我在Windows下装TeX Live,用了下TeX觉得很难用,就可以证明Windows很糟糕了吗?(CTeX甚至只支持Windows,呵呵)
FVWM类似的道理。
(我最早接触的Linux是Red Hat Linux 8.0,那时候还没有Fedora,默认桌面是GNOME,预装了OpenOffice.org,没预装TeX)

一个好的工具,应该只有少数几条需要记忆的规则,就像象棋一样。而这些源于 Unix 的工具却像是“魔鬼棋”或者“三国杀”,有太多的,无聊的,人造的规则。有些人鄙视图形界面,鄙视 IDE,鄙视含有垃圾回收的语言(比如 Java),鄙视一切“容易”的东西。他们却不知道,把自己沉浸在别人设计的繁复的规则中,是始终无法成为大师的。就像一个人有能力学会各种“魔鬼棋”的 规则,却始终无法达到象棋大师的思维高度,因为魔鬼棋本身就无法跟象棋的设计相提并论。所以,容易的东西不一定是坏的,而困难的东西也不一定是好的。学习 计算机(或者任何其它领域)的东西,应该“只选对的,不选难的”。记忆一堆的命令,乌七八糟的工具用法,最后脑子里什么也不会留下。学习“原理性”的东 西,才是永远不会过时的。

象棋流行还是三国杀流行?就算是象棋流行吧,呵呵。
“有些人”也完全可以是在Windows捣鼓C/C++的嘛,比如:
http://blog.codingnow.com/2008/09/replacement_of_ide_1.html
“魔鬼棋”式的工具只源于Unix吗?为了公平比较得把Windows NT发布之前出现的工具给去掉吧?比如TeX,想源于优秀的Windows NT也没机会啊。
我觉得这个世界被最多人使用的“魔鬼棋”式工具正是Microsoft Office,收到别人的doc文件,我放在微软自己的Office Web App里编辑都会变成一团乱麻,实在无法理解。

我并不是说 Windows 好很多。技术设计上的很多细节,也许它在早期是同样糟糕的。但是它却向着更加结构化,更加简单的方向发展。到 Windows XP 的时候,已经很不错了。我认识一个 Adobe 的高级设计师。他告诉我,当年他们把 Photoshop 移植到 Intel 构架的 Mac,花了两年时间。Xcode 比起 Visual Studio 真是差太多了。而 Mac OS X 的很多设计,让他们的移植实在太痛苦。只不过系统换了个处理器,移植个程序居然花了两年时间。不过他很自豪的说,当年很多人等了两年也没有买 Intel 构架的 Mac,就是因为他们在等待 Photoshop 的移植。最后他直言不讳的说,微软其实才是真正在乎程序员的公司。相比之下,Apple 虽然对用户显得友好,但是对程序员的界面却差很多。Apple 尚且如此,Linux 对程序员就更差了。可是有啥办法呢,有些人就是受虐狂。自己痛过之后,还想让别人也痛苦。就像当年的我。

且不说这种论证有多弱。要是以移植处理器作为比较对象,那我觉得Linux怎么都算是第一了,多少软件包都是N个架构可以编译可以用的?(去看看Debian吧)强大的Visual Studio的移植性在哪里?怎么Windows RT只支持Windows Store应用呢?
Windows XP被限制在IE8,很多用户甚至还在用IE6,搞得Web开发者苦不堪言,这就是“在乎程序员”?相比之下Ubuntu的各种版本只要支持期不结束,会不断给用户升级到Firefox的最新版。例如Ubuntu 10.04现在也会升级到Firefox 19.0。
http://packages.ubuntu.com/search?keywords=firefox
Windows RT都不支持SliverLight,之前搞个插件,现在又推HTML5,这就是“在乎程序员”?

我当然不是人云亦云。微软在程序语言上的造诣,我看得很清楚。我只是通过别人的经历,来验证自己早已存在的看法。所以一再宣扬别的系统都是向自己学习的 Apple 受到这样的评价,我也一点不惊讶。Mac OS X 毕竟是从 Unix 改造而来的。我在家里有一个 Macbook Air,一个 iPhone 5,和一个退役的,装着 Windows 7 的 T60。我不得不承认,虽然我很喜欢 Macbook 和 iPhone 的硬件,但我发现 Windows 在软件上的很多设计其实更加合理。举个简单的例子,我至今没有发现有什么不自虐的方式,可以改变 Mac 浏览器里面的中文字体!所有的论坛都说要改什么 .plist 配置文件,还有人打包分享了他自己的配置文件。怎么跟 Linux 当年一个德行?一个公司的偏执,真的可以阻碍它向别人学习,设计出更好的东西。微软也许在当年是傲慢轻狂的公司,但是我觉得它现在已经度过青春期,长大成熟了。

Windows在软件设计上更加合理因为提供了一个Windows改中文字体的UI?呵呵,要不我截图给大家看看,用微软官方的Windows 7 IE9虚拟机,默认的中文字体丑到了何种程度?
大概作者觉得改注册表要比改配置文件先进、优秀多了?有这样的个人观点本身没问题,不过我听说,只是听说,.Net也采用了.config文件的配置方式,这世界是怎么了呢?

说实话,我真的搞不懂为什么我当年会鄙视微软。现在我身边还有一些人鄙视微软。甚至在 Indiana 的时候有个教授口头上说“鼓励”,实际上想强迫学生离开 Windows 和 Visual Studio,而使用 Unix 和 Emacs。微软到底犯着谁了啊?不要忘了 Unix 是 AT&T 的产品。微软和 AT&T,到底谁更邪恶呢?公司不都是追逐利益的吗。现在看来 Apple, Google,…… 也都是一个样。不过现在,骂 Unix 和骂 Windows 不大一样的地方是,如果骂 Windows,几乎没有人跟你还口。最多有人跟你说,不就是个有点毛病的东西吗,有啥好骂的(埋头继续玩他的游戏)。而如果一旦有人骂 Unix,立刻有人会起来说:“菜鸟不理解 Unix 的哲学。人笨怪刀钝。” 哎,不吭声的就是容易被欺负。

有个教授和作者的观点不一,作者就看不下去了,呵呵。
至于所谓的“公司不都是追逐利益的吗”:
原来售价不菲(不然中国为什么盗版横行,请问)的私有软件(如Windows)和以GPL或BSD协议发表的自由开源软件(如Linux、FreeBSD、Darwin)是可以混为一谈的。
原来一个公司为了追逐利益,在操作系统中留下后门也没什么关系(忘了黑屏事件了吗)。

当然我不是在这里打击 Linux 和 Mac 而鼓吹 Windows。这些系统的纷争基本上已经不关我什么事。我只是想告诉新人们,去除头脑里的宗教,偏激,仇恨和鄙视。每一次仇恨一个东西,你就失去了向它学习的机会。

我觉得本文作者头脑中充满了“偏激,仇恨和鄙视”,呵呵。

总结一下,我只想对本文说“呵呵”。Unix并不是没有缺点,麻烦作者批评到点子上,不要扯了这么多结果什么实质内容都没有。

4 comments:

  1. 真是搞不懂王垠现在在想些什么了。没有什么坚持到底的,做一样废一样。

    ReplyDelete
  2. 看着王垠的文章,總覺得他是爲反駁而反駁。

    小弟雖然沒有用過 TEX,但讀書的時候就已經聽過一些研究生訴說用 TEX 的痛苦。但 TEX 極其量是 Unix 上的應用程式,可跟作業系統沒有關係。

    看一個作業系統的好不好不是應該要看系統的 architecture 設計跟穩定性等嗎?

    王垠大概沒有聽過連微軟自己也受不了之前的 Windows 裏的 API 並不是有條理地從上而下,以及很多的設定沒辦法在沒有圖像顯示之下而進行,所以才推動了一個 MinWin 的企劃來嗎?

    先不算 Windows 95/98 等硬在 DOS 上加個 GUI 的 OS。但打從微軟開發 Windows NT,歷多少代的 Windows 呢?要等到 Windows 7 才能做到?

    X 不錯是現代 *nix 的一個不足之處,但是(1)正如 blog主說已經有 Wayland 等企劃在進行,而(2)這並不正是 *nix 優勝的地方嗎?

    ReplyDelete
  3. 王垠這篇文章很空洞,大部分論點根本沒有提出論據,倒像是純粹發洩的文章。
    但話說回來,Unix的shell的確是大有問題,主要是它沒有類型系統,很容易導致誤操作(Bumblebee一個空格引發的血案);而它用標準IO作為程序通訊管道,令管道間的文本流為了IO的Human-readable輸出而妥協,難以有一個標準的管道通訊約定,令解釋數據的程序變得更加複雜,更容易誤操作
    詳見:http://www.soimort.org/posts/158/

    ReplyDelete
    Replies
    1. 一个实际命令,其实分人类手打和自动化批处理两种执行入口,这两种入口的本征需求千差万别。

      shell乃至整个unix风格命令行工具链的原罪,就在于又想方便人类手打,又想着能否自动化,结果闹得两头鸡飞蛋打。

      事实上我深刻的感到 Apache ANT 这样,用一门成熟语言来专门负责自动化执行任务的工具才是正确的。

      Delete