到底app開發者需要掌握多少門語言?

諸如Apple、Facebook及Google這樣的大公司正在開發他們自己的編程語言,開發者們被迫只有適應。前不久的世界開發者大會上,Apple公佈了它的新開發語言Swift。這是最近大型技術公司們開發的一大波新語言中的最新成員,這些新語言某種程度上都是專門應用於他們自己的平台。
對iOS開發者,Apple有Swift;而Facebook 有 Hack —— 一門用於後端開發的語言。與此同時,Google已經擁有了它自己的Javascript替代者 Dart,以及一門新的通用編程語言Go。
這一波又一波的新語言,給開發者們帶來了許多問題。也許其中最嚴重的問題正如我一位同事Adriana Lee在Apple發佈Swift後所說:
(開發者們到底還得學習多少門語言?) ——Adriana Lee (@adra_la) June 2, 2014
電腦語言的通天塔
目前已經存在的編程語言有數百種,同時還有更多的語言正在湧現。其中許多都是被設計用在相對較窄的應用程式範圍內,大多數甚至從未走出過專案小組的範圍。
與此類似,大技術公司開發的新語言其實也是伴隨著公司一起成長的。通用語言的鼻祖,C語言,就源於上世紀70年代初的AT&T貝爾實驗室。Java,目前作為Android app開發的主要語言,誕生於上世紀90年代Sun公司的Microsystems系統。
發展到現在,不同之處在於,公司們擁抱新語言、從而想要延伸的特定商業目標的範圍不一樣了 —— 這一過程同時建立了一個忠心耿耿的開發者基礎,他們被牢牢鎖定在了某個公司的特定平台上。這類一石二鳥的戰略,最早可以追溯到Sun對Java的採用,當時公司就將其作為了挑戰微軟PC桌面統治地位的一種手段。(事情雖然沒有像Sun計畫的那樣發展下去,但在Google轉向Android之前,Java大體上也算是在企業中間件系統中找到了自己的一席之地。)
這麼看來,Apple的Swift其目標也就很明確了。Swift應該不會辜負公司前期的大肆宣傳,通過磨平Objective-C那粗糙的毛邊,看起來它能夠成功簡化iOS app開發者的開發過程。但是同樣還是這些開發者,他們卻需要學習一門新語言的輸入和輸出,而這些功能很可能在其他地方都不會用到。
大公司們為什麼要重複造輪子
“不要重複造輪子”這一哲學在絕大多數開發者心中根深蒂固,大公司們對此卻並不買賬。那他們為何不只是修改下現有語言用於新的用途呢?
答案很簡單,公司們發明他們自己的語言,是因為他們有這個能力。設計一門新語言可能很複雜,但對資源要求卻並不很高。困難之處也就在對其提供支持,包括提供軟體資源(共用代碼庫、API、編譯器、文檔等)以及贏得開發者的支持。大公司們在這兩方面尤其擅長。
還有一個事實,現有語言通常很難硬塞進如今的複雜代碼框架中。舉個栗子,Facebook決定發明的Hack,就是一個普遍適用於Web開發的腳本語言PHP的超集合(superset)。
Facebook的Hack最近已經比較普遍,其主要目標就是改進代碼的穩定性,針對這一目的,它強制在程式運行之前對數據類型進行檢測。這樣的檢測確保了一個程式,比方說,不會將一個整數解析為一個字串,這樣的錯誤如果捕獲不到很可能會導致不可預知的後果。在Hack中,這些檢測會預先執行,以便程式員能夠在程式上線前早早發現這樣的錯誤。
據Facebook的Hack專案組核心成員Julien Verlaguet透露,公司之前嘗試過用一門現有語言實現更高效的編程。但是Facebook的大部分代碼都是由PHP編寫的,公司實際上已經建立了一個支持PHP及其分支的軟體架構。即使能夠讓PHP同其他語言編寫的代碼協同工作,實現的難易程度和運行速度都無法滿足要求。
“比如說我們嘗試用Scala重寫PHP代碼庫,”Verlaguet說。“Scala是一門設計優秀的漂亮語言,但是它與PHP完全不相容。每次我需要從Scala的代碼庫部分調用PHP的時候,都會損失性能。我們很願意使用一門現有語言,但是對於我們來說,這條路行不通。”
於是,Facebook發明了Hack,它與PHP一樣能夠共用公司現有的架構。Verlaguet介紹說,Facebook的代碼庫主體已經從PHP遷移到了Hack,同時公司將Hack開源,希望獨立開發者們能夠幫公司找到Facebook以外的用途。
“你仍然可以使用PHP,”他說,“但是我們希望你有使用Hack的欲望。”
誰說了算
公司和開發者之間有一種微妙的平衡。app公司可以按照自己的喜好發明語言。但是如果開發者都不願使用這門語言,那就沒人用了,公司以外的人也就沒人願意將自己的職業生涯託付給這家公司。
公司在開發過程中同時使用不同的語言,這並不少見。例如,你可能用Objective-C開發iOS app,但卻用Java開發Android app。對開發者來說,這從來都不是癥結所在,因為Objective-C和Java都是通用面向對象語言。它們用途廣泛適用於很多場合。
然而,Hack、Dart、Go和Swift,到目前為止,仍然只適用於嚴格特定公司的編程解決方案,往往和公司選擇的編程環境相對應。誠然,現在下結論可能還太早。比方說Hack,就可以用在一些後端的實現中;它只是太新了,以至於Facebook還沒有任何數據供人們如此使用。
不是開發者不能學習多門語言。事實上,大多數人已經掌握了多門語言。這好比羅曼斯語(一種由拉丁語演變而成的語言),如果你會說西班牙語,再去學法語就比那些不會西班牙語的人簡單許多。與此類似,如果你已經會Java,再學Ruby或Perl就簡單得多。如果你會PHP,基本上就已經學會了Hack。
與此相反,學習多門語言更多的是一個習慣問題。如果Java已經解決了你的問題,你就不再有動力去學Ruby。如果你用Objective-C編寫iOS app感覺很爽,你就不會有強烈的意願去學Swift。
另外,對於一些開發者來說,封閉生態系統的語言只會使每個人的生活變得更糟。例如,自由設計師Jack Watson-Hamblin就告訴我說,像Apple這樣強勢推出Swift,其實是在冒險增加程式員的負擔,同時將開發者社區割裂開來:
程式員掌握多門語言固然重要,但是不斷強迫他們緊跟新語言,卻是行不通的。如果我正在開發一個簡單的跨平台app,我可不想被迫掌握四門語言再來完成它。如果真的需要,我也只想使用一門語言。
Watson-Hamblin就主張說,當每家公司都為了自家需要發明自己的語言時,程式員的注意力被分散,開發的視野也局限於一種,這只會拖慢整個開發進程。他說,“如果拿公司負責一門語言與負責一個開源社區相比較,這兩者的區別就好比一家大企業與一個初創小公司的區別”。社區生來就更加靈活,適應能力更強。
當然,Apple有許多非常好的理由推出Swift從零開始,就像當初Facebook發明Hack的時候一樣。我並不是說,大公司不會強迫開發者接受這種改變,在這方面,有些公司一直都很讓人討厭。
“新語言的發明,伴隨著霸權的支配,”Verlaguet說,“被迫不停追趕,確實令人沮喪,但另一方面,你又多了一種解決問題的新語言。反過來想想,要是全世界的程式員都用同樣一門語言做所有事情,即使啥都湊合著能幹,這門語言也一定幹得不怎麼樣”。