做 Web 开发,我该学哪门新语言?
原文由 Michael Lynch 于 发布,订阅该博客
今年的目标之一是学一门新的编程语言。距离上次学新语言已经有一段时间了,我比较熟悉的几门语言(Go、Python、C++)彼此又很相似,所以我想稍微跳出舒适区,试试一门让我感觉有点“怪”的语言。
要求
我的要求如下:
- 与我熟悉的语言有显著区别
- 对 Web 应用有一等公民级别的支持
- 能轻松构建小而简单的应用
- 我想要的是 Angular 的反面,Angular 感觉过度为大型项目做了优化
- 同时支持后端和前端
- 不一定要自带前端框架,但我希望能像用 Go 或 Python 那样,前后端使用同一套工具链。
- 我不想用像 Elm 这样只做前端的方案。
- 我不想让前端和后端代码各自有一套构建流程(我完全可以接受写原生 JS,再配合轻量的后端模板)。
- 能以 SQLite 作为数据存储
- 有良好的单元测试支持
- 开源
- 持续维护
加分项
- 有不错的电子书可供学习
- 付费书籍也可以。
- 低抽象、少“魔法”
- 静态类型
非目标
- 极致性能
- 我写的大多数应用对性能要求都很低。通常唯一的用家就是我自己,就算有其他用户,同时在线的也不过几十人。
- 我不想用对单个用户来说就很慢的东西,但也想避开那些为了实现大规模承载而做出权衡的技术。
我对不同语言的喜爱程度
供参考,下面是我对自己用过的一些编程语言的喜爱程度:
| 语言 | 评分 | 使用经验 | 备注 |
|---|---|---|---|
| Go | 9 | 丰富 | Go 为 Web 应用而设计得非常优雅。 |
| Zig | 8 | 较少 | 写高效、高性能代码时非常有趣,不过不是我做 Web 应用的理想工具。 |
| Python | 6 | 丰富 | 用 Python 做了很多项目,但糟糕的包管理和缺乏类型已经开始让我困扰。 |
| JavaScript | 5 | 一般 | 希望能有不依赖 Node.js 的更好的打包/测试工具。 |
| Angular | 2 | 较少 | 过于魔法、过于复杂。 |
| Vue | 4 | 一般 | 曾有一段时间很喜欢 Vue 2,但已经被坑过太多次——应用崩掉往往不是我的代码问题,而是框架里的某个 bug 或陷阱。 |
| C++ | 4 | 一般 | 已经有一阵子没写了。在像 Google 这样有完善工具链的环境里还不错,但在 2025 年让我从零搭一套 C++ 开发环境,我可没兴趣。 |
| C | 6 | 较少 | 和 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 框架似乎是 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 的 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 做些小实验,看看哪一个更有趣。
随机一篇博客
评论
登录后参与讨论