(标题是标题党)
王垠最近的一篇文章中,提出了很多有趣的观点。其中最核心的一点,就是 *NIX 系统的设计哲学非常糟糕,而 Windows 系统才是真正为开发者设计的系统。凡是涉及到哲学层面的争论,最后都是以谁也说服不了谁收场。我相信王垠有足够的理由来证明 UNIX 设计哲学的糟糕,但遗憾的是,他的文章并没有表现出这一点。我摘抄一些论点并作答复。
Unix 的 shell,命令,配置方式,图形界面,都是非常糟糕的。每一个新版本的 Ubuntu 都会在图形界面的设计上出现新的错误,让你感觉历史怎么会倒退。但是这只是表面现象。Linux 的图形界面(X window)在本质上几乎是不可治愈的恶疾。
以现在的眼光看,X Windows 是一个设计过于繁复的系统。实际上,20年前出版的 The Unix Haters Handbook 里,就有专门的一章论述为什么 X Window 的 client-server 架构是糟糕的。可是,这和 Ubuntu 的设计演化之间似乎没有太多关联。Ubuntu 所谓的图形界面设计的错误(以 unity 为例),都是桌面环境层面的问题。一个设计师在这个层面犯错误,就像一个画家因为构图不够工整就去怪画布不行一样,之间还相差不少逻辑链条。
X Window 和其他操作系统上的 GUI 系统最大的不同,是它和宿主操作系统的松耦合。因为这种松耦合的存在,在不需要图形界面的地方,操作系统可以不带 X Window。很多云服务的服务器,都是没有 X 的。当下如日中天的移动操作系统如 Android 和 iOS 都是 UNIX 家族操作系统,而这两者都没有用 X Window 提供 GUI 支撑,而是另外开发了一套专门适合触摸式移动设备的图形界面系统。图形系统和操作系统间的松耦合,使得操作系统可以从头搭建适合具体设备的图形界面交互(如 Cocoa Touch),并且快速的迭代(如 Project Butter)。
在 GUI 和内核的耦合关系上,架构的确决定了产品的形状。我们都知道,微软 NT 内核和 Widnows UI 系统是绑定在一起的。Windows Phone 8 要和 Windows 8 共享内核和其他组件的结果,就是它们都必须兼顾桌面和移动平台。为此,微软做出了两个可以做榔头也能做螺丝刀的东西。一个是 Windows 8,支持触摸屏,Modern UI 界面长得像手机界面;一个是 Windows Phone 8,界面很适合触摸设备,却又同时支持移植来的桌面程序,造成有的程序界面长得像桌面。无论你认为哪个操作系统的图形界面漂亮,哪条路更加有光明的未来,微软的这些系统之间的关系之繁复,开发迭代的周期如此之长,都是客观事实。
UNIX 系统的Unix 的 shell,命令,配置方式的确有不少的问题,在痛恨者手册里也有详细的论述,我以前也写过,就不一一列举了。
Unix 依靠自己的“宗教”和“哲学”,“战胜”了别的系统在设计上的先进,统治了程序员的世界。胜者为王,可是 Unix 其实是一个暴君,它不允许你批评它的错误。它利用其它程序员的舆论压力,让每一个系统设计上的错误,都被说成是用户自己的失误。其它系统里面某些优秀的系统设计,也许就要被历史掩埋……
一个操作系统,是不可能凭着“宗教”和“哲学”就能统治程序员的世界的。程序员不是天主教徒,UNIX 也不是程序员世界的教皇。实际上,所谓的 UNIX 系统,不是一个特定的系统,而是一个家族的系统。这个家族的系统包罗万象。不喜欢微内核的做了宏内核,不喜欢一切还不都是文件的做了 Plan 9, 不喜欢 X Window 慢如蜗牛的做了 XGL 加速。优秀的设计不断地加入这个系统,改造这个系统。UNIX 来源于 Bell 实验室,X Window 却是 MIT 的,BSD 来自于 Berkeley, Solaris 来自于 SUN, Mac OS 来自于 Apple。如果说这里面有宗教的话,这一定是世界上最诡异的宗教,里面的教徒还天天打架。
在 UNIX 系统中,所有的设计,都在开放的环境下竞争。我们可以说 UNIX 不是一个设计良好的系统,但是它的设计哲学在竞争中获胜的原因,不是因为它是“暴君”,控制了程序员的思想,而恰恰是因为它的开放,所以最终汇总了很多优秀的东西。至于 UNIX 这种不怎么好的系统为何最终获胜,20年前的一篇文章也讲得很清楚了。
因为 TeX 的语言是非常糟糕的设计。它的设计者几乎完全不明白程序语言设计的基本原则,不明白什么叫做“抽象”。
而这些源于 Unix 的工具却像是“魔鬼棋”或者“三国杀”,有太多的,无聊的,人造的规则。有些人鄙视图形界面,鄙视 IDE,鄙视含有垃圾回收的语言(比如 Java),鄙视一切“容易”的东西。他们却不知道,把自己沉浸在别人设计的繁复的规则中,是始终无法成为大师的。就像一个人,他有能力学会各种“魔鬼棋”的规则,却始终无法达到象棋大师的高度。
这里,王垠把两个不相关的东西放到了一起。一个是工具的设计哲学,一个是我们如何学习知识。魔鬼棋本身是一种工具设计哲学,和成为大师无关。
在军刀工具一文中我提过,面向特定领域的软件工具之所以让人觉得复杂,是因为这个问题本身复杂。我们把解决特定领域问题而所需的知识叫做”领域模型“(domain model)。如果我们不了解领域模型,就不能理解为什么 Photoshop 比系统自带的 Paint 复杂几千倍, 或者为什么我们需要正则表达式这种诡异的东西。我们讲的复杂与简单,都是工具设计哲学层面的。
以王垠说的 TeX 为例。写出《计算机程序设计艺术》的 Knuth 到底知不知道程序语言设计的基本原则我们可以不加讨论。了解一点字体设计和排版的都知道,计算机排版问题是个复杂的问题。的确,软件工具的设计目标,是把复杂的问题简化。然而,大多数人不知道的是,简化问题是一个两步过程。第一步,我们需要把现实的问题映射到一个领域模型。第二步,是把这个模型简化到我们人可以处理的地步。很多时候这两步合并起来了,让我们觉得这两步好像是一步,并且认为所有的设计,都应该朝简化的方向走。这是一个对设计的错误认识。
举个非计算机领域的例子:用电饭锅煮饭非常简单,加米加水再按个按钮就行了。电饭锅的设计者的设计目标是操作简单且能完美地煮米。作为工具的设计者,它一方面需要了解大米是怎么煮熟的,另一方面需要提供给用户一个简单的按钮。TeX 作者,从一开始就不是设计一个电饭锅,而是一个精确的温控炉子。有了这个精确的温控炉子,想烧饭的可以把它封装成电饭锅,想做蛋糕的可以把它封装成蛋糕烤箱。设计电饭锅的人的设计,并不比设计精确的温控炉子的人好,或者差。设计者的初衷决定了产品的形状。 Kunth 的初衷,正是设计一个可以让他人排版出任何想排版的东西的系统。也就是说,做出一个最终非常简单的,只有一个按钮的排版系统不是他的设计目标。做出一个可以高度定制的系统才是他的目标。
其实,TeX 本身也是一个由繁到简的软件系统。它把所有排版中的问题,都提炼成了一些控制原语。有了这些控制原语,针对特定领域做优化就不是问题了。现在通用的科学出版排版工具 LaTeX, 正是这样的一种优化。这是有心设计的结果。我们抱怨 TeX 复杂,其实是抱怨排版本身复杂。Windows 系统上有许多排版软件,可以毫不客气地说,没有一个可以达到 TeX 所能到达的精确控制。以此责怪 UNIX 下的软件工具是魔鬼棋,就类似于责怪 Photoshop 为啥不象 Paint 那样简单一样,有选择性地忽视了两者所要解决地问题不一样。
我欢迎所有的 UNIX 使用者加入痛恨者阵营,因为我也是 UNIX 痛恨者。只有成为了 UNIX 痛恨者,你才是一个真正的 UNIX 使用者。至于 Windows, 我们对它没有感情,无所谓爱恨。
Pingbacks to “编程珠玑番外篇之番外篇-N 答 UNIX 痛恨者王垠”
54 comments to “编程珠玑番外篇之番外篇-N 答 UNIX 痛恨者王垠”
字处理软件也好, 企业应用也罢, 任何的软件都可以看成是人类在对领域需求的不断认知和重构, 很多时候是人类自己搞不清字处理到底意味着什么,软件只是实现这种认知的手段而已.这种认知是在不断精化提炼的进行的. 某个程序员对这个认识得更深刻,他写出的软件自然就更好用. 这并非是他的编程水平更高, 而事实上是因为他比我们更知道到底怎么可以把”字”处理得更好.
难道徐宥也是个JR啊?也上虎扑?
看你这篇文章发现你对unix很了解,你是怎么达到这种了解程度的啊?
我认为在系统设计上,如果一个系统无法进化达到需求,就会有另一个系统来取代它,就像现在Android、iOS这样的新一代范式的系统体系,在这个上面做开发已经比原来在Windows、Linux上做开发要快速了很多很多,少了很多很多琐碎和麻烦的事情。
这是一场正在进行的革命,每个事物都在进化、革新,都会会越来越好,但是需要人们有能够分辨不同事物优缺点的能力,选择合适的工具完成合适的事情,不要因为这个工具不行就开骂,或许这个工具本身就不是为这个目的设计的,有着时间还不如去创造一个满足自己需求的系统。
有句话真的很应验“想做的人从来都不说,天天在说在抱怨的人只是再说从来都不去做”。爱因斯坦说的成功之路A=X+Y+Z中的Z“闭上嘴,去干活“。
我觉得王垠这篇烂文最大的价值就是引来了徐宥博客的更新,哈哈
没读王的文章,但从楼主的引用看,王对系统的理解比较肤浅,完全不值得批驳。从系统程序员角度,Win的API设计足以让人深恶痛绝。以我现在支持跨平台的针对可执行程序行为分析的研究经历看,Ubuntu也是比较讨厌的Linux版本。类UNIX的用户权限设计太过简单,因此有ACL的出现。至于FS,虽然FFS是个笑话,但之后的LFS,以及NFS,AFS等分布式文件系统都反映了OS的进化。真正深究,可以重新写一篇博客啦。
评论很精彩啊。
我相信王垠是个很牛逼的人,面对事物的缺点也应该坦诚,我想每一个系统都有很多的不足。但是你总是在批评一切,你这么牛叉,为什么就不整出一个更好的系统来呢,我就纳闷
本文写的有理有据,不错!王垠那篇实在不敢苟同。
世界上有两种编程语言,一种是老被骂的,另一种是没有人用的。
呵呵,其实我比较喜欢这句。
linux老被骂,windows也老被骂,因为大家都有在用。
老子说过:“大白若辱,大方无隅,大器晚成,大音希声,大象无形”。
有缺陷的东西才是完美的!因为它了解自己的缺陷!
我记得他之前有篇文章是专门详细解释UNIX的不足的,攻击重点放在配置管理方面,不过后来他删掉了所有的文章。
很仔细的看完了您的这篇文章,颇有共鸣,真想一口气读完您博客的所有文章,但是由于目前水平的局限,一口气读完只能是囫囵吞枣。非常需要一个功能,就是:在以后的google搜索结果中,优先显示您博客的搜索结果。您是google工程师,告诉我一个简单的方法好吗
这篇文章没什么好批评的,他实际上在说:
无脑小白们,windows很好,别来用linux了。
不信你看这段话:
当然我不是在这里打击 Linux 和 Mac 而鼓吹 Windows。这些系统的纷争基本上已经不关我什么事。我只是想告诉新人们,去除头脑里的宗教,偏激,仇恨和鄙视。每一次仇恨一个东西,你就失去了向它学习的机会。
这篇文章有个明显的错误。
“我们都知道,微软 NT 内核和 Widnows UI 系统是绑定在一起的。”
如果看过《观止-微软创建NT和未来的夺命狂奔》这本书就知道,NT内核和Windows UI是完全分离的。Dave Cutler从一开始就将NT设计成server-client架构的。UI部分一直到到后期才加入进去,之前内部的daily build和开发人员都用的不带窗口的NT。
哇,我还真不知道。我所知的是 Windows NT 架构中,窗口管理和事件处理是在内核态完成的。
Vista以后都是用户态的了。经常显卡驱动蹦了自动重启桌面。
打脸赞,看到这就觉得有点逗,下来看评论果然有人提出来了
“微软 NT 内核和 Widnows UI 系统是绑定在一起的”,纯粹胡说,Windows Server 2008 Server Core是什么?
这个你说错了,Server Core只是受限的桌面环境。简单来说就是用cmd替换explorer,以及去掉了其他GUI组件。至于登录还是图形界面,也可以通过从其他远程桌面登录到Server Core,还可以调出Windows 任务计划,记事本也是存在。
这个你说错了,Server Core只是受限的桌面环境。简单来说就是用cmd替换explorer,以及去掉了其他GUI组件。至于登录还是图形界面,也可以通过从其他电脑远程桌面登录到Server Core,还可以调出Windows 任务管理器,记事本也是存在的
说个题外话,《番外篇》什么时候出书啊,今年有希望吗?
惭愧啊,码字没激情,像挤牙膏一样。遥遥无期。
永远没有不糟糕的设计
王垠的文章就算是矫枉过正,但是还算客观~
你的文章抓人家的字句,看起来没错,但其实跟王垠说的不完全是一个东西~
我到觉得王垠的说法都缺乏论证,博主指出王垠逻辑上的漏洞无可厚非
很是共鸣。
Plan 9怎麽也算到UNIX裏去了?還有那篇文章主要是批對UNIX的盲目崇拜,果粉、Linux粉的行爲。
Plan 9 就是作为 UNIX 的继承人而开发的。
http://doc.cat-v.org/plan_9/blue_gene/
plan 9 ,萌吃奶兔子一只
plan9官網說plan9不是UNIX
http://www.plan9.bell-labs.com/wiki/plan9/plan_9_wiki/
(第2段)
没人说Plan 9是UNIX。连UNIX之父Ken Thompson都参与其中啦。
http://www.openu.ac.il/home/wiseman/sds/plan9.pdf
博客终于更新了,期待博主继续好文
好文啊.王垠的文章说了一通等于什么都没说.
王垠 人家是故意写的是钓鱼贴,难道大家都没看出来?
虽然不明觉厉,不过还是要对这句话吐一下槽:
“这一定是世界上最诡异的宗教,里面的教徒还天天打架。”
但凡上点规模的宗教,里面的教徒都是天天打架的 :)
您这写得还是太客气太委婉了点儿……
作为另一个UNIX痛恨者,我来借个地儿毫不客气地喷两句。
首先,这篇文章很符合王垠批判事物的一贯逻辑:我用过一个工具/我读过它的全部文档 => 我对其缺陷已经了若指掌 => 它的设计不够简单/很糟糕 => 你们这些“盲目崇拜偶像”的才是不了解它的小白/是工具的奴隶。
以前见他批Python的态度就是,觉得自己做代码静态分析不顺手,大概觉得这语言的缩进语义表示处理起来忒jb麻烦了,不如Scheme那样的弄起来简洁(好吧这是我妄自揣测的,因为他自己根本就没给出个像样的理由),以此得出结论:我深知Python的这些设计上的缺陷,它是个很糟糕的语言。然后把自己做静态分析的那部分代码“给Google创造了难以估量的价值”最终还“贡献给了Jython社区”来作为“我对这门语言拥有足够发言权”“说Python好的其实都没有我懂Python”的例证。(这个梗貌似已经被他说烂了,搞得现在有不少人以为Google的那个Grok真是他一个人做出来的一样)
他从根本上忽略了,一个实际的软件系统设计基本上都经历了长时间的演化,冗余的复杂度(或者说设计上的大坑)不是一天就能消灭的。特定的系统当然也有特定的应用局限,所谓工具被设计出来,自然有其适合的用途。对于某些领域来说,设计上的复杂度几乎是无法避免的。比如,一个安全性能要求极高的网络系统,或者一个高度可定制化的排版系统,云云。
说Unix的文本管道机制会带来问题,说Unix对普通用户的界面不够友好,这些我都赞同。但是把“宗教”“暴君”的帽子扣在Unix的支持者头上这件事实在是欠妥,于是几十年来那么多选择了Unix做服务器的大公司都是被某“宗教”洗脑的咯?(更何况我觉得把操作系统、shell、X Window、Unity这几件东西混杂在一起来作为批判Unix的论点,本身就是一种缺乏水准的表现)
王垠断言“微软才是真正在乎程序开发工具的公司”,我不知道如果他深入地了解过MFC、VB、Silverlight、.NET这些框架,是否还会做出同样的判断。当然了,我不认为他真正了解这些,因为微软的东西变化的太快,而且基本不开源。拿一个商业公司为你精心包装好让你舒服使用、不会让你轻易hack的封闭平台来和一个开放的社区经历数十年通力协作的结晶、给了用户最大程度自主控制权的操作系统做比较,指责后者“为什么你要暴露那么多底层细节”“为什么你对用户那么不友好”,这是认知能力的一种倒退。
说到Python,那就是让人能够快速上手、并且拿来干活的一门胶水语言,绝对不是给程序语言专家用来研究类型系统理论用的,说它没有真正“吸收函数式编程的精华”所以“不适合初学者学习”(王垠原语),这就是不顾实际应用场景的胡搅蛮缠。
说到TeX,那就是排版上做各种精细活的大家伙,确实也是从设计上“可以高度定制”的系统,要求它简单,不可能。你要为了简单性牺牲一部分控制度,避开那些不友好的、干扰语义表达的冗余部分,完全有那么多的轻量级文本标记语言(比如Markdown)+pandoc可供选择。不过,一个搞IT的人如果要在一个连代码等宽高亮都做不到的博客平台上发文鼓吹啥“简单易用的就是好的设计”“菜鸟们应该去学习好的设计”,我觉得实在是(至少对我而言)没有什么说服力。
说TeX没有做到更高级别的抽象,借此为由批评它的作者(Knuth)“不懂程序语言设计的基本原则”“对程序语言理论缺乏深入的理解”,这也是在无理取闹。TeX确实是图灵完全的没错,可是它本来就不是拿来给你做软件开发用的。硬要拿类型系统那套程序语言中的抽象理论往一个更接近底层控制的排版系统上套,说它以一个程序设计语言的标准来看“毫无章法”,有意义么?
如果没记错的话,王垠批TAOCP也是基于相同的理由,他觉得Knuth太关注底层硬件太重视汇编、不懂计算的本质,却丝毫罔顾TAOCP是部讲“真实的计算机怎样实现算法”而不是“Church/Turing的理论怎样把一切算法都完备地抽象成计算模型”的书这样一个事实。
(我不知道王垠自己有没有意识到这一点,当你跟他谈论某件东西“好”的时候,他上来就会给你扣一个“你认为它好是因为你不理解它的本质只是盲从其实我什么都比你懂”的帽子。毫无逻辑的做法。)
一边抱怨前人造的轮子太糟糕,一边批评那些“盲目崇拜工具”的人都是菜鸟,自己却不愿意造出一套更好的轮子来造福我们这些菜鸟。一边教人家要“去除头脑里的宗教,偏激,仇恨和鄙视”,一边又简简单单地拿一句“不懂得计算本质”就能轻易蔑视掉Knuth、Dennis Ritchie和Guido van Rossum们为今天的计算机行业贡献的基础成果。这种行为我不知道该如何评价。
本来不想写这么多,只是看到王垠总是在不遗余力地贬Knuth,好像还真有人拿他的话当一回事,忍不住又要多码几行字……(楼主见谅)
单纯地为了喷而喷就没意思了。事实上,如果王垠自己能做出来一套更好的操作系统(或者至少是排版系统),取代现有的这些车轮,我觉得他现在的这些言论才有谈论的价值。
感觉王垠这哥们在清华这些年里人格有点扭曲,对事物的观点完全是自利归因,错误的运用类比,片面选择证据,不能举出有效证据和数据
说到王垠喷Knuth,记得王垠大学那会儿也是个Knuth的脑残粉,又是说自己怎么抱着Tex手册看,又是说自己有Knuth亲笔签名(还是亲自送给他)的T恤。
人总会变,我还是感谢王垠以前写的东西,至于那些片面的东西,我们可以反驳,那样会有精彩的火花出现;如果完全没有价值,就忽略吧。时间会慢慢打磨一切,然后现出本质
从接触 lInux 以来,我就开始看王垠的文章。关于王垠今天对 Unix 系统的痛恨,我以为这不是一个技术层面的问题,而关乎王垠的品格与气质。我猜想王垠不会长时间对一个东西推崇备至,除非这个东西一直没有进入人们的视野。像他在提到了 Multics ,我想如果某天流行一股 Multics 热,王垠也会看到 Multics 诸多不足的。
Multics有可能热么?读过那段历史的人都不可能有这种幻想。
这是谁火就灭谁的节奏吗?
精彩.. 不过人家可是写了三篇文章的啊, 这里只答了一篇的吧
win的那種過度的組件之間的耦合讓人在做開發的時候痛苦的要死
有理有据,好文
有理有据,主要是解释为什么。王垠谈到的Lisp Machine ,还是值得与shell比对和思考的,因此我目前在看power shell的内容。
也许因为unix从来就不是一个以追求统一形式美为最高目标,而是兼顾了实用的系统,于是难免quick and dirty。就像现实生活也是如此的。
powershell那个冷启动要20秒的东西真心不知道有啥用。不过gnome下的bash也够慢的。
这个确实,cmd的启动比powershell快
抨击LaTeX复杂是从程序语言的角度来看的.
的确LaTeX可以击败所有其他的排版软件, 但这并不说明它的有很好的语言设计. 写LaTeX Parser简直是噩梦.
“只有成为了 UNIX 痛恨者,你才是一个真正的 UNIX 使用者。”
为啥非要使用一个你痛恨的东西……ROFL
爱之深责之切
许久都没有更新了。
看来王垠的文章还引起了波澜