Without effective and smart algorithms for data processing, there would be no data science revolution. The revolution in data storage and data transmission is an interdisciplinary journey where advances in physics and digital design are combined with innovations in coding and signal processing. In this course, students will learn coding theoretic techniques and apply them to modern applications, including digital communications, data storage, cloud storage, and distributed systems supporting machine learning. These techniques encompass fundamentals of finite fields, used in algebraic error-correction codes, message-passing algorithms, used in error-correction codes defined by graphs, and algorithms for lexicographic indexing, used to design constrained codes that mitigate damaging physical effects. Students will learn importance sampling, methods of analyzing iterative algorithms, such as density evolution and EXIT charts, as well as finite-state machines. These algorithms and methods are useful, not just in coding theory, but in many other fields.