32 in Go, 32 in Rust. Every course is taught live to 8 people or fewer and costs £9.64 to £149.64, VAT included where it applies. None of them can be bought without talking to us first.
64 of 64 courses
Go · Language
Types, interfaces, errors and the tools, down to the runtime underneath them.
G1.1
Go from the first line
Types, slices, maps, structs, errors and modules, written from nothing on your own machine until you have a command-line tool you would actually use. For people who have never written Go, whatever else they've written.
Small interfaces, composition, error wrapping, generics and iterators: the habits that separate Go from other languages written in Go. You refactor a working package until it's half the length and easier to test.
Table tests, fuzzing, benchmarks, pprof, the race detector, vet and build tags: the tools that ship with the language and go mostly unused. You find a real allocation hot spot and prove the fix with numbers.
The scheduler, growable stacks, escape analysis, the garbage collector and write barriers, read from the runtime's own source. You trace a goroutine from the go statement to a thread and back, and predict what the collector will do before it does it.
Goroutines, channels, the memory model, and what happens under real load.
G2.1
Goroutines and channels
What a goroutine is, how channels synchronise, and how to stop a program that has started many things at once. You build a small concurrent crawler and shut it down cleanly. For people who have only written code that does one thing at a time.
Context, errgroup, worker pools, pipelines, cancellation and backpressure. You take a service that leaks goroutines under load and make it shut down cleanly every time.
The Go memory model, mutexes, atomics, and what the race detector can and can't see. You find real races in a real codebase and fix them without putting one lock around everything.
GOMAXPROCS, contention profiles, sync.Pool, GOGC and GOMEMLIMIT, and how the scheduler behaves at the edge. You push a service until latency falls apart, find out why, and move the edge.
Table tests, real databases, fuzzing and load, so a green build means something.
G3.1
Testing Go from the first test
Table tests, subtests, helpers, httptest and what makes a test worth keeping, on code you wrote without any. For people whose test suite is mostly hope.
Real PostgreSQL and Redis in containers, fakes instead of mocks, golden files, and testing/synctest for code that depends on time. You delete the tests that were only testing the mocks.
Native fuzzing, property-based tests with rapid, and mutation testing, to catch the cases nobody thought to write down. You let the computer break your parser, then fix what it found.
Load tests with k6, fault injection, and upgrading an old codebase in small safe steps. You push a real service until it falls over, find out what breaks first, and change it without a rewrite.
HTTP, PostgreSQL and gRPC with the standard library first, then your own storage engine.
G4.1
Your first Go service
An HTTP API with net/http and nothing else: routing, JSON, middleware, validation, errors a client can act on, and tests that call real handlers. For people who have used web frameworks and want to see what's under them.
database/sql, pgx and sqlc, connection pools, transactions, migrations and the bugs that only show up under concurrent writes. You take an endpoint from a slow, racy query to a fast, correct one.
Protobuf, gRPC, streaming, deadlines, retries and schema changes that don't break a client you can't see. You split one service in two and evolve the contract between them without downtime.
A write-ahead log, a B-tree, fsync and crash recovery, built from an empty file. You pull the plug in the middle of a write, restart, and prove that nothing was lost.
SQL, caches and streams, down to a query engine of your own.
G5.1
SQL for Go developers
Tables, keys, joins, aggregates, transactions and schema design, written by hand in psql and then called from Go. For people who have let an ORM do all of this so far.
Cache-aside, expiry, invalidation, stampedes stopped with singleflight, and the data structures that make Redis more than a map. You take a read-heavy endpoint down by an order of magnitude and keep it correct.
Consumer groups, ordering, the transactional outbox and why exactly-once is harder than it sounds. You split one feature out of a monolith without losing a single event.
A SQL parser, a planner and an executor with indexes and joins, built over your own storage. You run one query through every stage and can say exactly why the plan came out the way it did.
Sockets, proxies and replication, ending with Raft from the paper.
G6.1
Networks from a raw socket in Go
TCP, DNS, timeouts and connection pools, with the net package on one side of the screen and a packet capture on the other. For people who have only ever seen a network through an HTTP client.
Load balancing, health checks, retries, TLS termination and HTTP/2, in a proxy you write yourself. You put it in front of a real service and kill backends while the traffic keeps flowing.
Leaders, followers, quorums, clocks and what the word consistency actually promises, on a replicated store you can partition on purpose. You watch each guarantee hold, then watch it fail.
Leader election, log replication and snapshots, from the paper to a working key-value store, tested on a simulated network that drops, delays and reorders everything. You find out why the paper is so careful.
Safe defaults, auth and TLS, then attacking your own service.
G7.1
Secure Go from day one
Input validation, SQL injection, secrets, password hashing and safe defaults, built into a small service from the first commit. For people who have only thought about security after something went wrong.
Sessions, OAuth 2, OpenID Connect, where JWTs help and where they hurt, and permissions that stay readable as the rules grow. You secure one API for a browser and a mobile app at once.
[]string{"OAuth 2", "OIDC", "JWT", "Permissions"}
Level
Intermediate
Main tool
OAuth 2
Length
4 weeks
Price
£48.64
G7.3
TLS and cryptography in Go
The standard library's crypto packages, certificates, mutual TLS between services, and which primitives to reach for and which to leave alone. You run your own small certificate authority and rotate its keys without downtime.
Your own code, read the way an attacker reads it: SSRF, races as vulnerabilities, unsafe parsing and the supply chain, with govulncheck on the way. You break into a deliberately weak service, then close every hole you used.
Binaries, telemetry and Kubernetes: everything between git push and a service that stays up.
G8.1
Ship a Go binary
Static builds, cross-compiling, small container images, systemd and a CI pipeline, ending with your service on a real server. For people whose code has only ever run on their own machine.
Structured logs with slog, metrics and traces with OpenTelemetry, continuous profiling and alerts that mean something. You instrument a service until you can explain any slow request from the trace alone.
Probes, graceful shutdown, resource limits and what GOMEMLIMIT should be set to, then client-go and a small controller of your own. You run a rolling deploy under load and nobody sees an error.
Load shedding, connection pools, memory leaks, profiling in production, capacity planning and running an incident. You keep a service up through a simulated launch day, then write the postmortem.
Ownership, traits and lifetimes, down to unsafe and the memory model.
R1.1
Rust from the first line
Variables, enums, pattern matching, Cargo, and a first honest meeting with ownership, on a command-line tool you write yourself. For people who have never written Rust, or who bounced off it once.
Moves, borrows, lifetimes, Box, Rc, Arc and interior mutability, until the compiler's errors read like advice. You rewrite a design the borrow checker keeps refusing, and find out why it was right.
Traits, generics, iterators, error handling and the patterns the standard library uses. You design a small crate with an API that makes the wrong call fail to compile.
Raw pointers, allocation, unsafe contracts, undefined behaviour and the memory model. You build Vec and a small arena allocator from scratch, then run them under Miri until it has nothing left to say.
Threads, Send and Sync, async with Tokio, and how an executor works.
R2.1
Threads, Send and Sync
Threads, channels, Mutex and Arc, and the two marker traits that turn data races into compile errors. You write the program from our homepage, watch it fail to build, and then fix it three ways.
vec!["Threads", "Send", "Sync", "Channels"]
Level
Beginner
Main tool
Rust
Length
3 weeks
Price
£16.64
R2.2
Async Rust with Tokio
Tasks, select, channels, timeouts, and the rules that keep one blocking call from stalling everything. You build a small network service and watch it run in tokio-console.
Cancellation safety, streams, tower middleware, backpressure and graceful shutdown. You find the bug where a dropped future loses data, and design it out of the service for good.
Futures, Pin, wakers and a reactor on top of epoll: you write a working executor, then a small HTTP server on it, and test the hard parts with loom. Tokio stops being magic in about the fourth week.
vec!["Futures", "Pin", "Wakers", "loom"]
Level
Advanced
Main tool
Rust
Length
5 weeks
Price
£93.64
Rust · Testing
What the compiler can't check: integration, properties, fuzzing and simulation.
R3.1
Testing Rust from the first test
Unit tests, integration tests, doc tests and cargo-nextest, and what the type system means you no longer have to test. For people who have been trusting the compiler to do everything.
Real PostgreSQL in containers, sqlx test transactions, fakes behind traits and snapshot tests with insta. You delete the tests that were only testing the mocks.
vec!["sqlx", "Fakes", "insta", "Snapshots"]
Level
Intermediate
Main tool
Testcontainers
Length
3 weeks
Price
£42.64
R3.3
Property tests and fuzzing in Rust
proptest, cargo-fuzz and cargo-mutants, to catch the cases nobody thought to write down. A parser that never panics is harder to write than it looks, and you'll have one by the end.
Load tests, fault injection and deterministic simulation with turmoil, where a whole network of services runs inside one process. You reproduce a one-in-a-million bug on demand, then fix it.
axum, sqlx and tonic, with the compiler checking your queries, then your own storage engine.
R4.1
Your first Rust service
An HTTP API with axum, Tokio and serde: routing, extractors, validation and errors as types, with tests that call real handlers. For people who know a little Rust and want it to do a job.
sqlx and queries checked against a real database at compile time, connection pools, transactions and migrations. You change a column and let the compiler list every query you just broke.
Protobuf, tonic, streaming, deadlines and tower middleware, plus the schema changes a client you can't see will survive. You connect a Rust service to a Go one and evolve the contract between them.
A write-ahead log, a B-tree, memory-mapped files and crash recovery, built from an empty file with the type system guarding the invariants. You pull the plug mid-write and prove that nothing was lost.
vec!["WAL", "B-trees", "mmap", "Crash testing"]
Level
Advanced
Main tool
Rust
Length
5 weeks
Price
£105.64
Rust · Data
SQL, caches and streams, down to a vectorised query engine of your own.
R5.1
SQL for Rust developers
Tables, keys, joins, aggregates, transactions and schema design, written by hand in psql and then called from Rust. For people who know the borrow checker better than they know a query plan.
In-process caches with moka, Redis behind them, and the expiry, invalidation and stampede problems that come with both. You make a read-heavy endpoint an order of magnitude faster and keep it correct.
rdkafka and async-nats, consumer groups, ordering and the transactional outbox, with backpressure from Tokio to the broker. You move one feature onto a stream without losing a single event.
A SQL parser, a planner and a vectorised executor over Apache Arrow, with enough of DataFusion read along the way to see how the real thing does it. You run one query through every stage and profile each of them.
Sockets, proxies and replication, ending with Raft from the paper, guarded by types.
R6.1
Networks from a raw socket in Rust
TCP, DNS, timeouts and connection pools, with std::net on one side of the screen and a packet capture on the other. For people who know Rust and have only seen a network through a library.
vec!["TCP", "DNS", "Timeouts", "Packet capture"]
Level
Beginner
Main tool
std::net
Length
3 weeks
Price
£19.64
R6.2
Build a reverse proxy in Rust
hyper, rustls and Tokio, with load balancing, health checks, retries and HTTP/2, in a proxy you write yourself. You put it in front of a real service and kill backends while the traffic keeps flowing.
Leaders, followers, quorums, clocks and what the word consistency actually promises, with the states of each protocol written as types. You partition your own store and see which guarantees survive.
Leader election, log replication and snapshots, from the paper to a working key-value store, with the type system guarding the invariants and turmoil breaking the network. You find out why the paper is so careful.
vec!["Raft", "Consensus", "Snapshots", "turmoil"]
Level
Advanced
Main tool
Raft
Length
5 weeks
Price
£121.64
Rust · Security
What memory safety doesn't cover: auth, TLS, and attacking your own service.
R7.1
Secure Rust from day one
What memory safety covers and what it doesn't: input validation, injection, secrets and password hashing, built into a small service from the first commit. For people who assumed the compiler had this handled.
Sessions, OAuth 2, OpenID Connect, where JWTs help and where they hurt, and permissions encoded as types so a missing check won't compile. You secure one API for a browser and a mobile app at once.
rustls, certificates, mutual TLS between services, and which primitives to reach for and which to leave alone. You run your own small certificate authority and rotate its keys without downtime.
Your own code, read the way an attacker reads it: logic bugs, panics as denial of service, unsafe blocks and the supply chain, with cargo-audit and cargo-vet on the way. You break into a deliberately weak service, then close every hole you used.
Release builds, tracing and porting real services: everything after it compiles.
R8.1
Ship a Rust binary
Release profiles, static builds with musl, small images, cross-compiling, and CI that doesn't take twenty minutes. For people whose Rust has only ever run under cargo run.
The tracing crate, OpenTelemetry, metrics and tokio-console, and why a span in async code is harder than it looks. You instrument a service until any slow request explains itself.
Finding the part worth porting, measuring before you start, and moving traffic across one endpoint at a time. You replace one hot path in a running service and prove the gain, or prove there wasn't one.
Profiling with perf and flamegraphs, allocators, zero-copy parsing, load shedding and running an incident. You keep a service up through a simulated launch day, then write the postmortem.