我最近拜读了“清华牛仔”王垠的两篇文章,一篇是他的成名作的成名作《完全用Linux工作》,另一篇则是他的《谈 Linux,Windows 和 Mac》。我读毕后的感想是:“‘清华牛仔’在写这两篇文章的时候是不是溜大了?”
《完全用Linux工作》在网上流传的很广。这篇文章成于 2004 年,应该是他大学期间写的,基本上这篇文章的中心思想就是:Linux 很优秀,Unix 哲学很优秀,应该放弃设计不佳且带有铜臭的 Windows。里面的观点很“激进”,因此推崇此文的人不少,批评此文的人也不少。这篇文章在知乎上甚至有个相关问题叫“重读王垠的成名作《完全用Linux工作》, 你有哪些新的启发?”。
王垠后来自己又来了个 180 度的大转弯,在自己博客上写了一篇《谈 Linux,Windows 和 Mac》,批评 Unix 哲学,批评曾经的自己,开始吹捧微软的好。
总的说来,两篇文章都有着相似的问题:对技术问题半桶水的吹捧与批评、对他人与各种软件傲慢的评价、无视时间与技术条件。下面我就来盘点其中的一部分。
半桶水
很多东西都是牛仔没有搞清楚原理就开始批评或者赞扬的。这些是纯粹的事实错误,我把这些点摘出来是为了辟谣。
内存清理
《完全用Linux工作》: 我在 Windows 下做过的一件最傻的事情莫过于“释放内存”了。有一天我看到一个 Windows 程序说:“这个程序可以帮你把大量内存释放出来给一个很大的程序用。”我试了一下,居然一下把我的 64M 内存释放出来 48M!我高兴极了。现在想一想,那是多么傻的事情,那么多的内存留着干什么?不用白不用啊!一个操作系统,居然还需要别人写的程序来释放内存,那是什么样的操作系统?
“释放内存”那玩意如果没有杀进程的话,那本质上是让操作系统同步磁盘内容,清理掉内存里面的磁盘缓存。64M 清理出来 48M 正是因为那些玩意是磁盘缓存,在保证数据写入磁盘的情况下,可以随便清理掉。在 Linux 下 sync; echo 3 > /proc/sys/vm/drop_caches
有相同的效果。
做释放内存的不是小程序,而是Windows。牛仔自己被一个小程序骗到,反而去批评 Windows。这和微软有什么关系,你自己要傻不拉机的让操作系统去清理内存,微软还能拦着你?拦着你的话他们就该改名 Apple 了。
《完全用Linux工作》: 在 Linux 下用 free 命令,你会发现你的内存几乎每时每刻都快要被用完。那是因为 Linux 把大部分内存用来作为磁盘缓冲了。Linux 有比 Windows 先进的磁盘缓冲技术。
Linux 磁盘预读缓存确实比 Windows 激进。这叫取舍,不叫先进。
磁盘整理
《完全用Linux工作》: Linux機器根本不用整理硬盤,這就是為什麼沒有看到過Linux用戶整理硬盤。Linux的文件系統是比Windows的FAT, FAT32, NTFS高明得多的文件系統,它們不但可以對文件設置權限,實施完全的保護,而且可以“越用越整齊”,“越用碎片越少”!你應該把文件大部分放在Linux的分區,而不是Windows分區,因為它比Windows分區可靠得多。
牛仔传谣说 Linux 不用磁盘整理,实际上fsck
命令可以检测磁盘碎片率,e2fsprogs
包含了清理 EXT 分区磁盘碎片的工具。因为一些技术上的选择,Linux 文件系统确实会产生更少的碎片,但是“越用越整齊”,“越用碎片越少”的不是 Linux 的文件系统,那是神仙的文件系统。
说到权限,2004 年的 NTFS 可以设置权限。牛仔在写文章的时候就没有在 Windows 下右键点击文件打开属性页面看过一眼吗?不愧是清华出来的。
Linux / Unix 程序复制粘贴不正常
《谈 Linux,Windows 和 Mac》: 相反,由于受到“Unix 哲学”的误导,Unix 的程序间交换数据一直以来都是用字符串,而且格式得不到统一,以至于很多程序连拷贝粘贴都没法正确进行。
其实剪贴板是有格式的。牛仔这是没用过 LibreOffice 还是没有用过桌面环境?看来对于牛仔而言,在喷别人之前用一下搜索引擎或者翻翻自己脑子里的记忆确认实际说对了没很难。
牛仔当然可以批评 Xorg 的 ICCCM 标准有问题,但说一个东西坏和说一个东西没有是两回事。
傲慢
这可不是批评了,因为清华牛仔当然有资格傲慢。毕竟清华嘛。
GNU/Linux
《完全用Linux工作》: 由于GNU/Linux這個詞太長,下面如果沒有特別指明,“Linux”就是指“GNU/Linux”。
牛仔用 GNU/Linux 写文章,却没一句话解释 Linux 与 GNU 到底是个啥。上面就是他唯一提到 GNU 与 Linux 关系的一段。写了这么长长的文章(放在今天叫“万字小作文”),却没解释他要推荐的到底是什么。看在理查德·马修·斯托曼的份上,我不想用 GNU/Linux Copypasta 来批评人,但我觉得牛仔至少得尊重他人劳动,提一嘴别人做的东西是什么吧。
否定他人需求
《完全用Linux工作》: Linux的用戶們都是關心解決世界的關鍵問題的份子,他們哪裡有時間用自己的機器來玩遊戲啊?他們每天用Linux高效的做完自己的工作就到陽光下享受自然去了。
清华牛仔不愧是牛仔,牛仔在 2004 年写的文章就把我一个 2022 年的 Linux 用户踢出 Linux 用户籍。我就是那个用 Linux 打游戏还不享受自然的人。
圖形界面需要成百上千的菜單
《完全用Linux工作》: 因為圖形界面配置方式的能力是極其有限的,而配置文件和程序語言的表達能力卻是無限的。用圖形界面配置這些程序的話,如果你想達到配置文件的效果,你需要成百上千的菜單,checkbox, radio button, … 到時候你根本沒辦法找到你需要修改的地方了!
VSCode 对于配置文件既可以写 JSON,也可以用 GUI 来修改。当然 2004 年确实没有 VSCode,但结合方便的图形界面与高级设置并不是 VSCode 的独创。Firefox 的 about:config
页面给用户修改高级设置,同时也有普通的图形化设置。另外about:config
可以追溯到 Netscape 4.x 时代,这可不是新鲜玩意。牛仔脑袋里想不到能用的设计,不意味这世界上没有能用的设计。
Unix 的配置
《谈 Linux,Windows 和 Mac》: Windows 的“配置”,全都记录在一个中央数据库(注册表)里面,这样程序的配置得到大大的简化。虽然在 Win95 的年代,注册表貌似老是惹麻烦,但现在基本上没有什么问题了。相反,Unix 的配置,全都记录在各种稀奇古怪的配置文件里面,分布在系统的各个地方。你搞不清楚哪个配置文件记录了你想要的信息。每个配置文件连语法都不一样!
显然牛仔没用过注册表编辑器,想想一个普通用户看到注册表里面的那一堆 UUID 的时候该多么绝望啊。至于 Unix 的配置,牛仔这是连 /etc
、~/.config
都不认识了?如果我认识牛仔,我一定会建议他去看个眼科或者脑科,因为这个时候他显然失去了阅读英文的能力,而这种情况在清华高才生中应该是非常罕见的,需要医学专家加以记录和研究。
我不是说注册表不好,但牛仔的批评显然是没事找事。Unix 的文件路径不是天书,配置文件也没有到处都是。
IDE
《完全用Linux工作》: 高明的UNIX程序員不用IDE,IDE從來就是給初級Windows程序員用的。
而在UNIX下就不一樣了。你可以用你最喜歡的VIM編輯程序,你在VIM裡可以調用GNU make,make可以調用gcc, ld, … make的出錯信息可以被VIM捕獲,VIM能幫你在源程序裡定位。你如果喜歡icc, 你可以讓make用icc而不是gcc。你如果覺得gdb跟蹤變量時比較麻煩,你可以用ddd來顯示各種數據結構之間的關系。你還可以在Emacs裡調用gdb,那樣就可以同步顯示源代碼了。
牛仔首先说不要 IDE,但是自己却用 VIM 或 EMACS 做到了调试、捕获出错信息、定位源程序位置、分析数据结构…… 这不就是 IDE 嘛?
我想起一个笑话:有人说杀死那个让别人做电车难题的人就可以解决电车难题,旁边有人提醒到:“你刚刚提出了一个杀死一个人,而其他人就能获救的东西,听起来有点耳熟啊?”
牛仔这类 Vim / Emacs 用户就爱折腾,把编辑器折腾成 IDE,然后说 IDE 不好。了解程序后面的原理必然是好的,但这不代表开发者有必要去拒绝方便的工具。
后来牛仔幡然悔悟,爱上微软:
《谈 Linux,Windows 和 Mac》: Windows 的技术从 OLE,COM,发展到 .NET,再加上 Visual Studio 这样高效的编程工具,这些带来了程序员和用户效率的大幅度提高,避免了 Unix 和 C 语言的很多不必存在的问题。
他不怪 IDE 了,开始怪 C 语言有“不必存在的问题”了。真有你的,牛仔!可惜的是他没有说 C 语言到底有什么问题。
OLE
《谈 Linux,Windows 和 Mac》: Windows 程序从很早的时候就能比较方便的交换数据。比如,OLE 让你可以把 Excel 表格嵌入到 Word 文档里面。
我不觉得有人会真的觉得在 Word 里面塞 OLE 是个好主意。牛仔估计不经常写文档,因为 OLE 对象可能离了那台电脑就歇菜。读者可以试试用 Office Online、Google Docs 或者 Office for Mac 试试看,或者混用 WPS 和 MS Office,而且手机上也没法看。
那篇文章是 2014 年的,那个时候已经有 Office Online、Google Docs 和手机了。也许 OLE 是个好技术,但是我不清楚牛仔为什么会用 “把 Excel 表格嵌入到 Word 文档” 里面来举例,这个例子完全是反面例子。
除非他认为“Office Online、Google Docs 和手机”都无关紧要,一如他年轻的时候给用 Unix 的人发用 MFC 写的源代码,傲慢不改。
无视时间与条件
“清华牛仔”王垠有些时候会冒出来超时空批评,完全无视软件或原则适用的条件。
字符串,不行!
《谈 Linux,Windows 和 Mac》: Unix 的程序间交换数据一直以来都是用字符串.
在批评字符串之前,我觉得牛仔应该了解一些新技术,比如 JSON 和 XML。Unix 的字符串传统是 1971 年 Thompson shell 出世时就有了,对于简单的需求,这种方式真的没什么毛病。
“人笨怪刀钝”
《谈 Linux,Windows 和 Mac》: 可是 Unix 其实是一个暴君,它不允许你批评它的错误。它利用其它程序员的舆论压力,让每一个系统设计上的错误,都被说成是用户自己的失误。你不敢说一个工具设计有毛病,因为如果别人听到了,就会以为你自己不够聪明,说你“人笨怪刀钝”。
牛仔说 Unix 爱好者批评别人“人笨怪刀钝”,但是有没有想过有些需求不适合用这把刀?
就拿字符串传递举例:Unix 用管道传字符串,而你想要复杂且可靠的可以自己写 JSON + 套接字,或者用微软的 PowerShell 嘛。我可不相信 Windows 程序都是用 OLE,所以为什么非得有个“统一数据交换标准”之类的玩意呢?
而且“让每一个系统设计上的错误,都被说成是用户自己的失误”这段看起来像是牛仔在照镜子。他在十年前批评 Windows 用户不适应 Unix 的时候就是这幅样子。
混杂 Linux 与 Unix
《谈 Linux,Windows 和 Mac》: 我不想在这里细说 Unix 的缺点,在它出现的早期,已经有人写了一本书,名叫 Unix Hater’s Handbook,里面专门有一章叫做 The X-Windows Disaster。它分析后指出,X Window 貌似高明的 client-server 设计,其实并不像说的那么好。
这本书汇集了 Unix 出现的年代,很多人对它的咒骂。有趣的是,这本书有一个“反序言”,是 Unix 的创造者之一 Dennis Ritchie 写的。我曾经以为这些骂 Unix 的人都是一些菜鸟。他们肯定是智商太低,或者被 Windows 洗脑了,不能理解 Unix 的高明设计才在那里骂街。
牛仔引用《UNIX 痛恨者手册》为自己批评 Linux 辩护。《UNIX 痛恨者手册》这本书其实非常好,一方面指出了 Unix 的问题,一方面也告诉管理员什么不该干。比如里面提到:
管道能胜任一些简单任务 ,比如文本流传递,但无法用来构建健壮的软件。
我前面是不是说过类似的话来着?但是直接引用这本书有两个问题:
其一,这本书是 1990 年代出版的。因为时间,一些问题已经不再是问题。比如内存大小的增长让批评 XOrg 占用内存高的话不再有效。Mount 的安全问题以 nosuid 选项的广泛使用而结束。新闻组直接消失在时间长河中。
其次,他说的是 Unix 不是 Linux。Unix 和 Linux 除了长相差不多之外这两血缘关系都没有,指着 Unix 说 Linux 的不好就像指着幕府的日本说现在的越南不好——有什么关系?从外国人的角度,他们文字看上去确实蛮像的,但这并不能作为瞎比较和乱批评的理由。
牛仔引用这本书基本上就是拾人牙慧,没什么用。
《谈 Linux,Windows 和 Mac》: 可是 Unix 是谁制造的呢?是 AT&T。微软和 AT&T 哪个更邪恶呢?我不知道。但是你应该了解一下 Unix 的历史。
牛仔你说的对,但是 Linux 是 Linus 带头开发的,和 AT&T 有半毛钱的关系么?里面的软件不少是 GNU 开发的,和 AT&T 有半毛钱的关系么?牛仔没法挑刺 Linux 的自由,就只好顾左右而言他了。
一点点总结
就算中间隔了十年,王垠还是那个王垠,他的文章观点变了,核心没变。“清华牛仔”王垠的这两篇文章基本上都在说一件事,只不过对象换位了而已:“筷子不能舀汤,所以筷子不行,勺子行。”
牛仔自己在另一篇文章《什么是“对用户友好”》说:有美国同学在他抱怨 “TeX” 不友好的时候说他是菜鸟,我在这里支持那个美国同学。因为 TeX 本来就不是用来“友好”,牛仔属于进了冰淇淋店要烧烤吃,还觉得自己是冰淇淋大师,别人不骂牛仔神经病都算友好的啦。
牛仔写文章的时候就像溜大了,用一种无可置疑的语气陈述自己的偏激观点,也不在乎自己说的到底对还是不对。
我用“皈依者狂热”来形容牛仔对 Linux 的态度。这个词本来描述了对新信仰的强烈推崇,并与旧信仰坚决划清界限的一种信徒现象。他一直展现的形象是一个技术的信仰者。而只有信仰才能用无可置疑的语气陈述。
知乎上有人评论的好:“世界上有两种有才华的人,一种热爱自己的事业,愿意为之付出一切;另一种热爱自己的才华,任何的事业只是展示才华的舞台。王同学显然是后一种人。”
不过,王垠的文章也有中肯的部分:
我只是想告诉新人们,去除头脑里的宗教,偏激,仇恨和鄙视。每次仇恨一个东西,你就失去了向它学习的机会。
所以,我的建议是,在阅读王垠的文章时,带上自己的判断力。
写在最后
《完全用Linux工作》在网上流传的很广。来源也有好几个,有些版本的内容不尽相同,我写文本的时候采用了多个版本,因此引文有简繁夹杂的情况。
为了避免一些误解,我得做一些申明:
首先,我不认识王垠,我的生活也和他没有任何交集。他是先读了川大,再读了清华,而我,在成都和北京呆过的时间加起来可能连一个星期都没有。
其次,我写这篇文章并不是为了批评他——他是编程界的大鳄,不需要我的批评。我只是指出他文章中的错漏,毕竟这文章传的太广泛,而我觉得指出问题是社群的义务——坐视“Linux機器根本不用整理硬盤”这种胡话被人吹捧不是我的风格。
最后,我希望读者能感受到我一直以来强调的观点:用一个操作系统,就要理解和接受他的哲学与定位。如果不理解或者不接受,那就别用。否则只会写出让人哭笑不得的文字。
也感谢读者读到这里,我用罗老师的名言来结尾:“他在生命的每个阶段,都说了他相信的东西,那你要他怎么样,什么都没做错”。