这张路线适合谁
有任意一门语言的实操经验即可,Go、Python、JavaScript 都行——函数式与 BEAM 背景不是前置条件,是路线内要建立的能力。真正的前置只有一个判断:值不值得投入。先读开山篇再决定:想给 Erlang/Elixir 服务补类型安全、或要一个”编译器把错误关在编译期”的小服务语言,值得走完;追求生态厚度与招聘规模的,Elixir/Go 是更现实的选择。时长口径:每天 1-2 小时业余学习,全程约 4-6 周——Gleam 语言本体很小,这是它比多数路线短的原因。
总览
| 阶段 | 目标 | 阶段产出 | 预估时长 |
|---|---|---|---|
| 一 环境与工具链 | 装好 Erlang/OTP 与 Gleam,跑通命令 | hello world + 一条 gleeunit 用例 | 半周 |
| 二 语言核心 | ADT、case 穷尽、不可变、管道、use | 一个日志清洗脚本 + 测试 | 1-1.5 周 |
| 三 错误模型与测试 | Result/Option 语义、let assert 纪律 | 脚本全面 Result 化 + 失败路径用例 | 1 周 |
| 四 进程与 OTP | Subject、actor、进程级容错 | 令牌桶限速 actor + 崩溃演练 | 1-1.5 周 |
| 五 Web 服务与生产化 | wisp/mist 全套与部署 | 书签 API 部署到 VPS 稳定跑 | 1-1.5 周 |
阶段一:环境与工具链(半周)
学什么:装 Erlang/OTP(写作时要求 OTP 26 及以上,以官方文档为准)与 Gleam 本体(官网二进制或 brew,版本管理可用 asdf);gleam new/run/test/add 四个命令;VS Code 的 Gleam 插件(语言服务器补全与编译期报错是这门语言的核心体验,别用裸编辑器)。
产出与验收:新建项目跑通 hello world,再给 test 目录加一条用例让 gleam test 变绿:
gleam new bookmark && cd bookmark
gleam run # => "Hello, world!"
gleam add gleam_http # 体验一次依赖安装,gleam.toml 出现新条目
gleam test # 模板自带用例应为绿色
常见卡点:Windows 原生环境装 Erlang 折腾——用 WSL2,一小时的坑十分钟绕过去;gleam run 第一次会先编译全部依赖,等待属正常。
阶段二:语言核心(1-1.5 周)
学什么:ADT 与 case 穷尽检查、不可变与 record update、标签参数、管道、use 表达式、List/Dict/Option 的高频函数。主线是《Gleam 语法要点》建立心智模型,《Gleam 基础知识参考字典》当随查手册——字典里每个条目亲手跑一遍,编译器报错读法就有了肌肉记忆。
产出与验收:写一个日志清洗脚本,读 Web 日志文件、抽出路径与状态码、聚合计数、输出 JSON。验收标准:没有 if/else 瀑布(分支全走 case)、没有一处 let assert、解析失败有 Result 表达、核心函数各配一条 gleeunit 用例。
常见卡点:编译器穷尽报错看着吓人——它列的是”你还没处理的形状”,照着补分支即可,这是把调试时间前移不是找麻烦;第二个卡点是想找”默认可比””自动转字符串”这类便利,标准库没有就是没有,显式写比较函数。
阶段三:错误模型与测试(1 周)
学什么:Result(a, e) 作为签名的一部分、result 模块三个骨干函数(try/map/map_error)、Option 与 Result 的互转边界、let assert 的使用纪律、gleeunit 组织用例、echo/assert 调试。这阶段全在字典篇的”集合与缺省”和”工程与调试”两组里,不引外部材料。
产出与验收:把阶段二的脚本改造成”全 Result 化”——每个可能失败的步骤返回带自定义错误类型的 Result,用 use x <- result.try(...) 串接,失败路径各有用例覆盖。验收标准:能回答”哪个函数在什么输入下返回什么错误形状”,且测试里没有一条靠 panic 通过。
常见卡点:觉得满屏 Ok/Error 是”类型噪音”——这是契约不是噪音,编译器在替你枚举失败;真想图省事的 let assert 每写一处就记一笔,超过三处说明设计有问题。
阶段四:进程与 OTP(1-1.5 周)
学什么:进程与 Subject 消息传递(send/receive/call)、actor 的 new/on_message/start 三件套、崩溃与重启的进程级语义,最后看一眼 gleam/otp/static_supervisor(OneForOne 策略、add 挂子进程、restart_tolerance 控制重启强度)——不用深挖,知道”谁负责重启”在哪一层。主线是字典篇”进程与 OTP”组加 gleam_otp 1.x 官方文档——2025 年 6 月 GA 的 1.0 重写了整套 API,搜到的 0.x 时代教程全部对不上号,认准 1.x 文档。
产出与验收:实现一个令牌桶限速 actor(每秒补充 N 个令牌,call 消耗令牌),然后做崩溃演练:
# 崩溃演练三步(纯手工操作,不需要框架):
1. 步骤一:main 里启动 actor,确认 call 正常返回
1. 步骤二:处理函数里临时加一行 panic,发一条消息让它崩
1. 步骤三:再次 call——连接已断即正常,这就是"进程死了不会拖着服务走"的直接体验
验收标准:能说清”消息发到哪、状态住在哪、进程崩了谁负责、重启后状态从哪来(重新 init,归零是有意为之)”。
常见卡点:把 OTP 当成”高级话题”想跳过直接学 Web——wisp 的 rescue_crashes、mist 的每连接进程全建立在这套模型上,跳过的代价是阶段五处处黑盒。
阶段五:Web 服务与生产化(1-1.5 周)
学什么:wisp 的 handler/middleware/require_json、mist 启动与端口、wisp/simulate 测试、gleam export erlang-shipment 部署。主线材料两份:wisp 官方示例(hello_world、routing、working_with_json 三例吃透)加《用 Gleam 写一个小型 Web 服务:Mist 与 Wisp》——那篇里有中间件栈、actor 存储、simulate 测试三个难点的完整展开与反模式清单。
产出与验收:把书签 API 从零亲手搭一遍(不抄,对照着写),部署到一台最低配 VPS,用 systemd 拉起,稳定运行一周。验收标准:能解释”每个请求对应哪个进程、状态在哪个进程、谁兜谁的底”;erlang-shipment 产物在目标机脱离 gleam 工具链可运行。
常见卡点:找一个能力发现生态里没有——先查官方包索引 packages.gleam.run,确认没有再决定”FFI 包一层 Erlang/Elixir 库”还是”自己写”,这个决策成本是选 Gleam 的固定开销,写进工时预期。
避坑清单
| 不要 | 代价 |
|---|---|
| 不要拿动态语言直觉硬写 | 没有 null、没有隐式转换、没有 REPL——四处找 nil 替代品的写法全都是编译错误,越快接受”用类型表达缺失”越快 |
| 不要滥用 let assert | 每处都是一颗运行时地雷,panic 会杀进程;外部输入一律 Result,assert 留给真不变量 |
| 不要跳过 OTP 直接学 Web | wisp 与 mist 的容错全建立在进程模型上,跳过就是黑盒调试,出问题连”谁崩了”都答不上 |
| 不要拿 Gleam 干 CPU 密集活 | BEAM 单进程计算弱,数值计算、图像处理选别的语言;它的主场是高并发 IO 与容错 |
| 不要指望”什么包都有” | 生态年轻是选型的固定成本,先查 packages.gleam.run,没有就评估 FFI 或自写,别硬造轮子也别硬引 |
学完之后
路线走完,你有两个方向。往深走:把 BEAM 的容错心智补全——监督树、Registry、Supervisor 策略,同门五篇的完整展开见《Elixir 学习路线》,两门语言共享同一套 OTP,Elixir 侧材料反过来也是 Gleam 的进阶读物。往横向走:把这套”错误进签名、变更收拢进进程”的纪律带回现有技术栈——PHP 队列任务系统里的状态机与超时重投、任何语言里的”失败路径先行”测试法,都是同一件事的手工版,Gleam 只是把它们升级成了编译器保证。整个系列五篇(开山篇、语法要点、参考字典、Web 服务实战、本篇)至此形成闭环,回查任何一处都从这里出发。
版本核实(以官方文档为准):写作时 Gleam 稳定线 1.12.x(1.12.0 发布于 2025-08-05);Erlang/OTP 最低版本要求以官方安装文档为准(1.x 时代要求 OTP 26 及以上);gleam_otp 1.1.0 与 gleam_erlang 1.3.0 为写作时当前版(1.0 于 2025-06-12 GA,本路线全部按 1.x API 教学并明确警告 0.x 旧教程);wisp 2.0.0 发布于 2025-09-04、mist 5.0.x;packages.gleam.run 为官方包索引;无原生 REPL 为 2025 年 9 月时点状态。时长预估按每天 1-2 小时业余学习口径,为经验估算。本文未引用后续尚未发布的版本特性。