Which New Language Should I Learn for Web Development?

Michael Lynch

網頁開發該學哪個新語言?

原文由 Michael Lynch 發布,訂閱此部落格

今年的目標之一是學一個新的程式語言。已經有一陣子沒學新語言了,而且我熟練的幾個語言(Go、Python、C++)感覺彼此都很相似,所以想稍微跳脫舒適圈,試試看一個對我來說感覺有點怪的語言。

必要條件

以下是我在尋找的條件:

  • 和我熟悉的語言有顯著的不同
  • 對網頁應用有一等公民等級的支援
  • 容易打造小而簡單的應用
    • 我想要的是和 Angular 相反的東西,Angular 感覺過度為大型專案最佳化
  • 同時支援後端與前端
    • 不一定要有前端框架,但我希望能像用 Go 或 Python 那樣,用同一套工具鏈同時處理後端與前端。
    • 我不想用像 Elm 這種只做前端的東西。
    • 我不想為前端和後端程式碼分別維護不同的建置流程(而且我可以接受寫原生的 JavaScript 搭配一點後端樣板)。
  • 能以 SQLite 作為資料儲存
  • 有良好的單元測試支援
  • 開源
  • 持續維護中

加分條件

  • 有不錯的電子書可看。
    • 付費書也沒關係。
  • 低抽象/少一點「魔法」。
    • 我覺得 Angular 和 Vue 這類框架太「魔法」了,混雜了一堆我搞不懂的 Node.js 套件。剛開始感覺還好,但一旦超出簡單的玩具程式,就會發現抽象層終究會滲漏,底層其實是複雜到我無法理解的系統。光譜的另一端是 Zig,感覺非常容易理解與推論
  • 靜態型別

非目標

  • 極致效能
    • 我寫的應用大多對效能要求極低。通常唯一的用戶就是我自己,其他時候,同時在線的使用者也不會超過幾十人。
    • 我不想用對單一用戶來說很慢的東西,但也不想為了追求大規模擴展而做出取捨的技術。

我對各語言的喜愛程度

作為參考,以下是我對一些會寫的程式語言的喜愛程度:

語言評分經驗備註
Go9Go 為網頁應用設計得非常漂亮。
Zig8寫高效能程式非常有趣,但不是我開發網頁應用的理想工具。
Python6用 Python 做了很多專案,但糟糕的套件管理和缺乏型別已經開始讓我困擾。
JavaScript5希望有不依賴 Node.js 的、更好的打包/測試工具。
Angular2太魔法、太複雜。
Vue4曾經很喜歡 Vue 2,但已經太多次因為框架本身的 bug 或坑,而不是我自己的程式碼,導致應用壞掉,讓我心寒。
C++4已經有一陣子沒寫了。在像 Google 這種工具支援完善的環境下還不錯,但要在 2025 年從零開始打造 C++ 開發環境,我可不會喜歡。
C6和 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、無限資料結構、代數資料型別等等,但我也覺得要能有生產力,學習曲線可能會很陡。

熱門的網頁框架似乎是 IHPYesod。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,看看哪一個感覺更有趣。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言