This review by Barbara M. Terhal discusses the formalism of qubit stabilizer and subsystem stabilizer codes and their potential use in protecting quantum information in a quantum memory. It covers the theory of fault tolerance and quantum error correction, various code constructions, general quantum error correction conditions, noise thresholds, the role of Clifford gates, and the route to fault-tolerant universal quantum computation. The review also focuses on two-dimensional (topological) codes, particularly the surface code architecture, discussing decoding complexity, passive or self-correcting quantum memories, and the complexity of decoding. The review aims to provide a comprehensive overview of quantum error correction techniques, emphasizing the practical aspects relevant to various quantum technologies.This review by Barbara M. Terhal discusses the formalism of qubit stabilizer and subsystem stabilizer codes and their potential use in protecting quantum information in a quantum memory. It covers the theory of fault tolerance and quantum error correction, various code constructions, general quantum error correction conditions, noise thresholds, the role of Clifford gates, and the route to fault-tolerant universal quantum computation. The review also focuses on two-dimensional (topological) codes, particularly the surface code architecture, discussing decoding complexity, passive or self-correcting quantum memories, and the complexity of decoding. The review aims to provide a comprehensive overview of quantum error correction techniques, emphasizing the practical aspects relevant to various quantum technologies.