Which New Language Should I Learn for Web Development?

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,但太多時候應用程式是因為框架本身的錯誤或陷阱而壞掉,而非我的程式碼,所以被搞怕了。
C++4中等好一陣子沒寫了。在像 Google 這樣擁有強大工具支援的環境下還不錯,但我不會想在 2025 年從零開始打造一套 C++ 開發環境。
C6和 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(代數資料型別),但我也覺得要能用這個語言達到有生產力的程度,學習曲線可能很陡峭。

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

原文由 Michael Lynch 發布

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