天天看點

Go語言,Docker和新技術

上個月,作為 Go 語言的三位創始人之一,Unix 老牌黑客羅勃·派克(Rob Pike)在新文章“Go: Ten years and climbing”中,回顧了一下 Go 語言的發展過程。其中提到,Go 語言這十年的迅猛發展大到連他們自己都沒有想到,并且還成為了雲計算領域中新一代的開發語言。還提到了,中國程式員對 Go 語言的熱愛完全超出了他們的想象,甚至他們都不敢相信是真的。

這讓我想起,我在 2015 年 5 月份拜訪 Docker 公司在灣區的總部時,Docker 負責人也和我表達了相似的感歎:他們完全沒有想到居然中國有那麼多人喜歡 Docker,而且還有這麼多人在為 Docker 做貢獻,這讓他們感到非常意外。此外,還跟我說,中國是除了美國本土之外的另外一個如此喜歡 Docker 技術的國家,在其它國家都沒有看到。

的确如他們所說,Go 語言和 Docker 這兩種技術已經成為新一代的雲計算技術,而且可以看到其發展态勢非常迅猛。而中國也成為了像美國一樣在強力推動這兩種技術的國家。這的确是一件讓人感到非常高興的事,因為中國在跟随時代潮流這件事上已經做得非常不錯了。

然而,從 2014-2015 年我在阿裡推動 Docker 和 Go 語言的痛苦和失敗過程中,以及這許多年來,有很多很多人問我是否要學 Go 語言,是否要學 Docker,Go 和 Docker 是否能用在生産線上,這些問題看來,對于 Go 語言和 Docker 這兩種技術,在國内的技術圈中有相當大的一部分人和群體還在執觀望或是不信任的态度。

是以,我想寫這篇文章,從兩個方面來論述一下我的觀點和看法。

  • 一個方面,為什麼 Go 語言和 Docker 會是新一代的雲計算技術。
  • 另一個方面,作為技術人員,我們如何識别什麼樣的新技術會是未來的趨勢。

這兩個問題是相輔相成的,是以我會把這兩個問題揉在一起談。

雖然 Go 語言是在 2009 年底開源的,但我是從 2012 年才開始接觸和學習 Go 語言的。我隻花了一個周末兩天的時間就學完了,而且在這兩天,我還很快地寫出了一個能工作很好的網頁爬蟲程式,以及一個簡單的高并發檔案處理服務,用于提取前面抓取的網頁的關鍵内容。這兩個程式都很簡單,總共才寫了不到 500 行代碼。

我當時對 Go 語言有幾點體會。

第一,語言簡單,上手快。Go 語言的文法特性簡直是太簡單了,簡單到你幾乎玩不出什麼花招,直來直去的,學習曲線很低,上手非常快。

第二,并行和異步程式設計幾乎無痛點。Go 語言的 Goroutine 和 Channel 這兩個神器簡直就是并發和異步程式設計的巨大福音。像 C、C++、Java、Python 和 JavaScript 這些語言的并發和異步方式太控制就比較複雜了,而且容易出錯,而 Go 解決這個問題非常地優雅和流暢。這對于程式設計多年受盡并發和異步折磨的我來說,完全就是讓我眼前一亮的感覺。

Go語言,Docker和新技術

(圖檔來自 Medium:Why should you learn Go?)

第三,Go 語言的 lib 庫麻雀雖小五髒俱全。Go 語言的 lib 庫中基本上有絕大多數常用的庫,雖然有些庫還不是很好,但我覺得不是問題,因為我相信在未來的發展中會把這些問題解決掉。

第四,C 語言的理念和 Python 的姿态。C 語言的理念是信任程式員,保持語言的小巧,不屏蔽底層且底層友好,關注語言的執行效率和性能。而 Python 的姿态是用盡量少的代碼完成盡量多的事。于是我能夠感覺到,Go 語言想要把 C 和 Python 統一起來,這是多棒的一件事啊。

Go語言,Docker和新技術

(圖檔來自 Medium:Why should you learn Go?)

是以,即便 Go 語言存在諸多的問題,比如垃圾回收、異常處理、泛型程式設計等,但相較于上面這幾個優勢,我認為這些問題都是些小問題。于是就毫不猶豫地入坑了。

當然,一個技術能不能發展起來,關鍵還要看三點。

  • 有沒有一個比較好的社群。像 C、C++、Java、Python 和 JavaScript 的生态圈都是非常豐富和火爆的。尤其是有很多商業機構參與的社群那就更為人氣爆棚了,比如 Linux 的社群。
  • 有沒有一個工業化的标準。像 C、C++、Java 都是有标準化組織的。尤其是 Java,其在架構上還搞出了像 J2EE 這樣的企業級标準。
  • 有沒有一個或多個殺手級應用。C、C++ 和 Java 的殺手級應用不用多說了,就算是對于 PHP 這樣還不能算是一個好的程式設計語言來說,因為是 Linux 時代的第一個殺手級解決方案 LAMP 中的關鍵技術,是以,也發展起來了。

上述的這三點是非常關鍵的,新的技術隻需要占到其中一到兩點就已經很不錯了,何況有的技術,比如 Java,是三點全占到了,是以,Java 的發展是如此好。當然,除了上面這三點重要的,還有一些其它的影響因素,比如:

  • 學習曲線是否低,上手是否快。這點非常重要,C++ 在這點上越做越不好了。
  • 有沒有一個不錯的提高開發效率的開發架構。如:Java 的 Spring 架構,C++ 的 STL 等。
  • 是否有一個或多個巨型的技術公司作為後盾。如:Java 和 Linux 後面的 IBM、Sun……
  • 有沒有解決軟體開發中的痛點。如:Java 解決了 C 和 C++ 的記憶體管理問題。

用這些标尺來量一下 Go 語言,我們可以清楚地看到:

  • Go 語言容易上手;
  • Go 語言解決了并發程式設計和寫底層應用開發效率的痛點;
  • Go 語言有 Google 這個世界一流的技術公司在後面;
  • Go 語言的殺手級應用是 Docker,而 Docker 的生态圈在這幾年完全爆棚了。

是以,Go 語言的未來是不可限量的。當然,我個人覺得,Go 可能會吞食很多 C、C++、Java 的項目。不過,Go 語言所吞食主要的項目應該是中間層的項目,既不是非常底層也不會是業務層。

也就是說,Go 語言不會吞食底層到 C 和 C++ 那個級别的,也不會吞食到高層如 Java 業務層的項目。Go 語言能吞食的一定是 PaaS 上的項目,比如一些消息緩存中間件、服務發現、服務代理、控制系統、Agent、日志收集等等,沒有複雜的業務場景,也到不了特别底層(如作業系統)的中間平台層的軟體項目或工具。而 C 和 C++ 會被打到更底層,Java 會被打到更上層的業務層。這是我的一個判斷。

好了,我們再用上面的标尺來量一下 Go 語言的殺手級應用 Docker,你會發現基本是一樣的。

  • Docker 上手很容易。
  • Docker 解決了運維中的環境問題以及服務排程的痛點。
  • Docker 的生态圈中有大公司在後面助力。比如 Google。
  • Docker 産出了工業界标準 OCI。
  • Docker 的社群和生态圈已經出現像 Java 和 Linux 那樣的态勢。
  • ……

是以,早在 3、4 年前我就覺得 Docker 一定會是未來的技術。雖然當時的坑兒還很多,但是,相對于這些大的因素來說,那些小坑兒都不是問題。隻是需要一些時間,這些小坑兒在未來 5-10 年就可以完全被填平了。

同樣,我們可以看到 Kubernetes 作為服務和容器排程的關鍵技術一定會是最後的赢家。這點我在去年初就能夠很明顯地感覺到了。

關于 Docker 我還想多說幾句,這是雲計算中 PaaS 的關鍵技術,雖然,這世上在出現 Docker 之前,幾乎所有的要玩公有 PaaS 的公司和産品都玩不起來,比如:Google 的 GAE,國内的各種 XAE,如淘寶的 TAE,新浪的 SAE 等。但我還是想說,PaaS 是一個被世界或是被産業界嚴重低估的平台。

PaaS 層是承上啟下的關鍵技術,任何一個不重視 PaaS 的公司,其技術架構都不可能讓這家公司成長為一個大型的公司。因為 PaaS 層的技術主要能解決下面這些問題。

  • 軟體生産線的問題。持續內建和持續釋出,以及 DevOps 中的技術必需通過 PaaS。
  • 分布式服務化的問題。分布式服務化的服務高可用、服務編排、服務排程、服務發現、服務路由,以及分布式服務化的支撐技術完全是 PaaS 的菜。
  • 提高服務的可用性 SLA。提高服務可用性 SLA 所需要的分布式、高可用的技術架構和運維工具,也是 PaaS 層提供的。
  • 軟體能力的複用。軟體工程中的核心就是軟體能力的複用,這一點也完美地展現在 PaaS 平台的技術上。

老實說,這些問題的關鍵程度已經到了能判斷一家依托技術的公司的研發能力是否靠譜的程度。沒有這些技術,依托技術拓展業務的公司幾乎沒有可能發展得規模很大。

在後面,我會另外寫幾篇文章詳細地講一下分布式服務化和 PaaS 平台的重要程度。

最後,我還要說一下,為什麼要早一點地進入這些新技術,而不是等待這些技術成熟了後再進入。原因有這麼幾個。

  • 技術的發展過程非常重要。我進入 Go 和 Docker 的技術不能算早,但也不算晚,從 2012 年學習 Go,到 2013 年學習 Docker 到今天,我清楚地看到了這兩種技術的生态圈發展過程。讓我收獲最大的并不是這些技術本身,而是一個技術的變遷和行業的發展。

從中,我看到了非常具體的各種思潮和思路,這些東西比起 Go 和 Docker 來說更有價值。因為,這不但讓我重新思考我已掌握的技術以及如何更好地解決已有的問題,而且還讓我看到了未來。我不但有了技術優勢,而且這些知識還讓我的技術生涯多了很多的可能性。

  • 這些關鍵新技術,可以讓你拿到技術的先機。這些對一個需要技術上司力的個人或公司來說都是非常重要的。

一個公司或是個人能夠占有技術先機,就會比其它公司或個人有更大的影響力。一旦未來行業需求引爆,那麼這個公司或是個人的影響力就會形成一個比較大的護城河,并可以快速地産生經濟利益。

近期,在與中國移動、中國電信以及一些股份制銀行進行交流的過程中,我已看到通訊行業、金融行業對于 PaaS 平台的了解已經超過了網際網路公司,而我近 3 年來在這些技術上的研究讓我也從中受益匪淺。

是以,Go 語和 Docker 作為 PaaS 平台的關鍵技術前途是無限的,我很慶幸趕上了這個浪潮,也很慶幸在 3 年前我就看到了這個趨勢,現在我也在用這些技術開發相關的技術産品,助力于為高速成長的公司提供這些關鍵技術。