Language-agnostic: choose data structures, analyze time and space complexity, and reason about algorithm correctness. Use for nontrivial loops, recursion, graph algorithms, dynamic programming, boundary errors, and scaling tradeoffs. For measured speed and hardware profiling, use `performance-engineering`.