这张路线适合谁
有任意一门语言的实操经验即可,PHP、Go、JavaScript 都行——不需要函数式语言背景,函数式思维是路线内要建立的能力,不是前置条件。真正的前置只有一个判断:值不值得投入。先读开山篇(BEAM 并发模型与 LiveView 定位)再做决定:目标是长连接、实时推送类系统,或想补并发编程的眼界,值得走完;只想解决”PHP-FPM 每请求启动浪费”,Workerman/Swoole 成本更低,不必为此换语言。时长口径:每天 1-2 小时业余学习,全程约 6-8 周。
总览
| 阶段 | 目标 | 阶段产出 | 预估时长 |
|---|---|---|---|
| 一 环境与交互壳 | 装好工具链,iex 里能跑 | 跑通进程收发消息 | 半周 |
| 二 语言核心 | 模式匹配、不可变、管道、Enum | 一个日志清洗脚本 | 1-1.5 周 |
| 三 OTP | GenServer、Supervisor、let it crash | 带监督的限速进程 + 崩溃演练 | 1-2 周 |
| 四 Phoenix 与 LiveView | 路由、组件、会话进程 | 一个实时看板 | 2 周 |
| 五 生产化 | release、测试、运行时配置 | 看板部署到 VPS 稳定跑一周 | 2-3 周 |
阶段一:环境与 iex(半周)
学什么:安装 Erlang/OTP 与 Elixir(版本管理用 asdf 或系统包管理器,不钉版本号)、iex 的基本操作、值与模块的求值。安装照 elixir-lang.org 官方安装页走,别从第三方教程抄命令。
产出与验收:在 iex 里跑通开山篇的 spawn/send/receive 例子——能解释”消息发到哪了、谁在收”。这一步是整个路线的地基:后面所有概念都建立在”一切皆进程”上。验收动作就三行:
iex # 进入交互壳
1. 粘入开山篇的 spawn/receive 例子,确认返回 {:result, 3}
1. 再跑 self(),看"自己"也是一个 pid
常见卡点:Windows 原生环境装 Erlang 折腾——用 WSL2,一小时的坑十分钟绕过去。
阶段二:语言核心(1-1.5 周)
学什么:模式匹配(=、case、pin)、不可变与重新绑定、管道、Enum/Stream、模块与函数子句、with。对应站内两篇:《Elixir 语法要点》负责建立心智模型,《Elixir 基础知识参考字典》当随查手册——后者里的每个条目都建议亲手跑一遍。
产出与验收:用 Mix.install 写一个单文件脚本,读一份 Web 日志文件、抽出状态码与路径、聚合计数、输出 JSON。验收标准:逻辑全部用管道串起来、没有嵌套 if、跑通十万行量级(本站未实测,量级以自己机器为准)。
常见卡点:MatchError 频出——这是模式没对齐而不是语法错,先在纸上画”数据形状”再写模式;串不过来时回字典篇查 Map.get/fetch/fetch! 三连的语义。
阶段三:OTP(1-2 周)
学什么:GenServer 四回调(init/call/cast/info)、Supervisor 与重启策略、Task 与 Task.Supervisor、Registry、link 与 monitor。站内主线是《OTP 与进程》,官方的 “Mix and OTP” 指南做完整补充(两份材料就够,不要同时开五份教程)。
产出与验收:实现一个令牌桶限速进程(每秒补充 N 个令牌,call 消耗令牌),挂进监督树,然后做一次崩溃演练:
RateLimiter.consume() # 正常扣令牌
pid = Process.whereis(RateLimiter)
Process.exit(pid, :kill) # 手动杀掉
RateLimiter.consume() # 还能用——Supervisor 已经拉起了一个全新进程
验收标准:能说清”它崩了之后谁负责、重启后状态从哪来(重新 init,所以归零是有意为之)”。
常见卡点:回调返回值格式记不住({:reply, x, state} 还是 {:noreply, state})——这不是背的问题,返回值写错编译器不拦、运行时直接崩,快速反馈的靠法就是刻意制造一次错误看报错长什么样。
阶段四:Phoenix 与 LiveView(2 周)
学什么:mix phx.new 项目结构、路由与 Controller、CoreComponents、LiveView 的 mount/handle_event/handle_info 三件套、PubSub。主线走官方 guides(Phoenix 1.7 与 LiveView 1.0 文档),产出对照《用 Phoenix LiveView 做一个实时看板》把项目亲手搭一遍——那篇里有采集循环、stream 渲染、洪峰节流三个难点与反模式清单。
产出与验收:把看板的数据源从模拟器换成真实数据(订阅本机某个服务的日志或心跳),开两个浏览器标签验证一致性与新鲜度。验收标准:能解释”每个标签对应哪个进程、广播从哪发出、谁给谁兜底”。
常见卡点:搜到的教程还是 Phoenix 1.6 时代(webpack、Umbrella 项目)——特征是教程里出现 assets/webpack.config.js,直接关掉换官方 guides,1.7 起的 esbuild 与 verified routes 和旧教程对不上。
阶段五:生产化(2-3 周)
学什么:mix release 打包与部署、Ecto 基础(迁移、显式查询)、ExUnit 测试(async 与 setup)、telemetry 指标暴露、runtime.exs 与 config.exs 的分工。资源:官方 “Deployment” 与 “Testing” guides 加 hexdocs,每阶段外部材料不超过两个。
产出与验收:看板打成 release,部署到一台最低配 VPS,用 systemd 拉起,稳定运行一周不死、不涨内存。验收标准:能回答”进程崩了会怎样、内存凭什么不涨、配置改了怎么生效”。
常见卡点:release 里改了配置不生效——运行时配置写进 runtime.exs,编译期配置写 config.exs,两者加载时机不同,这是从”开发机能跑”到”线上能跑”的第一课。
避坑清单
| 不要 | 代价 |
|---|---|
| 不要用面向对象心智硬套 | 模块是命名空间不是类,defstruct 没有”实例方法”;按 OO 组织代码会把并行化的优势全部丢掉 |
| 不要跳过模式匹配写 if 瀑布 | 语法能跑但等于白学——Elixir 的错误处理、多子句分发、协议全部长在模式匹配上,绕开它后面寸步难行 |
| 不要从 Phoenix 1.7 之前的旧教程起步 | 资产管线、路由写法全变了,旧教程会让你在错误的目录结构里找文件 |
| 不要拿 BEAM 干 CPU 密集活 | 单进程没有抢占的纯计算会饿死调度,数值计算、图像处理选别的语言,BEAM 的主场是高并发 IO 与容错 |
| 不要一上来啃 OTP 设计原理 | 监督树的价值要在”进程真的崩过一次”之后才能体会,先按上面的节奏做产出,原理书放在阶段五之后 |
学完之后
路线走完,你有两个方向。往深走:回到看板项目加监控(telemetry 指标暴露、告警),或参与 LiveBook 这类活跃开源项目读真实工程的组织方式。往横向走:把 OTP 的容错心智带回现有技术栈——同样的”让失败可见、让重启自动化”在 PHP 队列任务系统的超时重投、在 Workerman 常驻内存的进程守护里都成立,Elixir 只是把这些从工程习惯升级成了虚拟机保证。整个系列的五篇(开山篇、语法要点、参考字典、OTP 与进程、实时看板实战)至此形成闭环,回查任何一处都从这里出发。
版本核实(以官方文档为准):Elixir 稳定线为 1.18.x(1.18.0 发布于 2024-12-19,1.18.3 发布于 2025-03-06),运行时对应 Erlang/OTP 27 线;Phoenix 稳定线 1.7.x(verified routes、esbuild 资产管线为 1.7 起特性),Phoenix LiveView 1.0.0 于 2024-12-03 GA;文中引用的官方指南(Getting Started、Mix and OTP、Deployment、Testing)均为 elixir-lang.org 与 hexdocs.pm 当前入口。安装与部署命令不钉版本号,以官方文档为准,本文未引用后续尚未发布的版本特性。