During my undergrad days as a student, and post-grad days, the one constant complaint students had, was that studying the theory of computation was just too hard. For those who don't know what the subject entails, here's a quick summary. The theory of computation studies the fundamentals of "computation"; that is to say, it is not about computers or how they work, their electronics, architecture etc., but instead on the fundamental mathematics that dictate what "computation" is, and what a "computer" can do. For instance, can a computer add two numbers? Ofcourse it can, but how do we prove that is can? The theory of computation can be used to demonstrate that given a question (with a "yes/no" answer), can a computer answer the question decisively? It is important for computer scientists and engineers to study the theory of computation, because studying it provides a foundation for understanding programming languages, how they function,