左耳朵耗子:Go語言,Docker和新技術(shù)
日前,作為 Go 語言的三位創(chuàng)始人之一,Unix 老牌黑客羅勃·派克(Rob Pike)在新文章“Go: Ten years and climbing”中,回顧了一下 Go 語言的發(fā)展過程。其中提到,Go 語言這十年的迅猛發(fā)展大到連他們自己都沒有想到,并且還成為了云計(jì)算領(lǐng)域中新一代的開發(fā)語言。還提到了,中國(guó)程序員對(duì) Go 語言的熱愛完全超出了他們的想象,甚至他們都不敢相信是真的。
這讓我想起,我在 2015 年 5 月份拜訪 Docker 公司在灣區(qū)的總部時(shí),Docker 負(fù)責(zé)人也和我表達(dá)了相似的感嘆:他們完全沒有想到居然中國(guó)有那么多人喜歡 Docker,而且還有這么多人在為 Docker 做貢獻(xiàn),這讓他們感到非常意外。此外,還跟我說,中國(guó)是除了美國(guó)本土之外的另外一個(gè)如此喜歡 Docker 技術(shù)的國(guó)家,在其它國(guó)家都沒有看到。
的確如他們所說,Go 語言和 Docker 這兩種技術(shù)已經(jīng)成為新一代的云計(jì)算技術(shù),而且可以看到其發(fā)展態(tài)勢(shì)非常迅猛。而中國(guó)也成為了像美國(guó)一樣在強(qiáng)力推動(dòng)這兩種技術(shù)的國(guó)家。這的確是一件讓人感到非常高興的事,因?yàn)橹袊?guó)在跟隨時(shí)代潮流這件事上已經(jīng)做得非常不錯(cuò)了。
然而,從 2014-2015 年我在阿里推動(dòng) Docker 和 Go 語言的痛苦和失敗過程中,以及這許多年來,有很多很多人問我是否要學(xué) Go 語言,是否要學(xué) Docker,Go 和 Docker 是否能用在生產(chǎn)線上,這些問題看來,對(duì)于 Go 語言和 Docker 這兩種技術(shù),在國(guó)內(nèi)的技術(shù)圈中有相當(dāng)大的一部分人和群體還在執(zhí)觀望或是不信任的態(tài)度。
所以,我想寫這篇文章,從兩個(gè)方面來論述一下我的觀點(diǎn)和看法。
- 一個(gè)方面,為什么 Go 語言和 Docker 會(huì)是新一代的云計(jì)算技術(shù)。
- 另一個(gè)方面,作為技術(shù)人員,我們?nèi)绾巫R(shí)別什么樣的新技術(shù)會(huì)是未來的趨勢(shì)。
這兩個(gè)問題是相輔相成的,所以我會(huì)把這兩個(gè)問題揉在一起談。
雖然 Go 語言是在 2009 年底開源的,但我是從 2012 年才開始接觸和學(xué)習(xí) Go 語言的。我只花了一個(gè)周末兩天的時(shí)間就學(xué)完了,而且在這兩天,我還很快地寫出了一個(gè)能工作很好的網(wǎng)頁爬蟲程序,以及一個(gè)簡(jiǎn)單的高并發(fā)文件處理服務(wù),用于提取前面抓取的網(wǎng)頁的關(guān)鍵內(nèi)容。這兩個(gè)程序都很簡(jiǎn)單,總共才寫了不到 500 行代碼。
我當(dāng)時(shí)對(duì) Go 語言有幾點(diǎn)體會(huì)
***,語言簡(jiǎn)單,上手快。Go 語言的語法特性簡(jiǎn)直是太簡(jiǎn)單了,簡(jiǎn)單到你幾乎玩不出什么花招,直來直去的,學(xué)習(xí)曲線很低,上手非???。
第二,并行和異步編程幾乎無痛點(diǎn)。Go 語言的 Goroutine 和 Channel 這兩個(gè)神器簡(jiǎn)直就是并發(fā)和異步編程的巨大福音。像 C、C++、Java、Python 和 JavaScript 這些語言的并發(fā)和異步方式太控制就比較復(fù)雜了,而且容易出錯(cuò),而 Go 解決這個(gè)問題非常地優(yōu)雅和流暢。這對(duì)于編程多年受盡并發(fā)和異步折磨的我來說,完全就是讓我眼前一亮的感覺。
(圖片來自 Medium:Why should you learn Go?)
第三,Go 語言的 lib 庫麻雀雖小五臟俱全。Go 語言的 lib 庫中基本上有絕大多數(shù)常用的庫,雖然有些庫還不是很好,但我覺得不是問題,因?yàn)槲蚁嘈旁谖磥淼陌l(fā)展中會(huì)把這些問題解決掉。
第四,C 語言的理念和 Python 的姿態(tài)。C 語言的理念是信任程序員,保持語言的小巧,不屏蔽底層且底層友好,關(guān)注語言的執(zhí)行效率和性能。而 Python 的姿態(tài)是用盡量少的代碼完成盡量多的事。于是我能夠感覺到,Go 語言想要把 C 和 Python 統(tǒng)一起來,這是多棒的一件事啊。
(圖片來自 Medium:Why should you learn Go?)
所以,即便 Go 語言存在諸多的問題,比如垃圾回收、異常處理、泛型編程等,但相較于上面這幾個(gè)優(yōu)勢(shì),我認(rèn)為這些問題都是些小問題。于是就毫不猶豫地入坑了。
當(dāng)然,一個(gè)技術(shù)能不能發(fā)展起來,關(guān)鍵還要看三點(diǎn)。
有沒有一個(gè)比較好的社區(qū)。像 C、C++、Java、Python 和 JavaScript 的生態(tài)圈都是非常豐富和火爆的。尤其是有很多商業(yè)機(jī)構(gòu)參與的社區(qū)那就更為人氣爆棚了,比如 Linux 的社區(qū)。
有沒有一個(gè)工業(yè)化的標(biāo)準(zhǔn)。像 C、C++、Java 都是有標(biāo)準(zhǔn)化組織的。尤其是 Java,其在架構(gòu)上還搞出了像 J2EE 這樣的企業(yè)級(jí)標(biāo)準(zhǔn)。
有沒有一個(gè)或多個(gè)殺手級(jí)應(yīng)用。C、C++ 和 Java 的殺手級(jí)應(yīng)用不用多說了,就算是對(duì)于 PHP 這樣還不能算是一個(gè)好的編程語言來說,因?yàn)槭?Linux 時(shí)代的***個(gè)殺手級(jí)解決方案 LAMP 中的關(guān)鍵技術(shù),所以,也發(fā)展起來了。
上述的這三點(diǎn)是非常關(guān)鍵的,新的技術(shù)只需要占到其中一到兩點(diǎn)就已經(jīng)很不錯(cuò)了,何況有的技術(shù),比如 Java,是三點(diǎn)全占到了,所以,Java 的發(fā)展是如此好。當(dāng)然,除了上面這三點(diǎn)重要的,還有一些其它的影響因素,比如:
- 學(xué)習(xí)曲線是否低,上手是否快。這點(diǎn)非常重要,C++ 在這點(diǎn)上越做越不好了。
- 有沒有一個(gè)不錯(cuò)的提高開發(fā)效率的開發(fā)框架。如:Java 的 Spring 框架,C++ 的 STL 等。
- 是否有一個(gè)或多個(gè)巨型的技術(shù)公司作為后盾。如:Java 和 Linux 后面的 IBM、Sun……
- 有沒有解決軟件開發(fā)中的痛點(diǎn)。如:Java 解決了 C 和 C++ 的內(nèi)存管理問題。
用這些標(biāo)尺來量一下 Go 語言,我們可以清楚地看到:
- Go 語言容易上手;
- Go 語言解決了并發(fā)編程和寫底層應(yīng)用開發(fā)效率的痛點(diǎn);
- Go 語言有 Google 這個(gè)世界***的技術(shù)公司在后面;
- Go 語言的殺手級(jí)應(yīng)用是 Docker,而 Docker 的生態(tài)圈在這幾年完全爆棚了。
所以,Go 語言的未來是不可限量的。當(dāng)然,我個(gè)人覺得,Go 可能會(huì)吞食很多 C、C++、Java 的項(xiàng)目。不過,Go 語言所吞食主要的項(xiàng)目應(yīng)該是中間層的項(xiàng)目,既不是非常底層也不會(huì)是業(yè)務(wù)層。
也就是說,Go 語言不會(huì)吞食底層到 C 和 C++ 那個(gè)級(jí)別的,也不會(huì)吞食到高層如 Java 業(yè)務(wù)層的項(xiàng)目。Go 語言能吞食的一定是 PaaS 上的項(xiàng)目,比如一些消息緩存中間件、服務(wù)發(fā)現(xiàn)、服務(wù)代理、控制系統(tǒng)、Agent、日志收集等等,沒有復(fù)雜的業(yè)務(wù)場(chǎng)景,也到不了特別底層(如操作系統(tǒng))的中間平臺(tái)層的軟件項(xiàng)目或工具。而 C 和 C++ 會(huì)被打到更底層,Java 會(huì)被打到更上層的業(yè)務(wù)層。這是我的一個(gè)判斷。
好了,我們?cè)儆蒙厦娴臉?biāo)尺來量一下 Go 語言的殺手級(jí)應(yīng)用 Docker,你會(huì)發(fā)現(xiàn)基本是一樣的。
- Docker 上手很容易。
- Docker 解決了運(yùn)維中的環(huán)境問題以及服務(wù)調(diào)度的痛點(diǎn)。
- Docker 的生態(tài)圈中有大公司在后面助力。比如 Google。
- Docker 產(chǎn)出了工業(yè)界標(biāo)準(zhǔn) OCI。
- Docker 的社區(qū)和生態(tài)圈已經(jīng)出現(xiàn)像 Java 和 Linux 那樣的態(tài)勢(shì)。
- ……
所以,早在 3、4 年前我就覺得 Docker 一定會(huì)是未來的技術(shù)。雖然當(dāng)時(shí)的坑兒還很多,但是,相對(duì)于這些大的因素來說,那些小坑兒都不是問題。只是需要一些時(shí)間,這些小坑兒在未來 5-10 年就可以完全被填平了。
同樣,我們可以看到 Kubernetes 作為服務(wù)和容器調(diào)度的關(guān)鍵技術(shù)一定會(huì)是***的贏家。這點(diǎn)我在去年初就能夠很明顯地感覺到了。
關(guān)于 Docker 我還想多說幾句,這是云計(jì)算中 PaaS 的關(guān)鍵技術(shù),雖然,這世上在出現(xiàn) Docker 之前,幾乎所有的要玩公有 PaaS 的公司和產(chǎn)品都玩不起來,比如:
Google 的 GAE,國(guó)內(nèi)的各種 XAE,如淘寶的 TAE,新浪的 SAE 等。但我還是想說,PaaS 是一個(gè)被世界或是被產(chǎn)業(yè)界嚴(yán)重低估的平臺(tái)。
PaaS 層是承上啟下的關(guān)鍵技術(shù),任何一個(gè)不重視 PaaS 的公司,其技術(shù)架構(gòu)都不可能讓這家公司成長(zhǎng)為一個(gè)大型的公司。因?yàn)?PaaS 層的技術(shù)主要能解決下面這些問題。
軟件生產(chǎn)線的問題。持續(xù)集成和持續(xù)發(fā)布,以及 DevOps 中的技術(shù)必需通過 PaaS。
分布式服務(wù)化的問題。分布式服務(wù)化的服務(wù)高可用、服務(wù)編排、服務(wù)調(diào)度、服務(wù)發(fā)現(xiàn)、服務(wù)路由,以及分布式服務(wù)化的支撐技術(shù)完全是 PaaS 的菜。
提高服務(wù)的可用性 SLA。提高服務(wù)可用性 SLA 所需要的分布式、高可用的技術(shù)架構(gòu)和運(yùn)維工具,也是 PaaS 層提供的。
軟件能力的復(fù)用。軟件工程中的核心就是軟件能力的復(fù)用,這一點(diǎn)也***地體現(xiàn)在 PaaS 平臺(tái)的技術(shù)上。
老實(shí)說,這些問題的關(guān)鍵程度已經(jīng)到了能判斷一家依托技術(shù)的公司的研發(fā)能力是否靠譜的程度。沒有這些技術(shù),依托技術(shù)拓展業(yè)務(wù)的公司幾乎沒有可能發(fā)展得規(guī)模很大。
在后面,我會(huì)另外寫幾篇文章詳細(xì)地講一下分布式服務(wù)化和 PaaS 平臺(tái)的重要程度。
***,我還要說一下,為什么要早一點(diǎn)地進(jìn)入這些新技術(shù),而不是等待這些技術(shù)成熟了后再進(jìn)入。原因有這么幾個(gè)。
技術(shù)的發(fā)展過程非常重要。我進(jìn)入 Go 和 Docker 的技術(shù)不能算早,但也不算晚,從 2012 年學(xué)習(xí) Go,到 2013 年學(xué)習(xí) Docker 到今天,我清楚地看到了這兩種技術(shù)的生態(tài)圈發(fā)展過程。讓我收獲***的并不是這些技術(shù)本身,而是一個(gè)技術(shù)的變遷和行業(yè)的發(fā)展。
從中,我看到了非常具體的各種思潮和思路,這些東西比起 Go 和 Docker 來說更有價(jià)值。因?yàn)?,這不但讓我重新思考我已掌握的技術(shù)以及如何更好地解決已有的問題,而且還讓我看到了未來。我不但有了技術(shù)優(yōu)勢(shì),而且這些知識(shí)還讓我的技術(shù)生涯多了很多的可能性。
這些關(guān)鍵新技術(shù),可以讓你拿到技術(shù)的先機(jī)。這些對(duì)一個(gè)需要技術(shù)領(lǐng)導(dǎo)力的個(gè)人或公司來說都是非常重要的。
一個(gè)公司或是個(gè)人能夠占有技術(shù)先機(jī),就會(huì)比其它公司或個(gè)人有更大的影響力。一旦未來行業(yè)需求引爆,那么這個(gè)公司或是個(gè)人的影響力就會(huì)形成一個(gè)比較大的護(hù)城河,并可以快速地產(chǎn)生經(jīng)濟(jì)利益。
近期,在與中國(guó)移動(dòng)、中國(guó)電信以及一些股份制銀行進(jìn)行交流的過程中,我已看到通訊行業(yè)、金融行業(yè)對(duì)于 PaaS 平臺(tái)的理解已經(jīng)超過了互聯(lián)網(wǎng)公司,而我近 3 年來在這些技術(shù)上的研究讓我也從中受益非淺。
所以,Go 語和 Docker 作為 PaaS 平臺(tái)的關(guān)鍵技術(shù)前途是***的,我很慶幸趕上了這個(gè)浪潮,也很慶幸在 3 年前我就看到了這個(gè)趨勢(shì),現(xiàn)在我也在用這些技術(shù)開發(fā)相關(guān)的技術(shù)產(chǎn)品,助力于為高速成長(zhǎng)的公司提供這些關(guān)鍵技術(shù)。