Template

Software Engineer — Competency Roadmap

Work towards being a software engineer: understand what the role really asks for across programming, computer science foundations, systems, tooling and working in a team, and where I currently stand against it.

This roadmap charts the full technical landscape of modern software engineering, spanning foundational programming, computer science principles, system architecture, team collaboration, and industry hiring standards. You will progress through core disciplines and explore branches such as distributed systems and low-level development at a sustainable pace of roughly 10 hours per week. Completing this path will leave you with a comprehensive portfolio of tested, containerized services, custom data structure implementations, systems tools, and technical documentation, alongside an honest audit of your readiness for professional engineering roles.

By the end: You will be able to design, write, test, containerize, and deploy production-grade software applications, analyze algorithmic complexity, explain OS and networking fundamentals, and communicate technical trade-offs across the software engineering spectrum.

Starting levelBeginnerStyleBuilding things
10h / week12 phases37 tasks~223h total

This is the map — make this roadmap yours

It shows what this journey generally looks like. Tell Kaidoro your version of the goal and it builds the plan around where you are actually starting, what to do first, the hours you really have, and what you have already finished.

1

Programming Fundamentals & Algorithmic Thinking

Establish core programming fluency using Python. Learn variables, control flow, functions, and data manipulation by building interactive command-line programs.

  • Set up a local Python development environment
    ~3hLearn1 resource

    Every software engineer needs a reliable, isolated local development environment before writing code.

    You'll learn

    • Python Interpreter — the program that reads and executes Python code
    • VS Code — a lightweight, extensible source-code editor
    • Terminal Execution — running programs via command line interfaces

    Install Python 3 and configure a code editor such as Visual Studio Code. Verify that you can execute scripts from the terminal and configure a dedicated workspace directory for your exercises.

    Done when: You run a Python script from your terminal that outputs environment diagnostic details including your Python version and working directory.

    How to work through it

    1. Download and install Python 3.12 or newer
    2. Install Visual Studio Code and the official Python extension
    3. Create a directory named `workspace` on your machine
    4. Write a script named `verify_env.py` printing the Python version and current time
    5. Execute the script via the command line
  • Build a command-line expense tracker with data persistence
    ~6hBuild

    Writing a multi-feature CLI program reinforces data structures, loops, file I/O, and structured error handling.

    You'll learn

    • Data Collections — lists, tuples, dictionaries, and sets in Python
    • File I/O — reading and writing structured data to disk
    • Exception Handling — using try-except blocks to catch runtime errors

    Create a command-line interface (CLI) program that allows users to record, categorize, filter, and summarize expenses. Save and load all data to a local CSV or JSON file so information persists between runs.

    Done when: The CLI tool successfully adds records, calculates category totals, handles invalid user input gracefully, and persists data after terminating the program.

    How to work through it

    1. Define data structures using lists and dictionaries to represent expenses
    2. Implement helper functions for input validation and calculations
    3. Implement read and write operations using Python's `json` module
    4. Build an interactive menu loop supporting add, list, filter, and delete operations
    5. Handle common exceptions such as missing files or malformed entries
  • Implement an interactive text-based game engine
    ~7hBuild

    Building game loops develops mental models for state machines, program flow, and modular code separation.

    You'll learn

    • Modular Programming — splitting logic across distinct Python files
    • State Management — tracking and updating mutating program state
    • Game Loop Pattern — continuous execution cycles responding to inputs

    Design and build a modular text adventure or turn-based combat game that models state changes, inventory management, and entity interactions through structured functions and modules.

    Done when: The complete game runs start to finish without unhandled crashes, maintaining game state and saving progress to disk.

    How to work through it

    1. Draft the game state schema including player attributes and game map
    2. Separate game logic, display helpers, and state storage into distinct Python modules
    3. Implement the core game evaluation loop
    4. Add automated input simulation to test win and loss conditions
    5. Record a five-minute demonstration walk-through of the code and gameplay
2

Developer Tooling, Shell & Version Control

Master Unix shell commands, terminal navigation, and Git collaboration workflows. This phase can be studied concurrently with computer science fundamentals.

  • Navigate and automate tasks using the Bash terminal
    ~4hLearn1 resource

    The terminal is the primary interface for operating systems, cloud servers, and build pipelines.

    You'll learn

    • Standard Streams — stdin, stdout, and stderr data pipelines
    • Shell Scripting — automating multi-step command sequences
    • POSIX Permissions — read, write, and execute bits on Unix filesystems

    Learn essential command-line tools for file manipulation, text processing, piping, and environment variable configuration. Write a shell script to automate a routine workspace cleanup or file conversion task.

    Done when: You write and execute an executable .sh script that processes files using pipes, grep, and redirection without errors.

    How to work through it

    1. Practice core commands: `ls`, `cd`, `mkdir`, `rm`, `cp`, `mv`
    2. Learn stream redirection using `>`, `>>`, and pipes `|`
    3. Filter text streams using `grep`, `awk`, and `sed`
    4. Write a shell script containing conditional checks and loop constructs
    5. Make the script executable with `chmod +x` and run it
  • Manage version control workflows with Git and GitHub
    ~5hPractice1 resource

    Version control is mandatory for professional software development, enabling collaboration, rollback, and code review.

    You'll learn

    • Git Object Model — blobs, trees, commits, and refs
    • Branching Strategies — isolating feature development from mainline branches
    • Merge Conflicts — identifying and resolving conflicting textual diffs

    Initialize local repositories, track changes, resolve merge conflicts, and manage branches. Create a remote GitHub repository, push code, open a Pull Request, and practice rebasing.

    Done when: You have a GitHub repository containing multiple branches, a cleanly resolved merge conflict in Git history, and an open Pull Request with descriptive commit messages.

    How to work through it

    1. Configure global Git credentials (`user.name`, `user.email`)
    2. Initialize a repository and stage changes with atomic commits
    3. Create feature branches and merge them using both fast-forward and merge commits
    4. Deliberately introduce and resolve a merge conflict between two branches
    5. Push the repository to GitHub and create a Pull Request with markdown documentation
  • Publish an open-source template repository with Git hooks
    ~4hBuild

    Publishing polished repositories reinforces professional standard practices for open collaboration.

    You'll learn

    • Pre-commit Hooks — scripts that run automatically before a commit is recorded
    • Semantic Versioning — major.minor.patch version numbering standards
    • Open Source Standards — licenses, issue templates, and documentation

    Assemble a standardized project starter repository equipped with .gitignore, README.md, licensing, and pre-commit hooks that enforce formatting before commits.

    Done when: A published GitHub repository automatically runs lint checks upon local commit attempts and contains clear setup instructions in its README.

    How to work through it

    1. Configure a strict `.gitignore` for Python and common operating system files
    2. Write a comprehensive `README.md` following standard open-source conventions
    3. Install and configure `pre-commit` to run automated code formatting
    4. Verify that malformed commits are automatically intercepted and fixed
    5. Tag a `v1.0.0` release on GitHub
3

Data Structures & Algorithmic Analysis

Understand how data is stored, indexed, and retrieved efficiently. Build classical data structures from scratch and analyze their time and space complexity using Big-O notation.

  • Calculate and analyze computational complexity using Big-O
    ~4hLearn

    Big-O notation provides the universal vocabulary engineers use to reason about performance at scale.

    You'll learn

    • Asymptotic Analysis — measuring algorithm resource usage relative to input size
    • Space Complexity — total memory overhead allocated during execution
    • Binary Search — logarithmic time search on sorted collections

    Learn how to evaluate algorithms based on asymptotic time and space complexity. Analyze worst-case, average-case, and best-case scenarios across common operations such as linear search, binary search, and nested iteration.

    Done when: You complete a written complexity analysis of 10 code snippets correctly identifying their Big-O time and space bounds.

    How to work through it

    1. Study definitions for $O(1)$, $O(\log n)$, $O(n)$, $O(n \log n)$, and $O(n^2)$
    2. Analyze single loops, nested loops, and recursive calls for time complexity
    3. Identify auxiliary memory allocation to evaluate space complexity
    4. Document edge cases where worst-case and average-case diverge
    5. Review solutions against theoretical bounds
  • Build linked lists, stacks, and queues from scratch
    ~6hBuild

    Building basic pointer-based structures develops deep intuition for memory referencing and dynamic allocation.

    You'll learn

    • Nodes and References — manual memory linking between independent objects
    • Stack (LIFO) — Last-In First-Out structure for recursion and undo systems
    • Queue (FIFO) — First-In First-Out structure for job queues and buffering

    Implement singly and doubly linked lists, a LIFO stack, and a FIFO queue using pure Python classes without relying on built-in list primitives for underlying storage.

    Done when: All custom data structures pass an automated test suite verifying insertion, deletion, traversal, and boundary conditions (empty collection, single node).

    How to work through it

    1. Define a `Node` class storing values and reference pointers
    2. Implement singly linked list methods: `append`, `prepend`, `delete_value`, `find`
    3. Implement a doubly linked list with forward and backward traversal
    4. Implement stack and queue interfaces with $O(1)$ push/pop/enqueue/dequeue operations
    5. Write comprehensive assertions covering all edge operations
  • Implement a hash map with collision handling
    ~6hBuild

    Hash maps are the single most ubiquitous data structure in production engineering; knowing their internal trade-offs prevents major performance pitfalls.

    You'll learn

    • Hash Functions — deterministic mapping of arbitrary keys to integer indices
    • Collision Resolution — chaining vs open addressing strategies
    • Amortized Complexity — average performance over a sequence of resizing operations

    Write a custom hash table class from scratch that computes hash codes, handles collisions using separate chaining or open addressing, and dynamically resizes when load factor thresholds are reached.

    Done when: Your custom hash map stores, retrieves, and deletes 1,000 key-value pairs correctly, maintaining amortized $O(1)$ lookup performance.

    How to work through it

    1. Implement a hash code generator and modulo bucket-mapping index function
    2. Implement key-value pair insertion and collision resolution via linked bucket chains
    3. Implement lookup (`get`) and deletion (`remove`) operations with key-equality checks
    4. Calculate load factor and implement dynamic table doubling and re-hashing
    5. Benchmark lookup times against Python's native `dict`
  • Implement binary search trees, tree traversals, and graphs
    ~7hBuild

    Trees and graphs model hierarchal data, network routing, dependency graphs, and social networks.

    You'll learn

    • Binary Search Tree — ordered binary tree enabling logarithmic searches
    • Graph Traversal — systematic node exploration using BFS and DFS
    • Cycle Detection — identifying loops in directed and undirected graphs

    Construct a Binary Search Tree (BST) supporting insertion, deletion, and breadth-first / depth-first traversals (pre-order, in-order, post-order). Extend this to an adjacency-list graph representation with Breadth-First Search (BFS) and Depth-First Search (DFS).

    Done when: You produce a tested module that traverses tree and graph structures, calculating the shortest path between two nodes in an unweighted graph using BFS.

    How to work through it

    1. Create a `TreeNode` class and BST insertion/search methods
    2. Write recursive in-order, pre-order, and post-order traversal functions
    3. Construct a `Graph` class backed by an adjacency list dictionary
    4. Implement iterative BFS using a queue to find shortest paths
    5. Implement DFS using recursion and an explicit visited set to detect cycles
4

Computer Systems, Architecture & Operating Systems

Uncover the layer beneath high-level languages: how CPUs execute instructions, how operating systems manage virtual memory, and how processes coordinate.

  • Study CPU execution, memory hierarchy, and binary representation
    ~5hLearn

    Understanding memory layouts and cache locality demystifies high-performance computing and low-level debugging.

    You'll learn

    • Bitwise Operations — direct manipulation of individual bits in memory
    • Memory Hierarchy — speed vs capacity trade-offs from CPU registers to disk storage
    • Instruction Cycle — fetch, decode, and execute loop of modern processors

    Learn how data is represented in binary, hexadecimal, and two's complement. Understand the von Neumann architecture, registers, caches (L1/L2/L3), RAM, and the fetch-decode-execute cycle.

    Done when: You write a Python script that performs bitwise manipulations (masks, shifts, bitwise AND/OR/XOR) to pack and unpack integer flags into a single byte.

    How to work through it

    1. Study number systems: binary, octal, decimal, and hexadecimal conversions
    2. Learn bitwise operators: `&`, `|`, `^`, `~`, `<<`, `>>`
    3. Review CPU architecture: registers, program counter, and instruction pipeline
    4. Map out the memory hierarchy latency numbers (nanoseconds to milliseconds)
    5. Build a bitmask simulator that toggles permission flags within an 8-bit integer
  • Explore processes, threads, and memory allocation in C
    ~8hBuild

    High-level languages manage memory automatically; touching C exposes the reality of pointers, memory safety, and operating system calls.

    You'll learn

    • Pointers & Heap — direct memory addresses and dynamic runtime allocation
    • Stack vs Heap — automatic call stack frames vs dynamic heap allocations
    • Process Forking — OS kernel duplicating process execution contexts

    Write a small C program to observe the stack, heap, pointers, manual memory allocation (malloc/free), and process creation via fork(). Learn how the OS isolates processes through virtual memory.

    Done when: You compile and run a C program that forks a child process, manages dynamic heap memory without memory leaks (verified using Valgrind or compiler sanitizers), and prints memory addresses showing stack vs heap growth.

    How to work through it

    1. Install `gcc` or `clang` and write a basic `main.c` program
    2. Demonstrate pointer arithmetic and address-of (`&`) / dereference (`*`) operators
    3. Allocate an array dynamically with `malloc()` and release it with `free()`
    4. Use `fork()` to spawn a child process and synchronize termination with `wait()`
    5. Inspect memory allocations with address sanitizers
  • Build a multi-threaded producer-consumer task queue
    ~6hBuild

    Concurrency is fundamental to modern backend servers, background workers, and asynchronous programming.

    You'll learn

    • Race Conditions — non-deterministic bugs caused by unsynchronized concurrent access
    • Mutex / Locks — mutual exclusion mechanisms to protect critical sections
    • Deadlocks — conditions where multiple threads block indefinitely waiting for resources

    Construct a concurrent task worker pool in Python or C using threads, mutex locks, condition variables, or thread-safe queues. Safely process shared work without data races or deadlocks.

    Done when: Multiple worker threads process tasks from a shared bounded buffer without race conditions, verified by deterministic final state counters.

    How to work through it

    1. Demonstrate a data race condition by mutating a shared variable across threads without locks
    2. Introduce a Mutex (`threading.Lock`) to serialize access to the critical section
    3. Implement a Producer-Consumer pattern using a synchronized queue
    4. Handle thread shutdown signals cleanly
    5. Benchmark throughput differences between single-threaded and multi-threaded runs
5

Networking, Protocols & the Web Lifecycle

Understand how computers communicate across networks. Learn the OSI and TCP/IP models, DNS resolution, HTTP/HTTPS, and low-level socket programming.

  • Map out the OSI model, TCP/IP stack, and DNS lookup flow
    ~5hLearn

    Every distributed service and web application relies on network protocols; diagnosing latency or downtime requires understanding these layers.

    You'll learn

    • TCP vs UDP — trade-offs between reliability/ordering and speed
    • DNS Resolution — hierarchical domain name translation to IP addresses
    • TLS Handshake — cryptographic protocol securing encrypted HTTPS communication

    Study how packets travel across network layers: Physical, Data Link, Network (IP), Transport (TCP/UDP), and Application (HTTP/DNS). Trace every network step that occurs when entering a URL in a browser.

    Done when: You produce a written network trace document explaining ARP, DNS lookup, TCP 3-way handshake, TLS negotiation, and HTTP request/response lifecycles.

    How to work through it

    1. Learn IP addressing, subnetting, and packet routing fundamentals
    2. Compare TCP (connection-oriented, reliable) vs UDP (connectionless, fast)
    3. Trace a DNS lookup using CLI tools (`dig`, `nslookup`, `traceroute`)
    4. Diagram the TCP 3-way handshake (SYN, SYN-ACK, ACK) and connection teardown
    5. Document the complete request lifecycle from browser keypress to page render
  • Build a custom multi-client TCP chat server using raw sockets
    ~6hBuild

    Writing raw socket code removes the magic from high-level web frameworks by demonstrating how byte streams are managed over network interfaces.

    You'll learn

    • Socket API — operating system interface for network communication endpoints
    • Packet Framing — delimiting byte streams into discrete application messages
    • I/O Multiplexing — handling hundreds of network connections with `select` or `epoll`

    Implement a low-level TCP server using native socket libraries that accepts multiple client connections concurrently, broadcasts messages, and handles sudden client disconnections gracefully.

    Done when: Three simultaneous terminal clients can connect to your server, send messages to each other in real-time, and disconnect without crashing the server.

    How to work through it

    1. Create a TCP socket, bind it to an IP and port, and listen for connections
    2. Handle multiple incoming connections using non-blocking I/O (`select`) or threading
    3. Implement a message protocol framing text into delimited byte packets
    4. Broadcast received messages to all other connected client sockets
    5. Test abnormal disconnections and close socket file descriptors cleanly
  • Build a minimalist HTTP/1.1 web server from scratch
    ~6hBuild

    Building an HTTP server exposes how HTTP methods, headers, status codes, and body payloads function at the byte level.

    You'll learn

    • HTTP Protocol — stateless client-server application layer protocol
    • MIME Types — header-specified media formatting for web assets
    • HTTP Status Codes — standard response groups: 2xx (Success), 4xx (Client), 5xx (Server)

    Write a pure socket-based HTTP server that parses raw HTTP GET and POST request strings, handles routing, serves static HTML files, and responds with valid HTTP status codes and headers.

    Done when: A web browser can load an HTML page and submit a form served directly by your raw socket HTTP server, returning correct 200 OK, 404 Not Found, and 400 Bad Request headers.

    How to work through it

    1. Parse the HTTP request line (Method, URI, Protocol Version)
    2. Parse key-value HTTP headers and handle Content-Length for request bodies
    3. Implement file system reading to serve static HTML and CSS files with correct MIME types
    4. Format RFC-compliant HTTP response strings including status codes and headers
    5. Test the server using `curl -v` to inspect exact request and response headers
6

Databases & Data Persistence

Learn how data is modeled, stored, indexed, and retrieved. Master relational database design with PostgreSQL, SQL queries, normalization, transactions, and indexing.

  • Design a normalized relational schema in PostgreSQL
    ~5hBuild1 resource

    Relational modeling is the backbone of business logic in the vast majority of software companies.

    You'll learn

    • Database Normalization — organizing relational fields to minimize data redundancy
    • Foreign Key Constraints — database-enforced relational integrity rules
    • SQL Migrations — version-controlled scripts describing schema alterations

    Install PostgreSQL and design a multi-table database schema adhering to 3rd Normal Form (3NF) for an e-commerce or booking platform, using foreign keys, constraints, and timestamps.

    Done when: Your database schema executes cleanly from an SQL migration file, enforcing entity relationships and constraints across at least four interrelated tables.

    How to work through it

    1. Install PostgreSQL locally and connect via `psql` or a graphical client like DBeaver
    2. Design tables: `users`, `products`, `orders`, and `order_items`
    3. Apply constraints: `PRIMARY KEY`, `FOREIGN KEY`, `NOT NULL`, and `UNIQUE`
    4. Enforce referential integrity using `ON DELETE CASCADE` or `RESTRICT` rules
    5. Write a repeatable `.sql` migration script that builds and seeds the schema
  • Write complex analytical SQL queries and aggregations
    ~5hPractice

    Software engineers must frequently extract and transform data directly within the database layer rather than processing everything in application memory.

    You'll learn

    • SQL Joins — combining rows from two or more tables based on related columns
    • Window Functions — performing calculations across a set of table rows related to the current row
    • Common Table Expressions — temporary named result sets for structuring complex queries

    Master SQL querying techniques: multiple JOIN types (INNER, LEFT, RIGHT), GROUP BY, aggregate functions (COUNT, SUM, AVG), subqueries, and Window Functions.

    Done when: You write a suite of 8 SQL queries that accurately calculate business metrics such as month-over-month revenue growth, running user totals, and top-spending customers.

    How to work through it

    1. Write multi-table `INNER JOIN` and `LEFT JOIN` queries
    2. Group records with `GROUP BY` and filter aggregated groups with `HAVING`
    3. Write Common Table Expressions (CTEs) using `WITH` statements for readability
    4. Implement window functions using `OVER (PARTITION BY ... ORDER BY ...)`
    5. Verify query results against known seed data calculations
  • Optimize queries using B-Tree indexes and EXPLAIN ANALYZE
    ~5hPractice

    Understanding index structures and query execution plans is critical for scaling databases under heavy read loads.

    You'll learn

    • B-Tree Indexing — balanced tree data structures enabling $O(\log n)$ disk lookups
    • Query Planner — database engine component that determines optimal execution strategies
    • Sequential vs Index Scan — full table scans versus indexed pointer lookups

    Generate a database with 100,000 synthetic rows. Use EXPLAIN ANALYZE to inspect query execution plans, identify sequential table scans, and create targeted B-Tree indexes to optimize lookup times.

    Done when: You demonstrate a query whose execution time drops by at least 90% (shifting from a Sequential Scan to an Index Scan) supported by before-and-after EXPLAIN ANALYZE execution plans.

    How to work through it

    1. Generate 100,000 synthetic records using SQL `generate_series()`
    2. Run a filtering query without indexes and record execution time with `EXPLAIN ANALYZE`
    3. Analyze the output: cost estimates, execution time, and scan types (Seq Scan vs Index Scan)
    4. Create single-column and composite B-Tree indexes
    5. Re-run `EXPLAIN ANALYZE` and document the query planner's optimization
  • Implement ACID transactions and concurrency control
    ~6hBuild

    ACID compliance ensures financial and mission-critical data remains correct despite hardware crashes or simultaneous writes.

    You'll learn

    • ACID Guarantees — database reliability guarantees under concurrent execution and failures
    • Transaction Isolation Levels — Read Committed, Repeatable Read, Serializable
    • Pessimistic Locking — locking rows explicitly to prevent concurrent mutations

    Write a banking or inventory transfer routine that utilizes explicit SQL transactions (BEGIN, COMMIT, ROLLBACK) and investigate isolation levels and row-level locking (SELECT ... FOR UPDATE).

    Done when: A concurrent transfer script prevents negative account balances and race conditions when two concurrent processes attempt to debit the same account simultaneously.

    How to work through it

    1. Review ACID properties: Atomicity, Consistency, Isolation, and Durability
    2. Write a funds transfer script wrapped in an explicit transaction block
    3. Simulate an error mid-transaction and verify that all operations are rolled back completely
    4. Simulate concurrent debit attempts using Python threads or multiple terminal sessions
    5. Apply row-level locking (`FOR UPDATE`) to serialize access to balance rows
7

Software Design, Testing & Engineering Practices

Move beyond writing scripts to building maintainable, robust software. Master Object-Oriented and Functional design principles, automated unit/integration testing, and CI pipelines.

  • Apply SOLID principles and modular design patterns
    ~6hBuild

    Writing decoupled code enables teams to change, test, and scale codebases without triggering cascading breakages.

    You'll learn

    • SOLID Principles — fundamental guidelines for maintainable object-oriented software
    • Dependency Injection — passing dependencies into objects rather than hardcoding them
    • Strategy Pattern — behavioral pattern enabling algorithms to be selected at runtime

    Refactor a monolithic script into a clean, modular architecture applying SOLID design principles (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) and factory or strategy patterns.

    Done when: The refactored codebase decouples business logic from external dependencies (such as notifications or database calls) using interfaces or abstract base classes.

    How to work through it

    1. Identify tightly coupled dependencies and responsibilities in a legacy codebase
    2. Extract distinct responsibilities into dedicated classes and modules
    3. Implement the Strategy Pattern to swap algorithms or behaviors at runtime
    4. Use Dependency Injection to pass database or service clients into consumers
    5. Verify that adding a new feature requires no modifications to existing core classes
  • Build a comprehensive unit and integration test suite with pytest
    ~6hPractice1 resource

    Automated testing is what gives engineers the confidence to refactor code, deploy rapidly, and avoid regressions.

    You'll learn

    • Unit vs Integration Testing — testing isolated logic units versus coordinated subsystems
    • Test Fixtures — standardized, repeatable context environments for running test suites
    • Mocking & Stubbing — replacing external services with deterministic test doubles

    Write automated tests using pytest. Implement unit tests with mocking for external dependencies, parametrized tests for boundary scenarios, and integration tests connecting to a test database.

    Done when: You run a test suite achieving over 85% branch coverage that mocks network calls and uses fixtures for isolated database testing.

    How to work through it

    1. Install `pytest`, `pytest-cov`, and `pytest-mock`
    2. Write unit tests with explicit assertions checking expected outputs and raised exceptions
    3. Use `@pytest.mark.parametrize` to test multiple inputs and boundary conditions in one test
    4. Create reusable test fixtures with setup and teardown phases
    5. Mock external network API requests using `unittest.mock`
    6. Generate an HTML coverage report and inspect untested code branches
  • Set up an automated Continuous Integration (CI) pipeline on GitHub Actions
    ~4hBuild

    CI guarantees that broken code or style violations are intercepted automatically before being merged into production branches.

    You'll learn

    • Continuous Integration — automated building, testing, and linting of shared code
    • GitHub Actions — workflow automation directly integrated into GitHub repositories
    • Build Matrix — executing CI jobs concurrently across multiple runtime environments

    Write a GitHub Actions workflow .github/workflows/ci.yml that automatically lints, formats, and executes your test suite on every branch push and pull request.

    Done when: A Pull Request on GitHub triggers the CI pipeline, runs linters (e.g., flake8 or ruff) and test suites across multiple Python versions, and reports a passing green checkmark.

    How to work through it

    1. Create `.github/workflows/ci.yml` in your repository
    2. Configure triggers for `push` and `pull_request` on the `main` branch
    3. Define job steps: checkout code, set up Python environment, install dependencies
    4. Add linting and formatting steps using `ruff` and `black`
    5. Execute `pytest` with coverage reporting and enforce a zero-failure exit code
8

Web Applications, APIs & Containerization

Construct production-ready backend web APIs using modern frameworks (FastAPI), implement authentication and middleware, and package applications inside Docker containers.

  • Build a RESTful API with FastAPI and PostgreSQL
    ~7hBuild1 resource

    REST APIs are the standard communication layer connecting user interfaces, mobile apps, and microservices.

    You'll learn

    • REST Architecture — Representational State Transfer constraints and HTTP verb semantics
    • Pydantic Validation — runtime data parsing, type enforcement, and serialization
    • ORM (Object-Relational Mapping) — mapping database rows directly to application objects

    Develop a backend REST API using FastAPI and SQLAlchemy (or SQLModel). Implement full CRUD endpoints, request validation using Pydantic, pagination, and automated OpenAPI documentation.

    Done when: The API successfully creates, reads, updates, filters, and deletes database records through valid HTTP requests, returning standardized JSON payloads and status codes.

    How to work through it

    1. Install FastAPI, Uvicorn, and SQLAlchemy
    2. Define Pydantic request and response validation schemas
    3. Implement ORM database models mapping to PostgreSQL tables
    4. Build CRUD route handlers with path parameters, query parameters, and request bodies
    5. Verify interactive API documentation automatically generated at `/docs`
  • Implement JWT authentication, password hashing, and role-based access
    ~6hBuild

    Security and access control are critical requirements for any software system handling user information.

    You'll learn

    • Password Hashing — one-way cryptographic salting and hashing algorithms
    • JSON Web Tokens (JWT) — stateless signed tokens for client authentication
    • Role-Based Access Control (RBAC) — restricting resource access based on assigned user roles

    Secure your API by implementing user registration, secure password hashing (bcrypt/argon2), JSON Web Token (JWT) generation, and authentication middleware protecting private endpoints.

    Done when: An unauthenticated request to a protected endpoint receives 401 Unauthorized, while a valid JWT bearer token allows access and identifies the authenticated user.

    How to work through it

    1. Hash user passwords using `passlib` / `bcrypt` before database storage
    2. Build a `/login` endpoint that validates credentials and issues signed JWT tokens
    3. Create a FastAPI dependency to decode and validate JWT tokens from Authorization headers
    4. Attach user identity to the request context
    5. Implement role-based authorization checks (e.g., admin vs regular user)
  • Containerize the application and database with Docker and Docker Compose
    ~6hBuild1 resource

    Containers eliminate 'works on my machine' bugs by standardizing dependencies, runtimes, and system libraries.

    You'll learn

    • Docker Images & Containers — lightweight, isolated execution packages for applications
    • Docker Compose — tool for defining and running multi-container Docker environments
    • Multi-stage Builds — optimizing container image size and separating build from runtime

    Write a multi-stage Dockerfile to containerize your FastAPI service and a docker-compose.yml file to orchestrate both the application and PostgreSQL database with persistent volume storage.

    Done when: Running docker compose up starts both the database and the API service on a fresh machine with all migrations applied and endpoints accessible.

    How to work through it

    1. Write a `.dockerignore` file excluding virtual environments and cache files
    2. Write a multi-stage `Dockerfile` minimizing final image size and running as a non-root user
    3. Create a `docker-compose.yml` linking the API service and PostgreSQL container
    4. Configure Docker named volumes to persist database storage across container restarts
    5. Test container networking and verify healthcheck configurations
9

Distributed Systems, Caching & Cloud Infrastructure

Scale systems beyond a single server. Learn caching with Redis, asynchronous background processing with message queues, horizontal scaling, and cloud deployment.

  • Implement caching and rate-limiting using Redis
    ~5hBuild

    In-memory caching is the primary strategy used to scale high-traffic backend applications under heavy read volume.

    You'll learn

    • In-Memory Data Store — ultra-fast sub-millisecond RAM-based key-value storage
    • Cache-Aside Pattern — application reads from cache first, populating on miss
    • Cache Invalidation — strategies for keeping cached data consistent with the source of truth

    Integrate Redis into your backend API. Implement the Cache-Aside pattern for expensive database queries and build a token-bucket or sliding-window rate limiter to protect endpoints from abuse.

    Done when: Cached endpoints return responses under 5ms without querying the primary database, and excessive requests from a single client receive 429 Too Many Requests.

    How to work through it

    1. Add a Redis container to your Docker Compose environment
    2. Implement the Cache-Aside pattern with explicit Time-To-Live (TTL) expiration
    3. Implement cache invalidation logic upon data updates or deletions
    4. Build a rate-limiting middleware using Redis atomic counters (`INCR`, `EXPIRE`)
    5. Measure latency improvements using `curl` or a benchmarking tool like `wrk`
  • Build an asynchronous background worker pipeline with Celery or RabbitMQ
    ~7hBuild

    Long-running tasks must be processed asynchronously to avoid tying up HTTP server threads and causing client timeouts.

    You'll learn

    • Message Broker — intermediary system translating and routing messages between services
    • Asynchronous Task Processing — offloading heavy computational workloads from web servers
    • Dead Letter Queue — holding failed messages for inspection and retries

    Decouple heavy tasks (such as report generation, email sending, or image processing) from the synchronous HTTP request-response cycle using an asynchronous task queue and message broker.

    Done when: The API accepts an image or file upload, returns an immediate 202 Accepted response with a job ID, processes the file in a background worker, and updates the task status upon completion.

    How to work through it

    1. Configure RabbitMQ or Redis as a message broker in Docker Compose
    2. Set up Celery or an async task worker script to consume jobs from a queue
    3. Create API endpoints to dispatch background jobs and return a tracking UUID
    4. Implement worker task logic with retry policies and dead-letter handling
    5. Build a status endpoint allowing clients to poll job progress
  • Deploy a containerized application to a cloud platform
    ~6hBuild

    Shipping software to real cloud infrastructure bridges the gap between local development and production engineering.

    You'll learn

    • Cloud Infrastructure — compute, storage, and networking services hosted off-premises
    • Secret Management — securing API keys and database credentials in production environments
    • Production Health Checks — automated probes checking container readiness and liveness

    Deploy your multi-container application to a cloud provider (e.g., Render, Fly.io, AWS ECS, or DigitalOcean). Configure environment variables, managed database connections, TLS certificates, and domain routing.

    Done when: Your application is publicly accessible over HTTPS on the public internet, successfully persisting data to a managed cloud database.

    How to work through it

    1. Provision a cloud server or container service instance
    2. Provision a managed cloud PostgreSQL database instance
    3. Configure secure production environment variables and secrets
    4. Deploy the Docker container image to the cloud host
    5. Verify automated TLS encryption and live endpoint functionality
10

Specialization Branches (Frontend, Low-Level & Systems)

Explore the major engineering branches off the shared core. Gain practical exposure to modern frontend frameworks and compiled low-level systems programming to discover your areas of interest.

  • Build a reactive single-page frontend application with React or Vue
    ~8hBuild1 resource

    Full-stack literacy enables engineers to build complete end-to-end features and collaborate effectively with frontend specialists.

    You'll learn

    • Component Lifecycle & Virtual DOM — UI rendering and reactive state updates
    • TypeScript — static type checking for JavaScript applications
    • SPA Routing — handling client-side navigation without page reloads

    Construct a responsive Single Page Application (SPA) using React or Vue and TypeScript that consumes your backend REST API, managing component state, user authentication tokens, and asynchronous API calls.

    Done when: The web UI enables users to log in, view paginated data from your backend API, create new records with client-side validation, and handle error states visually.

    How to work through it

    1. Scaffold a modern frontend project with Vite and TypeScript
    2. Build UI components with modular props and state management (`useState`, `useEffect`)
    3. Integrate an HTTP client (Axios or Fetch) with authentication token interceptors
    4. Implement client-side routing and protected routes
    5. Handle loading spinners, error alerts, and form validation states
  • Build a binary file parser or CLI utility in Rust or Go
    ~8hBuild1 resource

    Experiencing compiled, statically typed systems languages broadens your perspective beyond interpreted runtimes and demonstrates memory-safe concurrency.

    You'll learn

    • Static Compilation — transforming source code into standalone machine-executable binaries
    • Memory Safety Models — Rust's ownership/borrow checker vs Go's garbage collection
    • Binary Parsing — reading and interpreting structured raw byte streams directly

    Explore compiled systems programming by writing a high-performance CLI utility in Rust or Go that parses a binary file format (e.g., PNG, WAV, or custom binary protocol) and extracts embedded metadata.

    Done when: The compiled native binary parses valid input files in milliseconds and outputs structured metadata with robust error handling on corrupted binary inputs.

    How to work through it

    1. Install Rust (`rustup` / `cargo`) or Go (`go`)
    2. Learn basic syntax, structs, and error handling patterns (`Result`/`Option` or `error` returns)
    3. Read raw binary byte buffers from a file on disk
    4. Parse binary headers, magic numbers, and chunked byte offsets
    5. Compile an optimized release binary and benchmark execution speed
11

Professional Engineering & Team Workflows

Master the collaborative practices used in professional engineering teams: technical documentation, code reviews, observability, structured debugging, and postmortems.

  • Write a Technical Design Document (RFC) for a major system feature
    ~5hApply

    Senior engineers solve problems in writing before writing code; design documents align teams on trade-offs and prevent costly architectural mistakes.

    You'll learn

    • RFC Process — Request for Comments methodology for architectural decision-making
    • Trade-off Analysis — systematically weighing performance, simplicity, cost, and time
    • System Architecture Diagramming — visual communication of system boundaries and components

    Draft a structured Request for Comments (RFC) or Technical Design Document (TDD) detailing the architecture, schema changes, failure modes, trade-offs, and rollout plan for a complex feature.

    Done when: You complete a comprehensive 3-5 page design document following standard industry templates (Context, Goals, Non-Goals, Proposed Architecture, Trade-Offs, Security, Rollout Plan).

    How to work through it

    1. Define the problem statement, business goals, and explicit non-goals
    2. Diagram the proposed architecture and data flow
    3. Specify database schema alterations and API contract changes
    4. Analyze alternate approaches and justify why they were rejected
    5. Document risk mitigation, monitoring strategies, and rollback plans
  • Implement structured logging, metrics, and application observability
    ~5hBuild

    When production applications fail, observability (logs, metrics, traces) is the only way engineers can determine what went wrong.

    You'll learn

    • Structured Logging — machine-parseable log formatting (JSON) for log aggregators
    • Correlation IDs — unique identifiers passed across service boundaries to trace requests
    • Application Metrics — counters, gauges, and histograms tracking real-time health

    Add structured JSON logging, distributed correlation IDs, and Prometheus metrics to your backend API. View logs and metrics to monitor application performance and diagnose simulated errors.

    Done when: Every API request outputs a structured JSON log containing a unique request trace ID, duration, and status code, with request count metrics exposed on a /metrics endpoint.

    How to work through it

    1. Replace standard print statements with a structured JSON logging library
    2. Implement middleware that attaches a unique `X-Request-ID` to all incoming requests and logs
    3. Instrument route handlers to track HTTP request counts and latency histograms
    4. Expose an endpoint formatted for Prometheus metrics scraping
    5. Simulate unhandled exceptions and trace the error using only log output
  • Conduct a collaborative code review and write an incident postmortem
    ~4hApply

    Software engineering is a team sport; peer review and post-incident learning are fundamental to team health and system stability.

    You'll learn

    • Code Review Etiquette — delivering actionable, constructive feedback during peer review
    • Blameless Postmortems — analyzing failures to improve systems without assigning personal fault
    • Root Cause Analysis — techniques for diagnosing underlying systemic failures

    Perform a thorough, constructive code review on an open-source pull request or peer submission. Then, simulate an outage scenario and author an egoless, blameless postmortem document.

    Done when: You have submitted a line-by-line constructive code review identifying edge cases or style issues, and completed a blameless postmortem analyzing a simulated incident's timeline, root cause, and action items.

    How to work through it

    1. Review a substantial pull request checking for logic bugs, security risks, and test coverage
    2. Provide empathetic, actionable feedback with code suggestions
    3. Simulate a production incident (e.g., database connection pool exhaustion)
    4. Draft a timeline of detection, response, mitigation, and resolution
    5. Identify the systemic root cause using the '5 Whys' technique and define preventive action items
12

Technical Evaluation, Gap Analysis & Capstone

Synthesize everything you have built. Complete an end-to-end full-stack capstone project, conduct a rigorous gap analysis against real job descriptions, and prepare for industry technical evaluations.

  • Build and deploy a full-stack production capstone project
    ~15hBuild

    A single comprehensive, well-tested, deployed application is the strongest demonstrable evidence of software engineering competency.

    You'll learn

    • End-to-End System Integration — connecting UI, API, database, cache, and background workers
    • Production Deployment — configuring live hosting, DNS, and environment secrets
    • Project Presentation — documenting system design and setup clearly for technical reviewers

    Design, build, test, and deploy a complete web application integrating a frontend SPA, containerized backend API, PostgreSQL database, Redis caching, CI/CD pipeline, and comprehensive documentation.

    Done when: The full-stack project is live on the internet, backed by a public GitHub repository with >80% test coverage, a passing CI build badge, and an architecture diagram in the README.

    How to work through it

    1. Draft a design RFC outlining features, database models, and API endpoints
    2. Develop backend API endpoints with comprehensive automated test suites
    3. Build a responsive frontend UI consuming the API endpoints
    4. Configure Docker containerization and automated GitHub Actions CI pipeline
    5. Deploy the application to cloud hosting and verify production monitoring
  • Practice technical problem solving and algorithm whiteboard drills
    ~12hPractice1 resource

    Algorithmic coding assessments remain a standard evaluation method across tech industry hiring pipelines.

    You'll learn

    • Pattern Recognition — mapping novel problem statements to known algorithmic paradigms
    • Technical Communication — articulating algorithmic trade-offs clearly under timed conditions
    • Edge Case Identification — systematically checking boundary limits and potential overflow

    Solve 30 data structure and algorithm problems across key patterns (Two Pointers, Sliding Window, Fast/Slow Pointers, Tree BFS/DFS, Binary Search, Dynamic Programming) communicating your reasoning aloud.

    Done when: You solve and explain the optimal time and space complexity for 30 distinct algorithmic challenges without consulting solutions before completing your implementation.

    How to work through it

    1. Study pattern recognition across array, string, hash map, and pointer problems
    2. Practice explaining your thought process out loud before writing code
    3. Implement brute-force solutions first, then optimize time/space complexity
    4. Test boundary conditions manually (empty inputs, single elements, duplicates)
    5. Log problem patterns and review mistaken assumptions
  • Perform a software engineering role competency audit and gap analysis
    ~4hApply

    An honest audit clarifies what you can prove today, removes guesswork about employer expectations, and directs your continuous learning.

    You'll learn

    • Market Gap Analysis — mapping personal demonstrable skills against current industry demand
    • Portfolio Evaluation — auditing project codebases from the perspective of a hiring manager
    • Continuous Professional Development — structuring self-directed learning for long-term career growth

    Collect 10 real job descriptions for entry-level and mid-level software engineering roles across your target market. Evaluate your portfolio, demonstrable skills, and conceptual knowledge against their requirements to identify concrete remaining gaps.

    Done when: You produce a completed gap-analysis matrix comparing your portfolio artifacts and technical proficiency against 10 real job postings, with prioritized next steps.

    How to work through it

    1. Gather 10 job descriptions across companies of different sizes (startups, mid-sized, enterprise)
    2. Extract common technical requirements (languages, frameworks, databases, cloud tools)
    3. Match your completed projects against each requirement to verify demonstrable proof
    4. Identify recurring unaddressed technologies (e.g., GraphQL, specific cloud services)
    5. Formulate a prioritized 3-month continuous learning plan targeting your identified gaps

How the plan fits together

12 phases in 6 stages. Anything on the same row can be worked on at the same time, and 2 of them can start straight away.

An arrow points from a phase to the work it unlocks: before starting any phase, every phase with an arrow into it has to be finished first.

STARTSTAGE 2STAGE 3STAGE 4STAGE 5STAGE 61Programming Fundamentals &Algorithmic Thinking3 tasks · ~16h2Developer Tooling, Shell &Version Control3 tasks · ~13h3Data Structures &Algorithmic Analysis4 tasks · ~23h4Computer Systems,Architecture & OperatingSystems3 tasks · ~19h5Networking, Protocols &the Web Lifecycle3 tasks · ~17h6Databases & DataPersistence4 tasks · ~21h7Software Design, Testing &Engineering Practices3 tasks · ~16h8Web Applications, APIs &Containerization3 tasks · ~19h9Distributed Systems,Caching & CloudInfrastructure3 tasks · ~18h10Specialization Branches(Frontend, Low-Level &Systems)2 tasks · ~16h11Professional Engineering &Team Workflows3 tasks · ~14h12Technical Evaluation, GapAnalysis & Capstone3 tasks · ~31h
Solid arrow
Must be finished before the phase it points to
Dashed arrow
Same rule, but the prerequisite sits more than one stage back

Resources

21 in this plan's library, beyond the links on individual tasks.

Learning & Reference

Foundational computer science books, documentation, and reference materials.

  • Algorithms, Part I

    Use this resource to learn foundational data structures, sorting algorithms, and rigorous Big-O complexity analysis.

    coursera.org · Princeton University via Coursera · Online course · Free · Intermediate

  • Automate the Boring Stuff with Python

    Practical introduction to Python syntax and writing useful scripts to build early momentum.

    automatetheboringstuff.com · Al Sweigart / No Starch Press · Book · Free online version · Beginner

  • Beej's Guide to Network Programming: Using Internet Sockets

    Use this practical guide to learn low-level socket programming and client-server communication over IPv4/IPv6, TCP, and UDP.

    beej.us · Brian "Beej Jorgensen" Hall · Book · Free online · Intermediate

  • CS50’s Introduction to Programming with Python (CS50P)

    Use this course for a disciplined foundation in Python syntax, control flow, functions, loops, and data structures through problem sets.

    cs50.harvard.edu · Harvard University via Harvard Online and edX · Online course · Free to audit · Beginner

  • Designing Data-Intensive Applications

    Use this definitive reference to master distributed data systems, replication, partitioning, transactions, and consensus.

    oreilly.com · O'Reilly Media · Book · Paid · Advanced

  • FastAPI Official Documentation

    Production-grade documentation for building asynchronous APIs, dependency injection, and data validation.

    fastapi.tiangolo.com · Sebastián Ramírez · Documentation · Free · Intermediate

  • FastAPI Tutorial and User Guide

    Use this official guide to learn how to build asynchronous REST APIs, validate schemas, manage authentication, and containerize applications.

    fastapi.tiangolo.com · FastAPI Documentation Project · Documentation · Free · Intermediate

  • Google Engineering Practices Documentation

    Industry-standard reference detailing how to conduct thorough and constructive code reviews.

    google.github.io · Google · Guide · Free · Intermediate

  • Open Data Structures

    Comprehensive, open-source reference for classic data structures and algorithmic complexity.

    opendatastructures.org · Pat Morin · Textbook · Free · Intermediate

  • Operating Systems: Three Easy Pieces (OSTEP)

    Use this text to understand core OS concepts across virtualization, concurrency, and persistence.

    pages.cs.wisc.edu · University of Wisconsin–Madison · Book · Free online · Intermediate to Advanced

  • Refactoring.Guru

    Visual breakdowns of Design Patterns and refactoring techniques to write maintainable code.

    refactoring.guru · Refactoring.Guru · Reference Guide · Free web reference (paid expanded course) · Intermediate

  • Site Reliability Engineering: How Google Runs Production Systems

    Use this resource to learn industry-proven patterns for incident management, blameless postmortems, observability, and operating production systems at scale.

    sre.google · O'Reilly Media and Google · Book · Free online · Intermediate to Advanced

  • Software Engineering at Google: Lessons Learned from Programming Over Time

    Use this book to explore maintainable software design, automated testing strategies, CI pipelines, and engineering practices for long-lived codebases.

    abseil.io · O'Reilly Media and Google via Abseil.io · Book · Free online · Intermediate to Advanced

  • Tech Interview Handbook

    Use this resource to evaluate technical readiness, address knowledge gaps, and prepare systematically for coding and system design interviews.

    techinterviewhandbook.org · Yangshun Tay · Guide · Free · Intermediate

  • The Architecture of Open Source Applications (AOSA)

    Use this multi-volume collection to study how experienced engineers design and structure real-world open-source software systems.

    aosabook.org · Amy Brown and Greg Wilson · Book series · Free online · Advanced

  • The Missing Semester of Your CS Education

    Use this curriculum to master practical developer tools often omitted from standard CS programs, such as shell mastery, terminal multiplexing, and Git workflows.

    missing.csail.mit.edu · MIT CSAIL · Online course · Free · Intermediate

  • The Rust Programming Language

    Use this comprehensive official guide to learn systems programming, strict type systems, and memory safety without a garbage collector.

    doc.rust-lang.org · No Starch Press and the Rust Community · Book · Free online · Intermediate to Advanced

  • Use The Index, Luke!

    Use this guide to understand relational database indexing, SQL execution plans, B-trees, and query optimization from a developer perspective.

    use-the-index-luke.com · Markus Winand · Book · Free · Intermediate

Open Source & Codebases

High-quality public repositories to study for design patterns and architecture.

  • Build Your Own X

    Use this curated list of tutorials to deeply understand core technologies by building databases, shells, Git, and Docker from scratch.

    github.com · CodeCrafters · GitHub repository · Free · Intermediate to Advanced

  • HTTPie CLI Source Code

    Excellent example of a production-quality Python CLI application with robust architecture and automated tests.

    github.com · HTTPie · Codebase · Free · Intermediate to Advanced

Engineering Communities

Developer forums, local user groups, and technical discords.

  • Lobste.rs

    Use this community forum to follow technical discussions and link aggregations covering systems programming, language design, and computer architecture.

    lobste.rs · Lobsters community · Online forum · Free · All levels