
- Calculating space by Konrad Zuse (See: https://news.ycombinator.com/item?id=18325689)
- The Annotated Turing by Charles Petzlod
- Introduction to Lambda Calculus by H. Barendregt (do the exercises/proofs)
- Propositions as Types by Philip Wadler
- Part III. of Languages and Machines by Thomas Sudkamp
- "Introduction to the Theory of Computation" [Part I] by M. Sipser
- "Introduction to Compiler Design" by Torben A. Mogensen
- "An introduction to Formal Languages and Automata" by P. Linz
- "Languages and Machines" by Thomas A. Sudkamp
>Many of OP's objections come off as petty
I have had the book in my hands, I have turned the pages and seen the typesetting myself. It's not an exaggeration. It looks like one of those books written by a typewriter with some of the lines are misaligned, except it wasn't and that is overall a pain to parse. Also the pages are small and margins wide.
Why inflict that upon yourself when there are plenty of other books that show a modicum of effort in editing.
The author may be surprised to know that just because most of us CS majors will become programmers doesn't mean that we all want to take a "Programming" degree that would probably boil down to vocational training. There's nothing wrong with having vocational programming courses, but I don't know if universities are where they belong.
Secondly, there is a false dichotomy here between "programming" and "theoretical computer science." Theoretical computer science is merely a part (albeit an important one) of the field of computer science. There's also things like operating systems, databases, networking, graphics, and probably more. All these fields have overlaps with actual programming and theoretical computer science, but aren't solely in one or the other.
As an aside, I think the term "theoretical computer science" is often applied too broadly, since I wouldn't consider things like algorithms/data structures, AI methods like image recognition and data mining, and multiprocessing to be all that theoretical, since they don't require mathematical rigor to understand or produce useful results.
My Algorithms and Data Structures class didn't have much math at all. Complexity theory edit: and algorithm analysis did require brushing up on some summations and limits from calculus, but it was taught from a very practical perspective. My Languages and Machines class, ostensibly the most "theoretical" of all, has been my favorite class, and other than some basic digital logic it had no math at all. That's not to say it wasn't formal or rigorous; it just wasn't what I would consider purely theoretical.
The author claims that CS students don't plan to be computer scientists, but rather programmers. I am and will always be a computer scientist, and I will probably work as a programmer for most of my life. I see no contradiction or foolishness there.
The author implies that this gap between real-world skill and the related undergraduate program is unique to computer science, but certainly this is not the case.
My father is a high school History teacher. His degree is in History, not "High School History Teaching." Sure, many History majors probably go on to teach History. Sure, they probably learn way more "theoretical stuff" about the US Civil War or the Renaissance than would ever be covered in a high school class.
In re-reading the article, I'm now confused about exactly what the author is claiming or proposing. He says that CS programs are dumbing down the rigorous stuff because students want to learn modern programming, but he also complains about using "easier" programming languages. I'd like to interject and say that "easier" languages are probably easier because they're better for the task at hand. Language/compiler/interpreter design has come a long way and I have no problems with moving away from 40 year old languages and learning 20 or 10 year old languages. I don't think scientists or employers will be impressed at your ability to solve a problem in a difficult manner rather than an easy manner.
As for his argument that students hate the "theoretical" stuff and just want to learn to program, that's not true. I go to Missouri State University, not at all known for its CS department, and even students that don't do very well often list classes like Discrete Math or Languages and Machines as their favorite courses in the curriculum.
Is it "obvious" you can produce program Y that doesn't halt if program X halts? Do you understand one program can be taken as input string of another? If so, the Halting Problem proof in Sudkamp's Languages and Machines, my undergraduate text in the 90s, can indeed take just a page.