A conceptual introduction to the study of the intrinsic complexity of computational tasks. It will serve advanced undergraduate and graduate students, either as a textbook or for self-study. It provides explanations of the various sub-areas of complexity theory such as hardness amplification, pseudorandomness, and probabilistic proof systems