I’m a Senior engineer onboarding to Elixir, functional programming, BEAM, and the Erlang way. What follows is a little study guide put together with Claude Sonnet. Any feedback on how it could be improved would be very welcome.

Scope: server-side with a RESTful HTTP boundary. LiveView and real-time is out of scope for this exercise Pace: 6–12 hrs/week alongside full-time work and family. Total: ~14–20 weeks.

How to use this

Phase 1 — Unlearning OOP

Duration: 2–3 weeks · ~6 hrs/week Goal: Accept immutability, pattern matching, and data transformation pipelines. Stop reaching for objects and mutating state.

Resources

Focus areas

Done when

You can write a data transformation pipeline using only |>, Enum, and pattern-matched function heads, with no imperative control flow.

Notes


Phase 2 — BEAM and OTP

Duration: 3–4 weeks · 6–8 hrs/week Goal: Think in processes, supervisors, and fault tolerance. Understand the Erlang way before leaning on Elixir abstractions.

Resources

Focus areas

Key mental shift

Error handling in OOP: defend at every layer, catch exceptions, return nil. Error handling in BEAM: let the process crash, supervisor restarts clean state. The crash boundary is the design.

Done when

You can draw a supervision tree for a non-trivial system from memory, explain what happens when each process crashes, and implement a GenServer with init/1, handle_call/3, and handle_cast/2 without looking anything up.

Notes


Phase 3 — Real Systems (REST focus)

Duration: 4–5 weeks · 8–10 hrs/week Goal: Phoenix as a REST framework, Ecto for data, OTP for server-side state. Clean HTTP boundary, no LiveView.

Resources

Libraries to understand

Build project (required — don’t skip this)

Pick one with meaningful server-side state behind a REST boundary:

The project matters more than finishing the books. All three force real OTP usage with a clean HTTP surface.

What to deliberately skip (for now)

These are worth learning — just not yet.

Done when

Your side project is running locally, handles process crashes gracefully under load, and you can explain to a colleague why your GenServer-backed rate limiter is more reliable than a Redis-based one.

Notes


Phase 4 — Deep BEAM (ongoing)

Duration: 4–6+ weeks · fit around real work Goal: Scheduler internals, memory model, distribution, tracing, NIFs. Production-grade understanding.

Resources

Focus areas

Done when

You can diagnose a memory leak and a process bottleneck in a running system using only BEAM tools, with no application restarts.

Notes


Appendix: Nerves (after Phase 3)

Nerves is Elixir for embedded systems — Raspberry Pi, BeagleBone, and similar hardware. It is not a separate paradigm. A Nerves app is an OTP application. Everything from phases 1–3 transfers directly.

What it is

Nerves uses Linux purely as a hardware abstraction layer — drivers and OS primitives — then boots the BEAM. You write Elixir OTP applications that run directly on the device. Firmware is immutable, minimal (20–30 MB), and deployed over-the-air via SSH.

Why it fits your REST instinct

The natural Nerves architecture is exactly what you’ve been building toward: OTP processes managing device state, a Phoenix REST API as the HTTP boundary, hardware as the downstream concern. The same mental model, different hardware layer underneath.

Hardware needed

Where to start

Key libraries

Timing

Don’t start Nerves until your Phase 3 side project is working. Hardware friction on top of language friction stalls progress. With your hours available, target Nerves as a Phase 5 — a reward for having internalised OTP properly.

Notes


Key mental shifts (revisit monthly)

OOP instinct BEAM replacement
Objects hold state Processes hold state
Catch exceptions everywhere Let it crash, supervise the restart
Threads share memory Processes share nothing
Mutate data in place Return transformed data
Inheritance for reuse Composition, behaviours, protocols
Lock shared resources Eliminate sharing entirely
Debug with a debugger Trace messages with :sys and :recon

ACM-specific resources


Weekly rhythm suggestion

Given full-time work + young family, protect one fixed slot. Irregular “when I have time” sessions don’t compound.


Checkpoints