The basic principles of block codes are presented with illustrations to visualize the concepts of vector spaces and subspaces. Intuitive explanations of goals, capabilities, and limitations of codes are offered. An important subclass of block codes called cyclic codes is examined. Their algebraic structure is described and looked at the very popular BCH and R-S cyclic codes. In addition, the newest techniques, turbo codes and LDPC codes, that use iterative decoding to obtain performance exceedingly close to theoretical limitations.