整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Facebook、隱私、監(jiān)聽(tīng)廣告以及我們?nèi)绾问プ杂傻幕ヂ?lián)網(wǎng)的

          智能手機(jī)普及之前,互聯(lián)網(wǎng)的能力還是有限的,那時(shí)候的互聯(lián)網(wǎng)還可以說(shuō)是自由的。那這幾年到底發(fā)生了什么?什么殺死了分布式的互聯(lián)網(wǎng),使之變成了商業(yè)壟斷為主?

          我曾經(jīng)寫(xiě)過(guò)好幾篇和隱私相關(guān)的話題,閱讀量都不高。這不意外,沒(méi)有重大事件,通常人們不會(huì)關(guān)心這類(lèi)話題。

          最近有幾件事被引爆了,這個(gè)話題突然重新回到了人們視野中,所以可以再寫(xiě)一篇了。

          這幾件事分別是:Facebook 數(shù)據(jù)泄漏事件、互聯(lián)網(wǎng)公司是否偷偷用麥克風(fēng)監(jiān)聽(tīng)用戶,以及所謂大數(shù)據(jù)殺熟。

          說(shuō)到根本上,這幾件事是相關(guān)的,背后指向的是同一個(gè)問(wèn)題,即:人們到底出讓了多少隱私,以及用戶為什么會(huì)在不知不覺(jué)中出讓這么多隱私。

          在智能手機(jī)普及之前,互聯(lián)網(wǎng)的功能還很有限,人們的使用時(shí)長(zhǎng)也不長(zhǎng)。就算是 Facebook 這樣的霸主,在那個(gè)時(shí)代無(wú)非也就是諸多網(wǎng)頁(yè)中的一個(gè)。

          人們沒(méi)有把那么多數(shù)據(jù)交給互聯(lián)網(wǎng)公司,離線和在線狀態(tài)還非常分明,遠(yuǎn)不像今天絕大多數(shù)人實(shí)際上已經(jīng)永遠(yuǎn)在線,就算在飛機(jī)飛行途中也未必能獲得清凈。

          在那個(gè)時(shí)候,雖然互聯(lián)網(wǎng)的模式早就是免費(fèi)+廣告,人們出賣(mài)的隱私數(shù)據(jù)仍然是相當(dāng)有限的。

          然而幾年之后,事情就變成了完全不同的樣子,數(shù)據(jù)和流量變得極度集中,使得泄漏隱私和通過(guò)大數(shù)據(jù)計(jì)算給不同用戶標(biāo)定不同價(jià)格成為可行。

          在 2010 年之前,人們?cè)诨ヂ?lián)網(wǎng)上主要使用開(kāi)放協(xié)議,我們用電子郵件傳遞消息、用 IRC/Gtalk(XMPP)聊天、用瀏覽器上網(wǎng)瀏覽信息、通過(guò)鏈接把各種資源連起來(lái)。

          開(kāi)放協(xié)議意思是:每個(gè)人都可以架設(shè)自己的服務(wù),只要按照協(xié)議規(guī)范來(lái),就可以讓不同人架設(shè)的服務(wù)器之間正常傳遞信息。

          今天,區(qū)塊鏈興起之后,人們管這種模式叫做“分布式”,或者“去中心系統(tǒng)”。但僅僅幾年之前,互聯(lián)網(wǎng)本來(lái)就是去中心和分布式的,并不是像今天這樣所有數(shù)據(jù)和流量都掌握在幾家巨頭手里。

          這幾年到底發(fā)生了什么?什么殺死了分布式的互聯(lián)網(wǎng),使之變成了商業(yè)壟斷為主?

          2009 年,智能手機(jī)的興起,不僅僅是提供了一種新的使用方式,同時(shí)以這種方式使得大量的傳統(tǒng)網(wǎng)絡(luò)通信協(xié)議不可用。前者被廣泛討論,后者人們往往意識(shí)不到。

          簡(jiǎn)單來(lái)說(shuō),智能手機(jī)的興起,至少殺死了 IRC/XMPP 這樣的及時(shí)通訊協(xié)議,部分消滅了 HTML/URL 這種互聯(lián)網(wǎng)基礎(chǔ)協(xié)議。

          講述這段歷史不可能跳過(guò)蘋(píng)果這家公司,在 iPhone 出現(xiàn)的年代,蘋(píng)果還是一家有特色但不重要的公司,但它幾乎是憑自己一家公司開(kāi)啟了整個(gè)移動(dòng)互聯(lián)網(wǎng)時(shí)代,沒(méi)有蘋(píng)果的一系列決策,就沒(méi)有移動(dòng)設(shè)備的普及。在這個(gè)過(guò)程中,有意或者無(wú)意的,蘋(píng)果也在另外一方面推動(dòng)了歷史,使得我們進(jìn)入了一個(gè)壟斷更密集、更封閉,但是更方便的時(shí)代。

          先說(shuō)第一個(gè)問(wèn)題,IRC/XMPP 協(xié)議是如何被殺死以及如何改變生態(tài)的?

          很多人指責(zé)微信是個(gè)封閉的花園,這個(gè)指責(zé)沒(méi)有問(wèn)題。

          但解決方案是什么呢?

          這些人提供的解決方案通常是:使用另外一個(gè)商業(yè)軟件(Whatsapp/Telegram/iMessage)來(lái)代替微信。

          這時(shí)候如果你提出一個(gè)問(wèn)題,為什么不使用一個(gè)開(kāi)放協(xié)議?比如 :IRC 或者 XMPP 來(lái)代替微信這種聊天工具,對(duì)方給出的回應(yīng)通常是“那些太難用了,普通人不會(huì)用”。

          這個(gè)回答是錯(cuò)誤的。

          正確的回答是:移動(dòng)互聯(lián)網(wǎng)時(shí)代開(kāi)始之后,所有的傳統(tǒng)及時(shí)通訊協(xié)議都變得不可用了。不是因?yàn)殡y用,是因?yàn)樵诩夹g(shù)上不可用。

          傳統(tǒng)的聊天協(xié)議,都包含了在線和離線狀態(tài)。用戶使用之前,首先要完成登錄,標(biāo)記在線狀態(tài),建立一條到服務(wù)器的永久鏈接,然后才可以發(fā)消息。(如果你用過(guò) MSN 的話,應(yīng)該會(huì)比較形象理解這個(gè)過(guò)程)。

          移動(dòng)互聯(lián)網(wǎng)開(kāi)始之后,諾基亞 S60 和 Android 使用這些協(xié)議尚且沒(méi)問(wèn)題。但 iOS 早期版本做了一個(gè)不可思議的舉動(dòng),這個(gè)系統(tǒng)上沒(méi)有后臺(tái)進(jìn)程,一個(gè)應(yīng)用進(jìn)入后臺(tái)或者關(guān)閉屏幕之后,所有鏈接都會(huì)被系統(tǒng)斷開(kāi),但是系統(tǒng)會(huì)接收推送消息,幫助用戶再次喚醒應(yīng)用。

          早年諾基亞的粉絲是一直嘲笑 iPhone 這種設(shè)計(jì)愚蠢“一個(gè)沒(méi)有后臺(tái)進(jìn)程的智能手機(jī)怎么能叫智能手機(jī)呢?”

          事實(shí)的發(fā)展證明他們錯(cuò)了,iPhone 成功了,其他人都死了。

          為了待機(jī)時(shí)間和兼容當(dāng)時(shí)運(yùn)算能力仍然比較低的移動(dòng)設(shè)備,無(wú)后臺(tái)進(jìn)程,關(guān)閉鏈接,這些都是必要的優(yōu)化,不然手機(jī)待機(jī)時(shí)間會(huì)快速下降,使之不可用。

          但這種措施給傳統(tǒng)通訊協(xié)議帶來(lái)了巨大的挑戰(zhàn),沒(méi)有后臺(tái)進(jìn)程(以及設(shè)備在移動(dòng)帶來(lái)的網(wǎng)絡(luò)切換造成的網(wǎng)絡(luò)鏈接不穩(wěn)定),造成了 IRC 和 XMPP 這種有在線狀態(tài)的協(xié)議,要頻繁處理上線下線,用戶體驗(yàn)極差。鏈接被關(guān)閉或者網(wǎng)絡(luò)切換時(shí),對(duì)于服務(wù)器表現(xiàn)為 Session 超時(shí),在桌面互聯(lián)網(wǎng)上這是一種異常狀態(tài),需要等一段時(shí)間之后才能清理掉。

          但在移動(dòng)設(shè)備上這是頻繁發(fā)生的,這導(dǎo)致了服務(wù)器堆積了大量超時(shí)未釋放的Session,這使得服務(wù)器難以負(fù)荷,當(dāng)時(shí)很多 XMPP 服務(wù)器上每天處理的鏈接請(qǐng)求甚至超過(guò)每天傳遞的消息數(shù)量。

          這樣的服務(wù)當(dāng)然不可持續(xù)下去,但是開(kāi)放協(xié)議的修改效率是很低的,需要社區(qū)經(jīng)過(guò)廣泛討論才能制訂出新的標(biāo)準(zhǔn),然后各種開(kāi)發(fā)者和廠商才能支持它。移動(dòng)互聯(lián)網(wǎng)來(lái)勢(shì)兇猛,所有人都知道,這是未來(lái),人們等不及了。

          (網(wǎng)上還能找到在 Nokia Chat 中使用 Gtalk 的截圖,不容易)

          誰(shuí)填補(bǔ)了這個(gè)空白了?

          是那些意識(shí)到了過(guò)去的開(kāi)放協(xié)議缺點(diǎn),又有很好基礎(chǔ)的人。

          今天我們已經(jīng)知道了最終的勝利者,他們是——基于郵件投遞模式的微信、基于短信投遞模式的 whatsapp、基于大規(guī)模分發(fā)地震等緊急消息模式的Line。它們有一個(gè)共同點(diǎn):都是基于某種大規(guī)模的消息投遞模式開(kāi)發(fā)的,沒(méi)有在線和離線狀態(tài)。

          這個(gè)問(wèn)題在后面的很多年,甚至一直到今天還有人會(huì)提出:“為什么微信沒(méi)有 QQ 那樣的在線狀態(tài)?”

          張小龍回答過(guò)這個(gè)問(wèn)題,答案是:“手機(jī)是永遠(yuǎn)在線的”。

          這句話是產(chǎn)品邏輯,同時(shí)也是技術(shù)邏輯。除了產(chǎn)品上用戶期待是手機(jī)持有者隨時(shí)能收到并回應(yīng),技術(shù)上也必須采用更輕型的“消息推送”類(lèi)協(xié)議。

          這三個(gè)產(chǎn)品出現(xiàn)的時(shí)間是:

          • whatsapp:2009 年
          • 微信: 2011 年
          • Line:2011 年

          都是在 2010 這個(gè)關(guān)鍵時(shí)間點(diǎn)前后出現(xiàn)的。

          蘋(píng)果消滅后臺(tái)進(jìn)程的原因當(dāng)然不是為了殺死傳統(tǒng)互聯(lián)網(wǎng)協(xié)議,而是為了省電和移動(dòng)設(shè)備可用性。但是這種突然的轉(zhuǎn)變,事實(shí)上造就了一段足夠長(zhǎng)的真空時(shí)間,從而使得傳統(tǒng)開(kāi)放協(xié)議更新協(xié)議的迭代模式不可持續(xù)。

          新的商業(yè)公司拿到 MQTT 這些協(xié)議包裝一下,就成了自己的私有封閉協(xié)議,他們沒(méi)有和其他產(chǎn)品互相鏈接的意愿也沒(méi)必要,也就不會(huì)再跟隨開(kāi)放協(xié)議。

          蘋(píng)果以一家公司之力,通過(guò)一個(gè)小小的決策,直接改變了互聯(lián)網(wǎng)發(fā)展方向,造就了新的巨頭,進(jìn)而這些巨頭又影響和改變了人類(lèi)社會(huì)。順著這條脈絡(luò)看到今天,簡(jiǎn)直是壯觀又可怕。

          做為一個(gè)對(duì)比,IRC 協(xié)議從 2016 年開(kāi)始討論下一代標(biāo)準(zhǔn) irc v3,其中包括了一系列移動(dòng)設(shè)備需要的功能。包括:無(wú)狀態(tài)鏈接,推送消息,歷史記錄……等。

          但到現(xiàn)在 2018 年,距離可用還頗有距離,等到有好用的客戶端產(chǎn)品支持不知道要到哪一年了。和微信的成長(zhǎng)對(duì)比一下,商業(yè)公司的優(yōu)勢(shì)的確太大了。

          然后說(shuō)第二個(gè)問(wèn)題HTML 和 URL 是如何幾乎被殺死?被 URL 連起來(lái)的互聯(lián)網(wǎng)是如何變成一個(gè)個(gè)孤島的?

          如果你同時(shí)使用桌面互聯(lián)網(wǎng)和手機(jī)互聯(lián)網(wǎng),也許能感覺(jué)到這是兩個(gè)邏輯完全不同的世界。

          前者仍然保持著頁(yè)面+鏈接模式,后者是完全不同的一種模式,你用的是一個(gè)個(gè) App。前者你仍然可以自由的挑選組合自己需要的信息,接受來(lái)自不同渠道的信息并且組合它們。但是后者,只有一個(gè)個(gè)巨型 App 做為入口,接受他們提供的被排序或者沒(méi)被排序的內(nèi)容。

          使用桌面互聯(lián)網(wǎng)的人,仍然在使用網(wǎng)址(URL)這種東西,別人通常會(huì)貼一個(gè)鏈接給你,你在瀏覽器里面打開(kāi)它就可以使用了。但在移動(dòng)設(shè)備上,別人給你一個(gè)鏈接,似乎沒(méi)什么地方可以貼,在這里,功能是一個(gè)個(gè) App 組成的,瀏覽器在手機(jī)上不是核心位置。

          桌面互聯(lián)網(wǎng)上 URL 和 Link 使得不同的網(wǎng)站鏈接在一起,用戶使用互聯(lián)網(wǎng)的過(guò)程,是通過(guò)鏈接在不同網(wǎng)站之間無(wú)縫跳轉(zhuǎn)的過(guò)程。

          但在移動(dòng)互聯(lián)網(wǎng)上,App 之間是割裂的,它們之間幾乎沒(méi)有跳轉(zhuǎn)關(guān)系。僅有的一些鏈接應(yīng)用的場(chǎng)景,也遇到了各種商業(yè)競(jìng)爭(zhēng)導(dǎo)致的干擾,中文有微信和支付寶互相干擾對(duì)方的鏈接跳轉(zhuǎn);英文有 Twitter 阻斷Instagram鏈接;Facebook/Whatsapp 阻斷 Telegram 鏈接。

          在移動(dòng)互聯(lián)網(wǎng)上,不同品牌之間關(guān)系是對(duì)抗,而不是桌面互聯(lián)網(wǎng)的合作,當(dāng)人們開(kāi)始使用這種以 App 為核心的系統(tǒng)的時(shí)候,桌面互聯(lián)網(wǎng)的核心,瀏覽器/HTML/URL 就已經(jīng)死了一半了。

          這到底是怎么發(fā)生的?

          移動(dòng)互聯(lián)網(wǎng)和桌面互聯(lián)網(wǎng)都叫做被叫做“互聯(lián)網(wǎng)”,這是一個(gè)非常具有迷惑性的說(shuō)法,它使得人們下意識(shí)認(rèn)為移動(dòng)互聯(lián)網(wǎng)是傳統(tǒng)互聯(lián)網(wǎng)的延伸。實(shí)際上不對(duì),這是一個(gè)完全不一樣的世界,應(yīng)用完全不一樣的規(guī)則。

          2010 年,中文和英文業(yè)內(nèi)同時(shí)有過(guò)一場(chǎng)大爭(zhēng)論,叫做 HTML5 和原生 App 之爭(zhēng)。爭(zhēng)論這兩個(gè)東西哪個(gè)更有未來(lái)?

          2008 年雖然蘋(píng)果已經(jīng)在 iOS 中提供了 App Store,但是實(shí)際上的快速增長(zhǎng)是從 2010 年下半年才開(kāi)始的,這場(chǎng)爭(zhēng)論不早不晚,確實(shí)是一個(gè)重要時(shí)間點(diǎn)。

          這個(gè)爭(zhēng)論的重要意義在于——它最終決定了傳統(tǒng)互聯(lián)網(wǎng)的html頁(yè)面+鏈接,以瀏覽器為中心的模式是否能生存下去。

          爭(zhēng)論的另外一方——原生 App,提供了一個(gè)完全相反的模式:它沒(méi)有頁(yè)面,沒(méi)有鏈接,數(shù)據(jù)被封閉在 App 之內(nèi)形成孤島,以傳統(tǒng)互聯(lián)網(wǎng)擁護(hù)者看來(lái),這是歷史的倒退。我們本來(lái)就是從數(shù)據(jù)封閉在每個(gè)軟件之內(nèi)的時(shí)代走向的頁(yè)面+鏈接的互聯(lián)網(wǎng)時(shí)代,怎么突然就要倒退回去了?

          事實(shí)證明了人們接受了App,拋棄了 HTML 和瀏覽器。

          App Store 里面,幾乎沒(méi)有什么 App 是顯式表達(dá)鏈接存在的。雖然數(shù)據(jù)在 RESTful API 這一層仍然以鏈接形式存在,但是從 App 這個(gè)入口內(nèi),通常沒(méi)有輸入鏈接的地方。

          想把 App 中看到的東西分享給朋友,如果這個(gè) App 本身沒(méi)提供分享功能,幾乎是沒(méi)辦法的,只有截圖一條路。

          雖然后期 iOS 提供了一系列分享相關(guān)的 API,但是這種模式就決定了,URL 所代表的“唯一定位符”,“每一個(gè)唯一的資源對(duì)應(yīng)一個(gè)URL”這種模式在app的世界里已經(jīng)消失了,HTML 和 App 之爭(zhēng)也很快就結(jié)束了。

          2012 年,曾經(jīng)擁護(hù) HTML5 的 Facebook 投降認(rèn)輸,重新開(kāi)發(fā)原生 App,最終在后面的幾年里一路猛漲成為了中文世界之外的巨頭。

          2014 年,F(xiàn)acebook 收購(gòu)了聊天工具 Whatsapp,人們相當(dāng)恐慌,所有的數(shù)據(jù)都集中在一個(gè)巨頭手里這還了得?少部分人轉(zhuǎn)投 Telegram,這個(gè)事件在 Telegram 用戶增長(zhǎng)歷史曲線圖上清晰可見(jiàn),是早期 Telegram 獲得的最大一波用戶增長(zhǎng)。

          人們的擔(dān)心是有道理的,在 PC 互聯(lián)網(wǎng)上,廠商獲取的信息少很多,那個(gè)時(shí)代最準(zhǔn)確的廣告投放方式是 ——Google 提供的基于關(guān)鍵詞的廣告,因?yàn)樗阉麝P(guān)鍵詞透露了用戶明確的意圖。

          但移動(dòng)時(shí)代到來(lái)之后,通過(guò) App 獲取的用戶數(shù)據(jù)種類(lèi)就多得太多了。

          同樣也是 2014 年, Facebook 發(fā)布了跨應(yīng)用廣告網(wǎng)絡(luò),號(hào)稱可以跨越應(yīng)用,從網(wǎng)站到手機(jī) App 來(lái)統(tǒng)一完成用戶畫(huà)像。2012 年Facebook 收購(gòu)的照片應(yīng)用 Instagram,使得 Facebook 在移動(dòng)平臺(tái)上可以獲得更多的用戶和數(shù)據(jù),其他廠商沒(méi)有這種優(yōu)勢(shì)。

          (Telegram Geek 網(wǎng)站做的用戶歷史數(shù)量統(tǒng)計(jì)圖,注意 2014 年 4 月份的用戶數(shù)量,2 月份的時(shí)候 Whatsapp 被收購(gòu))

          之后 Facebook 逐年增長(zhǎng)的廣告收入告訴了其他廠商,這樣做是對(duì)的。

          社交關(guān)系+最大限度獲取用戶日?;钴S數(shù)據(jù),最終可以轉(zhuǎn)換成巨額廣告收入。

          于是所有廠商都沿用這個(gè)模式,用盡辦法去獲取能獲取的每一條用戶信息,無(wú)論是否之前被認(rèn)為是用戶隱私。由此帶來(lái)的一系列“應(yīng)用濫用權(quán)限”,是最終用戶能感受到的表面現(xiàn)象。背后的原因——就是這個(gè)盡量多的獲取數(shù)據(jù),轉(zhuǎn)換成廣告盈利的模式相當(dāng)有效。

          到了這兩年,廣告網(wǎng)絡(luò)已經(jīng)準(zhǔn)確到前所未有的狀況,某些情況下已經(jīng)不是廣告追著人走,而是廣告先于人一步出現(xiàn)。這一套用戶畫(huà)像模式威力巨大,不僅可以準(zhǔn)確投放商業(yè)廣告,還可以投放政治宣傳,最終影響人的社會(huì)行為。

          Facebook 數(shù)據(jù)泄漏影響了美國(guó)大選,這不是競(jìng)選失敗的一方找理由,這就是真實(shí)發(fā)生的情況。同樣的道理,廣告準(zhǔn)確到這種程度的時(shí)候,普通用戶已經(jīng)難以理解背后發(fā)生了什么,干脆按照奧卡姆剃刀原則,找了一個(gè)最簡(jiǎn)單的解釋:這些科技廠商在監(jiān)聽(tīng)我。

          不采用這一套模式的移動(dòng)互聯(lián)網(wǎng)產(chǎn)品,差不多都死了。

          今天流行的這些 App,無(wú)論是 Facebook/Instagram,還是中國(guó)的微信/微博/頭條/抖音/快手…都有一個(gè)共同的形容詞——“刷的停不下來(lái)”。

          這種停不下來(lái)的背后,是這些 App 吞噬了用戶的使用時(shí)長(zhǎng)。在手機(jī)的小屏幕上,通常情況 App 之間是零和競(jìng)爭(zhēng),被這個(gè) App 搶走了,別的 App 就沒(méi)了。于是拿走用戶數(shù)據(jù)越多,越準(zhǔn)確的 App 就會(huì)占領(lǐng)更多的時(shí)間,獲得更多的盈利同時(shí)順便擠死對(duì)手。這里不再有互相鏈接的互聯(lián)網(wǎng)了,每個(gè) App 本身就是世界的一部分。

          如果回到 2010 年,回到 HTML5 和 App 之爭(zhēng)的時(shí)間點(diǎn)看,還有其他可能性嗎?其實(shí)仍然是有的。

          2012 年 Facebook 宣布放棄 HTML5 App 的時(shí)候,說(shuō)過(guò)理由:“瀏覽器性能太差了,無(wú)法負(fù)擔(dān)應(yīng)用的需要,并且還說(shuō)了希望各廠商改進(jìn)瀏覽器?!?/strong>

          理想情況下瀏覽器廠商會(huì)競(jìng)爭(zhēng),推出性能更好的瀏覽器。但現(xiàn)實(shí)情況很悲慘,蘋(píng)果很長(zhǎng)一段時(shí)間內(nèi) iOS 系統(tǒng)上不允許使用其他瀏覽器內(nèi)核,必須只能使用 iOS 自帶的 Webkit 內(nèi)核和js解析器,并且在 iOS9 之前第三方瀏覽器不能使用 JIT 引擎,所以效率永遠(yuǎn)比 Safari 低一個(gè)級(jí)別。

          后來(lái)這種限制稍微放寬了一點(diǎn),性能上可以和 Safari 一樣了,但安全模型仍然不同,功能上還有很多限制。這些限制都導(dǎo)致了第三方瀏覽器不可能在 iOS 平臺(tái)上有所做為,只能跟著蘋(píng)果緩慢殘缺的步驟走。

          盡管在 P C市場(chǎng)上 Chrome 高效的 V8 引擎已經(jīng)徹底改變了瀏覽器市場(chǎng)的局面,使得一系列 W3C 標(biāo)準(zhǔn)可以落實(shí)被用戶使用,但在 iOS 上仍然是沒(méi)有辦法的。

          當(dāng)然,Chrome 還是接受了這種羞辱,在 iOS 上使用和 Safari 一樣的內(nèi)核,受更多的限制。但是即使如此,Chrome仍然表現(xiàn)比 Safari 更出色。

          憑借對(duì)Google相關(guān)服務(wù)支持更好,勉強(qiáng)也在 iOS 上獲得了足夠的用戶。但是其他獨(dú)立瀏覽器廠商,比如:Firefox可就悲慘了,蘋(píng)果即使后來(lái)放寬了這個(gè)限制,也只允許使用WebKit 內(nèi)核,不允許使用 Firefox 自己的內(nèi)核,F(xiàn)irefox就沒(méi)存在價(jià)值了。

          當(dāng)然過(guò)了很多年,F(xiàn)irefox 也上了一個(gè)使用 WebKit 內(nèi)核的版本,勉強(qiáng)在 iOS 上占了個(gè)位置,但這有什么用呢?

          在 Android 和 PC 上,F(xiàn)irefox的獨(dú)立引擎性能是能和 Chrome 這種怪物抗衡的,在 iOS 上不存在性能的競(jìng)爭(zhēng),大家都受一樣的限制。存在一個(gè)獨(dú)立的瀏覽器引擎,可以保證整個(gè)行業(yè)是中立和標(biāo)準(zhǔn)的。

          Firefox 標(biāo)準(zhǔn)化的更好,在瀏覽器里面加入廠商專有內(nèi)容的動(dòng)力更小,考慮到微軟專屬的 IE4 曾經(jīng)如何拖累了整個(gè)行業(yè),保持Firefox獨(dú)立瀏覽器占據(jù)足夠的份額,是保持整個(gè)互聯(lián)網(wǎng)世界開(kāi)放的重要基礎(chǔ)。

          很難說(shuō)蘋(píng)果刻意殺死了瀏覽器廠商,但客觀上,蘋(píng)果的限制,以及很長(zhǎng)時(shí)間內(nèi) iOS 自帶的 webkit 內(nèi)核和 JS 引擎效率低下(比同時(shí)期 Chrome 內(nèi)核低幾個(gè)數(shù)量級(jí)),使得 HTML5 App 難以獲得流暢的用戶體驗(yàn),最終結(jié)果就是導(dǎo)致 HTML 在移動(dòng)平臺(tái)應(yīng)用競(jìng)爭(zhēng)中失敗,Web App 成了一個(gè)不可行的想法。

          蘋(píng)果確立了以 App 和 App Store 分發(fā)為基礎(chǔ)的移動(dòng)設(shè)備事實(shí)上的標(biāo)準(zhǔn),其他廠商也都紛紛跟進(jìn),再也沒(méi)有人想在移動(dòng)設(shè)備上復(fù)制更開(kāi)放的傳統(tǒng)互聯(lián)網(wǎng)了。

          獨(dú)立瀏覽器引擎只剩下了Firefox憑借龐大的歷史積累的粉絲群體,勉強(qiáng)抗到了今天。

          2013 年,我在給紐約時(shí)報(bào)做技術(shù)顧問(wèn)的時(shí)候,曾經(jīng)和他們討論過(guò),是否可以以 Web App 做為移動(dòng)設(shè)備的核心?

          因?yàn)楸娝苤脑?,大家都心知肚明它?App 必然沒(méi)法在中國(guó)地區(qū)通過(guò) App Store 分發(fā),當(dāng)時(shí) ft.com 主推 Web,在瀏覽器里面實(shí)現(xiàn)全部功能(2011 年 FT 和蘋(píng)果因?yàn)橛嗛営脩舭l(fā)生了糾紛,就此 FT 放棄原生 App,有點(diǎn)類(lèi)似公眾號(hào)打賞分成之爭(zhēng)),但再三比較之后,我們最后還是在 Web 和 App 之間選擇了App。

          原因和 Facebook 一樣,Web 應(yīng)用難以滿足需求。

          這件事最尷尬的地方在于:Android 上瀏覽器體驗(yàn)不錯(cuò),有好的多性能也高的多的瀏覽器。但 Android 上分發(fā) App 限制不大,就算不通過(guò) Store 分發(fā),仍然可以自己下載 apk 安裝,這種情況下如果不是為了情懷,傾向 Web App 的動(dòng)力不足。

          iOS 上只能通過(guò) Store 分發(fā),在這里使用 Web App 可以繞開(kāi)分發(fā)的限制,但同時(shí)瀏覽器體驗(yàn)非常差,幾乎是不可用的,開(kāi)發(fā) Web App意義不大。

          (ft.com 還一直維護(hù)著一個(gè)如何開(kāi)發(fā) HTML5 web app 的教程…可惜沒(méi)多少人真的和他們一樣這樣做)

          Web app 有沒(méi)有成功的可能性?

          到了最近微信倒是給出了一個(gè)證據(jù):微信小程序就是HTML5 app。歷史繞了一圈之后,它在另外一個(gè)巨頭的圍墻內(nèi)復(fù)活了……

          盡管微信小程序的模式,仍然是需要審核上架的 Store模式。但是,它畢竟是 HTML5 App,這足以說(shuō)明如果有合適的條件,HTML5 App 曾經(jīng)是有可能戰(zhàn)勝原生 App 的。如果 HTML5 勝利了,今天的移動(dòng)互聯(lián)網(wǎng),理應(yīng)比我們現(xiàn)在看到的開(kāi)放的多。

          和前面所說(shuō)的移動(dòng)互聯(lián)網(wǎng)殺死聊天協(xié)議,最終導(dǎo)致改變了人類(lèi)社會(huì)一樣。以蘋(píng)果為主要推動(dòng)者的移動(dòng)互聯(lián)網(wǎng),嚴(yán)重傾斜于 App 模式,有意或無(wú)意的使得基于頁(yè)面和鏈接的傳統(tǒng)互聯(lián)網(wǎng)模式,在移動(dòng)平臺(tái)上消亡,從而推動(dòng)了收集更多數(shù)據(jù)的廣告商業(yè)模式發(fā)展,形成了幾大超級(jí) App。在吞噬傳統(tǒng)互聯(lián)網(wǎng)的同時(shí),也順便改變了人類(lèi)社會(huì)。

          互聯(lián)網(wǎng)到移動(dòng)互聯(lián)網(wǎng)的發(fā)展歷史,就是人類(lèi)社會(huì)放棄隱私的歷史。安全、方便、隱私、體驗(yàn)這些概念本身都是沖突的,這些年互聯(lián)網(wǎng)的發(fā)展,是充分使用了人類(lèi)“懶惰”(此處無(wú)貶義)這種特質(zhì),形成了今天這樣的商業(yè)模式,這是人類(lèi)與生俱來(lái)的特征,難以被打破。

          前面說(shuō)了很多蘋(píng)果在這個(gè)過(guò)程中起到的作用,但這并不是蘋(píng)果的錯(cuò),蘋(píng)果所有的做法在那個(gè)時(shí)代都是正確的,這些辦法綜合起來(lái)讓體驗(yàn)和耗電量達(dá)到了平衡,使得移動(dòng)設(shè)備變得可用。

          Push 喚醒 App、力推 App 模式打壓瀏覽器、殺死 Flash…如果沒(méi)有這些極端的辦法,我們到今天可能還在使用黑莓,移動(dòng)互聯(lián)網(wǎng)時(shí)代也難以開(kāi)啟。

          整個(gè)過(guò)程中,Android 雖然更加開(kāi)放,但在開(kāi)始的幾年里面 Android 性能和體驗(yàn)慘不忍睹,用戶和整個(gè)行業(yè)一起站在了蘋(píng)果模式這邊。

          我們現(xiàn)在看到的更封閉,更集中的移動(dòng)互聯(lián)網(wǎng)世界,是人們自己選擇的結(jié)果。

          歷史一次又一次證明了,人們?cè)诜奖愫碗[私之間,大多數(shù)人會(huì)選擇方便。李彥宏說(shuō)的中國(guó)人會(huì)如此選擇,這有點(diǎn)片面了,事實(shí)證明全世界人都會(huì)這么選。

          不信你看,這邊 Facebook 鬧出這么大風(fēng)波,另外一邊各種智能音箱的銷(xiāo)量還在上漲,似乎沒(méi)人覺(jué)得有問(wèn)題。智能音箱就是一種出賣(mài)更多隱私,換取一點(diǎn)點(diǎn)方便的產(chǎn)品。

          我不否認(rèn)市場(chǎng)上存在非常注意保護(hù)隱私的語(yǔ)音助理類(lèi)設(shè)備和軟件,但無(wú)論廠商多注意隱私保護(hù),它為了換取方便而導(dǎo)致了更多用戶數(shù)據(jù)離開(kāi)自己的控制,這是毫無(wú)疑問(wèn)的,人們不在乎。

          2010年是移動(dòng)互聯(lián)網(wǎng)興起的年代,可惜實(shí)際結(jié)果是把互聯(lián)網(wǎng)切成了幾個(gè)小塊。2010 年同時(shí)還是比特幣興起的年代,那個(gè)時(shí)候它開(kāi)始脫離創(chuàng)始人的那個(gè)小圈子,被更多普通人所知,但仍然沒(méi)引起廣泛注意。

          但到了最近,區(qū)塊鏈的熱潮已經(jīng)難以阻擋了,即使最近幣價(jià)下跌不少,仍然是不可阻擋的熱潮。

          區(qū)塊鏈?zhǔn)沁@些年來(lái)除了BT 下載之外應(yīng)用最廣泛的分布式應(yīng)用,在幾年之前,所有 P2P 系統(tǒng)都難逃被冠以“黑暗”,“犯罪”之名,很難成為大眾話題,更難以讓普通人嘗試。但區(qū)塊鏈通過(guò)資產(chǎn)增值的預(yù)期竟然做到了這一點(diǎn),人們開(kāi)始談?wù)撍?、嘗試它,并且親身投入這個(gè)領(lǐng)域。

          盡管這個(gè)領(lǐng)域仍然非常早期,充滿了風(fēng)險(xiǎn),但也必須看到另外一個(gè)角度,它帶來(lái)了前所未有的變化。

          在一個(gè)人們?nèi)绱嗽诤醍a(chǎn)品體驗(yàn)的時(shí)代,區(qū)塊鏈應(yīng)用使得人們?cè)敢鈬L試和接受各種非常早期、不成熟的產(chǎn)品,重新開(kāi)啟了競(jìng)爭(zhēng),這就是未來(lái)的希望所在。

          作者:霍炬,科技 blogger,連續(xù)創(chuàng)業(yè)者,技術(shù)愛(ài)好者,有一個(gè)公眾帳號(hào) “歪理邪說(shuō)”(ID:wxieshuo)。

          者按:高可用架構(gòu)分享及傳播在架構(gòu)領(lǐng)域具有典型意義的文章,本文由桑世龍?jiān)诟呖捎眉軜?gòu)群分享。轉(zhuǎn)載請(qǐng)注明來(lái)自高可用架構(gòu)公眾號(hào)「 ArchNotes 」。

          桑世龍,天津空弦科技 CTO,開(kāi)源項(xiàng)目 Moajs 作者,Node.js 技術(shù)傳道者。曾就職在新浪、網(wǎng)秦,曾做過(guò)前端、后端、數(shù)據(jù)分析、移動(dòng)端負(fù)責(zé)人、做過(guò)首席架構(gòu)師、技術(shù)總監(jiān),全棧技術(shù)實(shí)踐者。目前主要關(guān)注技術(shù)架構(gòu)和團(tuán)隊(duì)梯隊(duì)建設(shè)方向。

          “JavaScript 是世界上使用最廣泛的語(yǔ)言,沒(méi)有之一,包括后端開(kāi)發(fā)工程師也更愛(ài)使用 JavaScript?!?——stackoverflow

          Node.js 全球現(xiàn)狀

          雖然 Node.js 在國(guó)內(nèi)沒(méi)有盛行,但據(jù) StackOverflow 2016 年開(kāi)發(fā)者調(diào)查,其中 Node.js 、全棧、JavaScript 相關(guān)的技術(shù)在多個(gè)領(lǐng)域(包括全棧、后端)都有排名領(lǐng)先。

          (http://stackoverflow.com/research/developer-survey-2016)

          后端分布

          (http://stackoverflow.com/research/developer-survey-2016)

          Node.js 與生俱來(lái)的 2 個(gè)特性:

          • event-driven

          • non-blocking I/O

          以前總強(qiáng)調(diào)的異步特性,到今天異步已經(jīng)不是明顯優(yōu)勢(shì)。因此除了性能,其他都是?。ú蛔悖??

          1、Callback hell 問(wèn)題

          目前已經(jīng)很好的解決了。promise / generator / async 后面會(huì)講。

          2、包管理

          npm 已經(jīng)是開(kāi)源世界里最大的包管理器了,模塊非常豐富(25.6萬(wàn) )。

          Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

          以前我們總是喜歡拿異步說(shuō)事兒,現(xiàn)在我們拿 Node.js 的強(qiáng)大的生態(tài)來(lái)炫耀。

          為什么選擇 Node.js?

          空弦科技做的是基于云倉(cāng)儲(chǔ)的 SaaS 服務(wù),給中小賣(mài)家提供服務(wù),核心系統(tǒng)是進(jìn)銷(xiāo)存、訂單池、WMS。

          先看一下我們的瓶頸在哪里

          • 人(天津不好招人)。Node.js 招不到,好多都是從 Java 轉(zhuǎn)的,前端也不好找,好多也是從 Java 轉(zhuǎn)的,我們相當(dāng)于從 0 開(kāi)始組建團(tuán)隊(duì)

          • 開(kāi)發(fā)速度。創(chuàng)業(yè)公司 5 分鐘要造火箭,大家都懂。所以讓開(kāi)發(fā)快速進(jìn)入狀態(tài),提高開(kāi)發(fā)速度,對(duì)我們來(lái)說(shuō)至關(guān)重要。

          • 穩(wěn)定。在沒(méi)有專業(yè)運(yùn)維人員的情況下,如何保證系統(tǒng)可用、穩(wěn)定。

          于是就引出了我認(rèn)為的Node.js 好處

          • 同樣不優(yōu)化,性能比大部分語(yǔ)言好。即使優(yōu)化,也比其他語(yǔ)言簡(jiǎn)單,比如Java。

          • 有足夠多的選擇和架構(gòu)的平衡。

          • 如實(shí)在不夠,Java 補(bǔ)。

          Node.js 給了我們足夠的選擇工具

          • 可以采用面向過(guò)程

          • 可以面向?qū)ο?/p>

          • 可以函數(shù)式

          甚至可以用各種編譯器 coffee、typescript、babel(es)等。對(duì)于從 0 開(kāi)始的團(tuán)隊(duì)來(lái)講,可以先面向過(guò)程、然后隨著團(tuán)隊(duì)的成熟度,一點(diǎn)一點(diǎn)增加難度。

          提供好的基礎(chǔ)和包管理工具

          • 測(cè)試相關(guān) tdd / bdd 測(cè)試覆蓋率

          • 規(guī)范化 standard、各種 lint、hint

          • 構(gòu)建相關(guān) gulp、grunt、webpack,大量插件

          • 生成器 yo 等

          • 包管理工具 npm 足夠簡(jiǎn)單易用

          以上這些都做大型軟件的基礎(chǔ),Node.js 在這方面做得非常好

          特定場(chǎng)景的快速

          很多人把 MEAN 組合(比如 mean.io)起來(lái),這樣做的好處是如果熟悉,開(kāi)發(fā)速度確實(shí)會(huì)非???,但是難度太大,很少有人能搞的定。metetor 模糊了服務(wù)端和客戶端,是同構(gòu)的典型應(yīng)用,對(duì)于實(shí)時(shí)場(chǎng)景是非常高效的。這種東西都算特定場(chǎng)景的快速,一般不敢輕易上,調(diào)優(yōu)難度非常大,如果有人能 cover 的住,在初期是非常高效的。

          總結(jié)需求:可以簡(jiǎn)單,可以難;可以快、也可以慢;可以開(kāi)發(fā)大型軟件

          如果以上不滿足咋辦?這時(shí)就需要架構(gòu)平衡了。

          架構(gòu)平衡

          在架構(gòu)中各自做各自合適的事兒就好,我們很坦然的面對(duì) Node.js 的優(yōu)點(diǎn)和缺點(diǎn),做好架構(gòu)平衡。

          1、在語(yǔ)言層面可以做,那語(yǔ)言層面做

          • 已有大量 npm 上的模塊 ( 目前在 25.6 萬(wàn)個(gè)以上 )

          • 自己造輪子 ( 站在海量包上 簡(jiǎn)單語(yǔ)法 npm = 快速 )

          • 使用 Node.js 里的 (nan https://github.com/nodejs/nan)自己包裝 C/C++ 輪子

          從上面看,絕大部分需求都可以滿足了

          2、如果語(yǔ)言層面搞不定,那就架構(gòu)層面做

          • 業(yè)務(wù)邊界、模塊拆分、面向服務(wù)

          • MQ、RPC、cache

          • 運(yùn)維、監(jiān)控、自動(dòng)化

          稍微解釋一下,首先,架構(gòu)與 Node.js 沒(méi)直接關(guān)系。其次,架構(gòu)師常用的東東有足夠的 Node.js 模塊支持,比如 MQ,像 Rabbitmq 有比較好的 Node 模塊支持,RPC 里 Thrift、Grpc、Tchannel 支持的都不錯(cuò),我們使用的 senecajs,Redis,ioredis 等軟件,后面做 HA 都是一樣的。

          3、如果架構(gòu)層面也解決不了……

          合適的場(chǎng)景用合適的東西。有很多東西是 Node.js 不擅長(zhǎng),又不在架構(gòu)范疇里的,咋辦?如實(shí)在不夠,Java 補(bǔ)(嚴(yán)格點(diǎn),應(yīng)該叫其他語(yǔ)言補(bǔ))

          • 比如復(fù)雜 excel 生成

          • 比如 apns 推送(Go 做其實(shí)也很好,不過(guò)除了我,沒(méi)人能維護(hù))

          但凡是 Java 或其他語(yǔ)言里比較成熟的庫(kù),可以作為獨(dú)立服務(wù)使用的,都可以做 Node.js 的支持。避免過(guò)多的時(shí)間用在造輪子上,影響開(kāi)發(fā)進(jìn)度。

          4、Node.js 優(yōu)劣分析

          • 執(zhí)行效率,同樣不優(yōu)化,性能比大部分語(yǔ)言好。

          • 開(kāi)發(fā)效率,Node.js 本身比較簡(jiǎn)單,開(kāi)發(fā)效率還是比較高的。完善的生態(tài),比如測(cè)試、工具、npm 大量模塊。

          • 缺少 Rails 一樣的大殺器,scaffold 腳手架,ORM 太弱。

          Node.js 的 Web 開(kāi)發(fā)框架 Express、Koa 等,簡(jiǎn)單,小巧,精致,缺點(diǎn)是集成度不夠,目前已有的 MEAN 或 yo 或 sails 等總有某種方面的不滿意

          團(tuán)隊(duì) Node.js 使用現(xiàn)狀

          選擇 Node.js 我們需要做的包括:固化項(xiàng)目結(jié)構(gòu);限定 ORM;自定義腳手架。

          由于 Node.js 已經(jīng)提供以下特性,因此你可以在 30 分鐘完成一個(gè)腳手架。

          • cli 命令模塊,編寫(xiě)非常容易

          • 基于 JavaScript的模板引擎(知名的 30 )

          我們用Node.js做什么?

          • API服務(wù)

          • 前端(moa-frontend)

          • SDK(OAuth Provider)

          • 輔助開(kāi)發(fā) cli 工具

          目前進(jìn)度

          • 使用 0.10.38,開(kāi)發(fā) Moajs 框架,Express / MongoDB

          • pm2 部署,前后端分離,阿里云的 slb 負(fù)載,alinode 監(jiān)控

          • moa-api,moa-frontend,moa-h5 (未能用)

          • 使用 Redis 緩存,Rabbitmq,senaca 作為 RPC

          一些正在建設(shè)的方面

          • 使用 kong 作為 API gateway

          • consul 做服務(wù)發(fā)現(xiàn)和配置

          • 上 elk 作為日志分析處理

          • 使用 docker compose 作為本地開(kāi)發(fā)環(huán)境

          • 線上 docker

          打算進(jìn)行技術(shù)棧更新,包括Nodejs 4.x(預(yù)計(jì)今年 6 月份;Koa(generator/co);es6/es7 ( babel )。

          4.x 在內(nèi)存和性能上都有非常大的提升,新的語(yǔ)言特性上,異步流程和語(yǔ)法上都需要學(xué)習(xí),故不急于升級(jí),待人才梯隊(duì)完善。

          目前的做法是小步快走,一次只上一樣新技術(shù);另外形成梯隊(duì),即可準(zhǔn)備上新東西;善用 npm,實(shí)現(xiàn) 3 化:模塊化、最小化、服務(wù)化

          為什么選擇 MEAN 架構(gòu)

          MEAN 架構(gòu)

          MEAN 是目前最潮的全棧 JavaScript架構(gòu)。MEAN 是一個(gè) JavaScript平臺(tái)的現(xiàn)代 Web 開(kāi)發(fā)框架總稱,它是 MongoDB Express AngularJS Node.js 四個(gè)框架的第一個(gè)字母組合。它與傳統(tǒng) LAMP 一樣是一種全套開(kāi)發(fā)工具的簡(jiǎn)稱。

          從我的角度看

          • MySQL 用 MongoDB 替換,NoSQL 里最像 rdbms 的,從開(kāi)發(fā)和性能都是有優(yōu)勢(shì)的(參看老畢在高可用架構(gòu)群分享文章:MongoDB 2015回顧:全新里程碑式的WiredTiger存儲(chǔ)引擎)。

          • Angular 的出現(xiàn)是一個(gè)時(shí)代,IoC,雙向綁定,指令等都曾讓無(wú)數(shù)熱血沸騰。

          • Node.js 提供了完全的生態(tài)和工具鏈,你要的它基本都有,感謝 npm,早些年 Node.js 的性能甩 php 幾條街的。

          • Express 作為 Node.js 示范項(xiàng)目,它非常精簡(jiǎn),是比較合適的 Web 框架

          我為什么選擇 MEAN 架構(gòu)?

          • 成熟、穩(wěn)定,簡(jiǎn)單,有問(wèn)題我們能 cover 住,所以我們選了 Node.js。

          • 把握趨勢(shì),以后 Node.js 的前景非??春?,尤其前后端統(tǒng)一,全棧方向。

          • 在架構(gòu)上可以屏蔽可能風(fēng)險(xiǎn),不孤注一擲,也不會(huì)一葉障目,合理的使用其他語(yǔ)言,只要每個(gè)功能都以服務(wù)出現(xiàn),至于它是什么語(yǔ)言寫(xiě)的,并不重要。

          • 招人成本的性價(jià)比相對(duì)較高,技術(shù)棧新,容易吸引人才。

          最重要的一件事兒,是當(dāng)有問(wèn)題的時(shí)候,有人能 cover 住,在創(chuàng)業(yè)初期這是最最重要的事兒。

          Node.js最新Web技術(shù)棧

          https://cnodejs.org/topic/55651bf07d4c64752effb4b1

          Node.js 異步流程

          異步流程控制

          JavaScript流程控制的演進(jìn)過(guò)程,分以下 5 部分:

          • 回調(diào)函數(shù)Callbacks

          • 異步JavaScript

          • Promise / a+ 規(guī)范

          • 生成器Generators/ yield ( es6 )

          • Async/ await ( es7 )

          • 目前所有版本都支持 Promise / a+ 規(guī)范

          • 目前 Node.js 4.0 支持 Generators/ yield

          • 目前不支持 es7 里的 Async/await,但可以通過(guò) babel 實(shí)現(xiàn)

          整體來(lái)說(shuō),對(duì)異步流程控制解決的還是比較好的。

          Node.js 最新技術(shù)棧之 Promise 篇

          https://cnodejs.org/topic/560dbc826a1ed28204a1e7de

          快速開(kāi)發(fā)實(shí)踐

          業(yè)務(wù)邊界優(yōu)化

          創(chuàng)業(yè)公司有很多可變性,要做的系統(tǒng)也無(wú)數(shù),如何保證業(yè)務(wù)系統(tǒng)的邊界是非常難的,我們其實(shí)走了很多彎路。

          靜態(tài) API 理論

          當(dāng)需求和 UE 定下來(lái)之后,就開(kāi)始編寫(xiě)靜態(tài) API,這樣 APP、H5、前端就可以使用靜態(tài) API 完成功能,而后端也可以以靜態(tài) API 為標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn),整體效率還是比較高的。

          API 的最佳實(shí)踐

          http://developer.github.com/v3/ (嚴(yán)格的restful)

          微博 API (可讀性強(qiáng),相對(duì)比較傳統(tǒng)),我們采用的微博 API 類(lèi)似的,約定結(jié)構(gòu)也是類(lèi)似的。

          res.api is an express middleware for render json api , it convention over api format like this :

          {

          data : {},

          status: {

          code : x,

          msg : ‘some message’

          }

          }

          客戶端 API 開(kāi)發(fā)總結(jié)

          https://cnodejs.org/topic/552b3b9382388cec50cf6d95

          約定結(jié)構(gòu)

          和 Java 開(kāi)發(fā)里的目錄結(jié)構(gòu)類(lèi)似,該分層的分層,適當(dāng)?shù)陌凑?Express/Koa 增加中間件、路由等目錄,便于開(kāi)發(fā)。

          使用 npm 模塊化

          • 使用 npmjs 的 private 私有模塊(目前做法)

          • 使用 npm 的本地模塊開(kāi)發(fā)方法(測(cè)試和部署都非常快)

          • 搭建 npm 私服(todo)

          編寫(xiě)生成器

          在 Web 開(kāi)發(fā)里,寫(xiě)了 Moajs 生成器,類(lèi)似于 rails

          moag order name:string password:string

          其他開(kāi)發(fā),如 iOS 開(kāi)發(fā)里模型校驗(yàn)非常煩,于是寫(xiě)了一個(gè) json2objc 命令行工具,讀取 json,生成 oc 代碼,可以節(jié)省不少時(shí)間

          Moajs 框架和前后端分離

          • 前端 (moa-frontend https://github.com/moajs/moa-frontend)

          • public下面的采用 Nginx 做反向代理

          • 其他的采用 Express Jade 精簡(jiǎn)代碼(ajax與后端交互)

          • 后端(moa-api https://github.com/moajs/moa-api)

          moa 生成器,即上面講的生成器 scaffold。

          moa-frontend技術(shù)棧:Express /Jade /bootstrap、bootstrap-table /jQuery /gulp /Nginx

          moa-api技術(shù)棧:

          • base2(mirco kernel) https://github.com/base-n/base2-core

          • mongoose https://github.com/Automattic/mongoose

          • bluebird https://github.com/petkaantonov/bluebird

          • res.api https://github.com/moajs/res.api

          Features

          • 自動(dòng)加載路由,自帶用戶管理,使用 jsonwebtoken 做用戶鑒權(quán)

          • 支持 MongoDB 配置,集成 mongoosedao,快速寫(xiě) CRUD 等 dao 接口

          • 支持 migrate 測(cè)試,Mocha 測(cè)試

          • 默認(rèn)集成 res.api,便于寫(xiě)接口

          • 集成 supervisor,代碼變動(dòng),自動(dòng)重載,gulp 自動(dòng)監(jiān)控文件變動(dòng),跑測(cè)試

          • gulp routes 生成路由說(shuō)明

          • 使用 log4js 記錄日志

          從開(kāi)發(fā)效果上看,還是非??斓?,非常穩(wěn)定的。

          Moajs框架演進(jìn)之路

          https://cnodejs.org/topic/567e2388aacb6923221de469

          全棧 or 全爛 ?

          Node.js 相關(guān)工具

          • grunt/gulp/fis/webpack

          • bower/spm/npm

          • tdd/bdd cucumber/mocha

          • standard

          • babel/typescript/coffee

          前端開(kāi)發(fā)四階段

          • Html/css/js(基礎(chǔ))

          • jQuery、jQuery-ui,Extjs(曾經(jīng)流行)

          • Backbone(mvc),Angularjs、Vuejs(當(dāng)前流行)

          • React組件化(未來(lái)趨勢(shì))、Vuejs

          Vuejs 綜合 Angular 和 React 的優(yōu)點(diǎn),應(yīng)該是下一個(gè)流行趨勢(shì)。

          Hybrid 開(kāi)發(fā)

          Hybrid 混搭開(kāi)發(fā)是指使用 H5 技術(shù)開(kāi)發(fā)的跨瀏覽器應(yīng)用,并最終可以將 html5/js/css 等打包成 apk 和 ipa 包的開(kāi)發(fā)方式。它也可以上傳到應(yīng)用商店,提供給移動(dòng)設(shè)備進(jìn)行安裝。它最大的好處是通過(guò) H5 開(kāi)發(fā)一次,就可以在多個(gè)平臺(tái)上安裝。

          未來(lái)將會(huì)是JavaScript一統(tǒng)天下(Node.js 做后端,傳統(tǒng) Web 和 H5 使用 Javasctipt,更智能的工具如 gulp,更簡(jiǎn)單的寫(xiě)法如 coffeescript 等)。H5 大行其道(網(wǎng)速變快,硬件內(nèi)存增長(zhǎng))。

          跨平臺(tái)

          C/S 架構(gòu)到 B/S 架構(gòu),這個(gè)大部分都清楚,不多說(shuō)。

          移動(dòng)端加殼,在瀏覽器上做文章,把頁(yè)面生成各個(gè)移動(dòng)端的 app 文件。

          PC 端加殼,一樣是延續(xù)瀏覽器做文章,不過(guò)這次把頁(yè)面生成各個(gè) PC 平臺(tái)的可執(zhí)行文件。

          • node-webkit is renamed (NW.js https://github.com/nwjs/nw.js)

          • Electron https://github.com/atom/electron - Build cross platform desktop apps with web technologies

          目前比較火的編輯器都是基于 Electron 打包:

          • Atom https://github.com/atom/atom

          • vscode https://github.com/Microsoft/vscode

          組件化:統(tǒng)一用法

          React 的出現(xiàn)影響最大的是 JSX 的出現(xiàn),解決了長(zhǎng)久以來(lái)組件化的問(wèn)題:

          • 我們反復(fù)的折騰 JavaScript,依然無(wú)法搞定

          • 我們嘗試 OO,比如 extjs

          • 我們最終還是找個(gè)中間格式 JSX

          單純的 React 只是 view 層面的,還不足以應(yīng)用,于是又有 Redux。核心概念:Actions、Reducers 和 Store,簡(jiǎn)單點(diǎn)說(shuō)就是狀態(tài)控制,然后再結(jié)合打包加殼,變成 app 或可執(zhí)行文件。iOS、Android 上用 Cordova,PC 上使用 Electron。

          總結(jié)

          • 組件定義好(React)

          • 控制好組件之間的狀態(tài)切換(Redux)

          • 打包或加殼(Cordova or Electron)

          這部分其實(shí)組件化了前端,那么能否用這樣的思想來(lái)組件化移動(dòng)端呢?

          react-native

          https://github.com/facebook/react-native)

          A framework for building native apps with React.

          http://facebook.github.io/react-native/

          簡(jiǎn)單點(diǎn)說(shuō),就是用 React 的語(yǔ)法來(lái)組件化 iOS 或 Android SDK。它們都在告訴我們,你們以后就玩這些組件就好了,你不需要知道復(fù)雜的 SDK 是什么。

          當(dāng)下流行玩法

          Medis is a beautiful, easy-to-use Redis management application built on the modern web with Electron, React, and Redux. It’s powered by many awesome Node.js modules, especially ioredis and ssh2.

          https://github.com/luin/medis

          技術(shù)點(diǎn)

          • 使用 Node.js 模塊

          • 使用 Webpack 構(gòu)建

          • 使用 React(視圖) Redux(控制邏輯)

          • 使用 Electron 加殼打包

          親,你看到未來(lái)了么?

          如何全棧?

          講了 Node 工具,前端 4 階段,hybrid,各種跨平臺(tái),目前就是為了介紹 Node 全棧的各種可能,下面講一下如何能做到 Node 全棧?

          全棧核心,后端不會(huì)的 UI(界面相關(guān)),前端不會(huì)的 DB(業(yè)務(wù)相關(guān)),只要打通這 2 個(gè)要點(diǎn),其他就比較容易了。

          1、從后端轉(zhuǎn)

          做后端的人對(duì)數(shù)據(jù)庫(kù)是比較熟悉,無(wú)論 MongoDB,還是 Mysql、Postgres,對(duì)前端理解比較弱,會(huì)基本的Html,Css,模板引擎等比較熟悉。

          4 階段循序漸進(jìn),build 與工具齊飛,前端開(kāi)發(fā) 4 階段,我的感覺(jué)是按照順序,循序漸進(jìn)。

          • Html / Css / JavaScript(基礎(chǔ))

          • jQuery、jQuery-ui,Extjs(曾經(jīng)流行)

          • Backbone,Angularjs(當(dāng)前流行)、Vuejs

          • React(未來(lái)趨勢(shì))、Vuejs

          Vuejs 綜合 Angular 和 React 的優(yōu)點(diǎn),應(yīng)該是下一個(gè)流行趨勢(shì)

          2、從前端轉(zhuǎn)

          從前端往后端轉(zhuǎn),API 接口非常容易學(xué)會(huì),像 Express、Koa 這類(lèi)框架大部分人一周就能學(xué)會(huì),最難的是對(duì) DB、ER 模型的理解,說(shuō)直白點(diǎn),還是業(yè)務(wù)需求落地的理解

          我們來(lái)想想一般的前端有什么技能?

          • Html

          • Css(兼容瀏覽器)

          • JavaScript會(huì)點(diǎn)(可能更多的是會(huì)點(diǎn) jQuery)

          • PS切圖

          • Firebug 和 Chrome debuger會(huì)的人都不太多

          • 用過(guò)幾個(gè)框架,大部分人是僅僅會(huì)用

          • 英語(yǔ)一般

          • Svn / Git 會(huì)一點(diǎn)

          那么他們?nèi)绻朐谇岸祟I(lǐng)域做的更深有哪些難點(diǎn)呢?

          • 基礎(chǔ):OO,設(shè)計(jì)模式,命令,Shell,構(gòu)建等

          • 編程思想上的理解(MVC、IoC,規(guī)約等)

          • 區(qū)分概念

          • 外圍驗(yàn)收,如 H5 和 hybird 等

          • 追趕趨勢(shì),如何學(xué)習(xí)新東西

          以上皆是痛點(diǎn)。所以比較好的辦法:

          • 玩轉(zhuǎn) npm、gulp 這樣的前端工具類(lèi)(此時(shí)還是前端)

          • 使用 Node 做前后端分離(此時(shí)還是前端)

          • Express、Koa 這類(lèi)框架

          • Jade、ejs 等模板引擎

          • Nginx

          • 玩轉(zhuǎn)【后端】異步流程處理 promise / es6 的 ( generator | yield) / es7 ( async|await )

          • 玩轉(zhuǎn)【后端】MongoDB、Mysql 對(duì)應(yīng)的 Node 模塊

          從我們的經(jīng)驗(yàn)看,這樣是比較靠譜的。https://github.com/moajs/moa-frontend就是最簡(jiǎn)單前后端分離,里面沒(méi)有任何和 DB 相關(guān)。

          技術(shù)棧

          • Express

          • Jade

          • bootstrap,bootstrap-table

          • jQuery

          • gulp

          • Nginx

          一般的前端都非常容易學(xué)會(huì),基本 2 周就已經(jīng)非常熟練了,我的計(jì)劃是半年后,讓他們接觸【異步流程處理】和【數(shù)據(jù)庫(kù)】相關(guān)內(nèi)容,學(xué)習(xí)后端代碼,就可以全棧了

          3、從移動(dòng)端轉(zhuǎn)

          移動(dòng)端分:native 原生開(kāi)發(fā),hybrid 混搭式開(kāi)發(fā)。原生開(kāi)發(fā)就是 iOS 用 oc/swift,Android 用 Java 或 Scala 等,就算偶爾嵌入 webview,能玩 JavaScript的機(jī)會(huì)也非常好少。所以移動(dòng)端轉(zhuǎn)全棧的方法,最好是從 cordova(以前叫 phonegap)開(kāi)始做 hybrid開(kāi)發(fā)。只要關(guān)注 www 目錄里的 H5 即可,比較簡(jiǎn)單。如果 H5 不足以完成的情況下,可以編寫(xiě) cordova 插件,即通過(guò)插件讓 JavaScript調(diào)用原生s dk 里功能。cordova 的 cli 可以通過(guò) npm 安裝,學(xué)習(xí) npm 的好方法,學(xué)習(xí) gulp 構(gòu)建工具。

          只要入了 H5 的坑,其實(shí)就非常好辦了。

          • 然后 H5、Zeptojs、iScroll、fastclick 等

          • 然后微信常用的,如weui、vux(vue weui)、jmui(react weui)

          • 然后可以玩點(diǎn)框架,比如 jQuery mobile,Sencha touch

          • 然后可以玩點(diǎn)高級(jí)貨,ionicframework(基于Angularjs、cordova)

          • 然后前端 4 階段,依次打怪升級(jí)

          • 然后 Node.js

          這個(gè)基本上是我走的路,從 2010 年寫(xiě) IOS、做 phonegap(當(dāng)時(shí)是0.9.3)一路走到現(xiàn)在的總結(jié)吧。

          展望 Node.js 技術(shù)未來(lái)

          Node.js 可能是一場(chǎng)春夢(mèng),

          也可能一個(gè)變革機(jī)遇;

          我們更相信它是變革機(jī)遇,

          請(qǐng)拭目以待!

          附:Node.js 2015 發(fā)展歷史

          Q1 第一季度

          • IO.js 1.0.0 發(fā)布

          • Joyent 推進(jìn)建立 Node.js 基金會(huì)

          • Joyent,IBM,Microsoft,PayPal,F(xiàn)idelity,SAP and The Linux Foundation Join Forces to Support Node.js Community With Neutral and Open Governance

          • IO.js 和 Node.js 和解提案

          Q2 第二季度

          • npm 支持私有模塊

          • Node 項(xiàng)目領(lǐng)導(dǎo)人 TJ Fontaine 逐步解除核心身份并離開(kāi) Joyent 公司

          • A changing of the guard in Nodeland

          • Node.js 和 IO.js 在 Node 基金會(huì)下合并情況

          Q3第三季度

          • 4.0 版本發(fā)布,即新的 1.0 版本

          Q4第四季度

          • Node v4.2.0,首個(gè)長(zhǎng)期支持版本(LTS)

          • Apigee,RisingStack 和 Yahoo 加入 Node.js 基金會(huì)

          • Node Interactive

          • The first annual Node.js conference by the Node.js Foundation

          版本帝?去年從 v0.10.35 開(kāi)始

          • 2015-01-14 發(fā)布了 v1.0.0 版本(IO.js)

          • 2.x(IO.js)

          • 3.x(IO.js)

          • 2015 年 09 月 Node.js 基金會(huì)已發(fā)布 Node.js v4.0 版 與 IO.js 合并后的第一個(gè)版本

          • 2015 年 10 月 Node.js v4.2.0 將是首個(gè) LTS 長(zhǎng)期支持版本

          • 年底發(fā)布到 4.2.4 && 5.4.0

          目前(2016 年 3 月 20 日)的 2 個(gè)版本

          • v4.4.0 LTS(長(zhǎng)期支持版本)

          • v5.9.0 Stable(穩(wěn)定版本)

          整體來(lái)說(shuō)趨于穩(wěn)定。

          • 成立了 Node 基金會(huì),能夠讓 Node.js 在未來(lái)有更好的開(kāi)源社區(qū)支持。

          • 發(fā)布了 LTS 版本,意味著 API 穩(wěn)定。

          • 快速發(fā)版本,很多人吐槽這個(gè),其實(shí)換個(gè)角度看,這也是社區(qū)活躍的一個(gè)體現(xiàn),但如果大家真的看 CHANGELOG,其實(shí)都是小改進(jìn),而且是邊邊角角的改進(jìn),也就是說(shuō) Node.js 的 core(核心)已經(jīng)非常穩(wěn)定了,可以大規(guī)模

            使用。


          Node.js 企業(yè)級(jí)大事記

          Node.js 的企業(yè)級(jí)大事兒記

          2014年 nearform (NODE.JS 為什么會(huì)成為企業(yè)中的首選技術(shù)?http://www.nearform.com/nodecrunch/node-js-becoming-go-technology-enterprise/)

          2015年 IBM (收購(gòu) StrongLoop,拓展云服務(wù)業(yè)務(wù) http://www-03.ibm.com/press/us/en/pressrelease/47577.wss)

          Node.js 基金會(huì)的創(chuàng)始成員包括 Joyent、IBM、Paypal、微軟、Fidelity 和 Linux 基金會(huì)。

          對(duì)于企業(yè)級(jí)開(kāi)發(fā),Node.js 是足夠的,無(wú)論從性能、安全、穩(wěn)定性等都是非常棒的。

          空弦科技做的是基于云倉(cāng)儲(chǔ)的 SaaS 服務(wù),給中小賣(mài)家提供服務(wù),核心系統(tǒng)是進(jìn)銷(xiāo)存、訂單池、WMS。目前來(lái)看不存在任何問(wèn)題,

          es && babel

          2015 年 ECMA 國(guó)際大會(huì)宣布正式批準(zhǔn) ECMA-262 第 6 版,亦即 ECMAScript 2015(曾用名:ECMAScript 6、ES6)的語(yǔ)言規(guī)范。

          babel (http://babeljs.io/)作為 es 編譯器,已經(jīng)大量開(kāi)始使用了,模塊做的非常棒,還有人用babel寫(xiě)其他語(yǔ)言編譯器。Node.js 里在 0.12 之后才增加 es6 特性,es7 的目前還不支持。所以在 Node.js 里使用 es 里比較高級(jí)的特性,是需要 babel 去編譯處理的。這是 Node 追逐的標(biāo)準(zhǔn)。

          2016 年 01 月 22 日,(微軟請(qǐng)求 Node.js 支持 ChakraCore https://github.com/nodejs/node/pull/4765)

          未來(lái) Node.js 不只是基于 chrome v8 內(nèi)核,它還可以支持更多其他瀏覽器內(nèi)核,對(duì)生態(tài)、效率提升等非常有好處。

          蔡偉小兄弟的查克拉 benchmark 的對(duì)比(https://github.com/DavidCai1993/ES6-benchmark)基本結(jié)論是 V8 ES5 > 查克拉 ES6 > 查克拉 ES5 > V8 ES6

          Q & A

          1.在全棧的語(yǔ)言選擇上,除了 Node.js,是否還考慮過(guò)其他語(yǔ)言?

          桑世龍:有的,未來(lái) swift 和 Lua 是有可能的。swift 的語(yǔ)法和性能上有很大優(yōu)勢(shì),Lua 在 openresty 的推動(dòng)下也有機(jī)會(huì),不過(guò)沒(méi)有 swift 大。像 WebAssembly 之類(lèi)的就不太看好了。

          2.請(qǐng)教桑老師:剛才你說(shuō)的并發(fā)開(kāi)發(fā)流程中靜態(tài)API指的是API文檔?如果是的話誰(shuí)負(fù)責(zé)編寫(xiě)?你們目前已經(jīng)是一個(gè)人分模塊從前端寫(xiě)到后端了嗎?

          桑世龍:目前沒(méi)做到文檔即靜態(tài) API,所以目前是直接提供 json 和部分(json-server https://github.com/typicode/json-server),負(fù)責(zé)是后端開(kāi)發(fā)的 leader 在寫(xiě),他的進(jìn)度會(huì)比正常開(kāi)發(fā)要早一周左右。目前不是一個(gè)人寫(xiě)所有的前后端,團(tuán)隊(duì)成立不久,天津 Node.js 會(huì)的不多,所以還是前后端分離。但是通過(guò) moa-frontend 可以讓前端了解 Express 等后端知識(shí),適當(dāng)?shù)臅r(shí)候會(huì)給予機(jī)會(huì),前端轉(zhuǎn)后端。

          3.貴司在開(kāi)發(fā)協(xié)作中提到了靜態(tài) API,請(qǐng)問(wèn)是不是有什么比較好的工具可以推薦?

          桑世龍:Node.js 里(json-server https://github.com/typicode/json-server) 比較好

          我其實(shí)很想圍繞靜態(tài) API,寫(xiě)各種請(qǐng)求的生成器,只要 API 出來(lái),文檔和各平臺(tái)的 HTTP 請(qǐng)求代碼就生成出來(lái),同時(shí)可以對(duì)正式 API 進(jìn)行壓測(cè),可惜目前還沒(méi)精力寫(xiě)。

          4.做 hybrid app 在移動(dòng)端會(huì)遇到性能問(wèn)題吧,有沒(méi)有什么優(yōu)化經(jīng)驗(yàn)可以分享?

          桑世龍:足夠輕量級(jí),少選大框架,做好前端該有的優(yōu)化。注意 touch 和 click 的區(qū)別,比如 fastclick 或 Zeptojs 的 tap 手勢(shì)。Chrome profile(css3動(dòng)畫(huà))。使用 weinre 真機(jī)測(cè)試。參考:(我的 H5 實(shí)踐 http://mp.weixin.qq.com/s?__biz=MzAxMTU0NTc4Nw==&mid=222892082&idx=1&sn=ba1cdb42b43fbec08e4328c5080774e5#rd)。

          5.如果都全棧了,當(dāng)前你們團(tuán)隊(duì)是如何分工的?

          桑世龍:我們團(tuán)隊(duì)還是傾向于分工專業(yè)化,各個(gè)服務(wù)粒度非常小,便于輪崗、還有就是可以為以后像 Google 那樣代碼開(kāi)放做準(zhǔn)備。但是有很多情況下,是需要有機(jī)動(dòng)的突擊隊(duì)的(尤其是創(chuàng)業(yè)時(shí)期),這樣可以隨便組合,另外就是全棧為 remote 提供了更多便利性。

          6. H5 在手機(jī)上用 iScroll 坑比較多啊 尤其三星打開(kāi)硬件加速的時(shí)候 render 頁(yè)面,桑老師怎么看?

          桑世龍:可以嘗試一下淘寶系的 H5 虛擬化,鬼道曾經(jīng)在 as 大會(huì)上講過(guò)的,我們目前還沒(méi)能力做這么深層次的優(yōu)化。

          7.Node.js 做業(yè)務(wù)金額計(jì)算的金額性能和精度夠嗎

          桑世龍:你問(wèn)的不是 Node.js,而是 Node.js 要操作的數(shù)據(jù)庫(kù)。耗性能的計(jì)算可以在架構(gòu)上平衡的,如果可以延時(shí),MQ 就可以了。如果是非延時(shí)情況,可以采用其他語(yǔ)言編寫(xiě)對(duì)應(yīng)服務(wù),沒(méi)必要非要一定要 Node.js。我們目前的場(chǎng)景,還沒(méi)有在計(jì)算遇到瓶頸。

          8.關(guān)于 API 返回格式那里,對(duì)于 status 為什么不打平了把 code 和 message 放出來(lái)?這么設(shè)定有什么好處么?

          桑世龍:語(yǔ)義上更加清晰。整個(gè)返回的 json 就只有 data 和 status,如果 status.code != 0,我取 msg 就好了,如果等于 0,處理 data 數(shù)據(jù)這種設(shè)計(jì)不見(jiàn)得多好,不過(guò)結(jié)構(gòu)清晰,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),是比較容易接受的。

          最后桑老師還要補(bǔ)充最重要的一句,大家別忘了互相轉(zhuǎn)告。

          空弦科技招聘全棧相關(guān)架構(gòu)師、高級(jí)程序員,語(yǔ)言不限,坐標(biāo)天津,郵箱:sang@aircos.com

          本文策劃李慶豐,編輯王杰,審校 Tim Yang,想討論更多 NodeJS 全棧開(kāi)發(fā),請(qǐng)關(guān)注公眾號(hào)獲取進(jìn)群機(jī)會(huì)。轉(zhuǎn)載請(qǐng)注明來(lái)自高可用架構(gòu)「ArchNotes」微信公眾號(hào)及包含以下二維碼。

          高可用架構(gòu)

          改變互聯(lián)網(wǎng)的構(gòu)建方式

          長(zhǎng)按二維碼 訂閱「高可用架構(gòu)」公眾號(hào)

          片來(lái)源@視覺(jué)中國(guó)

          文|航通社,作者|書(shū)航

          從頭開(kāi)始制作一個(gè)手機(jī)操作系統(tǒng),并讓它至少站穩(wěn)腳跟,甚至取得成功,這聽(tīng)起來(lái)像是天方夜譚。

          甚至比爾·蓋茨都承認(rèn),他們不能在手機(jī)領(lǐng)域復(fù)制 Windows 當(dāng)年的成功,聽(tīng)?wèi){ Android 崛起,并帶來(lái)了一個(gè) 4000 億美元的教訓(xùn)。[1]

          但是,在內(nèi)憂外患的催化之下,華為還是開(kāi)發(fā)了用于替代 Android 的“鴻蒙”系統(tǒng),它正準(zhǔn)備向世界發(fā)出第一聲啼哭。

          “鴻蒙”的出現(xiàn)恰逢其時(shí)——相比歷史上的那些艱難時(shí)刻,現(xiàn)在正是無(wú)限接近一個(gè)新的操作系統(tǒng)能走向成功的時(shí)機(jī)。

          造生態(tài),難于上青天

          在大阪 G20 峰會(huì)結(jié)束后,美方稱有望解除當(dāng)前對(duì)華為的制裁,給了華為手機(jī)的海外業(yè)務(wù)一個(gè)意外驚喜。[2]

          受制裁影響,谷歌服務(wù)套件將在 90 天寬限期之后也即今年 8 月底開(kāi)始,無(wú)法在華為海外新機(jī)預(yù)裝。諸多國(guó)外流行 Android 應(yīng)用必須依賴此套件才可以運(yùn)行。

          這一紙禁令意味著華為手機(jī)將暫別谷歌一手搭建的海外應(yīng)用生態(tài),讓用戶恐慌,甚至在新加坡出現(xiàn)了低至 7 折的二手拋售。只是隨后,因?yàn)橛腥擞X(jué)得可以轉(zhuǎn)手賣(mài)給中國(guó)大陸,價(jià)格又開(kāi)始漲回來(lái)。[3]

          在中國(guó)大陸,因?yàn)楣雀钁?yīng)用市場(chǎng)從未被正式準(zhǔn)入,有需要使用谷歌服務(wù)和國(guó)外應(yīng)用的用戶,一般都能自學(xué)知識(shí)破解,也出現(xiàn)了一鍵傻瓜式的“谷歌安裝器”。但對(duì)海外而言,這是否合法暫且不論,哪怕讓用戶手動(dòng)多做一個(gè)操作,都會(huì)擋住很多只會(huì)一路下一步的人。

          華為宣布他們有一個(gè)自研的備用操作系統(tǒng),用于這種極端情形。它在媒體報(bào)道中有很多不同的名字,但最常用的是“鴻蒙”。據(jù)稱這個(gè)系統(tǒng)可以跨手機(jī)、電腦、電視、汽車(chē)等多種設(shè)備使用,同時(shí)支持運(yùn)行網(wǎng)頁(yè)應(yīng)用以及 Android 應(yīng)用。[4]

          跟自制芯片相比,自制操作系統(tǒng)聽(tīng)起來(lái)更“不靠譜”。消息公布一個(gè)多月以來(lái),不斷有人梳理國(guó)內(nèi)外挑戰(zhàn) iOS、Android、Windows 和 macOS 四大系統(tǒng)的各種失敗史。

          現(xiàn)代操作系統(tǒng)從運(yùn)行邏輯、界面、交互、硬件適配等多個(gè)方面,都已經(jīng)高度趨同且非常成熟。雖然可能存在一些專利壁壘,但大家也多少都有規(guī)避的辦法—— iOS 曾因?yàn)楦咄ㄆ鹪V,而微調(diào)多任務(wù)切換的動(dòng)畫(huà)效果。

          唯一不同的地方,就在于生態(tài)。為你這個(gè)系統(tǒng)開(kāi)發(fā)的第三方軟件是否足夠多?是否夠用?該有的東西是不是都有?開(kāi)發(fā)者和用戶社群是否能夠互相促進(jìn),像滾雪球一般越滾越大?

          數(shù)不清過(guò)去有多少錢(qián)投入到操作系統(tǒng)開(kāi)發(fā)之后打了水漂。像 WebOS 這樣把用戶體驗(yàn)做得超越時(shí)代的優(yōu)秀系統(tǒng),沒(méi)能獲得一線生機(jī);而 Symbian、Windows Mobile 這樣曾叱咤風(fēng)云的舊日霸主,也都在短時(shí)間內(nèi)匆匆隕落。

          一切都可以歸結(jié)于生態(tài)建設(shè)的失敗,這真是關(guān)生死,定勝負(fù)的因素。

          做得好,只因“做得早”?

          如何從頭開(kāi)始構(gòu)建一個(gè)成功的生態(tài)?我們從 iOS 講起。

          iPhone 初代并不支持第三方應(yīng)用的安裝,但是它在功能和操控上的劃時(shí)代突破,吸引了全世界的關(guān)注。產(chǎn)品本身做得足夠好,以至于人們產(chǎn)生巨大興趣,這是讓它馬上能吸引到開(kāi)發(fā)者的誘因。

          多點(diǎn)觸控加上支持桌面 Web 功能的瀏覽器,讓當(dāng)時(shí)的開(kāi)發(fā)者只要做一個(gè)適合手機(jī)屏幕寬度的網(wǎng)頁(yè),就足以成為一個(gè)“App”。

          Safari 瀏覽器支持把網(wǎng)頁(yè)快捷方式放到桌面,圖標(biāo)也跟原生 App 一模一樣。在 App Store 誕生初期,有很多 App 實(shí)際上只是一個(gè)瀏覽器的殼,把網(wǎng)頁(yè)做了封裝就上架了。放到現(xiàn)在,這是不可想象的。

          App Store 一旦推出,蘋(píng)果對(duì) iPhone 的宣傳重心就完全改為應(yīng)用,對(duì)商店體系下開(kāi)發(fā)者的宣傳、推薦和培養(yǎng)過(guò)程,也基本是從此時(shí)開(kāi)始成型,并被后人效仿。

          另一方面,已有足夠應(yīng)用數(shù)量兜底的 App Store 保持了嚴(yán)格的準(zhǔn)入機(jī)制,對(duì)直接安裝商店外應(yīng)用的“越獄”圍追堵截,確保了收費(fèi)應(yīng)用開(kāi)發(fā)者的權(quán)益。等到應(yīng)用下載數(shù)、安裝數(shù)、付費(fèi)應(yīng)用收入等指標(biāo)紛紛創(chuàng)下新高,iOS 生態(tài)的地位已經(jīng)不可撼動(dòng)。

          只是對(duì)于其它后面來(lái)的玩家而言,蘋(píng)果獲得這般成功的關(guān)鍵幾乎就是三個(gè)字——做得早。

          在另一邊的開(kāi)放陣營(yíng)中,Android 成功的秘訣也是做得早。

          在體驗(yàn)也不算差的 Windows Phone 7 出來(lái)的時(shí)候,它面對(duì)兩個(gè)問(wèn)題:一個(gè)是原先 Windows Mobile 的應(yīng)用全都不能沿用,甚至不能移植過(guò)去,對(duì)微軟而言相當(dāng)于一切都要從零開(kāi)始;二是既然是從零開(kāi)始,這時(shí)候?qū)γ?Android 已經(jīng)做了兩年。而這兩年里,微軟致力于讓大多數(shù)上市的 WM 6.5 手機(jī)支持全鍵盤(pán),以發(fā)揮它移動(dòng) Office 的所謂“生產(chǎn)力”優(yōu)勢(shì)。

          大體上,這就是蓋茨慨嘆的 4000 億美元怎么損失掉的原因。

          要建設(shè)一個(gè)經(jīng)典的應(yīng)用生態(tài),需要的并不是大力出奇跡,反而用力過(guò)猛會(huì)適得其反。特別是,直接引用別人(說(shuō)白了就是 Android)的生態(tài)系統(tǒng),并且無(wú)腦移植過(guò)來(lái)的做法,只會(huì)搭建一座了無(wú)生氣的“死城”。

          我還記得微軟當(dāng)初在華推廣 Windows Phone 應(yīng)用開(kāi)發(fā)之初,曾經(jīng)許諾給報(bào)名的開(kāi)發(fā)者都送一臺(tái)外殼靚麗的諾基亞手機(jī),所需要的僅僅是把開(kāi)發(fā)者已有的安卓程序,以簡(jiǎn)單步驟轉(zhuǎn)制為一個(gè) Metro 應(yīng)用就可以了。[5]

          前面說(shuō)過(guò),因?yàn)椤白龅迷纭?,iOS App Store 和谷歌應(yīng)用商店,最早期都可以允許一些網(wǎng)頁(yè)套了個(gè)殼的簡(jiǎn)單應(yīng)用上架,僅僅過(guò)了兩年,用戶就再也不可能接受這種東西了。

          而一鍵轉(zhuǎn)換而來(lái)的應(yīng)用,有時(shí)出現(xiàn)無(wú)法正常啟動(dòng)或界面錯(cuò)位等現(xiàn)象,商店也沒(méi)有及時(shí)發(fā)現(xiàn)和處理,這導(dǎo)致用戶看到各種各樣跟安卓同名的應(yīng)用,但使用體驗(yàn)卻極為差勁。

          種種原因讓 Windows Phone 的應(yīng)用商店被大小開(kāi)發(fā)者拋棄。2015 年 3 月,支付寶發(fā)布 Apple Watch 適配卻不愿更新已沉睡 3 年的 WP 客戶端,引發(fā)用戶不滿。官微回復(fù)了一句:“你是1%,為什么要選擇1%的生活?” [6]

          這句話讓“1%”成為中國(guó) WP 用戶的自嘲專有名詞,直到微軟徹底放棄自己的手機(jī)操作系統(tǒng)為止。

          狂“收稅”,圍墻現(xiàn)裂痕

          iOS 封閉的應(yīng)用生態(tài)被人們形象的稱為“圍墻花園”,因?yàn)殚_(kāi)發(fā)者想要突破這個(gè)“圍墻”是基本不可能的;相比之下,Android 可以自由地分發(fā)和安裝后綴為 APK 的安裝包,因此走上了不同的發(fā)展道路。

          人們對(duì) iOS 的粘性,很大程度上是由眾多開(kāi)發(fā)者貢獻(xiàn)的優(yōu)質(zhì)應(yīng)用帶來(lái)的。蘋(píng)果卻利用這種難以掙脫的粘性,對(duì)平臺(tái)內(nèi)的應(yīng)用內(nèi)付費(fèi)(IAP)征收 30% 的手續(xù)費(fèi),開(kāi)發(fā)者只能將這一成本轉(zhuǎn)嫁到消費(fèi)者身上。

          這導(dǎo)致對(duì)于一些跨平臺(tái)的產(chǎn)品,如果是在 iOS 客戶端內(nèi)購(gòu)買(mǎi)諸如電影、音樂(lè)、游戲道具等商品,支付的費(fèi)用要比在安卓或網(wǎng)頁(yè)版購(gòu)買(mǎi)貴三分之一。

          2017 年,蘋(píng)果針對(duì)中國(guó)部分應(yīng)用中出現(xiàn)的對(duì)作者“打賞”的情況,宣稱這也屬于應(yīng)用內(nèi)付費(fèi)。也就是說(shuō),在微信公眾號(hào)、知乎專欄、視頻直播應(yīng)用等地的打賞也要被抽成 30%。這對(duì)于風(fēng)行一時(shí)的內(nèi)容創(chuàng)業(yè)生態(tài)是一大暴擊。

          iOS 形成的天然市場(chǎng)壟斷地位,導(dǎo)致其中幾乎每一個(gè)默認(rèn)位置,對(duì)合作伙伴都是不菲的花銷(xiāo)。今年 2 月份有分析指出,為了保住在 Safari 瀏覽器中的默認(rèn)搜索引擎地位,谷歌在 2018 年度向蘋(píng)果支付了 95 億美元,相當(dāng)于蘋(píng)果 2018 年?duì)I收的 1/5。

          該分析師計(jì)算,谷歌的這部分貢獻(xiàn),加上 App Store 的分成收入,兩項(xiàng)占蘋(píng)果 2018 年服務(wù)營(yíng)收的比例高達(dá)51%,占毛利潤(rùn)比例更高達(dá) 70%。[7]

          今年春季,蘋(píng)果發(fā)布了一系列的內(nèi)容訂閱產(chǎn)品,收“蘋(píng)果稅”的習(xí)慣也沿襲到了這些新的服務(wù)身上,由于蘋(píng)果提出的分成比例過(guò)高,一些主流的出版商選擇抵制蘋(píng)果雜志訂閱服務(wù) Apple News +。

          從 2011 年開(kāi)始,就有美國(guó)消費(fèi)者提出對(duì) App Store 高額抽成的訴訟。他們認(rèn)為這增加了消費(fèi)者獲取同類(lèi)服務(wù)的時(shí)候,相對(duì)安卓等其它用戶付出的成本。

          蘋(píng)果認(rèn)為他們不是合適的原告,因?yàn)樯痰瓿槌墒敲鎸?duì)開(kāi)發(fā)者,而不是用戶,應(yīng)該由開(kāi)發(fā)者來(lái)起訴。不過(guò)按照這個(gè)邏輯,開(kāi)發(fā)者真的起訴了蘋(píng)果之后,還能不能繼續(xù)在 App Store 愉快的玩耍呢?

          歷經(jīng) 8 年多的不斷反復(fù),直到今年 5 月,美國(guó)最高法院才以 5:4 的比例,判定蘋(píng)果在這一階段性的訴訟過(guò)程中敗訴。也就是說(shuō),任何 iOS 的用戶,而不僅限于開(kāi)發(fā)者,也都可以提起反壟斷訴訟。消息一出,蘋(píng)果的股價(jià)大跌,投資者擔(dān)心這會(huì)影響到蘋(píng)果服務(wù)產(chǎn)品的盈利模式。[8]

          受到這一判決結(jié)果的激勵(lì),在 iOS 開(kāi)發(fā)者群體當(dāng)中也有人挺身而出。6 月初,有兩名開(kāi)發(fā)者向蘋(píng)果所在的圣何塞地方法院提起反壟斷訴訟,稱 iOS 只允許一家單獨(dú)的應(yīng)用商店運(yùn)轉(zhuǎn),不允許其他第三方的商店,削弱了用戶的自主選擇權(quán)。如果這一訴求獲得法院的支持,那其實(shí)也意味著在海外安卓系統(tǒng)當(dāng)中只有 Google Play 商店的情況也要改變。[9]

          目前這些案件都還在審理過(guò)程當(dāng)中。唯一可以確定的是,這些小小的變化正推動(dòng)著已經(jīng)穩(wěn)定運(yùn)轉(zhuǎn)了 10 多年的 App Store 模式發(fā)生變化。圍墻花園的高墻開(kāi)始出現(xiàn)了裂縫。

          “輕應(yīng)用”,跌倒再爬起

          推動(dòng)這一裂縫變得越來(lái)越大的,還有兩個(gè)重要的因素。

          在國(guó)內(nèi),全民普及的超級(jí) App 紛紛推出了小程序,總算把手機(jī)網(wǎng)頁(yè)充當(dāng) App 的多年志向部分實(shí)現(xiàn)。

          小程序是一種封裝好的基于 XML 變種語(yǔ)言的軟件包,依賴母體 App 獲得讀取個(gè)人信息及調(diào)用手機(jī)硬件能力的權(quán)限,跨越 iOS 和 Android 平臺(tái)限制,能夠共享一致的用戶體驗(yàn)。

          不管是此前百度、UC 瀏覽器的“輕應(yīng)用”,還是之后手機(jī)廠商推出的“快應(yīng)用”,都不能像微信、支付寶、百度系、字節(jié)跳動(dòng)系 App 一樣,對(duì)所謂“網(wǎng)頁(yè)應(yīng)用”的推廣起到這么大的推動(dòng)作用。

          在中國(guó),人們習(xí)慣于在少數(shù)幾個(gè)超大型的 App 當(dāng)中完成幾乎所有的事情。早在 PC 互聯(lián)網(wǎng)時(shí)代,英語(yǔ)用戶習(xí)慣使用 AOL、雅虎和谷歌的搜索框來(lái)獲取信息,而中國(guó)人則鍛煉出了使用密密麻麻的網(wǎng)址大全的習(xí)慣。

          同樣的風(fēng)格差異也體現(xiàn)在中英文購(gòu)物網(wǎng)站的區(qū)別上。淘寶、京東等網(wǎng)站擺滿了商品信息,而亞馬遜的每次改版都反其道而行之,盡可能追求頁(yè)面的簡(jiǎn)潔。你很難簡(jiǎn)單評(píng)判兩種習(xí)慣的優(yōu)劣。

          在移動(dòng)互聯(lián)網(wǎng)時(shí)代,人們也需要一個(gè)包攬一切的入口。微信、支付寶、百度等產(chǎn)品擔(dān)當(dāng)了這樣的角色。它們都擁有可以閱覽資訊(公眾號(hào)-生活號(hào)-百家號(hào)),進(jìn)行一定程度的交流(聊天-螞蟻森林-貼吧),以及購(gòu)物、繳費(fèi)、支付的能力。

          這些超級(jí) App 成為一個(gè)籠罩在操作系統(tǒng)之上的新的平臺(tái)層。華為要做“鴻蒙”,只要這幾個(gè)超級(jí) App 分別實(shí)現(xiàn)了適配,那么架設(shè)在上面的所有小程序生態(tài)都可以無(wú)縫轉(zhuǎn)移過(guò)去,大大減少了人們適應(yīng)新系統(tǒng)的障礙。

          超級(jí) App 挾用戶而令商店,跟蘋(píng)果和谷歌之間形成了亦敵亦友的關(guān)系。蘋(píng)果曾強(qiáng)迫微信贊賞功能抽成 30% ,微信干脆先撤下贊賞能力,談判一年,最后毫發(fā)無(wú)傷。在蘋(píng)果的發(fā)布會(huì)上,微信經(jīng)常被放在 iOS 的相關(guān)幻燈片上,作為中文應(yīng)用的代表出現(xiàn)。

          在國(guó)外,利用最新 Web 技術(shù)的漸進(jìn)式網(wǎng)頁(yè)應(yīng)用(PWA)正成為潮流。新的 Web 標(biāo)準(zhǔn)令 PWA 不同于以前的手機(jī)版網(wǎng)頁(yè),具備了本地存儲(chǔ)、調(diào)用分享接口等能力。

          已經(jīng)醞釀了 10 年以上的“網(wǎng)頁(yè)應(yīng)用”,之所以到了近一兩年才有跟原生應(yīng)用分庭抗禮的跡象,是因?yàn)榧夹g(shù)終于到了成熟的時(shí)候。這就好像微軟早在 2002 年就推出了平板電腦版的 Windows,但是最終實(shí)現(xiàn)平板電腦的“完全體”形態(tài),卻要等到蘋(píng)果的 iPad。如果技術(shù)不到那個(gè)程度,揠苗助長(zhǎng)不會(huì)有好結(jié)果。

          早期的網(wǎng)頁(yè)應(yīng)用,因?yàn)椴僮飨到y(tǒng)的運(yùn)算能力和后臺(tái)駐留能力不足,導(dǎo)致頁(yè)面不斷的刷新,表單信息容易丟失。而且如果不在室內(nèi)的 WiFi 環(huán)境之下,在手機(jī)上還容易因?yàn)閿嗑€而無(wú)法繼續(xù)操作。當(dāng)時(shí)的網(wǎng)頁(yè)技術(shù)也不具備離線緩存的能力,也無(wú)法調(diào)用系統(tǒng)的攝像頭、麥克風(fēng)等硬件。

          隨著互聯(lián)網(wǎng)標(biāo)準(zhǔn)的完善,除了以上提到的能力之外,網(wǎng)頁(yè)的繪圖效率也因?yàn)?CSS 和 HTML5 Canvas 的改進(jìn)而提高;一些 3D 效果可以通過(guò) WebGL 等技術(shù),不用插件,直接在瀏覽器中實(shí)現(xiàn)。

          甚至支付都不是問(wèn)題—— Facebook 宣布推出的穩(wěn)定幣 Libra 必定會(huì)應(yīng)用在眾多內(nèi)嵌 Facebook 框架的網(wǎng)頁(yè),即使是網(wǎng)頁(yè)版的用戶,也可以正常的收付款或查看錢(qián)包狀態(tài)。

          與此同時(shí),5G 網(wǎng)絡(luò)的普及和網(wǎng)絡(luò)信號(hào)覆蓋率的提升都意味著操作網(wǎng)頁(yè)元素時(shí),可以加載和緩存更多內(nèi)容,避免應(yīng)用崩潰。

          PWA 最激動(dòng)人心的地方,就是它的本質(zhì)是一個(gè)網(wǎng)頁(yè)。這意味著任何現(xiàn)代瀏覽器和操作系統(tǒng)都可以支持它們,并獲得完全一致的使用體驗(yàn)。

          PWA 已經(jīng)獲得了谷歌和微軟應(yīng)用商店的官方支持,可以獲得跟原生應(yīng)用類(lèi)似的圖標(biāo)和啟動(dòng)方式;在 Windows 10 的將來(lái)版本中,PWA 更可像原生應(yīng)用一樣在“設(shè)置”里卸載。[10]

          沒(méi)有獲得移動(dòng)互聯(lián)網(wǎng)“船票”的微軟,和正打算推出新操作系統(tǒng) Fuchsia 的谷歌,都把 PWA 看作是在當(dāng)前的原生應(yīng)用體系之外,新建生態(tài)的突破口。

          在用戶和開(kāi)發(fā)者“以卵擊石”般悲壯的法律挑戰(zhàn)之外,中國(guó)的超級(jí) App 和全球合作的 PWA 開(kāi)放環(huán)境,共同給花園的圍墻撕開(kāi)更大的缺口。

          不管是強(qiáng)大的廠商希望自己打破操作系統(tǒng)的區(qū)隔,還是小開(kāi)發(fā)者以 Web 標(biāo)準(zhǔn)實(shí)現(xiàn)終極的跨平臺(tái)編程,都是在實(shí)踐一個(gè)由來(lái)已久的心愿:當(dāng)初 Java 所提出的“寫(xiě)一次就到處運(yùn)行”的理想,將在這些繼承者身上得到延續(xù)。

          結(jié)論

          今年 4 月,有人因?yàn)橹髁k公電腦送修,所以不得不使用 10 年前的筆記本電腦工作。結(jié)果他意外地發(fā)現(xiàn),雖然有點(diǎn)慢,但是不影響使用。10年前的電腦依然能夠滿足日常工作。開(kāi)發(fā)者阮一峰評(píng)論說(shuō):[11]

          “如果 2009 年讓你去用 1999 年的電腦,那是不可想象的,根本沒(méi)有實(shí)用性。但是,2019 年去用 2009 年的電腦,卻是完全可行的。這說(shuō)明,過(guò)去十年的硬件進(jìn)展不太大,導(dǎo)致 10 年前的硬件不是那么過(guò)時(shí)。過(guò)去十年,進(jìn)展主要體現(xiàn)在軟件上面:軟件功能更強(qiáng)大、使用更友好、界面更美觀。”

          多年前,航通社寫(xiě)過(guò)《軟件應(yīng)不應(yīng)該更新到最新版》,表達(dá)了類(lèi)似的看法。[12]

          很多情況下,軟件并不是越新越好。有些新版要求單機(jī)軟件強(qiáng)制聯(lián)網(wǎng),加入你并不需要的會(huì)員功能和消息推送;有些新版和舊版,甚至同一版本的自家軟件不兼容;有些產(chǎn)品更是從頭到尾蛻變成另一款你不認(rèn)識(shí)的軟件。

          上述問(wèn)題都是操作系統(tǒng)原生應(yīng)用普遍存在的。如果同一款軟件有對(duì)應(yīng)的網(wǎng)頁(yè)版,那么只需要一個(gè)瀏覽器,就可以避免大部分煩惱。在桌面電腦上,瀏覽器就是我們所說(shuō)的“超級(jí) App”。

          歷史上,PC 操作系統(tǒng)的軟件生態(tài)經(jīng)歷了從純粹的單機(jī)軟件,到出現(xiàn) c/s(使用客戶端與服務(wù)器交互)再到 b/s (使用瀏覽器與服務(wù)器交互)的過(guò)程。這一過(guò)程也在手機(jī)操作系統(tǒng)上得到重現(xiàn),雖然其中經(jīng)歷了曲折反復(fù)。

          眼下,由超級(jí) App 和小程序、PWA、統(tǒng)一的 Web 標(biāo)準(zhǔn)以及 5G 等通信技術(shù)的進(jìn)步,共同催化了在應(yīng)用商店之外,一個(gè)全新的、開(kāi)放的、跨平臺(tái)的生態(tài)。

          蘋(píng)果曾經(jīng)以 Flash 是一個(gè)閉源的技術(shù)為理由,在 iOS 中取消對(duì) Flash 的支持,促成了這個(gè)風(fēng)靡一時(shí)的網(wǎng)頁(yè)技術(shù)的凋敝。但 iOS 和 Android 本身也不能免俗于掌控一個(gè)封閉平臺(tái)的誘惑。

          作為 iOS 和 Android “護(hù)城河”的應(yīng)用商店,是再典型不過(guò)的“圍墻花園”,正是花園的高墻擋住了歷史上其它競(jìng)爭(zhēng)操作系統(tǒng)的道路?,F(xiàn)在,高墻終于開(kāi)始出現(xiàn)了裂縫。

          如果華為“鴻蒙”系統(tǒng)能僅僅憑借對(duì)大量 PWA 和小程序的兼容性,就成功站穩(wěn)腳跟,這將是一個(gè)重要的標(biāo)志,意味著頭部操作系統(tǒng)長(zhǎng)期積累而成的應(yīng)用生態(tài)壁壘,今后將不再扮演像現(xiàn)在這么關(guān)鍵的角色。

          而操作系統(tǒng)的地位,也將下降到作為一個(gè)承載瀏覽器和個(gè)別超級(jí) App 的容器,不同系統(tǒng)之間的操作習(xí)慣幾乎可以無(wú)感知地移植,這樣用什么操作系統(tǒng)就再也不是一個(gè)問(wèn)題。

          這是“鴻蒙”的機(jī)會(huì),也是我們所有人的機(jī)會(huì)。

          [1] https://techcrunch.com/2019/06/22/bill-gates-on-making-one-of-the-greatest-mistakes-of-all-time/

          [2] http://tech.sina.com.cn/i/2019-07-01/doc-ihytcerm0437333.shtml

          [3] https://www.zaobao.com/znews/singapore/story20190523-958860

          [4] https://news.mydrivers.com/1/630/630953.htm

          [5] https://tech.qq.com/a/20110219/000090.htm

          [6] https://www.ithome.com/html/windowsphone/134028.htm

          [7] https://www.cnbeta.com/articles/tech/817521.htm

          [8] http://finance.sina.com.cn/stock/relnews/us/2019-05-15/doc-ihvhiqax8865477.shtml

          [9] http://www.techweb.com.cn/world/2019-06-05/2738826.shtml

          [10] https://tech.sina.com.cn/n/k/2019-06-19/doc-ihytcitk6190308.shtml

          [11] http://www.ruanyifeng.com/blog/2019/04/weekly-issue-51.html

          [12] http://www.geekpark.net/news/187221

          尋求轉(zhuǎn)載授權(quán),請(qǐng)聯(lián)系航通社助理(ID:hangtongshe)或發(fā)郵件給 coop@lishuhang.me

          更多精彩內(nèi)容,關(guān)注鈦媒體微信號(hào)(ID:taimeiti),或者下載鈦媒體App


          主站蜘蛛池模板: 精品一区二区三区中文字幕| 午夜视频在线观看一区| 国产精品无码一区二区三区在| 麻豆亚洲av熟女国产一区二| 中文字幕视频一区| 日本一道高清一区二区三区| 色婷婷av一区二区三区仙踪林| 无码丰满熟妇一区二区| 日本一道一区二区免费看| 无码日韩人妻AV一区免费l| 国产亚洲一区二区在线观看 | 国产精品揄拍一区二区久久| 成人精品视频一区二区| 国产成人一区在线不卡| 99精品一区二区免费视频| 相泽南亚洲一区二区在线播放| 一区二区在线视频观看| 亚洲一区在线视频| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 中文字幕一区二区人妻| 中文字幕一区日韩精品| 亚洲视频在线一区二区| 亚洲一区二区三区在线| 国产午夜精品一区二区三区嫩草 | 国产一区二区三区无码免费 | 国产成人精品一区在线| 国产福利微拍精品一区二区| 日本强伦姧人妻一区二区| 国产精品夜色一区二区三区| 制服中文字幕一区二区| 日韩视频在线一区| 国产自产对白一区| 精品国产一区在线观看 | 日韩一区二区三区在线| 日韩毛片基地一区二区三区| 一区二区三区亚洲| 成人区精品人妻一区二区不卡| 亚洲片国产一区一级在线观看| 波多野结衣在线观看一区二区三区| 亚洲午夜精品一区二区麻豆 | 国产对白精品刺激一区二区|