2010 年代,程式設計發生了什麼?
原文由 Matthias Endler 于 發布,訂閱此部落格
前陣子,我讀了 Fred Wilson 寫的一篇文章,標題是「What Happened In The 2010s」。這篇文章點出了過去十年間科技與商業的關鍵變化。這讓我開始思考一個範圍小得多的主題:2010 年代,程式設計發生了什麼?
🚓 我大概忘了實際發生的事情中有九成。拜託別告我。我的目標是回顧過去,讓你能更好地預測未來。
該從哪裡開始?
從宏觀的角度來看,程式設計跟十年前還是一樣:
- 把程式碼敲進編輯器
- 丟給編譯器(或直譯器)
- 嗶嗶啵啵 🤖
- 取得輸出
但若仔細觀察,我們周遭其實已經有了巨大的變化。許多我們今天視為理所當然的事物,在十年前根本還不存在。
過去是什麼樣子?
回到 2009 年,我們還在寫 jQuery 外掛,把網站跑在共享主機上,透過 FTP 上傳內容。有時候程式碼是從來路不明的論壇、部落格上的教學複製貼上,甚至是從書上手動抄下來的。Stack Overflow(於 2008 年 9 月 15th 日上線)當時仍在起步階段。版本控制用的是 CVS 或 SVN——或者根本沒在用。我在 Github 上註冊是在 2010 年 1 月 3rd 日。還沒有人聽過 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 推廣了 Goroutine 與 channel,讓並行處理更簡單,並以次毫秒級的 Garbage Collector 令人驚豔;而 Rust 則透過所有權(ownership)與借用(borrowing)機制,徹底避免了 Garbage Collector 的額外開銷。
這只是一份簡短的清單,但程式語言領域的創新已大幅加速。
老牌語言的更多創新
那些已經發展成熟的語言也沒有停下腳步。舉幾個例子:
C++ 從漫長的冬眠中醒來,在上一次重大更新是 1998 年之後,推出了 C++11。它為語言引入了許多新功能,例如 Lambda、auto 指標以及範圍基礎的 for 迴圈。
上一個十年之初,最新的 PHP 版本是 5.3。如今我們已經來到 7.4。(我們跳過了 6.0,但我現在還不想談這件事。)在這過程中,它的執行速度提升了兩倍多。PHP 如今已是一個真正現代化的程式語言,擁有蓬勃發展的生態系。
就連 Visual Basic 現在都有 tuple 了。(抱歉,我忍不住想提一下。)
更快的發布週期
多數語言都採用了更快的發布週期。以下是一些熱門語言的週期一覽:
| 語言 | 目前的發布週期 |
|---|---|
| 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 月 25th 日的一場演講中,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。

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

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

莫爾所預言的新電晶體不再讓我們的 CPU 變得更快,而是增加了其他類型的處理能力,例如更高的平行度或硬體加密。已經沒有白吃的午餐了。工程師必須找到讓應用程式變得更快的新方法,例如透過擁抱並行執行。
Callback、coroutine,乃至於最終的 async/await,正逐漸成為業界標準。
GPU(圖形處理器)變得非常強大,能夠進行大規模的平行運算,這也為機器學習在實際應用上的復興帶來了契機:
深度學習變得可行,進而使機器學習成為許多廣泛使用的軟體服務與應用中不可或缺的一部分。 — Wikipedia 上的 Timeline of Machine Learning
運算無所不在,因此在多數情況下,能源效率如今扮演的角色比單純的效能更重要(至少對消費性裝置而言是如此)。
意想不到的命運轉折
- Microsoft 現在變成酷炫的角色了。它收購了 Github,推出了 Windows subsystem for Linux(其實應該叫 Linux Subsystem for Windows 才對),將 MS-DOS 和 .NET 開源。就連 Microsoft Calculator 現在也是開源的。
- IBM 收購了 Red Hat。
- Linus Torvalds 為自己的行為道歉,並暫時休假。
- 開源成為軟體開發的預設選項(?)。
心得
如果你現在心想:Matthias,你完全忘了 X,那我就達到目的了。這還遠遠不是全部發生的事情。要把所有事情都講完,大概需要花上整整十年。
就我個人而言,我對接下來的十年感到非常期待。軟體正在吞噬世界——而且速度越來越快。
隨機一篇部落格
留言
登入後參與討論