我该为 Web 开发学习哪门新语言?
我今年的目标之一是学习一门新的编程语言。距离我上次学习新语言已经有一段时间了,而且我感觉自己比较熟悉的很多语言(Go、Python、C++)彼此都很相似,所以我想尝试走出舒适区,学一门对我来说感觉有些古怪的语言。
要求
以下是我想要的条件:
- 与我熟悉的语言有显著区别
- Web 应用是一等公民
- 能够轻松构建小而简单的应用
- 我想要的是与 Angular 相反的东西,Angular 感觉过度针对大型项目进行了优化
- 同时支持后端和前端
- 它不一定需要有前端框架,但我希望能像在 Go 或 Python 中那样,前后端使用同一套工具链。
- 我不想使用像 Elm 这样仅面向前端的方案。
- 我不想让前端和后端代码使用各自独立的构建链(我完全可以接受编写原生 JavaScript 配合一些轻量的后端模板)。
- 兼容以 SQLite 作为数据存储
- 对单元测试有良好的支持
- 开源
- 持续积极维护
加分项
- 有不错的电子书可供学习。
- 付费书籍也可以。
- 低抽象/少“魔法”。
- 静态类型
非目标
- 极致性能
- 我写的大多数应用对性能要求都很低。通常唯一的的用户就是我自己,其他时候,同时在线用户也不过几十人。
- 我不想使用对单个用户来说都很慢的东西,但也想避免那些为了实现高扩展性而做出权衡的方案。
我对各种语言的喜爱程度
作为参考,以下是我对自己了解的一些编程语言的喜爱程度:
| 语言 | 评分 | 我的经验 | 备注 |
|---|---|---|---|
| Go | 9 | 高 | Go 为 Web 应用进行了精美的设计。 |
| Zig | 8 | 低 | 编写高效或高性能代码时非常有趣,不过不是我开发 Web 应用的理想工具。 |
| Python | 6 | 高 | 我用 Python 做了很多项目,但糟糕的包管理和缺乏类型已开始让我困扰。 |
| JavaScript | 5 | 中 | 我希望有不依赖 Node.js 的更好的打包/测试工具。 |
| Angular | 2 | 低 | 过于魔法化且复杂。 |
| Vue | 4 | 中 | 我曾一度很喜欢 Vue2,但已有太多次应用崩溃是因为框架中的 bug 或坑,而非我自己的代码。 |
| C++ | 4 | 中 | 已有一段时间没写了。在像 Google 这样拥有完善工具支持的环境中还不错,但在 2025 年从零搭建 C++ 开发环境就不是我喜欢的事了。 |
| C | 6 | 低 | 与 C++ 有同样的问题,但我欣赏它的简洁。 |
研究方法
为了研究每门语言,我:
- 阅读了该语言的功能特性页面
- 阅读了该语言主流 Web 框架的功能特性页面
- 查找了每门语言中简单的“hello world” Web 应用示例
- 让 LLM 将这些语言的特性与我熟悉的语言进行对比
候选方案
Elixir / Phoenix / LiveView
Elixir 在我的候选名单中排名靠前,因为我认为很聪明的许多博主似乎都很喜欢它。它似乎也有一些听起来古怪而有趣的概念和特性。
我喜欢 Elixir 有一个非常官方的 Web 框架:Phoenix。我不太喜欢 Phoenix 默认依赖 Tailwind CSS,不过看起来我可以把它关掉。
新东西是Phoenix LiveView,它似乎是一种无需编写大量 JavaScript 就能创建 Web 应用的方式,因为 LiveView 通过 websockets 将后端状态推送到前端而无需重新加载页面。但 LiveView 生成的是 SPA(单页应用),而我已经对 SPA 感到非常厌倦,不想再在上面投入了。你可以不使用 LiveView 而只用 Phoenix,但我感觉 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 中也会应用亚历克西斯·金的想法,但 Haskell 能用数据类型表达更多内容,听起来很酷。
Haskell 有许多古怪的特性,感觉会开阔我的思维,比如 monad(单子)、无限数据结构和 algebraic data types(代数数据类型),但我也觉得要在这门语言上达到高效产出的学习曲线可能会很陡峭。
流行的 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 Templates,就 HTML 模板语言而言,在我看来其实还挺不错的。
- 优点
- ✅ 支持静态类型
- ✅ 初看之下,我喜欢 Blade 模板
- 缺点
- ❌ 语言看起来很糟糕
- ❌ 我找不到好的 Laravel 文字入门资料
Scala
我听到不少关于 Scala 的正面评价。这门语言看起来很有趣,有很多我在其他语言中从未体验过的特性。语法看起来像是更简洁的 Java,这点不错。
Scala 似乎是强面向对象的。我过去喜欢面向对象,但在多年使用 Go 中限制更多的面向对象特性后,我开始觉得继承和多态弊大于利。
主流的 Web 框架似乎是Play,但阅读其文档时,感觉已经过时且充满企业级气息。hello world 教程开头就是一张复杂的 Play 架构图,超级无聊,完全无法激起我学习该框架的兴趣。
Scalatra 是另一个更注重简洁性的 Scala Web 框架,但文档中的示例很少。不过有一本电子书可以购买。
- 优点
- ✅ 围绕类型的有趣特性,比如 variance annotations(可变性注解)和 compound types(复合类型)
- 缺点
- ❌ Scala 面向对象的部分让我想起 C++ 中不好的地方,虽然没那么糟
- ❌ 似乎与 Java 生态紧密纠缠,而我并不喜欢 Java 生态
- ❌ 我对任何一个 Web 框架都提不起兴趣
总结
Gleam 感觉最符合我的目标和经验,Elixir 紧随其后。Haskell 是我鼓起勇气和耐心后应该去学习的那门语言。
我打算分别用 Gleam + Lustre 和 Elixir + Phoenix 做一些小实验,看看哪一个更让我觉得有趣。
随机一篇博客