Which New Language Should I Learn for Web Development?

Michael Lynch

做 Web 开发,我该学哪门新语言?

原文由 Michael Lynch 发布,订阅该博客

今年的目标之一是学一门新的编程语言。距离上次学新语言已经有一段时间了,我比较熟悉的几门语言(Go、Python、C++)彼此又很相似,所以我想稍微跳出舒适区,试试一门让我感觉有点“怪”的语言。

要求

我的要求如下:

  • 与我熟悉的语言有显著区别
  • 对 Web 应用有一等公民级别的支持
  • 能轻松构建小而简单的应用
    • 我想要的是 Angular 的反面,Angular 感觉过度为大型项目做了优化
  • 同时支持后端和前端
    • 不一定要自带前端框架,但我希望能像用 Go 或 Python 那样,前后端使用同一套工具链。
    • 我不想用像 Elm 这样只做前端的方案。
    • 我不想让前端和后端代码各自有一套构建流程(我完全可以接受写原生 JS,再配合轻量的后端模板)。
  • 能以 SQLite 作为数据存储
  • 有良好的单元测试支持
  • 开源
  • 持续维护

加分项

  • 有不错的电子书可供学习
    • 付费书籍也可以。
  • 低抽象、少“魔法”
    • 我觉得 Angular 和 Vue 这类框架太“魔法”了,里面混杂着一大堆我搞不懂的 Node.js 包。刚上手时感觉还好,可一旦超出玩具程序的范畴,就会发现抽象终会泄漏,底层藏着我完全不理解的复杂系统。另一个极端是 Zig,它让人感觉非常容易理解
  • 静态类型

非目标

  • 极致性能
    • 我写的大多数应用对性能要求都很低。通常唯一的用家就是我自己,就算有其他用户,同时在线的也不过几十人。
    • 我不想用对单个用户来说就很慢的东西,但也想避开那些为了实现大规模承载而做出权衡的技术。

我对不同语言的喜爱程度

供参考,下面是我对自己用过的一些编程语言的喜爱程度:

语言评分使用经验备注
Go9丰富Go 为 Web 应用而设计得非常优雅。
Zig8较少写高效、高性能代码时非常有趣,不过不是我做 Web 应用的理想工具。
Python6丰富用 Python 做了很多项目,但糟糕的包管理和缺乏类型已经开始让我困扰。
JavaScript5一般希望能有不依赖 Node.js 的更好的打包/测试工具。
Angular2较少过于魔法、过于复杂。
Vue4一般曾有一段时间很喜欢 Vue 2,但已经被坑过太多次——应用崩掉往往不是我的代码问题,而是框架里的某个 bug 或陷阱。
C++4一般已经有一阵子没写了。在像 Google 这样有完善工具链的环境里还不错,但在 2025 年让我从零搭一套 C++ 开发环境,我可没兴趣。
C6较少和 C++ 有同样的问题,但我欣赏它的简洁。

研究方法

为了调研每门语言,我做了以下几件事:

  • 阅读该语言的特性介绍页
  • 阅读该语言主流 Web 框架的特性介绍页
  • 查找每门语言中简单的“hello world”级别 Web 应用示例
  • 让大语言模型将这些语言的特性与我熟悉的语言进行对比

候选方案

Elixir / Phoenix / LiveView

Elixir 在我的候选名单上排名很高,因为很多我认为很聪明的博主似乎都很喜欢它。它还有一些听起来很怪、很有趣的概念和特性。

我喜欢 Elixir 有一个非常官方的 Web 框架:Phoenix。我不太喜欢 Phoenix 默认依赖 Tailwind CSS,不过看起来这个是可以关掉的。

新东西是 Phoenix LiveView,它似乎是一种无需编写大量 JavaScript 就能创建 Web 应用的方式,因为 LiveView 通过 WebSocket 将后端状态推送到前端,无需刷新页面。但 LiveView 生成的是 SPA,而我已经对 SPA 感到非常厌倦,不想再在这上面投入精力。Phoenix 也可以不用 LiveView,但我感觉官方正把大量资源投入到 LiveView 上。

  • 优点
    • ✅ 有趣的语言特性
    • ✅ 为 Web 应用提供了很有吸引力的解决方案
    • ✅ 基于 Erlang 构建,因此可以使用 Erlang 生态
  • 缺点
    • ❌ 无静态类型
    • ❌ LiveView 面向 SPA 设计
    • ❌ LiveView 感觉很“魔法”

Gleam / Lustre

Gleam 像是 Elixir 精干的小兄弟。它和 Elixir 有很多共同的语言特性,比如模式匹配和管道操作,但它有静态类型(很棒!)。

Gleam 不支持元编程,对此我心情有点复杂。一般来说,我不喜欢元编程,总觉得自己不够聪明玩不转,所以从某种程度上说,我很高兴 Gleam 去掉了这个特性。但另一方面,如果我的目标是尝试新东西,也许我应该逼自己试试元编程。

Gleam 的 Web 框架叫 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)、无限数据结构和代数数据类型,但我也觉得要在这门语言上达到能高效产出的水平,学习曲线可能会很陡。

流行的 Web 框架似乎是 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 的 Web 开发变得专业而流畅,所以我去看了一下。

我惊讶地发现,要找到基础 Laravel 应用的示例竟然这么难。Laravel 文档展示了创建基础应用的命令,却没有展示代码是什么样子、又是如何渲染的。我猜测,由于 Laravel 商业模式的一部分是通过 Laracasts 销售视频课程,其公开的文字文档做得不怎么样(编者注:Laravel 并不拥有 Laracasts,尽管一些 Laravel 核心开发者在 Laracasts 上发布过课程)。

我能找到的最接近基础示例的东西是starter kits,它们会引入 React(算了)、Vue(算了)或 Livewire(不了解,但跟它们混在一起,印象也不太好)。不过,Laravel 内置的前端方案是 Blade 模板,就 HTML 模板语言而言,在我看来其实还挺不错的。

  • 优点
    • ✅ 支持静态类型
    • ✅ 初看之下,我喜欢 Blade 模板
  • 缺点
    • ❌ 语言看起来很糟糕
    • ❌ 找不到好的 Laravel 文字入门资料

Scala

我听过不少关于 Scala 的好评。这门语言看起来很有趣,有很多我在其他语言中从未体验过的特性。语法像是更简洁的 Java,这点不错。

Scala 似乎是强面向对象的。我过去喜欢面向对象,但在用了多年 Go 那种受限得多的面向对象特性之后,我开始觉得继承和多态带来的麻烦超过了收益。

主流的 Web 框架似乎是 Play,但读其文档时,感觉有些过时、充满企业味。hello world 教程一上来就是一张复杂的 Play 架构图,非常无聊,完全无法激起我学习这个框架的兴趣。

Scalatra 是另一个更注重简洁的 Scala Web 框架,但文档中的示例很少。不过有一本可以购买的电子书

  • 优点
    • ✅ 在类型方面有有趣的特性,比如型变注解和复合类型
  • 缺点
    • ❌ Scala 面向对象的部分让我想起 C++ 中糟糕的地方,虽然没那么糟
    • ❌ 似乎与 Java 生态紧密绑定,而我并不喜欢 Java 生态
    • ❌ 对任何一个 Web 框架都提不起兴趣

总结

Gleam 感觉最符合我的目标和经验,Elixir 紧随其后。Haskell 是等我鼓足勇气和耐心后应该去学的那门语言。

我打算分别用 Gleam + Lustre 和 Elixir + Phoenix 做些小实验,看看哪一个更有趣。

本文章由 muse-spark-1.2-contributor 进行翻译

评论