為了網頁開發,我該學哪個新語言?
今年的目標之一是學一個新的程式語言。已經有一段時間沒學新語言了,而且我熟練的許多語言(Go、Python、C++)彼此都很相似,所以我想嘗試稍微跳出舒適圈,學一個讓我覺得有點奇怪的語言。
需求條件
以下是我的篩選條件:
- 與我熟悉的語言有顯著差異
- 將網頁應用程式視為一等公民
- 容易打造小而簡單的應用程式
- 我想要的是與 Angular 相反的東西,Angular 感覺過度為大型專案最佳化
- 支援後端與前端
- 不一定要有前端框架,但我希望能像在 Go 或 Python 中那樣,前後端使用同一套工具鏈。
- 我不想使用像 Elm 這種僅限前端的技術。
- 我不想為前端與後端程式碼分別維護不同的建置流程(我可以接受寫原生的 JavaScript 搭配輕量的後端樣板)。
- 可將 SQLite 作為資料儲存
- 具備良好的單元測試支援
- 開源
- 持續積極維護中
加分條件
- 有不錯的電子書可供學習。
- 付費書籍也可以。
- 低抽象/少一點「魔法」。
- 靜態型別
非目標
- 追求極致效能
- 我寫的應用程式大多對效能要求極低。通常唯一的使用者就是我自己,其他時候同時在線的使用者也不會超過幾十人。
- 我不想使用對單一使用者來說就很慢的東西,但也不想為了追求大規模擴展而做出取捨的技術。
我對各種語言的喜愛程度
供參考,以下是我對一些常用程式語言的喜愛程度:
| 語言 | 評分 | 經驗 | 備註 |
|---|---|---|---|
| Go | 9 | 高 | Go 為網頁應用程式而生的設計非常優美。 |
| Zig | 8 | 低 | 寫高效能程式非常有趣,但不是我開發網頁應用的理想工具。 |
| Python | 6 | 高 | 用 Python 做過很多專案,但糟糕的套件管理和缺乏型別已開始讓我困擾。 |
| JavaScript | 5 | 中等 | 希望有不依賴 Node.js 的更好的套件/測試工具。 |
| Angular | 2 | 低 | 太過魔法、太過複雜。 |
| Vue | 4 | 中等 | 曾經很喜歡 Vue 2,但太多時候應用程式是因為框架本身的錯誤或陷阱而壞掉,而非我的程式碼,所以被搞怕了。 |
| C++ | 4 | 中等 | 好一陣子沒寫了。在像 Google 這樣擁有強大工具支援的環境下還不錯,但我不會想在 2025 年從零開始打造一套 C++ 開發環境。 |
| C | 6 | 低 | 和 C++ 有同樣的問題,但我欣賞它的簡潔。 |
研究方法
為了研究每種語言,我做了以下幾件事:
- 閱讀該語言的功能介紹頁面
- 閱讀該語言主流網頁框架的功能介紹
- 尋找每種語言中簡單的「hello world」網頁應用範例
- 請 LLMs 幫我比較這些語言與我熟悉的語言之間的功能差異
候選名單
Elixir / Phoenix / LiveView
Elixir 在我的名單上排名很高,因為許多我認為很聰明的部落客似乎都很喜歡它。它也有許多聽起來奇特又有趣的概念與功能。
我喜歡 Elixir 有一個非常官方的網頁框架:Phoenix。我不太喜歡 Phoenix 預設依賴 Tailwind CSS,不過看起來可以關掉。
最近的新東西是 Phoenix LiveView,它似乎是一種幾乎不用寫 JavaScript 就能建立網頁應用程式的方式,因為 LiveView 透過 websockets 將後端狀態推送到前端,而無需重新載入頁面。但 LiveView 產生的是 SPA(單頁應用程式),而我已經對 SPA 感到非常厭倦,不想再投入其中。你可以不用 LiveView 而只用 Phoenix,但我感覺他們正把大量資源投入在 LiveView 上。
- 優點
- ✅ 酷炫的語言特性
- ✅ 針對網頁應用程式有具吸引力的解決方案
- ✅ 基於 Erlang 建構,因此可使用 Erlang 生態系
- 缺點
- ❌ 沒有靜態型別
- ❌ LiveView 是為 SPA 設計的
- ❌ LiveView 感覺很「魔法」
Gleam / Lustre
Gleam 感覺像是 Elixir 精悍的小老弟。它與 Elixir 有許多共同的語言特性,像是 pattern-matching(模式匹配)和 pipelining(管線操作),而且它還具備靜態型別(很棒!)。
Gleam 不支援 metaprogramming(後設程式設計),這讓我心情有點複雜。一般來說,我不喜歡元程式設計,總覺得自己不夠聰明駕馭它,所以某種程度上我很樂見 Gleam 排除這項功能。另一方面,如果我的目標是嘗試新事物,也許我應該逼自己試試看 metaprogramming。
Gleam 的網頁框架叫做 lustre,它讓你以 Gleam 函式呼叫的形式來撰寫 HTML:
pub fn main() {
let app =
lustre.element(
html.div([], [
html.h1([], [html.text("Hello, world!")]),
html.figure([], [
html.img([attribute.src("https://cdn2.thecatapi.com/images/b7k.jpg")]),
html.figcaption([], [html.text("A cat!")])
])
])
)
let assert Ok(_) = lustre.start(app, "#app", Nil)
Nil
}老實說,用那種方式寫 HTML 看起來超繁瑣又醜,但我願意試試看。
Gleam 尚未達到關鍵規模,所以存在五年後這個語言可能就消失的風險,但我想那也沒關係。我不打算用 Gleam 來打造事業,只是想玩玩、學點新東西。
- 優點
- ✅ 酷炫的語言特性
- ✅ 基於 Erlang 建構,因此可使用 Erlang 與 Elixir 生態系
- 缺點
- ❌ 相對新穎且尚未成熟的語言
- ❌ 除了官方文件外,學習資源不多
Haskell
我認識喜歡 Haskell 的人,往往是那種聰明到有點煩人的語言宅,熱愛思考編譯器與語言設計。那不是我。
讓我對 Haskell 最感好奇的是 Alexis King(艾莉克希絲·金)的「Parse, don’t validate」,它讓原本不太在乎靜態型別的我開始欣賞它。我在 Go 中實踐了艾莉克希絲·金的想法,但 Haskell 能用資料型別表達更多東西,聽起來很酷。
Haskell 有許多古怪的功能,感覺會拓展我的思維,例如 monads(單子)、infinite data structures(無限資料結構)和 algebraic data types(代數資料型別),但我也覺得要能用這個語言達到有生產力的程度,學習曲線可能很陡峭。
熱門的網頁框架似乎是 IHP 和 Yesod。IHP 似乎嚴格要求使用 PostgreSQL,這對我來說是無法接受的,所以大概只剩下 Yesod。不過 Yesod 看起來不錯。有一本免費的 O’Reilly 書籍可供參考,那就是免費的 O’Reilly 書籍,而且簡單的範例看起來也很直觀,雖然語法有點陌生。
Haskell / Yesod 感覺像是我應該學的技術組合,但似乎沒有 Elixir 或 Gleam 那麼有趣。
- 優點
- ✅ 豐富、成熟的生態系
- ✅ 比我所知的任何語言都更強大的型別系統
- ✅ 或許有助於我理解 Nix
- ✅ 有大量學習資源可用(包含免費資源)
- 缺點
- ❌ 程式碼在我看來有點醜,但也許只是因為不熟悉
- ❌ 學習曲線似乎很陡峭
- ❌ 我會變成一個怪異的 Haskell 人
Ruby / Rails
Ruby on Rails 很吸引人,因為我知道很多人熱愛它並覺得用它極具生產力。但從語言特性的角度來看,從 Python 過來,我看不到任何讓人覺得新穎或創新的東西。
我對 Rails 的印象是,它是一個很有主見的框架,但那些主見都非常好。Rails 的支持者盛讚這個框架能很好地把繁瑣的工作抽象掉,同時又不會剝奪開發者的能力或客製化彈性。
- 優點
- ✅ 豐富、成熟的生態系
- ✅ 設計上能很好地向下擴展
- ✅ 似乎很多人都很喜歡它
- 缺點
- ❌ 沒有靜態型別
- ❌ Ruby 看起來跟 Python 頗為相似,所以我不確定能學到多少新東西
PHP / Laravel
我得承認,我對 PHP 有一種菁英式的排斥感。
PHP 和我在大學時曾有過一段愉快的時光,但學了其他語言之後,PHP 就讓我覺得很糟。
近幾年,我聽說 PHP 已經成熟許多,而 Laravel 讓 PHP 的網頁開發變得專業又流暢,所以我決定來看看。
我驚訝地發現,要找到基礎的 Laravel 應用範例出乎意料地困難。Laravel 文件展示了建立基礎應用程式的指令,卻沒有展示程式碼長什麼樣子或如何渲染。我猜是因為 Laravel 商業模式的一部分是透過 Laracasts 銷售影片課程,所以公開的文字文件品質不太好(編按:Laravel 並未擁有 Laracasts,雖然部分 Laravel 核心開發者曾在 Laracasts 上發布課程)。
我能找到最接近基礎範例的東西是 starter kits,它們引入了 React(不用了)、Vue(也不用了)或 Livewire(不認識,但跟它們混在一起感覺不是好兆頭)。不過,Laravel 內建的前端解決方案是Blade Templates,就 HTML 樣板語言來說,看起來倒是蠻不錯的。
- 優點
- ✅ 支援靜態型別
- ✅ 初步看來,我喜歡 Blade 樣板
- 缺點
- ❌ 語言看起來很糟
- ❌ 找不到好的 Laravel 文字入門介紹
Scala
我聽到不少關於 Scala 的好評。這個語言看起來很有趣,有許多我從未在其他語言中體驗過的特性。語法看起來像是更簡潔的 Java,這點很不錯。
Scala 似乎是強烈的物件導向語言。我以前喜歡物件導向,但在用了 Go 相對受限得多的物件導向功能多年後,我開始覺得繼承和多型帶來的是弊大於利。
看起來主流的網頁框架是 Play,但閱讀文件時,感覺內容有點過時且充滿企業級的味道。hello world 教學一開始就放了一張複雜的 Play 架構圖,超級無聊,完全無法激起我學習這個框架的興致。
Scalatra 是另一個更注重簡潔的 Scala 網頁框架,但文件中的範例相當少。不過倒是有一本可以購買的電子書,那就是電子書。
- 優點
- ✅ 圍繞型別的有趣特性,例如 variance annotations(變異註記)和 compound types(複合型別)
- 缺點
- ❌ Scala 物件導向的面向讓我想起 C++ 糟糕的部分,雖然沒那麼糟
- ❌ 似乎與 Java 生態系緊密糾纏,而我並不喜歡這點
- ❌ 無法對任何一個網頁框架感到興奮
總結
Gleam 感覺最符合我的目標與經驗,Elixir 緊追在後。Haskell 則是我鼓起勇氣與耐心後應該去學的語言。
我打算稍微實驗一下 Gleam + Lustre 和 Elixir + Phoenix,看看哪一個感覺更有趣。
隨機一篇部落格