Learning path

Web development

Build from page structure and styling to typed application code.

  1. 1

    HTML

    Structure accessible web pages.

  2. 2
  3. 3

    JavaScript

    Add behavior to the web and build applications.

    JavaScript Variables

    Use const and let for values.

    JavaScript Functions

    Write reusable logic.

    JavaScript conditions and array loops

    Filter values with strict comparisons and accumulate a total.

    JavaScript map, filter, and reduce

    Build a transformation pipeline without mutating the source.

    JavaScript types, equality, and coercion

    Know the primitive types, why === is safer than ==, and which values count as false.

    JavaScript closures and scope

    Use a function that remembers its surrounding variables, and see why let fixes the classic loop bug.

    JavaScript destructuring, spread, and rest

    Unpack objects and arrays into variables, copy with spread, and collect arguments with rest.

    JavaScript string methods and regular expressions

    Split, pad, replace, and extract parts of text with strings and regular expressions.

    JavaScript promises, async, and await

    Write asynchronous code that reads like synchronous code, and handle errors with try and catch.

    JavaScript classes and private fields

    Protect instance state with a private class field.

    JavaScript inheritance and overriding

    Reuse initialization and specialize instance behavior.

    JavaScript prototypes and class inheritance

    See that classes are built on prototype chains, and extend one constructor from another.

    JavaScript private fields, getters, and static members

    Hide state with #private fields, expose it through a getter, and keep a counter on the class itself.

    JavaScript binary search

    Search a sorted numeric array with a shrinking interval.

    JavaScript Map and Set

    Count values and identify distinct entries.

    JavaScript linked lists and iterators

    Build a singly linked list class that can be looped over with for...of.

    JavaScript stacks and queues

    Use an array as a stack, and write a queue that does not shift the whole array on every removal.

    JavaScript sorting and the default sort pitfall

    Learn why [10, 9, 1].sort() is wrong, sort with comparators, and write a merge sort.

    JavaScript binary search trees with a generator

    Insert values, search, and produce the sorted order lazily with a recursive generator.

    JavaScript graphs: BFS, DFS, and path existence

    Store a graph as a Map of neighbour lists and search it breadth-first and depth-first.

    JavaScript: memoization trades memory for time

    Count the calls made by a naive recursive Fibonacci and a memoized one.

    JavaScript: counting the steps of binary search

    Show that searching a sorted array of 1000 items takes at most about ten comparisons.

    JavaScript: an index turns a scan into a lookup

    Compare scanning an array for a row with looking it up in a Map keyed by id.

    JavaScript: GROUP BY and HAVING with Map

    Total a column per group, keep the groups that pass a condition, and sort them.

    JavaScript: the event loop as a cooperative scheduler

    Predict the order in which synchronous code, nextTick, promises, and timers run in Node.js.

    JavaScript: LRU replacement with a Map

    Use Map's insertion order to evict the least recently used page and count page faults.

    JavaScript: an HTTP server and client on the loopback interface

    Start a Node.js HTTP server on a free port and request it with fetch to see status codes.

    JavaScript: a TCP echo server with the net module

    Send a line through a TCP socket and print the server's reply.

    JavaScript: unit tests with node:assert

    Write small tests with assertions, including checks that bad input throws the right error.

    JavaScript: the observer pattern with EventEmitter

    Let several listeners react to the same event without the emitter knowing about them.

    JavaScript: SHA-256 hashing and HMAC with node:crypto

    Hash a message, authenticate it with a secret key, and compare tags in constant time.

    JavaScript: storing passwords with scrypt and a salt

    Derive a memory-hard hash from a password and a random salt, then verify a login attempt.

    JavaScript: preventing XSS by escaping output

    Turn special HTML characters into entities so user text is shown as text, never run as markup.

    JavaScript: concurrency without parallelism

    See how async functions interleave on a single thread and finish together under Promise.all.

    JavaScript: real parallelism with worker threads

    Split an array between two worker threads and add their partial results.

    JavaScript: breadth-first search for the fewest steps

    Find a shortest path in an unweighted graph by exploring it layer by layer.

    JavaScript: constraint satisfaction by backtracking

    Color a map so that neighbouring regions differ, counting every valid coloring.

    JavaScript: querying facts stored as triples

    Represent knowledge as subject–predicate–object triples and answer queries with variables.

    JavaScript: proof by resolution refutation

    Show that a knowledge base entails a query by deriving a contradiction from the knowledge base plus the negated query.

    JavaScript: fitting a line with least squares

    Compute the slope, intercept, and R² of the best-fit line in closed form.

    JavaScript: a naive Bayes text classifier

    Classify short messages as spam or ham from word counts with Laplace smoothing.

    JavaScript: a forward pass through two dense layers

    Multiply by weight matrices, add biases, apply ReLU, and finish with softmax probabilities.

    JavaScript: checking a gradient numerically

    Compare a hand-derived gradient with a finite-difference estimate, the standard test for backpropagation code.

    JavaScript: RGBA pixel arrays and Uint8ClampedArray

    Convert pixels stored the way a canvas stores them to grayscale and see how clamping works.

    JavaScript: a sharpen filter and why clamping matters

    Apply a sharpening kernel to a step edge and see the overshoot clamped to the valid range.

  4. 4

    TypeScript

    JavaScript with static types for dependable code.

    TypeScript Types

    Describe values before runtime.

    TypeScript Union Types and Narrowing

    Accept more than one type and narrow it safely with typeof.

    TypeScript literal types and as const

    Build a union of allowed strings from an object or array and make switch statements exhaustive.

    TypeScript unknown and user-defined type guards

    Validate parsed JSON at run time and let the compiler trust the result only after the check.

    TypeScript tuples, readonly, and optional chaining

    Return fixed-shape pairs, protect arrays from change, and read nested optional values safely.

    TypeScript Interfaces

    Describe the shape of an object, including optional properties.

    TypeScript abstract classes and access modifiers

    Use private, protected, readonly, and abstract to describe what subclasses and outside code may do.

    TypeScript Generics

    Write one function that keeps the type of whatever it receives.

    TypeScript generic stack and queue

    Write containers that work for any element type and keep it checked.

    TypeScript generic binary search tree

    Order any type with a comparator function and collect the values in sorted order.

    TypeScript typed comparators and multi-key sorting

    Build comparators from a key with keyof, and combine them to sort by several fields.

    TypeScript: a typed memoize wrapper

    Cache the results of a pure function with a generic higher-order function and count how often the body runs.

    TypeScript: type-safe select, where, and orderBy

    Write small query helpers whose column names are checked by the compiler with keyof.

    TypeScript: a process lifecycle as a typed state machine

    Allow only legal transitions between process states and reject the rest.

    TypeScript: parsing a raw HTTP request into a typed object

    Split the request line, headers, and body of an HTTP/1.1 message and read a query parameter.

    TypeScript: explicit errors with a Result type

    Return success or failure as a value, and let the compiler force the caller to handle both.

    TypeScript: branded types for validated and escaped data

    Use the type system so that unvalidated text cannot be passed where a validated value is required.

    TypeScript: running async tasks with a concurrency limit

    Start at most N tasks at once, collect results in input order, and measure the peak concurrency.

    TypeScript: a generic breadth-first search solves the water-jug puzzle

    Write the search once for any state type and apply it to two jugs.

    TypeScript: propositional formulas as a discriminated union

    Represent formulas as trees, evaluate them for any assignment, and test for tautologies.

    TypeScript: precision, recall, and F1 from a confusion matrix

    Count true and false positives and negatives with a typed interface, then compute the metrics.

    TypeScript: composing neural-network layers behind an interface

    Build a small network from Dense and Sigmoid layers that share one Layer interface.

    TypeScript: a grayscale image class with threshold and flip

    Wrap a flat pixel buffer in a class that checks bounds and returns new images from its operations.