“最好的語言” PHP 如何造就 Facebook?

贊 回覆發表於2015-04-08

程式語言會塑造這門語言使用者的思維方式,這有助於解釋科技創業公司的執行方式,以及它們能重新發明自己的原因。

當日本電腦科學家松本行弘決定創造 Ruby 時,他正在追逐 Samuel R. Delany 於 1966 年創作的科幻小說《巴別 17 語》(Babel-17)中的一個想法。這部小說的核心是一種與書名同名的人工語言,可以讓所有說這種語言的人的思想升級。小說裡的主角曾說過:“巴別 17 語是一門非常精確的分析語言,幾乎能確保讓你掌握任何情況的技術細節。”松本行弘想要通過 Ruby 實現同樣的事:重新改造並提高程式設計師的思維方式。

PHP與Facebook

這聽起來很巨集偉,但松本行弘的想法並不少見。軟體開發者們傾向於認為,程式語言能改變使用者思考問題的方式,甚至會改變使用者想要去解決的問題。這也是他們擴大公司、產品以及同事人數的方法:“你用什麼語言?”

這能幫助外部人士理解已經變得極其強大和有價值的軟體公司,以及充斥我們生活的產品和服務。哪怕是這些公司最內部的決定,比如用 Ruby 或 PHP 或 C 打造了某個新產品,這個決定都能一下子影響到所有人。如果你想知道 Facebook 給人以現在這種印象和工作方式的原因,以及 Facebook 能為/對我們做什麼,你就需要了解 PHP,這門馬克·祖克伯建立 Facebook 所使用的語言。

PHP 可能是最不受程式設計師尊重的程式語言。一篇目前已經成為權威的博文在描述 PHP 的缺陷時稱, PHP 是“支離破碎的糟糕設計”,願意使用 PHP 的人都被視為外行。知名程式設計問答網站 Stack Overflow 聯合創始人 Jeff Atwood 表示道:“那些聰明的工程師們加入 Facebook,卻在 Windows XP 上編寫 PHP 程式碼,這已然成迷。說他們是黑客簡直是在侮辱黑客這個詞。”在不到 10 分鐘的談話裡,Atwood 稱 PHP 是“拖沓的怪物”,“瘟疫”和一間住戶必須愛上鬼的鬼屋。

大多數成功的程式語言都有全域性哲學或系列指導原則,以便將程式語言的詞彙表和語法組織成一個合乎邏輯的整體。PHP 則不然。PHP 的創造者 Rasmus Lerdorf 坦承,PHP 是他胡亂拼湊而成。他在 2003 年的一次採訪中說道:“我不知道該如何阻止它。我根本不知道該怎麼編寫一門程式語言,在我覺得需要時,就往裡面加東西。”

程式設計師們最喜歡舉的一個例子是 PHP 的 mysql_escape_string 函式,這個函式可以在惡意輸入查詢進入資料庫之前將它排除掉。當這個功能被發現有問題時,出現了一個名為 mysql_real_escape_string 的新函式,但原來的那個函式並沒有得到替換。結果就像是飛機駕駛艙裡有兩個很像的按鈕靠在一起:一個按鈕可以放下起落架,另一個按鈕則可以安全地放下起落架。這根本不合常理,是製造災難的溫床。

然而,儘管對 PHP 的輕視普遍存在,但很多網站都是用 PHP 建立的。根據一項估計,有 39% 的網站使用了 PHP 語言。Facebook、維基百科、WordPress 都是 PHP 專案。這是因為儘管 PHP 有很多缺陷,但它卻很容易用在專案的起步階段。PHP 是“personal home page”(個人主頁)的縮寫。使用者可以很方便地使用 PHP 向靜態 HTML 頁面中新增日期、使用者名稱等動態內容。PHP 極大地縮小了修改網站和編寫網路應用之間的差距,你不必成為專家。

運營維基百科的維基媒體基金會首席軟體工程師 Ori Livneh 表示,這種一路走來的特性對維基百科的成功至關重要。他告訴我:“我一直都討厭 PHP。”由於對 PHP 的依賴,維基百科飽受大規模設計缺陷的困擾。但 PHP 可以讓非軟體工程師為維基百科貢獻新功能。埃及古物學的維基百科條目可以顯示象形文字就得益於此。

你不可能用 PHP 做出來谷歌,因為谷歌需要進行精心設計,讓搜尋可以快速高效地進行。谷歌使用了更精確和強大的語言,比如 Java 和 C++。相反,Facebook 由眾多小試驗組成,是一個由按鈕、訊息流和試圖引起你關注的元素組成的大雜燴。PHP 天生是用來快速開發出功能的。

幾乎可以想象,在 Facebook 誕生的那個命運之日,祖克伯在他的哈佛宿舍裡肯定是想盡可能地省事,好讓網站上線。網路變化的太快,使用者如此善變,你能抓住機會的唯一方法就是成為第一個,而無論做出了什麼東西。祖克伯完工了。人們能用 Facebook。祖克伯當時想的不是漂亮的程式碼;他在想的是他的朋友們要登入“Thefacebook”看美女照片。

如今 Facebook 的市值超過 2000 億美元,“完成比完美重要”、“快速行動,打破成規”的標語遍佈在 Facebook 辦公室的牆上。這些直率的訊息是為了讓員工們與 Facebook 的“黑客”文化保持一致。但這些都是 PHP 的價值觀。快速行動和打破成規就是 PHP 的精髓,任何“說”這一語言的人都會不可避免地這麼想。也可以說,PHP 創造並維繫了 Facebook 的文化。

祕密武器

如果你想要尋找 PHP 的反例,金融交易公司 Jane Street Capital 就是最好不過的例子了。這家 400 人的公司號稱處理了全美日股票交易量的 2%。

Jane Street 的技術負責人 Yaron Minsky 十分推崇一門名為 OCaml 的冷門程式語言。10 年前,身為電腦科學博士的 Minsky 說服了 Jane Street Capital 用 OCaml 重寫公司的整個交易系統。在此之前,幾乎沒有人在實際產品中用過 OCaml。OCaml 由一家法國研究機構的學者們開發,旨在改進一個能自動證明數學定理的計算機系統。但 Minsky 認為 OCaml 能取代驅動 Jane Street 交易系統的複雜 Excel 電子表格。

OCaml 的大賣點是其“型別系統”,對於不符合型別的資料,程式不會執行。對於一個在行情好的日子裡每天能交易 300 億美元的程式而言,用型別系統編寫的程式要可靠得多。

Minsky 表示,通過捕獲錯誤,OCaml 的型別系統可以讓 Jane Street 的程式設計師專注於更大的問題。程式設計師們會想,他們是否修復了系統捕獲的錯誤,這樣 OCaml 就成了一種讓人不可能思考糟糕想法的新語。

這裡的訣竅是,為了讓型別檢查器奏效,程式設計師們必須給程式碼新增複雜的註釋。編寫對型別進行限制的程式碼很討厭,甚至會讓人喪氣。更糟糕的是,OCaml 需要高深的抽象數學能力。但這種語言的精確性卻牢牢地吸引了一些人,這讓 Jane Street 在緊俏的程式設計師招聘市場中具備非同尋常的優勢。儘管使用 PHP 作為開發語言,大部分軟體開發者還是會選擇加入 Facebook 和維基百科。但 OCaml 卻能穩定地吸引到高質量的求職者。這種吸引不僅源自語言,還和使用它的人有關。Jane Street 是一家允許員工在休息室裡玩四人國際象棋的公司。這種競爭智慧的文化與花哨程式語言的使用交相輝映。

谷歌似乎打算在 Go 語言上實現類似的效果。Go 是谷歌開發的高效能程式語言,旨在讓網際網路的運作更優雅、更高效,很適合開發驅動大型網際網路服務的高併發軟體。Go 也很吸引對困難的新語言感興趣的程式設計師。

成長壯大

在 2010 年末時,Facebook 遭遇了一場危機。PHP 並不強調效能,但 Facebook 卻需要效能。Facebook 發展得太快,似乎如果不大改 PHP,Facebook 就會開始衰落。

徹底轉換語言不在考慮之列。Facebook 的 PHP 程式碼數超過數百萬行,這些程式碼由數千名工程師編寫而成,服務超過 5 億使用者。相反,Facebook 任命了一小隊高階工程師來發明一種方式,讓 Facebook 在不更換程式語言的情況下繼續保持運作。

解決方案之一就是開發一個編譯器,將 Facebook 的 PHP 程式碼轉換成執行速度快得多的 C++ 程式碼。另一種解決方法是創造一種 PHP 方言,這樣就不會改變 Facebook 的 PHP 文化,又能讓他們寫出更可靠的程式碼。

於是 Facebook 開發出了名為 Hack 的 PHP 方言。Hack 是擁有可選型別系統的 PHP。Hack 的型別檢查器完全用 OCaml 編寫也絕非偶然。Facebook 想要自己的程式設計師繼續用 PHP 快速開發,但不再想要他們像以前一樣打破成規了。

與此同時,Twitter 也經歷了類似轉變。Twitter 最開始採用 Ruby on Rails 框架。但隨後使用者暴增。當有成千上萬粉絲的使用者釋出推文時,這些粉絲的時間線就必須立即得到更新。像這樣的大推文經常會擠爆系統,迫使工程師們將網站下線,以查詢問題所在。Twitter 的工程師這麼做了很多次,以至於 Twitter 維護頁面上的“失敗鯨”都出了名。Twitter 用 Scala 語言重寫了大部分服務,從而阻止了情況惡化。和 OCaml 一樣,Scala 也是由學者們開發的,擁有一個強大的型別系統,強調正確性和效能,哪怕是以犧牲程式設計師在程式碼上的自由和愉悅為代價。

就像創業公司的“成熟”是以最終弄清楚了營收來源為標誌一樣,公司也能聰明地利用程式語言的威力來操縱組織心理。程式語言設計師 Guido van Rossum 表示,一旦一家軟體公司達到一定規模,避免混亂的唯一方法就是使用需要程式設計師預先投入很多的語言。van Rossum 說道:“這種語言會讓你覺得拖慢了速度,因為你必須把一件事說上三次。”這也是許多創業公司儘可能拖延轉換語言的原因。因為轉換語言會失去一些幫助公司起步的牛人,小團隊也不大可能快速推出新功能。但一門更精確的語言能幫助公司員工理解彼此的程式碼,讓公司的產品具備穩定性,從而成為人們日常生活的組成部分。

軟體公司能進行這類佈局也許還能解釋為什麼它們會變得這麼強大。計算機不斷擴充套件的邊界是原因之一。但這些公司也具備再造自己的特質。隨著它們改變和壯大,它們將不侷限於重繪組織結構圖。因為它們建立在程式碼之上,也就能做些更加激烈的事。它們可以改造自己、自己的文化以及思維方式。

相關文章