網頁開發該學哪個新語言?
原文由 Michael Lynch 于 發布,訂閱此部落格
今年的目標之一是學一個新的程式語言。已經有一陣子沒學新語言了,而且我熟練的幾個語言(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,但已經太多次因為框架本身的 bug 或坑,而不是我自己的程式碼,導致應用壞掉,讓我心寒。 |
| C++ | 4 | 中 | 已經有一陣子沒寫了。在像 Google 這種工具支援完善的環境下還不錯,但要在 2025 年從零開始打造 C++ 開發環境,我可不會喜歡。 |
| C | 6 | 低 | 和 C++ 有相同的問題,但我欣賞它的簡潔。 |
研究方法
為了研究每個語言,我做了以下幾件事:
- 閱讀該語言的功能介紹頁面
- 閱讀該語言主流網頁框架的功能介紹頁面
- 尋找每個語言中簡單的「hello world」網頁應用範例
- 請 LLM 幫我比較這些語言與我熟悉的語言在功能上的差異
候選名單
Elixir / Phoenix / LiveView
Elixir 在我的名單上排名很前面,因為很多我覺得很聰明的部落客似乎都很喜歡它。它也有一些聽起來很怪、很有趣的概念和特性。
我喜歡 Elixir 有一個非常官方的網頁框架:Phoenix。我不太喜歡 Phoenix 預設依賴 Tailwind CSS,不過看起來可以關掉。
最近的新東西是 Phoenix LiveView,它似乎是一種不用寫太多 JavaScript 就能建立網頁應用的方式,因為 LiveView 透過 WebSocket 把後端狀態直接推送到前端,不需要重新整理頁面。但 LiveView 產生的是 SPA,而我已經對 SPA 感到非常厭倦,不想再投入其中。你可以不用 LiveView 只用 Phoenix,但我感覺他們把大量資源都投入在 LiveView 上。
- 優點
- ✅ 很酷的語言特性
- ✅ 針對網頁應用有很有吸引力的解決方案
- ✅ 基於 Erlang 打造,因此可以使用 Erlang 生態系
- 缺點
- ❌ 沒有靜態型別
- ❌ LiveView 是為 SPA 設計的
- ❌ LiveView 感覺很「魔法」
Gleam / Lustre
Gleam 感覺像是 Elixir 那個精悍的小老弟。它和 Elixir 有很多共同的語言特性,像是模式匹配和管線操作,但它有靜態型別(很棒!)。
Gleam 不支援元程式設計,這點讓我心情有點複雜。一般來說,我不喜歡元程式設計,總覺得自己不夠聰明做不來,所以某種程度上我很樂見 Gleam 拿掉這個功能。另一方面,如果我的目標是嘗試新東西,或許我應該逼自己試試元程式設計。
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 裡實踐了 Alexis 的想法,但 Haskell 能用資料型別表達更多東西,聽起來很酷。
Haskell 有很多古怪的特性,感覺會拓展我的思維,像是 monad、無限資料結構、代數資料型別等等,但我也覺得要能有生產力,學習曲線可能會很陡。
熱門的網頁框架似乎是 IHP 和 Yesod。IHP 似乎嚴格要求使用 PostgreSQL,這對我來說是無法接受的,所以大概只剩下 Yesod。不過 Yesod 看起來不錯。有一本免費的 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 生態系緊密糾纏,而我並不喜歡 Java 生態系
- ❌ 對任何一個網頁框架都提不起勁
總結
Gleam 感覺最符合我的目標和經驗,Elixir 則緊追在後,排名第二。Haskell 是那個等我鼓起勇氣和耐心時才該去學的語言。
我打算稍微試玩一下 Gleam + Lustre 和 Elixir + Phoenix,看看哪一個感覺更有趣。
隨機一篇部落格
留言
登入後參與討論