关于:程序员要不要了解内核技术?

《大道至简》的一个读者huofei给我mail,提及到这样的问题:

在你与Soul的讨论之中,你写道很多程序员对于OS的内核没有了解,所以水平不能够有提高。我的问题是很多程序员是写非底层程序的,比如java程序员。我以为这些人是不需要多少OS知识的。

你的话会不会误倒别人呢!如果真的需要研究,又要研究些什么呢?这对写上层应用程序的开发人员有什么帮助呢?

这个问题其实一直在被很广泛、很有争议地讨论着。很多人认为只有搞学术的、专业的、科班的程序员会把“懂多少OS知识”作为一项对技术评核的要求。但首先说,我不是搞学术的,也非专业、科班的程序员。然而即便如此,我仍旧希望开发者能了解一些OS方面的底层技术。

我给huofei的mail回复如下:

我和Soul都是Delphi程序员,相对于java,是更接近底层的。但我和Soul都认为自己,以及其它delphi程序员对底层的了解不足够。而java又在语言与OS之间隔了一层,你可以想象它离系统到底有多远。

下面一个问题,是说“了不了解底层,都可以写程序”。其实这个观点是对的。因为仅以“写程序”而言,了不了解底层都可以做的。但是,如果你要理解一些本质的东西,例如“程序为什么要这样写”,那就与底层有关系了。——当然,你也可以说“我不需要了解程序为什么这些写”,就好象说,砌砖的工人只需要按规则砌砖就可以造房子了,至于这个规则本身**"是谁、如何、为什么"**这样定下来的,砌砖的工人并不需要了解。

——这当然可以理解,但问题是,你想永远埋着头砌砖吗?

如果你说“想”,那下面的内容就不用看了。如果你说不想,那我就先告诉你,java阻碍了你去了解“事件背后的真相”。

这些真相由“CPU、存储器、寄存器、外设、二进制编码、汇编语言、指令系统、编译原理、数据结构、算法、OS、进程、线程、事件、异常、文件管理系统、内存管理系统等等”构成。任何一个方面都可能阻碍你对“OS知识”的了解的。

了解这些,对于“写上层应用程序的人”是没有多少直接的帮助的。现在的开发行为讲模式、讲工程、讲框架结构等等本身并没有错(例如我写软件工程的书,例如我现在就是架构设计师),但问题在于,没有对“计算机系统本身”的了解作为基础,很难于一些细节。

盲目从之未尝不可。但如果撞到了墙,却不知道这条路走下来原本就是要撞墙的,还是跟错了路,还是撞墙的时候应该怎样做。这些事情就不是盲目可以解决的了。java中有些问题很让人痛,例如中文支持的问题,sun就花了很多时间去解决。那在sun给出解决方案之前,一般的java开发者可尝试做了些什么吗?

这就是问题:做不做,与有没有能力做,是两回事情。他的确对你现在“面对某些具体的项目时”的java解决方案没有帮助,但是当你需要帮助的时候,你不能手足无措。

关于误导,我只能说“我们需要更方便、更智能化、更人性的开发环境、开发模式和语言系统”。但是,这并不是我们不去了解系统的借口。