[譯文] How Three Guys Rebuilt the Foundation of Facebook - Page 3

原文來自Wired.com,版權屬於原作者,本篇僅用於練習翻譯

終於要結束這一系列了(汗


閉關室中的工程師

閉關在高風險科技業中很常發生。將整批開發小組移到專屬房間,直到他們搞定專案為止。曾幫助Google打造Google Docs的現任Box.com工程副總Sam Schillace表示:「這很常見。像我們目前就有一些正在進行。」

Pobar將Facebook的虛擬機器小組移進第18大樓的地面層,那裡工程師的數量是相對較少的,Paroski說,他們甚至沒有告訴別人他們在那裏。Adams回憶:「就像是我們在沙漠迷路等待直升機救援一般,但我們決定要自己走出去。即使不知道要往哪去,但就是得靠自己的力量到達。」

曾有好幾個月,整個小組──尤其是Adams──都在尋找程式碼中可以修復效能問題的一個關鍵。但在小組移進「戰洞」後,態度有了轉變。比起尋找一個關鍵,他們寧願用盡心力修好所有東西。

Paroski說:「方法就是去找小地方,並做實驗看看修改那裏是不是有幫助。如果實驗失敗,就放下它並趕快尋找其他地方。」

在房間的另一面牆,他們正在雜亂的白板上統整他們的成果。它被便利貼黏得到處都是,每張記載著一個提升系統的可行方法,並依照改進所需的時間來做排列。如果其中一張便利貼上的方法是死路,它就會馬上被移到旁邊去。

在白板上面,他們安裝了兩個用來比較新系統和Hiphop效能差距的螢幕。起先,那條線只是緩緩地移動。但從Adams開始,相繼其他人(如Evans和Paroski)焚膏繼晷努力工作了五周後,許多小小的改進最終值得了。

根據專案相關人員的說法,Adams是主要點子來源。Evans是能快速將大量程式碼修正成果的工程師。而PHP專家Paroski則是確保這些點子不會偏離軌道──偏離這個程式語言所能支援的範圍。

漸漸的,那條速度線又開始上升,並在2012年11月6號的選舉日,它終於超越了Hiphop。那周末,Adams和他的VMWare老同事Eli Collins一起去騎腳踏車。Collins說:「這我還記得很清楚。」

向公司原本的PHP轉換器致敬,他們將系統命名為Hiphop虛擬機器,或縮寫為HHVM,而它很快地就被安裝在網站下運作,至今還在服役。

HHVM使用所謂的即時編譯,意味著Facebook的PHP程式碼在伺服器上執行時才轉換成機器碼。這就是Java程式語言的運作方式,但Java虛擬機器好多年前就已建造來服務整個業界的程式設計師們。Hiphop虛擬機器正如其中許多架構是專為Facebook量身打造的,但Facebook已將它開源化,因此所有人都可以使用它。

花園之州

有了Hiphop虛擬機器,Facebooko可以用大部分開發者無法想像的速度執行PHP。但有些人依舊很疑惑為什麼這間公司會用如此極端的方式。資深程式開發權威David Pollack就不認同PHP幫助Facebook快速轉變的這個看法。

他說:「PHP很適合用來建立次級網站。Facebook能擴展一個次級語言至如此強大且有彈性的網站真的很讓我驚訝,但我就是不認為用PHP來建造網站是最好的方式。就像是住在紐澤西(新澤西)的人們稱它為花園之州一樣。」

即使Adams承認「他說開發者使用動態語言較有生產力」這件事在某些角度上是有問題的。Evans也承認「雖然像是PHP這種語言可以讓你在短期內有更好的生產力,但長期下來它會讓事情更難處理。」

他說:「靜態程式碼最終會成為很好的文件,它替你紀錄寫程式時想做的事。如果你用像是PHP的動態語言寫了一些程式碼,而兩年後你回來看就會發現它缺乏當時的資訊。」

的確,Facebook很大一部分卡在PHP,因為要將整個網站改寫成另一種語言會是更龐大的工程。這稱為傳統問題。Paroski說:「最終,你就會到達無法全部改寫的規模。」

從與Adams類似的人對話中可以知道,Facebook依舊對PHP很有愛,即使為它建造全新的虛擬機器須背負很大的風險,這不只是間願意冒險的公司,還是冒別人不願意的險。

前Google員工現任Box工程副總Sam Schillace說:「Apple是優美、Google是規模、Microsoft是...ㄜ...三十歲的老公司。但Facebook是創新、他們不只為了典雅、而是為了創新。他們的信念是利用嘗試和快速來擊敗其他人。」

其他人可能不會了解,因為他們不知道所謂的駭客之道。

更新:此故事說到Amir Michael是被Facebook雇用的伺服器工程師,但他三周前就已經離職了。

留言

粗體斜體刪除線連結引用圖片程式碼

注意:您的電子信箱將不會被公開,且網站連結不會被搜尋引擎採計

{124} {123} {122} {121} {120} {119} {118} {117} {116} {115} {114} {113} {112} {111} {100} {025} {024} {023} {022} {021} {020} {019} {018} {017} {016} {015} {014} {013} {012} {011} {010} {009} {008} {007} {006} {005} {004} {003} {002} {001}