跨平台技术

清明假期,闲着无聊,扯下淡

背景

每隔几年总有一种号称颠覆性的跨平台技术推出,最开始是java,因为有着全平台统一的字节码和虚拟机,所以一次开发到处运行,但是后来的结果大家都知道,java主导的客户端开发已经好多年没听说过了。再后来是各种跨平台技术,比如QT,这个倒是现在还活着,但是好像活的也不是很好,整个生态参加的人并不多。然后是微软的MOON,好像听说的人也不是很多,就算借助着微软树大也没招来几个猢狲,现在.net core也随着微软继续推出,但是好像也是没有多少人参与进来。然后是facebook的RN技术,这个说起来倒是可以有些故事讲的,话说当时笃定要使用HTML5统一各端开发的,但是兜兜转转后来又搞来RN才曲线救国,然后大家觉得还不错,说到底是借助了web生态的庞大开发者才进入了大众的视角。对了, 忘记谈web,大家好像一直没有把web放入跨平台的技术体系里面,虽然它是运行在客户端的。

然后是现在大火的Flutter,号称颠覆了以往的跨平台技术,目前的2.x版本已经是全平台的正式版本支持了,而且无论从出身来看(背后有google的强大支撑)还是从技术角度看(skia实现系统原生级别的渲染效率)还是从开发体验角度看(Dart这种易学易用的开发语言+JIT的即时调试体验+AOT的运行时性能保证)好像都是下一个『Amazing』的跨平台技术。

这是又一个『一次编写,到处运行』的技术框架,它是那么完美,无论从哪个方面看都是无可挑剔的下一代的跨平台开发的王者。

但是!

永远不可能有一个完美的跨平台方案,小型应用可以使用市面上比较火的跨平台方案开发,大型应用永远不能,never!!!

为什么?

正如本文题目所言,我们不从技术角度聊各种跨平台技术的优缺点,仅从利益角度出发谈一下跨平台 技术。

各种利益实体

客户端是什么?
客户端是运行在某种操作系统上,实现某些用户功能的应用。

那么操作系统又是什么?
操作系统是厂商实现某些用户功能的底座。

那么同样都是为了满足用户需求,实现某些用户功能,而且无论是从技术角度还是从利益角度讲,操作系统厂商完全可以是客户端的开发商,那为什么操作系统不去做应用开发呢?

非不能也,实不为也! 为什么不为? 非不为也,实不能也!

怎么理解呢?
操作系统当然可以做应用开发,而且对于操作系统厂商来讲,实现客户端他们应该更专业才对,应为系统都是他们开发的,他们对于系统特性太熟悉了,哪里有坑哪里好用,他们比那些第三方的没有此类技术背景,甚至专业能力远远不如他们的客户端开发者来说强太多了。

但别忘了,用户需求千千万,那些系统厂商拼死996、007也只能做很小的一部分。用户想选自己想要的那些功能,但是那些功能哪些是能够提供的呢。

天下熙熙皆为利往,天下攘攘皆为利去

操作系统、应用开发者与用户的三国杀的由来

操作系统厂商想赚客户的钱,那么谁是客户,是用户。更限定一点,我们这里只谈客户端操作系统,不谈服务端操作系统,那么在这个前提下,客户就是终端用户,是那些我们口中经常说的那些C。话说随着时代的变迁,这些C的范围也在变化,早期可能是一些专业的科技人员,计算机开发人员,后期是普通的办公者,再后来是那些普普通通的相对有需求的大众,至移动时代已经是所有人了,包括以前不是目标的老人和小孩。

应用开发者也想赚钱,那么谁是客户。这个就有所不同了,不通领域的应用有不同领域的用户,你是垂直应用可能就是某些垂直行业的用户。如果你是通用应用,那么可能就是所有的普罗大众了。

用户可不是想白被赚钱的,谁也不啥,哪个能满足我的需求,我就选哪个。哪个让我用的爽,我就用哪个。当然还要在我的银子能够支付的范围内才行。

至此,操作系统厂商–客户端开发者–用户的三国杀局面开始。

操作系统

操作系统要做什么?

  • 提升操作系统的通用性和性能。只要有市场(利益),没有实现不了的需求。微软、苹果、谷歌甚至包括华为,大家都能干。只要有钱,啥都不是事!当然如果真有事,那么拉上硬件厂商一起提升操作系统体验也是必须的,至于后来的硬件厂商也要恰饭,拉上操作系统厂商一起搞用户的钱也不是不可能(wintel联盟)。苹果觉的硬件厂商也是一堆渣渣,那自己从软到硬一通搞也是可以的,至于能不能做大靠造化(比如乔帮主就是造化)了。
  • 吸引用户

到底是先有用户才有应用,还是先有应用才有用户呢,这是一个千古难题,正如先有鸡还是先有蛋的问题一样难。开始每个厂商的解法不一样。

这个话题我们还是从移动操作系统说起。

再有蛋(用户),再有鸡(应用)–塞班,我们且称作『蛋原生』战略

Iphone横空出世之前,塞班系统才是移动端的王者,从以前的featurephone(现在都叫老人机了,甚至现在的老人机都比以前的这种机器更智能)到smartphone(经典的诺基亚系列智能机)占据了几乎整个市场。那时候的开发体验那叫一个糟糕,从应用开发工具到应用开发上架对开发者来说都是一个非常大的折磨,C++已经足够令人可恨,Symbian C++更是一个奇葩的存在,那不是移动开发,那是远古石器时代的嵌入式开发,能指望这种复杂性下有几个人参与。那是一个移动开发者的昏暗时期,市场上没有几款应用,除了操作系统厂商有能力做开发之外,好的应用寥寥无几。

先有鸡(应用),再有蛋(用户)–安卓,我们且称作『鸡原生』战略

在聊安卓之前,我们先说一下真正的移动开发的太祖iphone,IPhone推出已足够惊艳,但我觉得真正Iphone之所以能成为Iphone的原因,是它的应用市场的推出,这个时间在Iphone推出一年多以后。
Android的推出气坏了乔帮主,以至于乔帮主说『_我将花掉苹果银行400亿美元的每一分钱,以纠正这一错误。我要销毁Android,因为它是被盗的产品。我愿意为此进行热核战争。_』乔帮主总是没有错,但他还是低估了苹果的损失。如果苹果垄断整个移动市场,那么苹果的市值远不止现在的2万亿美元,那将是史无前例的巨无霸公司。

好像想话题扯远了, 我们拉回来一点。

谷歌决定推出安卓的时候,肯定做了很大一番斗争的。那个时候手机的性能远远不如现在,所有的移动开发,除了部分体验较差的J2ME应用之外,大家基本都在用C++、OC做主力开发语言,甚至大家觉得C++都不够用,直接用C才行,而JAVA似乎已经被证明不适合用作客户端开发。

但是谷歌打眼一看市场上哪个开发者的人数最多?当然是永远的web开发者了,但那时候谷歌还没有后来推出的V8,心里嘀咕一下,卧槽,javascript来开发安卓应用估计性能上还搞不定。那再往下数,Java开发者众多,语言比C++那厮简单多了,看着Java还算顺眼,得,就它吧。另外JVM虚拟机(Dalvik)哥们还有机会搞。另外光凭自己一个厂商搞安卓估计还是不起势,干脆把系统开源得了,拉来更多的厂商,这样就能拉来更多的开发者。
谷歌怎么是这么一个浓眉大眼的大善人呢,嗯,谈不上。谷歌从来都不是一个操作系统厂商,谁拿来谁用,哥不在乎,哥在乎的是所有的安卓操作系统里都带着哥的谷歌服务,中国厂商怎么没有,那是因为中国市场 哥本来就没服务,带着谷歌服务也是没毛用,那么做个人情放开算了。

另外从时间节点上讲,谷歌这种鸡原生战略的推出也是不得已,毕竟安卓相比于iphone系统那可是晚了几年的,先发优势已经没有,那只能从『应用』上做差异话竞争了。

谷歌推出了全套的安卓开发者工具,包括精致的安卓开发IDE、精心编写的开发者教程、极其宽松的应用入场条件–塞班和苹果的开发者证书费用都能吓退很大一部分开发者,安卓跟windows应用一样,开发完可以直接安装,原来的J2ME的开发者和原来大量的Java开发者大量涌入,加上大量三方手机系统借助安卓定制的MiUI等,造就了安卓应用的繁荣生态,于是安卓形成了一个正向飞轮,安卓慢慢成为了现在的第一大生态。

那事情是不是很简单,有最多的开发者,就有最多的应用,就有最全的功能,就能满足各色各样的用户需求,就能吸引更多的用户,就能赚更多的钱。

但别忘了,操作系统厂家又不是一家,用户凭什么选你不选他,你长的好看咋的。硬件总会进步,软件也会进步 ,最初的那点流畅的体验最终都会被抹平。

那凭什么吸引用户,靠免费吗?靠低价甚至免费的恶性竞争永远不能带来一个新机会,却总会毁灭一个老市场。

最终靠的是差异化。差异化才会让喜欢萝卜的用户选择萝卜,喜欢青菜的用户选择青菜。

那作为萝卜厂商,怎么 让喜欢萝卜的用户更多一些呢?这个得颇费一些脑筋了。

体验是一个感觉,千万个读者有千万个哈姆雷特,永远别指望那些极端的苹果粉去用安卓,反之亦然。那么剩下的竞争只能是应用的多样性和应用体验了。
垄断总是产生最大收益,操作系统厂商,总是希望开发者都选我的操作系统,永远别开发别的操作系统的应用,那么我的应用体验永远是独一无二的,这就是那些独占应用,但是不是所有应用开发者都会独占应用,大多数应用也想获得更多的用户赚更多的钱,应用开发者也要恰饭。怎么抢占应用开发者呢,安卓靠用户多来抢占应用开发者,苹果靠用户多金且应用市场分钱多来抢占开发者。

那么话题转到应用开发者,我们开聊。

应用开发者

都说屁股决定脑袋,那么我们看看应用开发者的屁股在哪里?

应用开发者的客户在哪里?怎么赚钱?
不同的应用有不同的赚钱策略,有的靠用户多赚钱,有的靠少量金主用户赚钱,但总归是靠客户赚钱,只是每个应用的客户群体不一样而已。但不管这些客户是谁,应用开发者总是想要用户越多约好那么用户从哪里来,从各个操作平台上来。作为应用开发者,我想覆盖的平台越多越好,这样才能触达到更多的用户,无论现在的手机(安卓、ios)还是PC(windows、Mac、linux)还是各种智能设备(智能电视、智能冰箱、智能汽车等)还是web,总之平台有多少要多少,我通通都想覆盖。

但是,但是!

每个平台接口都不一样,每个系统都搞一堆开发者,钱花不起,时间搞不定。通常有两个方案解决这个问题,第一个方案:先搞定有最多目标用户的那个平台(先吃肥肉),然后慢慢补齐其他平台。第二个方案:跨平台,开发者总是想一劳永逸解决所有平台的问题,总希望有一种手段写一次代码,搞定所有平台,这就是跨平台技术。

第一种方案是一种妥协,第二种方案是一种理想。

记住我们的主题,不谈技术,抛开五花八门的跨平台技术不谈,我们谈操作系统和应用开发者间的竞争合作关系。

有了跨平台技术,开发者可以提供多系统一致的用户体验,可以方便从一个系统迁移到另外一个系统。记住,这两条犯了系统的大忌,你这么搞,这是反我啊,早就知道你有二心。真有这么一种技术,那开发者从安卓都溜到IOS怎么办,那我安卓的应用多的优势在哪? 用户体验都一致了,那我IOS拿什么和安卓竞争?

说到底,操作系统厂商是最不希望有跨平台技术出现的,这种技术出现等于砸了我的饭碗。断人财路如杀人父母,这仇都不共戴天了。

但是等等,话说跨平台技术好多都是操作系统平台厂商推出的,那他们凭什么要推出呢,这不是自掘坟墓吗?

还真不是,永远没有最好的方案只有最合适的方案。当一个操作系统比较弱的时候,我凭什么吸引开发者,光有好的开发体验不行,有好的开发体验也得额外投入精力不是。有什么办法是不用额外投入精力就能搞定呢,那我发明一个跨平台方案好了,你看,也不耽误你开发原来的系统应用,顺带能开发我的系统应用,而且新技术推出因为『后发优势』总能找到吸引开发者的点,更好的应用开发环境,更高效的编程语言,更好的调试手段,应用开发者一看,卧槽,这么好的东西,我赶紧拿来用,双赢才会用 ,单赢谁鸟你。

技术总是无辜的,利益才是永恒的。当各位技术开发者热烈的讨论这些令人激动的划时代技术的时候,其他操作系统厂商却在背后偷偷下黑脚,但总不能摁住跨平台技术不让人家发布吧,没这样的。

那怎么办呢,原来我还给跨平台开发留了这么多漏洞,要死要死,我要赶紧堵上。现在已经系统已经发布出去的API我总不能说明不让那些跨平台方案调用吧,怎么办?那我下一版更新的时候,原生技术很容易支持的,跨平台技术到处使绊子,然后不停的迭代。跨平台方案要不停的兼容新的系统,还要不停的填上操作系统故意留下的坑,随着支持的系统原来越多,支持的系统版本越来越多,总有支撑不下去的一天,也可能继续支撑下去,但是给用户的方案太复杂了,开发者不买账了,或者最终跨平台技术开发的应用体验不如原生开发了,那这个跨平台方案就到了寿终正寝的那一天了,这也就是每个几年总有一个跨平台方案出来,却每隔几年总有跨平台方案死去的原因了。

这种跨平台方案有两种结果。失败了,那就是飞鸟从天空飞过,可它并没有留下痕迹。如果成了并且我的系统占有率也上去了,那我得搞点不一样的才行,一样要垄断,屠龙少年终将变成恶龙。

这里讲一下Flash,可能很多人都不认为这算一种值得讲的跨平台技术,但其实我认为它是,而且是众多跨平台技术中将要成功的一种,因为Flash的使用如此众多,人人必备,几乎到了挟天子以令诸侯的程度,但被伟大的乔帮主的一篇檄文扫的荡然无存,现在Flash坟头草都三尺高了。以阴谋论讲,Flash不是死于那些冠冕堂皇的技术原因(安全漏洞、性能差、耗电),因为我们知道技术障碍不是障碍终将被抹平,而是死于这种跨平台方案已经大到威胁操作系统的利益的时候,那它不得不死,而且各大系统厂商得而诛之。如果Flash是一种开放标准还好,它会是实质上的HTML5的实现者, 但它恰恰是Adobe的私人财产,这个太危险了,卧榻之侧岂容他人鼾睡,而且Adobe的创始人在乔帮主落难的时候不帮一把,以乔帮主的小肚鸡肠肯定会恨一辈子,那正好终结吧,让一切尘归尘土归土。

Web

在众多的跨平台方案中,Web太特殊了。因为 『Web天然跨平台』,为什么?

Web是早于很多商业系统的一个存在,是世界上最大的开放系统,这里人人平等,天然没有二等公民。但为什么Web发展了这么多年没有成为现在的跨平台统一解决方案呢?有人可能说web功能比原生少,性能比原生差。基于一种假设,只有永远的利益,没有所谓的技术障碍,所有技术原因的坑都会被填平,随着HTML5的推出,现代web能够实现的功能已经远远超过了以前的 web所能实现的范围,PWA部分填平了web离线的问题,Webassembly部分填平了性能的问题,随着web标准的完善,各种原生才能实现的功能,Web差不多已经或者将要实现。

操作系统厂商不想阻挡吗,当然想,但是为什么不呢? 非不为也,而不能也。

说到底Web是一种趋势,别人都能访问的网站(相当于应用)到你这里不行,相当于你不仅没有独占,反倒有缺失,那我干脆不用你的得了。如果一种趋势不能被打败,那就加入,还能混口饭吃。

底线

有了web之后就知道了操作系统厂商的底线在哪里,原则上,web能做到的事就是操作系统能容忍的跨平台技术的底线。因为就算我阻止了所有的跨平台技术,但是我不能阻止web,所以我索性放开。从这里得知,小型应用可以使用市面上比较火的跨平台方案开发,大型应用永远不能,因为这是操作系统的底线,一旦践踏,操作系统早晚会使绊子绊倒你。

终极方案

那么『跨平台』技术是不是Web就行了?不,Web是未来终极解决方案,你得先保证活到未来早说,早点洗洗睡吧,当好上班狗,写好现在的每一行代码再说,江湖再见!