小程序员我从编写单片机代码起家,曾有一段时间很排斥带操作系统的东西,觉得操作系统屏蔽了很多硬件特性,不能直接反映硬件特征。在研究了uboot和linux内核后,我渐渐体会到,操作系统很强大,将很多硬件的差异进行了抽象,对上呈现了一个统一的视图(或者叫接口)。感慨自己当初多么稚嫩,对操作系统的理解本末倒置。
软件开发的直接目标是实现眼前项目的需求。需求是整个产品成败的根基。对需求理解的偏差,将直接导致产品的失败。那谁来定这个需求? 需求的制定者不仅仅是客户,还有开发人员等等。关键就在这个“等等”两字。我们往往忽略了老板这个重要的需求源。老板是产品的直接投资方,他的需求就是尽量使得成本更低。如果我们开发的代码仅仅为当前的项目,而不考虑其可移植性,那么当有多个相似项目需要开发时,成本是成倍增长的。而如果在开发阶段充分考虑到了可移植性,那么产品的成本将大幅下降。
我们当然可以为每种嵌入式设备都开发一个系统,但当我们有一个标准的操作系统,我们只要针对硬件或客户需求的差异,修改部分驱动或上层应用即可。
可以说,操作系统的出现,很大程度上是为了降低开发成本。随着操作系统的发展,很多公共的东西都被集成到了操作系统内核中,后人需要重复的劳动越来越少。
当然,追求极致成本优势的厂商不会满足于操作系统提供的基本功能所带来的成本降低。为了获得更高的代码复用率,中间件、编程框架、虚拟机等等概念应运而生。操作系统解决了应用程序的跨硬件平台,而中间件、虚拟机解决了应用工的跨操作系统。有时开发人员把它们打包,作为一个新的操作系统。比如Android,它实际是在Linux系统上的一套框架,但开发APP的人员更愿意把它看成是一个操作系统。