  Active quantum error correction using qubit stabilizer codes has emerged as a
promising, but experimentally challenging, engineering program for building a
universal quantum computer. In this review we consider the formalism of qubit
stabilizer and subsystem stabilizer codes and their possible use in protecting
quantum information in a quantum memory. We review the theory of
fault-tolerance and quantum error-correction, discuss examples of various codes
and code constructions, the general quantum error correction conditions, the
noise threshold, the special role played by Clifford gates and the route
towards fault-tolerant universal quantum computation. The second part of the
review is focused on providing an overview of quantum error correction using
two-dimensional (topological) codes, in particular the surface code
architecture. We discuss the complexity of decoding and the notion of passive
or self-correcting quantum memories. The review does not focus on a particular
technology but discusses topics that will be relevant for various quantum
technologies.
