This course provides an introduction to the theory and practice of quantum computation. The course integrates the foundations of quantum computing with a hands-on coding approach to this emerging field. Topics covered include quantum mechanics to understand quantum computation, Quantum algorithms, Mathematical models of quantum computation, their relationships to each other, and to physical systems, Quantum cryptography and Quantum fault tolerance.