Morse, bar and QR codes, ISBN, blockchain hashes, and many more codes play important roles in numerous scientific disciplines and virtually all telecommunication systems. In practice, codes are used to efficiently insure reliable, secure, and private transmission and storage of information. In theory, codes are used to e.g., study computational complexity, design screening experiments, provide a bridge between statistical mechanics and information theory, and even help understand the (quantum) spacetime fabric of reality. One can also use codes for entertainment, e.g., to solve balance puzzles such as the penny weighing problem, or to design social (hat color) guessing-game strategies that significantly increase the odds of winning. This course covers fundamentals of coding theory and practice, as well as a selected number of more advanced topics. It is accessible to advanced undergraduate and graduate students in ECE, Math, and CS.