在移動開發領域我們發現一個很奇怪的現象:普通菜鳥新手經過3個月的培訓就可以拿到 8K 甚至上萬的工作;在北京稍微有點工作經驗的 iOS 開發,就要求 2 萬一個月的工資。不知道大家是否想過:移動應用開發已經在市場上火熱了這麼多年了,為什麼很多公司還仍然會面臨移動開發人才稀缺的問題呢?對於移動開發人才的增長速度總是趕不上市場需求發展的原因,我認為不應該簡單歸為市場供求關係的問題,其源動力還是來自移動應用整體的開發模式和開發效率低下的內因。正是這強大的市場需求和低下的原生開發效率結合在一起才導致了這幾年軟體開發行業人才的嚴重失衡,導致大家沒辦法也只能漲工資的方式來搶人才。為此我們一直在尋找高價效比的應用開發方案(實現低成本投入和高品質的產出),儘可能的降低應用開發複雜性。應用複雜性的本質是邏輯和控制,邏輯決定了程式碼複雜性的下限,而控制則包括對應用環境和裝置環境的進一步優化。我們常抱怨應用不夠簡潔的最根本原因:就是其沒能處理好邏輯與控制之間的耦合。說到應用複雜度的解耦,最常見的解決方案就是通過元語言抽象讓邏輯和控制進行分離,也就是人們通常所說的中介軟體方案。先普及一下:什麼叫元語言?簡單說,元語言就是對應用語法和語義的配置,對應的後設資料則是對這些配置的具體描述。也就是說元既是資料也是程式碼。為了能說清楚這個問題,讓我們來簡單回顧一下中介軟體開發技術的發展歷史:
最早也是最基礎的應用開發方式是超程式設計(Meta Programming):也就是從元語言到目標語言的編譯器,將後設資料編譯為目標程式程式碼的開發過程。超程式設計的模式要求我們要面向具體裝置進行程式設計,每種裝置在作業系統基礎上會提供給開發者大量的api服務,最終的應用的原始碼經過編譯和連結兩個過程生成可以直接執行的應用程式。雖然開發過程的複雜度較高,但超程式設計生成應用的執行效率確實非常高。採用超程式設計方式的開發工具包括:組合語言、c語言、PowerBuilder、VC、Objective-C等。我們可以通過下圖來理解超程式設計:
超程式設計之後,緊接著就出現了元驅動程式設計(Meta Driven Programming) :它是直接在目標語言中實現元語言的直譯器,這是支撐中介軟體技術的基礎方式。元驅動程式設計帶來的最大的好處就是我們不必再面向具體的裝置進行程式設計,元語言需要先預編譯成中間程式碼,中間程式碼對於不同型別裝置的適配工作完全可以交給“執行時引擎”去完成,從而達到了“write once and run anyway”的能力。 採用元驅動程式設計方式的開發工具包括:Java、Flex、.Net等。我們可以通過下圖來理解元驅動程式設計的模型:
這些年比較流行的應該還是元解釋程式設計(Meta Interpretive Programming):它可以讓元語言直接執行在不同的目標環境中,這也就是我們所說的指令碼語言程式設計。由於省去了編譯和預編譯的過程,程式碼的語法檢查的過程只能在執行期間完成,理論上講這會降低應用的執行的效率。但隨著計算機硬體效能不斷的提升,效能問題已經被越來越弱化,同時元解釋程式設計簡潔強大的語法也大大提高了應用的開發速度,也降低了程式的複雜度。採用元解釋程式設計方式的開發工具包括:Javascript、Python、Lua等。我們可以通過下圖來理解元驅動程式設計的模型:
為什麼在移動互聯時代,很多傳統應用開發的規則都不再適用了呢?讓我們來對比一下移動裝置和傳統計算機體系結構之間的差異,看看移動裝置到底在結構上發生了哪些重要的變化。首先移動裝置去掉作業系統的快取,為了控制個體應用對系統造成的任何不良影響,在應用的實體記憶體不夠時,該應用馬上就會強制退出。 這就是app開發中為什麼一點點的記憶體問題就會產生閃退的根本原因,也是我們在專案中需要通過底層原生程式設計來優化app穩定性的必要原因之一。另外由於移動作業系統中個體應用獨立化的設計,讓系統級的執行時引擎無處載入,這自然也就顛覆了元驅動程式設計在app開發中應用的可行性,於是程式設計師們就又要重新開始尋找移動中介軟體技術的解決方案了。
第一代移動中介軟體的程式設計(HTML5 Based App Programming)是基於HTML5技術的跨平臺app開發模型。在這個模型中一般都通過內嵌的webkit核心來實現原生擴充套件程式碼的橋接,用HTML5構建網頁UI,用網頁中的Javascript編寫業務程式碼。在這個模型下HTML5技術天生就具備跨平臺的能力,而且很多傳統的網站開發程式設計師在技術上也可以很自然的過度。採用第一代移動中介軟體模型的產品包括:PhoneGap平臺、數字天堂中介軟體產品、烽火中介軟體產品等。我們可以通過下圖來理解第一代移動中介軟體產品的模型:
在第一代移動中介軟體技術的發展過程,吸引了大量傳統的web程式設計師,很多人都希望能夠通過html5技術進入app開發的陣營裡。但經過幾年內大量的嘗試後我們發現,市場上主流app開發工作仍然還是要交給原生開發人員完成,幾年下來用Html5開發出來的優質app在應用商店裡仍然是鳳毛麟角。html5的互動體驗能力和原生app開發之間的差距似乎越來越大了,雖然硬體裝置的高速發展解決了部分html5頁面執行效率的問題,但android和IOS每次大版本升級在UI互動能力上的提高卻讓html5技術有點越來越望塵莫及了。
隨著技術的發展很自然又出現了對第一代移動中介軟體程式設計技術的改進模型,其結構如下圖所示:
在改進模型中的變化主要體現在兩個方面:首先是對原生擴充套件能力進行了進一步增強。除了對檔案、照相機、通訊錄等本地能力的擴充套件外,還增強了對原生UI框架的擴充套件能力以及對第三方服務的擴充套件能力;另外改進模型中還增加了擴充套件模組的概念對外提供開放平臺,允許開發者擴充套件自己開發原生元件。雖然改進的模型在很大程度上了增強了HTML5和原生的原生互動能力,但最大的技術瓶頸仍然能解決,即對於基礎UI的構建還是隻能通過網頁方式實現。開發者仍然需要通過網頁渲染來模擬原生互動,所不同的只是可以通過網頁內的javascript再去呼叫一些原生擴充套件功能而已。目前採用第一代移動中介軟體改進模型的產品包括:Appcan、APICloud、HBuilder等。
HTML5技術是第一代移動中介軟體技術發展的核心動力,但隨著IT技術的發展,它也成為了移動中介軟體技術進一步發展的最大瓶頸。無論大家在第一代中介軟體的改進模型多麼努力,卻始終改變不了WebView的單執行緒模型、改變不了DOM/CSS的複雜而低效的排版和渲染水平、改變不了瀏覽器通過內嵌Cavas、WebGL和定時器來實現動畫的在使用者體驗效果上的失敗。 很多人都還在幻想著HTML5會成為App的未來,要知道HTML5這項Web時代的技術本身就不是為移動互聯時代而生的,HTML5的骨子裡根本就不具備移動互聯的基因,它與App的未來實際已經是漸行漸遠了。
Facebook在2015年初重磅推出了React Native移動開發中介軟體技術,在結構上完全擺脫了HTML5的束縛,真正開啟了一套通過自定義原生控制元件渲染UI的框架的道路,我們可以稱之為第二代移動中介軟體的程式設計(Meta Extended App Programming)。我們可以通過下圖來理解該模型:
Facebook在React Native產品中所提出的 “Learning once, write anywhere” 本身也是一種複用的思想。大家厭煩了各種各樣的程式語言,如果有一種語言真的能夠統一移動開發領域,對於所有人都是好事。先不說這個框架後續是否能得到大眾認可,單從原始碼來說,這個框架原始碼裡有非常多的設計思想和實現方式值得學習。React Native產品雖然在實用性還有很大的不足,但它最大的價值則是為移動中介軟體技術提供了全新的發展思路。或許很多人還沒有關注到,2015年中旬的時候一款DeviceOne的移動中介軟體產品正式對外發布,它對React Native產品架構進行全面的繼承和改進,不僅實現了跨平臺移動開發的“Write once, run anywhere”能力(同時支援IOS、Android、Windows10),還實現了原生開發擴充套件平臺的完全開放。我們來研究一下這第二代移動中介軟體的改進模型吧:
在DeviceOne這個模型中所有UI元件功能元件都已經被抽象成可被自由擴充套件的跨平臺元件,就連Webkit本身在模型中也僅僅退化成一個普通的UI元件而已,App開發者可以自由選擇js指令碼、lua指令碼甚至python指令碼來編寫業務邏輯,讓昂貴的原生開發人員能夠更專注於底層技術創新和元件封裝,讓應用開發人員可以更加專注於具體專案的業務需求,實現原生開發和應用開發的分離,也就是讓邏輯和控制充分解耦。
隨著移動互聯時代的高速發展,人類對“低成本高品質”app開發技術的需求越來越迫切。Fred Brooks在人月神話中曾闡述的 “沒有銀彈”理論一直以來對IT界產生了很深的影響:他認為不存在一種技術能使得軟體開發在生產力、可靠性、簡潔性方面提高一個數量級。但在我看來也不一定要那麼悲觀了,凡事都沒那麼絕對,任何原則都有其假設的前提和範圍,如果超過這個範圍,原則可能都要失效了。例如:如果超出了宇宙大爆炸基點的範圍,我們就會失去任何參照物,那麼就連時間概念同時也都會消失,更何況Fred Brooks的理論呢?雖然“沒有銀彈”理論在軟體工程範圍內是被普遍認可的,但我們這並不能僅以此就推理出 “低成本高品質”的需求是無解的。App的開發技術的發展歷程不是可簡單線性描述,也更不會侷限於軟體工程理論的範圍內。就像Kevin Kelly在《失控》中所說的那樣,IT技術應該更貼近大自然自身的發展規律。工業時代的標誌是機械設計能力的登峰造極,而以IT技術為代表的新生物文明則應使設計再次迴歸自然。React native和Device one的出現就讓我們看到了app開發的新希望,這可能就是我們期待了已久的移動中介軟體技術發展拐點。凡事不破不立,React native通過擴充套件標籤的方式實現了去HTML5化,而Device one繼而則在支援跨平臺的同時還還進一步實現了去中心化,按照這樣思路再發展下去移動中介軟體技術的未來將會是怎樣的呢?一旦我們能通過分散式的、至下而上的去中心化控制系統來激發大量個體(開發者)的差異化發展,就能夠最大限度的實現整個系統的自學習和自遞增,當系統的進化進而再反過來再影響和改變個體的時候,那麼軟體開發的生產力、可靠性、簡潔性可能就會在每次迭代過程中實現突破,甚至能以指數級別的速度開啟全新的增長…