Mac OS X不是unix

本文地址:http://blog.hoppinglife.com/?p=19

警告:这是一篇高度个人化的文章,不适者请跳过。

这篇文章不是要探讨OS X的可用性或者设计优劣:尽管那个题目很热闹。我要讲的话是:『Mac OS X不是unix』。

从字面角度上,这句话不太正确:OS X通过了SUSv3,这使得它成为地球上不超过十个可以自称自己是『UNIX』的操作系统之一。其他的成员包括AIX, HP-UX, Solaris等等。

但是Linux和BSD都不是这个家族的成员,而它们加起来占了Unix服务器的绝大部分,所以让我略加修改APUE的名言:

On the other hand, if it does not look like a duck, does not walk like a duck, and does not quack like a duck, then it’s probably not a duck.

所以我们来看看Mac OS X是不是unix:Again,这无关某个动物或者鸭子是好还是坏,我只想说明某只特定的动物是不是鸭子。

一 内核

『Mac的底层是Darwin,Darwin是BSD』大概是最常听到的关于Mac和BSD的关系的描述。但事实上不是这回事。

事实上这个内核的核心还是mach:内存管理、进程管理都由mach负责,而mach不管从历史还是特征上都更像NT内核。部分Darwin kernel的源代码来自4.4BSD – 和Berkeley有关的最后一个版本。但是这部分代码运行在Mach的上层,几乎只负责提供SUS/POSIX子系统的API,而且被大规模的修改过. 除此以外,Darwin kernel拥有自己的Driver API和I/O Kit,(面向对象的),从这个角度上来说,与其说Darwin kernel像unix, 还不如说它像VMS/Windows。

二 API

让我从一个问题开始:『装着cygwin的Windows』是unix吗?

OS X的感觉与这个类似:你确实可以使用POSIX的API,但大多数OS X的GUI会基于闭源的cocoa,会使用特有的thread API,会使用launching API来运行daemon,会使用GCD来做消息处理,会使用不一样的动态链接库。

简而言之,除了使用了Posix的API,OS X和BSD/Linux并不share太多的共同点。你可能会使用一些POSIX的API,但你几乎同样必须使用Apple专有的API。

与其说你在开发unix软件,不如说你在开发OS X软件。

三 Look’n’Feel

OK,回到使用上,Mac OS X到底有多unix-y呢?

事实上,Apple在努力隐藏这个系统的unix部分:Apple有自己的路径规则和文件系统。用户使用Applescript来做自动化。时至今日,安装软件很多时候还是运行一个installer或者把文件copy到Application folder。App Store里找不到wget或者macvim,你可以清晰的区分出两类程序——一类装在/usr下面,一类装在/Applications里。

你的用户感受是『Mac OS』,不是『unix』。与其说Mac OS X像unix,不如说它更像Mac OS 9。

四 哲学

“Keep it simple and stupid”

“Do not reinvent the wheel”

“Write prog1rams that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.”

unix的最核心的价值之一,在于它提供的模式:充分利用已有的成果,给最终用户以选择的机会,系统高度透明和模块化,高度可配置。

Mac OS X不是这样的一个系统。Apple搭建了一个自有的平台,通过限制功能和封闭来达到稳定性,通过复杂的封装来达到可用性。macports和homebrew能够很好的反映这一点:你要么选择冗余(重新安装所有文件),要么选择匮乏(被系统工具的版本限制).

五 

如果从内核,API,操作方式到哲学,Mac OS X都更像Mac OS 9而非unix的话,为什么我们还要叫它unix呢?

我对Mac OS X没有什么意见——出于个人的偏爱,我不会用它,但我相信它是一个出色的系统。

但我不喜欢Apple用Unix当商标来推广Mac OS X,unix不仅仅是一个『好用的shell』而已,它的价值,也在于『类似的系统路径和配置方式』,更重要的,在于『高度透明和可配置』,在于『充分利用既有的社区成果而非重新发明轮子』。对这些哲学的坚持,是unix社区成功的要素之一。

但OS X是一个和unix社区从理念到实践都相差甚远的OS。它有着特有的操作方式和配置规则,有着比Windows还厚的封装,重新发明了比Ubuntu还多的轮子。

它只是碰巧能兼容一部分BSD程序而已。认为『Mac OS X有Unix认证所以是unix』和认为『Windows + cygwin是POSIX兼容的所以是unix』没有什么本质不同。就算猩猩和老鼠99%的基因相同,猩猩也不是老鼠。

你可以喜欢unix,也可以讨厌它,但是希望你喜欢或讨厌unix的原因,不是因为你喜欢或者讨厌Mac OS X。

Several Thoughts

本文地址:http://blog.hoppinglife.com/?p=13

最近有好几个小朋友跑来问我有关学习啊前途啊推荐导师方向啊的问题,我猜我的答案不是很让你们满意。正好,今天又看到一篇『ACM大牛太厉害怎么办』式的文章,有感而发,写一点我此刻的感触。个人意见,水平有限,仅供参考。

一 轨迹和距离

要讲的,大概就是乔布斯『dot』那个演讲的意思。你从来不知道自己的现在会以怎么样的方式影响未来。恩,这个话题很俗,但是在此时此刻,我希望我更早一些懂得这个道理。

我在大学里有几个领域不愿意碰:不喜欢数学,不喜欢Machine Learning,不喜欢并行编程。

结果是代数和概率没学好,Boss的一个很有趣的题目不敢接。前不久项目要用到基本的机器学习和MPI,翻出教材重看了好几天;课上讲到CUDA自己浅尝辄止,现在天天抱着Nvidia的资料啃。

专业课程的设置终究有它的原因,你永远都不知道,你不喜欢的那件事,在什么时候会挡住你的路。如果运气不好,说不定连是什么挡住了你的路都不知道。

二 游戏与现实

有一个很有名的段子,医学院的学生找老师去划重点,老师说,你打算跟将来的患者说,不好意思,这个病不是重点?

课堂、考试和大作业,终究是一种『游戏』。它不能太难以至于大多数人阵亡,它不能耗时太长以至于很多人饿死,它也不能太无趣,以至于大家觉得它很无聊。

但是教材那么厚,还有那么多参考书终究是有原因的,实践中的问题不会顾及你是否曾经对这个问题详加练习;不等式的难度是否超过了你算法课的习题;或者问题的规模是不是超出了你习惯的问题。

更何况,太多的问题书本上没有答案。C++书上,不太会讲到实践中tuple奇奇怪怪的用法或者是decay_copy对线程安全的意义,也不会讲到什么样的代码能内联什么样的代码不会被优化;算法课上,也不太会讨论B+树的节点插入的时候可以rebalance或者实践中B树的性能到底跟什么有关。

『考试内容』和『书本知识』天差地别,『书本内容』和『工程实践』又隔着鸿沟,想真正掌握一门学科,课堂讲义和教科书远远不够。

三 天赋与先发优势

最常听到的问题,是『成绩还行,编码不好怎么办』。

我就笑,因为我觉得,如果真的用心去『学』了相关的课而不是仅仅应付考试,编码应该有所提高才对:c++大作业让写链表的时候,有没有去翻翻std::list的实现?OS课上让写shell,有没有去翻翻类似的代码?做算法大作业的时候,有没有去查查工程实践中的代码是什么样的?做编译大作业的时候,有没有让自己的code尽量clean?学软工的时候,有没有仔细看看设计模式?

或许有人天生擅长coding,或许有人通过ACM的锻炼coding提高;但这绝非唯一的提高之途。作为一个工程师,对『先例』的熟悉和『自身经验』的累积,是远比天赋更宝贵的财富。

顺便说一句,在我ACM水平最高的时候,代码是变量乱飞作用域稀里糊涂的。很多ACMer编码水平高,是因为他们对待代码(和其他知识)比我认真。

四 结果与目的

别人看你的学生生涯,会有很多『评价因子』:成绩如何,奖学金和荣誉,科研,课外活动。加权平均一下,给你的学生生涯打个分数。

所以挺多小朋友从进大学开始,就开始奔着这个方向去努力:GPA,GT,进实验室。而当问起『你的兴趣是什么?』『你擅长什么?』的时候,往往很茫然:『其实我也没有什么特别的兴趣啦』。

但这些都是『结果』,不是『原因』。它们终究是衡量一个人的专业水平和综合素养的工具,而后者,才是大学应该给予你的东西。学数学也好,学编程也好,都是为了,当有一天用这些创造什么的机会摆在面前的时候,你可以把那份工作干得更漂亮,让自己更满意,幸运的话,惠及更多的人。

大学四年的意义,不仅仅是『换个敲门砖』,你可以做的多得多:认真寻找到一个自己擅长和感兴趣的领域;把基础知识认认真真学扎实;培养良好严谨的工程习惯;积累一些初步的经验。做好这些,那些你所在意的『敲门砖』,自然会水到渠成。

相信我,你今后不会有太多的机会做这些事的。