Modern distributed storage systems recently adopted erasure coding to reduce storage overheads. We show how network coding can surprisingly make the maintenance of such distributed erasure coded systems more efficient by orders of magnitude compared to standard Reed-Solomon codes. We survey the developing theory and practice of regenerating codes. Both lower bounds via information theoretic cut-set arguments and constructive techniques will be developed in a tutorial way. We will discuss recent implementations over Apache Hadoop Mapreduce and open research directions.