Secure Design
Most security vulnerabilities follow predictable structural patterns: programs that use raw input directly, data models that allow values that make no real-world sense, safety checks that disappear during refactoring, and race conditions caused by mutable shared state. This course teaches four defensive design principles -- Parse Untrusted Data, Make Unsafe State Unrepresentable, Make Unsafe Behaviour Impossible, and Immutable Branching -- that address these patterns at the design level. Each principle gives you a concrete technique for structuring code so that whole classes of vulnerability become impossible to express, not just unlikely to occur. No prior security background is required; every concept is taught through code examples in Java, Python, and TypeScript.