Skip to content

Commit fa5ffb8

Browse files
committed
Added plans for future LFE Friday posts.
1 parent 8089fd8 commit fa5ffb8

3 files changed

Lines changed: 633 additions & 0 deletions

File tree

‎planning/lfe-friday-core-plan.md‎

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
# LFE Friday — Core Set Plan
2+
3+
*Generated: 2026-06-04*
4+
5+
This plan covers the **176 uncovered modules** in the core OTP set (stdlib,
6+
kernel, erts, crypto, ssl, inets, mnesia, tools, sasl, ssh, os_mon,
7+
runtime_tools, parsetools, syntax_tools, xmerl). Modules are organized into
8+
thematic arcs — multi-week sequences that build on each other — mirroring the
9+
series' proven approach (the ETS and digraph arcs were its strongest runs).
10+
11+
Partially-covered modules (lists, string, erlang, etc.) are included where
12+
significant gaps remain.
13+
14+
15+
## Arc 1: Maps and Modern Data Structures (8 weeks)
16+
17+
The single biggest gap. maps was introduced in OTP 17 (2014) — after the
18+
original series started but never covered.
19+
20+
| Week | Module | Topic | Notes |
21+
|------|--------|-------|-------|
22+
| 1 | maps | maps:new/0, from_list/1, to_list/1, get/2, get/3, put/3 | Basics, comparison with dict |
23+
| 2 | maps | maps:merge/2, merge_with/3, update/3, update_with/3 | Mutations, merge_with is OTP 24+ |
24+
| 3 | maps | maps:filter/2, filtermap/2, map/2, fold/3, foreach/2 | Functional operations |
25+
| 4 | maps | maps:keys/1, values/1, find/2, is_key/2, size/1, groups_from_list/2 | Querying and grouping |
26+
| 5 | maps | maps:intersect/2, intersect_with/3, iterator/1, next/1 | Set ops and lazy iteration |
27+
| 6 | sets | sets module | Modern set implementation (OTP 24 rewrote internals) |
28+
| 7 | gb_sets | gb_sets module | Balanced-tree sets, when to prefer over sets/ordsets |
29+
| 8 | gb_trees | gb_trees module | General balanced trees, comparison with maps |
30+
31+
**Why this arc first:** maps is the most-used data structure in modern
32+
Erlang/LFE. Starting here signals the revival is forward-looking, not just
33+
picking up where 2016 left off.
34+
35+
36+
## Arc 2: The lists Module — Unfinished Business (6 weeks)
37+
38+
The original series covered 6 list functions. There are 60+ more.
39+
40+
| Week | Module | Topic | Notes |
41+
|------|--------|-------|-------|
42+
| 9 | lists | lists:map/2, foldl/3, foldr/3 | The workhorses |
43+
| 10 | lists | lists:sort/1, sort/2, usort/1, merge/1, merge/2 | Sorting and merging |
44+
| 11 | lists | lists:zip/2, zip3/3, unzip/1, unzip3/1, zipwith/3 | Zipping |
45+
| 12 | lists | lists:partition/2, splitwith/2, takewhile/2, search/2 | Partitioning (pairs with original dropwhile post) |
46+
| 13 | lists | lists:nth/2, last/1, reverse/1, flatten/1, append/1 | Structural operations |
47+
| 14 | lists | lists:seq/2, seq/3, duplicate/2, enumerate/1 | Generators, enumerate is OTP 25+ |
48+
49+
50+
## Arc 3: OTP Behaviours (10 weeks)
51+
52+
The biggest conceptual gap. The original series never touched OTP behaviours.
53+
54+
| Week | Module | Topic | Notes |
55+
|------|--------|-------|-------|
56+
| 15 | proc_lib | proc_lib:spawn/1, start_link/3, init_ack/1 | Foundation: what OTP processes really are |
57+
| 16 | gen_server | gen_server part 1: init, handle_call, handle_cast | The workhorse behaviour |
58+
| 17 | gen_server | gen_server part 2: handle_info, terminate, code_change | Lifecycle and hot code |
59+
| 18 | gen_server | gen_server part 3: multi_call, reply, format_status | Advanced patterns |
60+
| 19 | gen_statem | gen_statem part 1: callback_mode, state functions | The modern FSM |
61+
| 20 | gen_statem | gen_statem part 2: state_enter, timeouts, postpone | Advanced state machine features |
62+
| 21 | gen_event | gen_event: add_handler, notify, call | Event managers |
63+
| 22 | supervisor | supervisor part 1: one_for_one, one_for_all, rest_for_one | Supervision strategies |
64+
| 23 | supervisor | supervisor part 2: dynamic children, child specs | Dynamic supervision |
65+
| 24 | supervisor_bridge | supervisor_bridge + sys module | Wrapping non-OTP processes, sys tracing |
66+
67+
68+
## Arc 4: I/O and Files (8 weeks)
69+
70+
Another major gap — the entire file and I/O layer.
71+
72+
| Week | Module | Topic | Notes |
73+
|------|--------|-------|-------|
74+
| 25 | io | io:format/2, fwrite/2, get_line/1, read/1 | Console I/O |
75+
| 26 | io_lib | io_lib:format/2, write/1, print/1, scan/2 | Formatting and parsing |
76+
| 27 | io_ansi | io_ansi module | Terminal colors and styling (new OTP module) |
77+
| 28 | file | file:read_file/1, write_file/2, open/2, close/1 | Basic file operations |
78+
| 29 | file | file:consult/1, path_open/3, list_dir/1, make_dir/1 | Directory ops, Erlang term files |
79+
| 30 | filename | filename:join/1, split/1, basename/1, extension/1, rootname/1 | Path manipulation |
80+
| 31 | filelib | filelib:wildcard/1, ensure_dir/1, is_dir/1, file_size/1 | Expands on the single existing post |
81+
| 32 | file_sorter | file_sorter module | Large-file external sorting |
82+
83+
84+
## Arc 5: Strings and Text (6 weeks)
85+
86+
The original string posts covered deprecated functions. Time for the modern API.
87+
88+
| Week | Module | Topic | Notes |
89+
|------|--------|-------|-------|
90+
| 33 | string | string:slice/2, slice/3, find/2, split/2, trim/1 | Modern unicode-aware API (OTP 20+) |
91+
| 34 | string | string:replace/3, pad/2, titlecase/1, casefold/1, to_graphemes/1 | Advanced text manipulation |
92+
| 35 | unicode | unicode:characters_to_binary/1, characters_to_list/1 | Encoding conversions |
93+
| 36 | re | re:run/2, run/3, compile/1, replace/3, split/2 | Regular expressions |
94+
| 37 | uri_string | uri_string:parse/1, compose/1, normalize/1 | URI handling (replaces http_uri) |
95+
| 38 | json | json module | JSON encoding/decoding (OTP 27+, native!) |
96+
97+
98+
## Arc 6: Networking (8 weeks)
99+
100+
| Week | Module | Topic | Notes |
101+
|------|--------|-------|-------|
102+
| 39 | inet | inet:getaddr/2, gethostname/0, parse_address/1, setopts/2 | Network primitives |
103+
| 40 | gen_tcp | gen_tcp:listen/2, accept/1, connect/3, send/2, recv/2 | TCP client/server |
104+
| 41 | gen_tcp | gen_tcp active mode, {active, once}, packet options | Advanced TCP patterns |
105+
| 42 | gen_udp | gen_udp:open/1, send/4, recv/2 | UDP |
106+
| 43 | ssl | ssl:connect/3, listen/2, handshake/1 | TLS client/server |
107+
| 44 | ssh | ssh:connect/3, ssh_connection:session_channel/2, exec/4 | SSH client |
108+
| 45 | ssh | ssh:daemon/2, ssh_sftp:start_channel/1 | SSH server, SFTP |
109+
| 46 | httpc | httpc deep dive: streaming, async, SSL options | Expands on the single existing post |
110+
111+
112+
## Arc 7: The erlang Module — BIF Safari (6 weeks)
113+
114+
Only 3 functions covered out of 200+ BIFs.
115+
116+
| Week | Module | Topic | Notes |
117+
|------|--------|-------|-------|
118+
| 47 | erlang | erlang:spawn/1,3, spawn_link/1,3, spawn_monitor/1,3 | Process creation |
119+
| 48 | erlang | erlang:send/2, self/0, process_info/1, is_alive/0 | Process introspection |
120+
| 49 | erlang | erlang:monitor/2, demonitor/1, link/1, unlink/1 | Links and monitors |
121+
| 50 | erlang | erlang:system_info/1, memory/0, statistics/1 | System introspection |
122+
| 51 | erlang | erlang:binary_to_term/1, term_to_binary/1, phash2/1 | Serialization and hashing |
123+
| 52 | erlang | erlang:make_ref/0, monotonic_time/0, unique_integer/0 | Time and uniqueness |
124+
125+
126+
## Arc 8: Concurrency Primitives (4 weeks)
127+
128+
| Week | Module | Topic | Notes |
129+
|------|--------|-------|-------|
130+
| 53 | atomics | atomics module | Lock-free atomic integers (OTP 21+) |
131+
| 54 | counters | counters module | Mutable counter arrays (OTP 21+) |
132+
| 55 | persistent_term | persistent_term module | Global immutable storage (OTP 21+) |
133+
| 56 | erpc | erpc module | Modern remote procedure calls (OTP 23+) |
134+
135+
136+
## Arc 9: Profiling and Debugging (8 weeks)
137+
138+
| Week | Module | Topic | Notes |
139+
|------|--------|-------|-------|
140+
| 57 | dbg | dbg:tracer/0, tpl/2, p/2, stop/0 | Trace-based debugging |
141+
| 58 | trace | trace module | New tracing API (OTP 27+) |
142+
| 59 | tprof | tprof module | Time profiling (OTP 27+, replaces eprof) |
143+
| 60 | eprof | eprof module | Time profiling (classic) |
144+
| 61 | fprof | fprof module | Flame-graph-style profiling |
145+
| 62 | cprof | cprof module | Call count profiling |
146+
| 63 | cover | cover module | Code coverage analysis |
147+
| 64 | xref | xref module | Cross-reference analysis |
148+
149+
150+
## Arc 10: Logging and SASL (4 weeks)
151+
152+
| Week | Module | Topic | Notes |
153+
|------|--------|-------|-------|
154+
| 65 | logger | logger part 1: log/2, set_handler_config/2, adding handlers | Modern logging (OTP 21+) |
155+
| 66 | logger | logger part 2: filters, formatters, custom handlers | Advanced logger |
156+
| 67 | application | application:start/1, get_env/2, ensure_all_started/1 | Application lifecycle |
157+
| 68 | systools | systools:make_script/1, make_tar/1 + release_handler | Releases |
158+
159+
160+
## Arc 11: Mnesia (4 weeks)
161+
162+
| Week | Module | Topic | Notes |
163+
|------|--------|-------|-------|
164+
| 69 | mnesia | mnesia part 1: create_table/2, write/1, read/2, transaction/1 | Basics |
165+
| 70 | mnesia | mnesia part 2: select/2, match_object/1, index_read/3 | Querying |
166+
| 71 | mnesia | mnesia part 3: table types, disc_copies, disc_only_copies | Storage backends |
167+
| 72 | mnesia | mnesia part 4: add_table_copy/3, change_table_copy_type/3 | Distribution |
168+
169+
170+
## Arc 12: Miscellaneous Essentials (8 weeks)
171+
172+
| Week | Module | Topic | Notes |
173+
|------|--------|-------|-------|
174+
| 73 | os | os:cmd/1, getenv/1, system_time/0, type/0 | OS interaction |
175+
| 74 | math | math module | Trig, log, exp, pow, pi, sqrt |
176+
| 75 | rand | rand:uniform/0, uniform/1, seed/1, normal/0 | Random numbers (replaces random) |
177+
| 76 | binary | binary:split/2, match/2, part/2, compile_pattern/1 | Binary processing |
178+
| 77 | proplists | proplists:get_value/2, expand/2, lookup_all/2 | Property lists |
179+
| 78 | orddict | orddict module | Ordered dictionaries (comparison with maps) |
180+
| 79 | zip | zip:create/2, extract/1, list_dir/1 | Zip archives (compare with erl_tar) |
181+
| 80 | base64 | base64:encode/1, decode/1, mime_encode/1 | Base64 encoding |
182+
183+
184+
## Arc 13: Crypto (3 weeks)
185+
186+
| Week | Module | Topic | Notes |
187+
|------|--------|-------|-------|
188+
| 81 | crypto | crypto:hash/2, mac/3, strong_rand_bytes/1 | Hashing and MACs |
189+
| 82 | crypto | crypto:crypto_one_time/4, generate_key/2 | Encryption and key generation |
190+
| 83 | crypto | crypto:sign/4, verify/5 | Digital signatures |
191+
192+
193+
## Arc 14: Developer Tools (6 weeks)
194+
195+
| Week | Module | Topic | Notes |
196+
|------|--------|-------|-------|
197+
| 84 | escript | escript module | Building standalone scripts |
198+
| 85 | beam_lib | beam_lib module | BEAM file introspection |
199+
| 86 | erl_scan | erl_scan + erl_parse | Tokenizing and parsing Erlang |
200+
| 87 | erl_eval | erl_eval module | Runtime expression evaluation |
201+
| 88 | erl_pp | erl_pp module | Pretty-printing Erlang terms |
202+
| 89 | shell_docs | shell_docs module | Programmatic access to documentation |
203+
204+
205+
## Arc 15: New in Modern OTP (4 weeks)
206+
207+
Posts highlighting what's new since the original series ended.
208+
209+
| Week | Module | Topic | Notes |
210+
|------|--------|-------|-------|
211+
| 90 | json | json module (if not already covered in Arc 5) | OTP 27+ native JSON |
212+
| 91 | graph | graph module | OTP 29, modern graph API |
213+
| 92 | argparse | argparse module | OTP 26+, CLI argument parsing |
214+
| 93 | zstd | zstd module | OTP 29, Zstandard compression |
215+
216+
217+
## Remaining Core Modules (Standalone Posts)
218+
219+
These modules are worth individual posts but don't fit neatly into arcs:
220+
221+
| Module | Application | Topic |
222+
|--------|-------------|-------|
223+
| array | stdlib | Functional arrays |
224+
| dets | stdlib | Disk-based ETS |
225+
| digraph_utils | stdlib | Companion to the covered digraph module |
226+
| disk_log | kernel | Disk-based logging |
227+
| global | kernel | Global name registration |
228+
| global_group | kernel | Node groups |
229+
| inet_res | kernel | DNS resolution |
230+
| init | erts | System initialization |
231+
| instrument | runtime_tools | Memory instrumentation |
232+
| lcnt | tools | Lock counting |
233+
| make | tools | Erlang make |
234+
| msacc | runtime_tools | Microstate accounting |
235+
| net_adm | kernel | Network admin (ping, names) |
236+
| net_kernel | kernel | Distribution kernel |
237+
| peer | stdlib | Peer node management (OTP 25+) |
238+
| pg | kernel | Process groups (OTP 23+) |
239+
| pool | stdlib | Worker pool |
240+
| qlc | stdlib | Query list comprehensions |
241+
| rpc | kernel | Remote procedure calls (classic) |
242+
| scheduler | runtime_tools | Scheduler utilization |
243+
| seq_trace | kernel | Sequential tracing |
244+
| socket | kernel | Low-level socket API (OTP 22+) |
245+
| sofs | stdlib | Sets of sets |
246+
| system_information | runtime_tools | System information collection |
247+
| tags | tools | Emacs TAGS generation |
248+
| zlib | erts | zlib compression |
249+
250+
Plus specialized modules from ssh (10), ssl (4), inets (10), os_mon (5),
251+
sasl (4), parsetools (2), syntax_tools (9), and xmerl (7) that could each
252+
get standalone posts or mini-arcs depending on audience interest.
253+
254+
255+
## Pacing
256+
257+
At one post per week, the 15 arcs alone cover **93 weeks** (~1.8 years). With
258+
the standalone posts, there's material for **130+ weeks** (~2.5 years) from
259+
the core set alone — before touching the extended set.
260+
261+
A realistic launch cadence might be:
262+
- Start with **Arc 1 (maps)** — high impact, signals modernity
263+
- Alternate between long arcs and short ones to maintain variety
264+
- Sprinkle standalone posts between arcs as palette cleansers
265+
- The **OTP behaviours arc** should come early (within the first 6 months) — it's the single most requested topic for LFE learners

0 commit comments

Comments
 (0)