  This chapter deals with the topic of designing reliable and efficient codes
for the storage and retrieval of large quantities of data over storage devices
that are prone to failure. For long, the traditional objective has been one of
ensuring reliability against data loss while minimizing storage overhead. More
recently, a third concern has surfaced, namely of the need to efficiently
recover from the failure of a single storage unit, corresponding to recovery
from the erasure of a single code symbol. We explain here, how coding theory
has evolved to tackle this fresh challenge.
