For anyone with an interest in going a little deeper, in my opinion the best textbook on the subject is Sipser's Introduction to the Theory of Computation. It's truly introductory, so anyone who is smart enough to program will be able to follow, if they do the work.
[1] https://www.goodreads.com/en/book/show/400716