Go 語言在 2009 年問世,在短短不到 10 年的時間,已經儕身各大語言排名的主流語言區。Ruby 的發明者松本行弘曾說過,一個語言生態圈的培養,需要至少十年的時間;以這個標準來看,Go 語言的成長可說是相當迅速。然而,Go 的語法特性其實不是很優秀,像是缺乏繼承、泛型、函式重載、運算子重載、枚舉等現代語言常見的特性;基本上,大概只到 Java 1.4 版的水準。Go 所編譯的程式也不是編譯語言中最快的,大概和 Java 同級,但還輸 C++ 一些。就如同世界上其他的事物,程式語言的成功,就是需求和一些些機運。
一些程式語言理論的書會教我們什麼是良好的程式語言,像是易學易寫、執行速度快、標準化、開放原始碼等等;對照一些成功的程式語言,我們雖然不能說這些原則是 bullshit,但也是做為參考就好。JavaScript 除了是網頁前端必備的語言外,還擴展到網頁後端、桌面程式、行動程式、IoT 等,就是一個典型的成功例子;但 JavaScript 的坑坑洞洞從來也沒少過,筆者先前在這裡也有談過,有興趣的讀者可以前往一讀。相較之下,Dart 雖然在技術層面上是正確的,卻敗在各大瀏覽器供應商間的角力,相當可惜 (可看這裡)。
程式碼是程式設計者將想法轉為可執行的電腦程式所需的中間媒介,除了一些工程上的理由,程式碼的主要目的還是要轉成可用的程式,而不是像文學作品般拿來拜讀。就像其他的産品,使用者其實不會區分某個網站背後跑的是 PHP、Python、Node (JavaScript) 還是 Go,還是看網站本身是否順暢好用。對於程式設計者來說,我們也不需要和程式語言結婚,一生一世、至死不渝,按照需求選擇所需的工具即可。同樣地,語法特性只是撰寫程式時會用到的一些性質,不會某個程式只能用某個語言撰寫,如果缺乏某樣特性,通常可以用其他 (稍微笨一點的) 方法替代。
觀察一下 Go 成功的使用案例,就會發現大部分集中在網頁後端、雲端運算、伺服器程式、微服務等重疊的領域。從 Go 內建對共時性的支援和其標準函式庫所提供的功能,可以發現到 Go 團隊的確相當關注這方面的應用。相較起來,Go 團隊對其他領域大概就不感興趣,像是 Go 並沒有官方的 GUI 函式庫,行動程式相關的套件發展得很慢,科學運算也是放任社群自行努力。筆者覺得這樣子並沒有什麼對錯,如果 Google 本身不需要這些功能,發展這些功能只是在消耗公司的經費;反正 Go 本身也開放給社群,有這方面需求的團隊自然會去發展相關的套件。
實際把玩 Go 一陣子,會發現 Go 的確是相當適合工程師的玩具。像是 Go 的專案不需要額外的設定檔,某種程度上簡化了專案管理的過程。Go 的程式碼可自動整理,有助於專案風格的統一,對多人合作的確有一些幫助。Go 專案編譯快速,縮短了開發時程。Go 程式碼易學易寫,在易用性及執行效率上取得不錯的平衡。
當然,Go 缺乏很多語法特性,有時候程式碼會比較長;甚至在語言本身也輸自家的 Dart。如果將 Go 和其他語言比較,會發現 Go 的思維比較接近 C 和 Java,就是程式碼要詳細 (verbose)、清楚,儘量地減少內隱規則等黑魔法。對語言來說,verbose 似乎不是好的評語;但在程式碼中大量地使用一些捷徑,程式設計者需要記憶很多特性,反而使程式碼難讀,對於後續程式的維護是不利的,像是 Perl 就是一個易寫難讀的實例。
網頁後端是至少 40 年以上的老議題,但是 Go 仍然可以在這個領域取得成功。雖然 Google 這塊金招牌會有一些號召力,但仍然要靠 Go 良好的特質才能持續吸引使用者 (看看隔壁的 Dart)。成熟的市場通常很難進入,但重點是把握自家産品的特質,做出市場差異,而不是一味地 costdown、殺到紅海。