谷歌的語言何以戰(zhàn)勝Python?50%的人都應(yīng)該立即學(xué)習(xí)Golang
本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)
很多軟件工程師視Python為比較喜愛的語言之一,工作生活都和它死死綁定在一起。但Google, Uber, Dropbox, Soundcloud, Slack, 和Medium的軟件工程師并不是這樣。長期以來,優(yōu)秀企業(yè)的程序員們一直迷戀于另一種語言。
盡管大部分開發(fā)者還在使用Python,但無論是對于API、網(wǎng)頁服務(wù),或是數(shù)據(jù)處理,高級員工都已經(jīng)增加了對于Golang(Go)的使用,它的表現(xiàn)棒極了!
由先驅(qū)建立
Go是由谷歌的一個全明星三人組發(fā)明的:
- Rob Pike參與開發(fā)了Unix環(huán)境,并參與創(chuàng)建了Limbo編程語言。
- 有了Ken Thompson,這個團隊就有了Unix和B語言(C語言的前身)的發(fā)明人。
- Robert Griesemer是谷歌的V8 JavaScript機器的負責人之一,同時也是谷歌創(chuàng)造的另一門語言——Sawzall的主要開發(fā)者。
谷歌最初正是用Python編寫的,但是在2007年前后,工程師們正在尋找一種更好的語言來執(zhí)行谷歌的主要任務(wù)。
Rob Pike在2012年的一次篇演講中提到了他們遇到的問題:
- 構(gòu)建緩慢:生成新代碼需要很長時間。
- 依賴路徑不可控:你是否曾經(jīng)試圖安裝一個軟件包,結(jié)果卻發(fā)現(xiàn)你不得不安裝至少5個其他的依賴路徑和無數(shù)的子依賴路徑來讓它運行?是的,即使是谷歌人也有這個問題。
- 版本偏離:由于到處都是重復(fù)的代碼,工程師可能只會更新原始代碼片段的一個版本,而忘記其他版本。因此,最終得到的版本既包含新代碼,也包含舊代碼。
- 編寫自動工具較困難:編寫自動寫代碼的程序是可能的——事實上,大多數(shù)程序在某個階段都會這樣做。但在現(xiàn)代編程語言中,這仍然很難實現(xiàn)。
- 每個程序員都使用語言的不同子集:對于Python,一個開發(fā)人員可能使用numpy包,另一個更喜歡scipy包。諸如此類,當程序員想要將他們的代碼混合到一個包中時,情況就會變得混亂。
- 程序理解能力差:那些說自己一讀代碼就懂的人是在撒謊,它不是一個簡單的“Hello World”程序。而且代碼的文檔通常幫不上什么忙——在大多數(shù)情況下,它甚至不存在,或者被編得很糟糕。
- 重復(fù)操作:你是否曾經(jīng)從程序的某個部分復(fù)制一段代碼?這是不好的做法。但大多數(shù)編程語言都使其易于實現(xiàn)。
- 更新成本高:在上面描述的這種混亂情況下,更新軟件需要花費大量的時間和腦力。
- 跨語言構(gòu)建:Python適合于中小型腳本,c++適合于復(fù)雜的程序,Java適合于web開發(fā),Haskell適合于有惰性但穩(wěn)健的代碼。結(jié)果是,一個程序常常包含許多不同語言的代碼片段。但是為了編譯、調(diào)試和保持簡潔,用一種語言編寫程序要好得多。
于是三人組開始設(shè)計一種干凈、簡單、易讀的語言。一種可以消除或至少減輕軟件工程中這些常見問題的語言。
一門精簡的語言
這些常見問題的根源在于現(xiàn)代語言的復(fù)雜性。想想Python或C——你有沒有試著閱讀過整個文檔?祝你好運。相比之下,Go比較大的特點就是簡單。這并不意味著你不能用它來構(gòu)建復(fù)雜的代碼。但Go考慮到了,不要有引入復(fù)雜性卻不能解決問題的特性。
例如,Go不像其他面向?qū)ο笳Z言那樣有類。作為其他語言中常用功能,類可以使一個對象繼承另一個對象的屬性。
問題是,如果試圖改變一個對象的結(jié)構(gòu)而不改變其他對象的結(jié)構(gòu),就會破壞代碼。Go有一個被稱為struct替代方法,其更偏向組合而不是繼承。
Go的其他主要特征是:
- 類型安全:在C語言中,使用光標做任何事情——包括使程序崩潰。Go不會讓你這樣搞砸東西的。
- 正交性:這意味著如果在代碼中更改一個對象,其他對象不會因此而更改。與C語言不同的是,比如,如果你改變了一個變量,那么其他的變量也會隨之改變。Go是正交的,因為它使事情更簡單。
- 最小化:在Go中,只有一種方法來編寫代碼。而Python有無數(shù)種方法來編寫一個東西!
- 可讀性高:和Python一樣,Go會把可讀性放在第一位。因此它相比大多數(shù)語言來說對新手更友好,也使維護代碼更容易。
- 文檔化:尤其對于初級開發(fā)人員,他們覺得為了使別人可以使用代碼而寫一些關(guān)于代它的簡介是很乏味的。使用Godoc,這個過程會比大多數(shù)語言更加自動化,開發(fā)人員不需要浪費寶貴的時間來記錄他們所做的事情。
- 實用性:重要的東西應(yīng)該易于編寫代碼,即使這意味著其他事情不可能在Go中完成。邏輯是,你希望通過使重復(fù)的任務(wù)變得快速和簡單來提高開發(fā)人員的效率。如果有更復(fù)雜的問題他們可以用另一種語言來寫。
或許這些聽起來毫無創(chuàng)意,從某種意義上說,確實如此,這不是一種帶有時髦特征的語言,Go不是一種用來探索和研究的語言。
但神奇之處正在于此,當你嘗試著去創(chuàng)造一些能運行的東西的時候,當你在一個團隊中,有許多不同背景的人在同一個代碼上工作的時候,當你厭倦了其他語言帶來的混亂的時候,Go能救你于水火。
日益繁榮的社區(qū)
由于其簡單性,Go是當今存在的很具協(xié)作性的語言之一。過去程序員們總是坐在自己的小隔間里,從不與別人見面,這樣的時代已經(jīng)一去不復(fù)返了。
現(xiàn)在,我們有StackExchange來解決所有的編碼問題。我們有Slack,Zoom,Google Meet等來和我們的團隊保持聯(lián)系。但現(xiàn)代語言仍然是為小隔間里的小書呆子量身定做的。
Go改變了這種局面。盡管比Python晚了20歲,但它擁有一個充滿活力的社區(qū)。他們將尊重、開放和友好置于行為準則之上,雖然其他語言,如Python或C,也有類似的社區(qū)聲明,但對這些基本價值觀的強調(diào)較少。
因此,社區(qū)在Go年度調(diào)查中扮演著明確的角色也就不足為奇了
有關(guān)社區(qū)和領(lǐng)導(dǎo)力的問題 | 圖源:2019
數(shù)據(jù)不言自明
根據(jù)2019 Go Survey,谷歌的語言主要用于網(wǎng)站開發(fā)、網(wǎng)絡(luò)和系統(tǒng)編程。Python的前景看起來與之非常相似:
Python的使用數(shù)據(jù) | 圖源:2019 Python
唯一顯著的區(qū)別是有多少Python用于數(shù)據(jù)分析和機器學(xué)習(xí)。在這些領(lǐng)域,其他熱門的新語言也正在涌現(xiàn)。
你可以看到許多Python的用法都可能被Go所取代,包括46%的網(wǎng)絡(luò)開發(fā)46%,37%的系統(tǒng)管理和DevOps中,以及19%的網(wǎng)絡(luò)編程中。即使你認為許多開發(fā)人員完成了所有這三種工作,至少一半的Python支持者正在做他們在Go中可以做的事情。
事實上,開發(fā)人員已經(jīng)意識到Go提供的巨大潛力。根據(jù)Hackerrank的數(shù)據(jù),在2019年,大約有三分之一的程序員想學(xué)Go。
接下來的熱門語言 | 圖源:Hackerrank.
由于Go非常容易學(xué)習(xí),我們應(yīng)該會在未來幾年看到從Python到Go的轉(zhuǎn)變。雖然對于大多數(shù)公司,尤其是不像Dropbox或Medium那樣龐大有錢的公司來說,把所有的代碼重寫用Go編寫將是非常昂貴的。但對于新項目來說,你至少應(yīng)該嘗試一下。
給彼此一個機會,給未來一個可能,何不去試試Go呢?