This course constitutes an introduction to theory of computation and basics of complexity theory. It discusses the basic theoretical models of computing (finite automata, Turing machines), as well as, provides a solid and mathematically precise understanding of their fundamental capabilities and limitations.