2010 年代的程式設計發生了什麼事?
前陣子,我讀了 Fred Wilson(弗雷德·威爾森)所寫的一篇題為 「What Happened In The 2010s」 的文章。該文重點介紹了過去十年間科技與商業的關鍵變化。這啟發我去思考一個範圍小得多的主題:2010 年代的程式設計發生了什麼事?
🚓 我大概忘了實際發生的事情中的 90%。請別告我。我的目標是回顧過去,讓你能更好地預測未來。
從何說起?
從宏觀角度來看,程式設計與十年前相比依然如故:
- 把程式碼敲進編輯器
- 丟給編譯器(或直譯器)
- 嗶嗶啵啵 🤖
- 取得輸出
但若仔細觀察,我們周遭已經有了巨大的變化。許多如今被視為理所當然的事物,十年前根本還不存在。
以前是什麼樣子?
回到 2009 年,我們還在撰寫 jQuery 外掛,在共用主機上運行網站,並透過 FTP 上傳內容。有時候程式碼是從來路不明的論壇、部落格上的教學文章複製貼上,甚至是從書上手動謄錄而來。Stack Overflow(於 2008 年 9 月 15 日上線)當時仍處於起步階段。版本控制是用 CVS 或 SVN 來做——或者根本沒在用。我在 Github 上註冊的時間是 2010 年 1 月 3 日。那時還沒有人聽過 Raspberry Pi(它要到 2012 年才發布)。

新程式語言的大爆發
過去十年間誕生了大量新穎且令人興奮的程式語言。
Crystal、Dart、Elixir、Elm、Go、Julia、Kotlin、Nim、Rust、Swift、TypeScript 都發布了首個穩定版本!
更令人興奮的是:上述所有語言現在都是開放開發的,原始碼皆可在 Github 上自由取得。這意味著每個人都能為其開發做出貢獻——這正是開放原始碼的一大見證。
這些語言各自引入了以往並不普及的新概念:
- 強型別系統:Kotlin 與 Swift 讓 可空型別 成為主流,TypeScript 為 JavaScript 帶來了型別,而代數資料型別在 Kotlin、Swift、TypeScript 與 Rust 中已相當常見。
- 互通性:Dart 可編譯為 JavaScript,Elixir 可與 Erlang 互通,Kotlin 可與 Java 互通,而 Swift 則可與 Objective-C 互通。
- 更好的效能:Go 透過 Goroutines 與 channels 讓並行處理變得更簡單,並以亞毫秒級的 Garbage Collector(垃圾回收器) 令人驚豔,而 Rust 則透過所有權與借用機制完全避免了 Garbage Collector 的額外負擔。
這只是一份簡短的清單,但程式語言領域的創新已大幅加速。
舊有語言的更多創新
既有的語言也並未停滯不前。舉幾個例子:
C++ 從漫長的冬眠中甦醒,在距離上次重大版本 1998 年之後發布了 C++11。它為語言引入了眾多新功能,例如 Lambdas、auto 指標以及範圍為基礎的迴圈。
在上個十年的開端,最新的 PHP 版本是 5.3。現在我們已經到了 7.4。(我們跳過了 6.0,但我還沒準備好談這件事。)在這過程中,它的執行速度提升了一倍以上。PHP 如今已是一個真正的現代化程式語言,並擁有蓬勃發展的生態系。
天啊,連 Visual Basic 現在都有 tuples 了。(抱歉,我忍不住。)
更快的發布週期
多數語言都採用了更快的發布週期。以下是一些熱門語言的清單:
| 語言 | 目前的發布週期 |
|---|---|
| C | 不定期 |
| C# | 約 12 個月 |
| C++ | 約 3 年 |
| Go | 6 個月 |
| Java | 6 個月 |
| JavaScript (ECMAScript) | 12 個月 |
| PHP | 12 個月 |
| Python | 12 個月 |
| Ruby | 12 個月 |
| Rust | 6 週(!) |
| Swift | 6 個月 |
| Visual Basic .NET | 約 24 個月 |
Null 的緩慢消亡
在上個十年接近尾聲時,於 2009 年 8 月 25 日的一場演講中,Tony Hoare(東尼·霍爾)將 null 指標描述為他的十億美元錯誤。
Chromium 專案的一項研究發現,其 70% 的嚴重安全性錯誤皆為記憶體安全性問題(Microsoft 的情況亦是如此)。幸運的是,我們的記憶體安全性問題並非出在糟糕的程式設計師身上這一觀念終於獲得了一些認同。
許多主流語言開始採用比 null 更安全的替代方案:可空型別、Option 與 Result 型別。像 Haskell 這樣的語言早已具備這些功能,但它們直到 2010 年代才真正普及。
型別系統的復仇
與此密切相關的是關於型別系統的爭論。過去十年見證了型別系統的重返舞台;TypeScript、Python 和 PHP(僅舉幾例)都開始擁抱型別系統。
趨勢走向型別推論:為了讓其他人更清楚你的意圖以及在語意模糊時才加上型別——否則就省略。Java、C++、Go、Kotlin、Swift 和 Rust 都是支援型別推論的熱門範例。就我個人而言,我認為近幾年撰寫 Java 變得更加符合人體工學、更加順手了。
函式庫與框架的指數級成長
截至今日,npm 上託管了 1,330,634 個套件。那是超過一百萬個由他人為你維護的套件。再加上 160,488 個 Ruby gems、243,984 個 Python 專案,以及 42,547 個 Rust crates。

別問我 2019 年 npm 發生了什麼事。
來源:Module Counts
當然,偶爾會出現 leftpad 這樣的事件,但這也意味著我們自己需要撰寫的函式庫程式碼變少了,可以更專注於商業價值。另一方面,潛在的故障點也變多了,且稽核變得困難。也有大量過時的套件。若想更深入探討,我推薦 Linux Foundation 與 Harvard 合作的 Census II 報告 [PDF]。
我們在前端框架上也有點瘋狂:
沒有免費的午餐
像這樣的回顧若不瞥一眼Moore's Law(摩爾定律)就不算完整。在過去十年中,它依然表現得驚人地穩固:

不過,事情沒那麼簡單。若觀察單核心效能,曲線正趨於平緩:

Moore 所預言的新電晶體並未讓我們的 CPU 變得更快,而是增加了其他類型的處理能力,例如更高的平行度或硬體加密。已經沒有免費的午餐了。工程師必須尋找讓應用程式變得更快的新方法,例如擁抱並行執行。
Callbacks、coroutines,以及最終的 async/await 正成為業界標準。
GPUs(Graphical Processing Units,圖形處理器)變得非常強大,得以進行大規模平行運算,進而引發了 Machine Learning(機器學習) 在實際應用場景中的復興:
深度學習變得可行,進而使機器學習成為許多廣泛使用的軟體服務與應用程式不可或缺的一部分。 — 維基百科上的機器學習年表
運算資源已無所不在,因此在大多數情況下,能源效率現在扮演著比原始效能更突出的角色(至少對消費性裝置而言)。
意想不到的命運轉折
- Microsoft 現在成了酷炫的孩子。它收購了 Github,發布了 Windows subsystem for Linux(其實應該叫做 Linux Subsystem for Windows),將 MS-DOS 和 .NET 開源。甚至連 Microsoft Calculator 現在也已開源。
- IBM 收購了 Red Hat。
- Linus Torvalds(林納斯·托瓦茲)為自己的行為道歉並暫時休假。
- 開源成為軟體開發的預設選項(?)。
心得與啟示
如果你現在心想:Matthias(馬提亞斯),你完全忘了 X,那我就達到目的了。這還遠遠不是所發生的一切。要談完所有事情,大概需要花上十年時間。
就我個人而言,我對下一個十年感到興奮。軟體正在吞噬世界——而且速度越來越快。
隨機一篇部落格