《安卓傳奇:Android 締造團隊回憶錄》

>>>  文章華國詩禮傳家—精彩書評選  >>> 簡體     傳統

這個世界就是這樣:你從失敗中學到的東西可能比從成功中學到的東西更多

在開發 Android 之前,我們中的大多數人都經歷過多次失敗。因為當時的情況、時機或其他因素都無法讓我們取得成功。

在開發Android 之前,我曾參與開發3到4個失敗的平臺。但我們不斷嘗試,從每一次失敗中吸取教訓,并利用獲得的知識來開發 Android。

“他十五分鐘后給我回了郵件,問我是否需要一份工作。”于是,Brian去了加州,在這家公司進行了一整天的面試,包括與Dominic進行現場調試。

就這樣,Brian拿下了這份工作。面試之后,他回到家里,收拾好東西,兩周后搬到了加利福尼亞。

他上大學的目標是開發一個操作系統,而現在立即就有機會了,所以他認為大學學位的事情可以以后再說。

本以為我是天選打工人,不會變🐏,沒想到我也沒挺過 2022 年。在距離新年還有兩天的時候,我也陽了。

請了三天假期,連上元旦三天假,大概率也能痊愈,目前癥狀也比較輕微。

我就時常感覺焦慮,特別是在社交媒體上,各種排名、曬收入,看到這些我就焦慮的不行。索性,我把抖音、頭條刪了個干凈。 唯一留了個微信,朋友圈能屏蔽就屏蔽,眼不見心不煩。

但是,遇到工期緊張、多項目并行,又不免焦慮起來。其實吧,也就是臉皮薄,很多事情并沒有多嚴重,多經歷幾次,就能坦然面對了,磨練自己臉皮厚的功夫非常有必要。

整理了一下前一段時間看過的不錯的一本書,《安卓傳奇:Android 締造團隊回憶錄》。

九敗一勝

之前一直有個錯覺,以為 Android 是一蹴而就的,順利地成為了與 iOS 比肩的手機操作系統。 沒想到這個團隊的成員在加入 Android 項目之前,都有過類似的操作系統項目的失敗經驗。

這個世界就是這樣:你從失敗中學到的東西可能比從成功中學到的東西更多

在開發 Android 之前,我們中的大多數人都經歷過多次失敗。因為當時的情況、時機或其他因素都無法讓我們取得成功。在開發Android 之前,我曾參與開發3到4個失敗的平臺。但我們不斷嘗試,從每一次失敗中吸取教訓,并利用獲得的知識來開發 Android。

大學學位

美國人對大學學位的態度確實更客觀冷靜一些。

“他十五分鐘后給我回了郵件,問我是否需要一份工作。”于是,Brian去了加州,在這家公司進行了一整天的面試,包括與Dominic進行現場調試。就這樣,Brian拿下了這份工作。面試之后,他回到家里,收拾好東西,兩周后搬到了加利福尼亞。他上大學的目標是開發一個操作系統,而現在立即就有機會了,所以他認為大學學位的事情可以以后再說。

借鑒 Emacs

Zygote 是 Dalvik 小組為 Android 1.0開發的另一個東西。Zygote 就像你做三明治時用的面包片。當然,你也可以在每次做三明治時從頭開始烤面包,但如果是這樣的話,每次你想吃三明治都要花大量的時間和精力。很明顯,如果有現成的面包,你只需要把它切成片,并更快更容易地做出三明治。Zygote 就像做三明治用的面包。Dan 的這個想法來自 Emacs(UNIX系統上的一個非常流行的文本編輯器)的一個特性,我們可以隨時轉儲編輯器的狀態,稍后可以從這個保存點啟動 Emacs(這個過程被巧妙地稱為反轉儲(undump))。這意味著Emacs可以更快地啟動,因為它只需要從磁盤上恢復狀態,不需要在啟動時重新執行一大堆代碼邏輯。“我的想法是我們實現一個具有反轉儲功能的系統,就像 Emacs 最‘著名’(至少對我來說)的那個特性。Mike Fleming 說:‘我們跳過轉儲和重新加載這些步驟,怎么樣?’說完他就開干了。”

DP 的由來

最初的G1以及Droid之前的Android設備的密度都是每英寸160像素(PPI),也就是說,屏幕的每一英寸都有160個不同的顏色值(垂直和水平)。Droid的密度是265 PPI。更高的密度意味著可以表示更多的信息,可以獲得更平滑的曲線和文本,或帶有更多細節的圖像。為了能夠支持各種密度,開發人員需要用一種方法來定義他們的UI。Dianne和Romain實現的系統以DP(與密度無關的像素)為單位,開發人員可以用這個系統來定義UI,并且不依賴設備的實際像素大小。系統將根據設備的實際密度對UI進行適當的伸縮。這種處理屏幕密度的機制、資源系統基于密度提供不同資源的能力和獨立于屏幕大小的UI布局系統,在Android的發展過程中起到至關重要的作用。隨著廠商不停地為他們的用戶推出不同格式的屏幕,Android從只能在一種設備(G1和后續配備了相同尺寸和密度的設備)上運行變成了可以支持各種屏幕尺寸和密度。

Intent 的由來

我曾和 Mike Cleron 一起開發布局系統和View系統,并提供布局和算法(Two-Pass算法)API。我還和 Dianne Hackborn 等人一起開發 Intent 機制。我記得我們在房間里花了好幾小時給現在這些叫作 Intent 的東西取名字。我們花了幾小時粉刷自行車棚,想找到一個最合適的名字。最后,我們想到了‘Intent’。Intent 機制背后的原理非常有趣:如何讓一個應用在不知道另一個應用是否存在的情況下去調用它?這就好像我們問:‘有人能處理這個嗎?’如果有人去做了,那么就說明他們能夠處理。我們對此感到十分興奮。”

推送服務也如此狼狽

推送功能是早期的主要問題之一:當一些東西在服務器端發生了變化(例如,用戶的收件箱收到了電子郵件或日歷事件被更新),服務器需要向設備發送通知,這樣才能保持設備和服務器的數據是同步的。Debajit 發明了“撓癢癢”(Tickle)這個詞。“我們想要給設備‘撓癢癢’。我們想到了輕撓(Light Tickle),意思是讓設備知道有東西發生了變化,需要主動同步以獲取具體內容。還有重撓(Heavy Tickle),意思是直接在通知消息里包含消息內容。我們更喜歡輕撓的方式,但具體要視情況而定。”團隊想到了一個辦法,就是在手機后臺與谷歌服務器建立一個專用的連接。這個連接被稱為移動連接服務器(Mobile Connection Server,MCS),是一種長連接,可以隨時發送或接收消息,確保當服務器上有新消息時,手機就會收到通知。每個應用程序都有自己特定的數據需求,不過它們都共享這個連接,如果服務器有任何變化,都會通過這個連接通知設備。這個連接還被用于實現最初的谷歌Talk功能,用于發送和接收消息。與谷歌服務器建立長連接不只是個技術問題,因為長連接所使用的資源受到了限制。[插圖]2008年10月21日,G1上市前一天的Michael Morrissey(圖片由Brian Swetland提供)。長連接機制受到了網絡運營團隊的限制。當時,谷歌假定所有需要網絡連接的東西都是基于Web的,傳輸數據的請求使用的是標準的Web HTTP請求。但是,Android使用了一種完全不同的協議,所以他們需要用到虛擬IP(VIP)。問題是,網絡團隊不想給他們。“他們給了一大堆無聊的理由。關于谷歌的做事風格,我就不多吐槽了,總之是非常罕見的。當時的網絡團隊大約有200個VIP,其中的一些已經用掉了,但就是不愿意給我們一個。”Debajit和Michael經常與網絡團隊會面,嘗試說服他們給Android團隊一個VIP。這種事情對Michael來說已經是家常便飯了:“我的一大部分工作就是在Gmail、日歷、聯系人團隊和谷歌的其他舉足輕重的團隊之間斡旋,因為他們應該能夠在技術和SRE[插圖]方面給我們幫助。”最后,網絡團隊妥協了,給了Android一個VIP,但有個前提:如果Android在前六個月沒有達到100萬用戶,他們將收回VIP,并且Michael和Debajit將欠他們一箱威士忌。Debajit記得:“他們在談判時絕對提到了威士忌,那是當時的硬通貨。”有了VIP,他們在5228端口上建立起了長連接,并讓MCS運行了起來。最終,Android贏得了這場“賭局”,盡管Michael說這取決于時間是從什么時候開始算起的。網絡運營團隊說從他們提供VIP那一刻開始算起,而Michael說從1.0版本發布那一刻開始算起。無論怎么算,當時的Android都已經足夠成功,所以保證了所有的Android設備都不會失去長連接。

因為Android使用了長連接,所以也需要放置在數據中心里的專用服務器上。處理數據的人都知道,為了防止主系統出問題,需要對數據進行備份。這就是為什么我們會有冗余的磁盤陣列和備份存儲。這也是為什么許多家庭會有父母雙親,因為如果孩子問的問題其中一方無法回答,那么孩子還可以問另一方。但Android服務的可不只是一兩個用戶,他們需要一個可以服務更多用戶的系統。一個備份站點是不夠的,主系統完全可能出問題,而第二個備份系統也有可能出問題,盡管可能性不大。因此,為以防萬一,他們啟用了第三個數據中心。三個數據中心應該可以覆蓋所有的故障情況了。2008年10月22日是G1上市的日子。在上半周,Android的一臺服務器發生了宕機,幸好在上市之前及時恢復了過來。但在上市當天,第二臺服務器又因“計劃外的維護”而宕機。谷歌需要診斷問題,把它從系統里移掉了。所以,在上市當天,Android只剩下兩臺服務器。幸運的是,兩臺服務器足以撐起一個強大且無故障的系統。然后,其中的一臺服務器著火了。那天,數據中心出現了過熱問題,他們不得不把系統關閉。Michael說:“我們真的嚇出了一身冷汗——我們只剩下最后一臺服務器了!已經沒了兩臺,如果第三臺再宕機,所有的同步功能都將無法正常工作,聊天功能也沒有了。我們真的很恐慌。”好在最后一臺服務器一直正常運行,沒有發生宕機。但團隊幾乎與死神擦肩而過,這是他們之前所沒有預料到的。

安全更新策略

最后一個問題是如何保證安全性。更新系統可以修改只讀的部分,因為它需要更新設備上的核心操作系統。那么,怎樣才能防止一些惡意軟件把自己偽裝成更新軟件對系統進行篡改呢?Dan和他的團隊在Android安全團隊的幫助下采用了一種方法,即只允許受信任的文件替換系統文件。每個更新模塊都需要進行密鑰簽名,系統將會驗證它們是否被Android信任。安全團隊還增加了一層保護,除了每個單獨的模塊有密鑰加密,整個更新也有一個額外的密鑰加密層。只有有了這些層,系統才是安全的,才能被發布(和更新)。

灰度發布與監控機制

當時,Michael正在從西雅圖搬到山景城。他想:“一切似乎都沒問題了,我要休一星期假,順便搬家。幾天后,也就是在周二晚上十點,我的電話響了,是Dan Egnor打來的。我接通了電話,問:‘Dan,發生什么事了?’他說:‘首先,我想讓你知道,一切都很好。’我的第一感覺是肯定是哪里出問題了。‘只是……我們讓很多手機變磚了。’”原來,增量更新鏡像與HTC(G1的廠商)安裝在手機上的鏡像略有不同。只有當系統與鏡像完全匹配時,更新系統才能進行增量更新。所以,當增量更新被安裝到這些手機上時,系統就被破壞了,設備也就變磚了。好消息是,當時受影響的手機只有129部。但對于那些用戶來說,這仍然是一件可怕的事情。他們都通過客服換了新手機。但這129部之外的其他G1手機都在這次災難性的故障中完好無損。這個問題之所以能夠得到如此好的控制,是因為團隊使用了分階段發布和CheckIn服務機制,它們確實發揮了預期的作用。Dan和Doug也一直在監控這些更新,并立即發現了這個問題。他們停止了更新,直到診斷出并解決了這個問題。

谷歌地圖

Charles當時對移動技術并不是特別感興趣。“那時候我還沒有手機。我從來都不喜歡手機,它們對我來說就是一種煩惱。人們可以隨時打擾你。誰希望這樣?”第二年,Charles的妻子懷上了他們的第一個孩子,這讓Charles有了開發一款應用程序的想法。“我需要知道她在哪里。如果我要去接她,并把她送去醫院,我希望能看到醫院的位置。”他想開發一款能夠為他提供這些信息的應用程序。

西雅圖辦公室的Keith Ito正在研究逐向導航。為了解決數據問題,他研究了一種新的顯示地圖的方法,即使用矢量。[插圖]矢量是一種使用幾何圖形而不是圖片來描述圖像(如地圖)的方法。服務器向手機發送的不是地圖的圖像(在圖片中嵌入了文本),而是地圖的幾何描述,設備可以基于這些描述通過適當的分辨率和旋轉角度繪制出地圖,而且數據量比PNG圖像要小得多。

中美文化差異

Android 希望通過 Android Market 來解決這個問題。他們希望為開發者提供一個可以上傳應用的商店。服務團隊負責人Michael Morrissey 向 Nick Sears 描述了他的目標:“我希望能夠做到:堪薩斯州的一個14歲的孩子早上開發好應用,下午上傳到 Android Market,然后所有的用戶都能下載。”

我們則是竭盡所能地阻止個人開發者發布程序。

嵌入式開發經驗

Ficus回憶起他在Be和Danger的經歷對他在Android的工作產生了怎樣的影響:“說到CPU和內存,我們當中有很多人都做過嵌入式系統,都形成了一種極度節約的理念。我覺得這是看待Android早期決策的一個非常有趣的視角。我看到很多這樣的工程師,好像他們是在大蕭條時期長大似的,已經學會了如何將就過日子。”整個平臺團隊把性能放在第一位。這是因為早期的設備內存有限,CPU速度慢,缺少GPU渲染(直到發布Honeycomb時,Android才有了用于渲染UI圖形的GPU。


2023-10-05 13:37:08

[新一篇] 用戶思維 健康指南 小池大魚 六項精進 返樸 如父如子 擊敗莊家

[舊一篇] 美國夢尋 100個美國人的100個“美國夢”
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表