Before you start this course, make sure you’ve read and followed all of the instructions in the prep document. This will get you set up and explain how to work through the projects.

Remember: you can always Google or ask for help if you get stuck.


This course is structured into self-contained projects that you can work through at your own pace.

Each project has its own directory with a file that has instructions. If you want to take a look at one way of completing an exercise, there’s some code waiting on a branch prefixed impl/ (short for “implementation”) and an associated Pull Request for you to look at. Try not to copy!

Most exercises finish with a list of optional extension tasks. It’s highly recommended that you try them out. Note that often the extensions are open-ended and under-specified - make sure to think about them with a curious mind: Why are they useful? What trade-offs do they have?

  1. Output and Error Handling
    An introduction to how to handle errors in Go, and how to present information to users of programs run on the command line.
  2. CLI & Files
    An introduction to building things with Go by replicating the unix tools cat and ls.
  3. File Parsing
    Practice parsing different formats of files, both standard and custom.
  4. Servers & HTTP requests
    Learn about long-running processes, HTTP and curl
  5. Servers & Databases
    Build a server that takes data from a database and serves it in json format
  6. Multiple Servers
    Build and run file & API servers behind nginx in a simple multi-server architecture
  7. Docker & Cloud Deployment
    Use containers to reproducibly deploy applications into the cloud
  8. gRPC
    Learn about RPCs and how they differ from REST, and start thinking about observability
  9. Batch Processing
    Build an image processing pipeline with cloud storage
  10. Buggy App
    Run, debug, and fix a buggy application
  11. Memcache
    Explore sharding and replication of state
  12. Kafka Cron
    Build a distributed multi-server application handling variable load, with Kafka as a task queue
  13. RAFT and OTel
    Build a complex distributed system for with strong consistency, and instrument it with tracing