在古代,程序员绝对是一个高门槛的职业。他们只能用汇编编程,写程序非常困难。机器指令集互不兼容,程序无法移植,只能重写。IBM决定改变这种情况,推出了具有相同架构和指令集的机器家族System/360。计算机厂商众多,硬件和指令集很难统一,所以在上面加一个抽象层:操作系统。70年代,AT&T的KenThompson和DennisRitchie发明了一个优秀的操作系统:Unix,而DennisRitchie也发明了伟大的C语言。Unix用C语言改写后,成为一个可移植的操作系统,屏蔽了底层硬件的差异,上面的应用程序可以移植。但让人没想到的是,各大厂商和大学都推出了自己的Unix版本,最终发展出100多个Unix变种。为了保持操作系统之间的兼容性,IEEE率先定义了系统级和用户级的API,即PortableOperatingSystemInterface(简称POSIX)。POSIX标准已经形成标准,吸引后来者入局。使用POSIX,在不同操作系统之间移植软件要容易得多。除了统一操作系统的API,一些高手决定在编程语言上有所动作,在操作系统之上再增加一个抽象层:虚拟机。虚拟机的出现完全隐藏了硬件和操作系统的细节。从此,大部分程序员只需要考虑业务逻辑,软件开发的门槛再次降低。2007年,随着移动互联网时代的到来,一个全新的开发平台应运而生。(注:乔布斯当年离开苹果,创立了NeXT,推出了NeXTSTEP操作系统。这个系统的原生语言是Objective-C,而macOS和iOS都是从NeXTSTEP衍生出来的,所以iPhone选择Objective-C也是被认为是相同的。)Java并没有在iPhone中安家,而是进入了Android手机。Android和iOS已经成为两大手机操作系统,互不兼容。应用程序开发再次碎片化,变得不可移植。如果一个公司想要开发原生应用,它必须维护两套团队:iOS程序员和Android程序员。iOS和Android差异巨大,很难像POSIX那样统一接口,也很难通过虚拟机屏蔽差异(Android运行在虚拟机上)。我们应该做什么?Facebook推出了解决方案:用JS编写App,通过ReactNative“翻译”成原生界面。ReactiveNative使用JSX语法编写接口和逻辑,可以实现热更新,但毕竟直接和原生API隔了一层,有“翻译”成本,效率还是不如原生的。Google另辟蹊径,推出了Flutter。但是,这两种解决方案都存在各种不足,移动应用的可移植性还有很长的路要走。未来可能会有新的技术或平台来彻底解决移动应用程序的可移植性问题。即使在统一之后,新平台(物联网?)也可能会导致新的分裂。纵观过去几十年的软件发展,你会发现一个特点:为了弥合各种技术平台之间的差异,实现软件开发的统一,抽象层次越来越高。然而,每次统一后,新的技术平台又迅速出现又分裂。真是应了中国那句古话:天下大势,分久必合,分久必分。
