Application Building
How do these pieces become useful software?
Put the pieces to work.
Combine language fundamentals in small, complete programs. Follow data through configuration, files, HTTP, storage, and concurrent work.
Work in progress. 1 of 16 lessons are drafted and open to read; they're still being reviewed.
Useful foundations: functions, collections, errors, and cleanup. Craft supplies testing habits; Runtimes explains processes, files, and concurrent execution.
Still being written 1 of 16 lessons are drafted and open to read while they're reviewed. Planned topics show where the catalog is going.
CLI tools and configuration
Build understandingGive a small program a clear interface and predictable configuration.
Arguments, standard streams, and exit codes
How does another person or program interact with your tool? Parse arguments, distinguish output from diagnostics, and report failure.
TypeScriptGoRustCHaskellJavaProject structure and dependency boundaries
Where should parsing, domain behavior, and I/O live? Organize a small project around responsibilities and explicit dependencies.
TypeScriptGoRustCHaskellJavaFiles and external data
Build understandingTurn bytes outside the program into usable values, then write results with explicit failure behavior.
Reading lines and processing text
How do you count, filter, and summarize a text file? Build a small word-count tool and handle the last line and the empty file.
TypeScriptGoRustCHaskellJavaFiles, parsing, and serialization
How does external text become a checked value? Separate decoding, parsing, validation, and representing failures.
TypeScriptGoRustCHaskellJavaPaths, directories, and portability
Will this path work on another machine? Join paths safely, walk a directory, and handle files that disappear mid-walk.
TypeScriptGoRustCHaskellJavaSafe file updates and interrupted writes
What remains if a write fails halfway through? Compare overwriting, temporary files, replacement, and the limits of atomicity and durability.
TypeScriptGoRustCHaskellJavaSerialization and foreign interfaces
What survives when a value crosses a file, wire, or language boundary? Compare encodings, layouts, and ownership contracts.
TypeScriptGoRustCHaskellJavaHTTP clients and small servers
Build understandingFollow a request through parsing, application behavior, and a response.
HTTP requests, responses, and timeouts
What does a client actually send and receive? Handle status codes, body decoding, cancellation, and owned resources.
TypeScriptGoRustCHaskellJavaHandlers, validation, and error responses
Where does an untrusted request become a domain input? Separate transport handling from behavior and map failures deliberately.
TypeScriptGoRustCHaskellJavaTesting a network boundary
Which behavior needs a real connection, and which can be checked locally? Test protocol interactions without making every test depend on a remote service.
TypeScriptGoRustCHaskellJavaPersistence and transactions
Build understandingMake the boundary between an in-memory result and stored state explicit.
Storage operations and repository boundaries
What does the rest of the program need from storage? Express operations and errors without hiding important consistency assumptions.
TypeScriptGoRustCHaskellJavaTransactions, commit, and rollback
Which changes must succeed together? Trace success and failure while separating database transactions from in-memory mutation.
TypeScriptGoRustCHaskellJavaTesting persistence and restart behavior
What survives after the process exits? Check migrations, constraints, failed writes, and reload behavior with a representative storage environment.
TypeScriptGoRustCHaskellJavaA bounded concurrent worker
Go underneathCombine task lifetime, errors, resource ownership, and testing in one small application.
Bounded work and backpressure
What happens when jobs arrive faster than they finish? Limit active work and queue growth, and define how callers observe overload.
TypeScriptGoRustCHaskellJavaCancellation and graceful shutdown
What happens to queued and active work when the program stops? Trace cancellation, draining, cleanup, and explicit completion guarantees.
TypeScriptGoRustCHaskellJava