delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

10 Oct 2004

为什么我反对从头编写操作系统的个人努力(1)

此文章版权归 李鑫 所有。版权声明如下:

版权所有 © 2004 李鑫,保留所有权利。转载必须完整地复制这些文字,不允许修改,并附上其原始连接:


我在许多场合公开地发表过类似的意见,有时言辞比较激烈,有时只是委婉地反对。

这种意见,同意也好,不同意也好,我希望其他人能够把它当作一种意见,而不是某种强加于人的意志。我只是说出自己的看法,并不要求任何人接受——如果他们认为这是对的,愿意接受,我当然很高兴;但如果他们觉得我说的有道理而不愿意接受,那是他们的问题;如果他们觉得我说的没道理,我很希望看到反驳的意见。我始终相信,真理越辩越明。

其实,最关键的问题就在于,我们没有必要重新发明轮子。在阐述这个观点之前,我希望大家能够接受一个密码学界的常识,即安全不能建立在别人不知道的基础上。另一个常识是,安全总是从最薄弱的环节被突破的,不要去尝试解决最强点上的问题——因为那不解决问题。

论点1:别觉得写个操作系统有多难,也别觉得写一个好的操作系统很容易!

写个操作系统很难吗?当然不是!任何一个学了两年计算机专业本科课程的学生都能够写出操作系统。操作系统是什么呢?它是一个程序,能够管理和调度计算机的软硬件资源。

一个进程调度器,一个内存管理器,加上一组驱动就可以构成一个操作系统。这些东西用C写出来需要多少行代码?不超过两万行。没错,不仅不超过两万行,而且,你需要的汇编基础也很少。怎么从磁盘启动?512字节的代码。你不需要写文件系统——把磁盘当作一块有编址的存储器就足够了。

但这个操作系统能用么?显然不能,你需要可以在上面运行的编译器;有了编译器够了吗?不够,你的内存管理器不够健壮,需要支持虚拟内存来执行更多的任务;你没有文件系统,这意味着没办法按名存取文件;等等。完成最基本的这些功能需要多少代码?至少16万行,在前面那两万行的基础上。

只有一个内核不行吧?你需要实现一些命令行工具。

实现一个可用的操作系统需要多少行代码?

大约50万行左右。我可以告诉你的是,这只是让它跑起来,而不是说没有问题地运行。你可以说你调过5K, 10K, 20K行代码的程序,但是500K行是什么?这是一个系统,调试100行的脚本和调试1000行的小程序不是一个概念,其难度增长超过10倍,同样的,调试10000行代码的程序和调试10000行代码的微型系统也不是简单地增长10倍的问题。

我承认有牛人的存在,但是牛人仍然是人。别忘了,500K行只是入门,在你拿到这个门票的时候,时刻牢记,500K行的系统是没有实用价值的,你只是发明了一个前人已经发明过的轮子而已。

论点2:从成熟的codebase出发,而不是从头写起,除非你有非常好的想法和一大票牛人作你的兄弟和后盾

我希望论点1已经让你放弃了去拿那张门票的想法——如果你仍然想要那张门票,那么我祝福你,但是我相信你拿到那张门票之后决不会冲进门去。

为什么?有了500K行编码经验的人,一定要去想一些更高层次的事情。如果你有了这样的经验而没有开始去想更高层次的东西,抱歉,你只是一个熟练的程序员,你的目光只是局限于一些非常肤浅的表面。

我说过,写500K行代码不是做不到的事情,但是,做这件事情之前,是否应该仔细想想,一定需要这样做吗?是否有更好的方法来更快地达到目标?

如果你不想这个,那么很遗憾,我们没什么好说的,因为您只是一个喜欢蛮干的人,我祝福你成功,但我不认为你真的能成功,即使成功那也是侥幸。

为什么这么说呢?

如果你要成为一个好的作家,用不着重新发明一种语言;如果你要成为一个好的科学家,用不着重新去花上数十年时间去研究为什么苹果会落在地上——人类发展到文明社会积累了如此多的知识,而你与古人的最大区别就是,你可以去学习他们的成果,而不是从头开始。人类的进步源于不断地积累,而不是不断地拓荒。不断地横向拓荒,只是增加了更多只会拓荒的野人,这不是文明,因为动物也会这么做。

会拓荒并不是坏事,但如果你只会拓荒,那就要加把劲了,因为别人从更早的人那里学会了拓荒;而如果所有人都只会拓荒,则毫无疑问是一场灾难,因为你得到了大量的拓荒者,但是拓荒之后作什么呢?没有答案。