Learning path
Web development
Build from page structure and styling to typed application code.
- 1
HTML
Structure accessible web pages.
HTML Elements
Structure a document with semantic tags.
HTML Forms
Collect input with labelled form controls.
HTML Lists and Tables
Mark up lists and tabular data with the right elements.
HTML Links and Images
Connect pages and show pictures with alternative text.
HTML Semantic Page Layout
Describe the regions of a page with header, nav, main, article, aside, and footer.
HTML Accessibility Basics
Make pages usable with keyboards and screen readers through labels, alt text, and landmarks.
HTML Document Head and Metadata
Set the character encoding, viewport, title, description, and stylesheet for a page.
HTML Responsive Images and Media
Offer different image files for different screens and embed video with a fallback.
HTML Forms: GET versus POST
See what each form method sends over HTTP and when to use it.
HTML Safe Links, Embeds, and Content Security Policy
Limit what linked and embedded content can do with rel, sandbox, and a content security policy.
- 2
CSS
Style responsive web interfaces.
CSS Selectors
Choose elements and apply styles.
CSS Box Model
Understand content, padding, border, and margin.
CSS Flexbox
Lay out items in a row with spacing and alignment.
CSS Variables and Media Queries
Reuse values and adapt the layout to narrow screens.
CSS Specificity and the Cascade
Predict which rule wins when several rules match the same element.
CSS Grid Layout
Build a two-dimensional page layout with named areas and a responsive card grid.
CSS Transitions, Animations, and Reduced Motion
Animate state changes smoothly and respect users who prefer less motion.
CSS Units and Fluid Typography
Choose relative units and clamp() so text scales with the user's settings and the screen.
- 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
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.