Math & Computer Science
I have always believed in a vital relationship between mathematics and computer science. In fact, my second blog post in 2003 is also entitled “Math and Computer Science” and points to several arguments for a more incorporation of mathematics in computer science.
This belief was strengthened by being introduced to Lisp as my first formally taught computer science course, Artificial Intelligence, at Columbia University, taken during my senior year at high school. While I was already exposed to other high-level languages and assembly, the pedagogical impact of learning Lisp first is development of the strong associations between mathematics and programming such as a value-centric approach to programming. It was clear, for example, that the notion of first-class functions could provide a more generic way of programming, not to mention other ideas such as code as data, metacircularity, universal data structures. These associations were heavily strengthened by my purchase of Mathematica and my formal introduction to Prolog and ML, and their underlying mathematical foundation.
I actually became attracted to C++, because it seem like C was being enriched with a way to program in a more mathematical, high-level way with the introduction of operator overloading and OOP, but with an eye to performance. Some of this sentiment can be attributed to Stroustroup’s quasi-academic exposition of the language in the C++ Reference Manual. I was still concerned that object-oriented mechanisms were deficient in its inability to express mathematical constructs such as set comprehensions or, more generally, a way to program using set theory, or alternatively to program in more logical style a la Prolog but without the limitations of Horn clauses and expensive searches. I wasn’t concerned as much with not be able to program in these alternate styles, as I was in the language’s inability to express mathematical notions.
At Harvard, reflecting my beliefs, I concentrated in applied math with emphasis in computer science (code words for majors and minors). I started out in computer science and applied math, but for procedural reasons and concerns that I was losing the math edge I had entering college, switched the two studies midstream—a decision I later regretted because the applied math requirements forced me to take courses outside computer science as a means of rounding out my mathematical toolset.
My knowledge in either computer science and mathematics is not as solid as I would like, as I have taken for effective half the number of courses in each discipline that a dedicated major would have taken. For instance, I audited courses in compilers and operating systems—normally two capstone CS courses--and read through the classic textbooks on the subjects, but I don’t have experience of completing projects, problem sets, and exams in those two areas.
On the other hand, some of my Applied Math courses could also fall under the Computer Science umbrella. Numerical Analysis deals with algorithms for problems of continuous mathematics. Abstract Algebra has a number of applications in in computer science such as cryptography and compression. For that course project, I wrote a full-fledged Mac application to solve the Rubik’s cube using group theory. It rendered the cube in 3d and showed all the rotations necessary to restore a cube; written using the Think Class Library framework and AppMaker designer, it was my first major application and I regret not release it as shareware.) My course in Operations Research dealt with topics like various optimization problems like linear programming, which make up Windows Solver Foundation.
Lately, I have been going through the course guides at Harvard and elsewhere to take an inventory of my knowledge set and proceed on a plan to study textbooks and online learning material from all of the missed courses in mathematics and computer science and related disciplines. Graduate courses are pedagogically efficient as the material tends to be more interesting while actively incorporating concepts introduced in undergraduate courses.
Theory and Practice
My appreciation of mathematics in computer science was heighted by the rich theoretical treatment of computer science at Harvard. Great differences in textbooks I have surveyed (e.g., compare the “Dragon” book to other compiler books) indicate that is not true in most other schools, but as I can attest from auditing a Computational Linguistics course at UCLA, is probably true for the top schools. The Harvard CS department philosophy is to not teach technology, because such knowledge is transient, changing rapidly, in favor of more theoretical knowledge that will last a lifetime. In one course, the stated aim was to allow students to read academic papers in the field. While I agree with both of the aims, I think a general understanding of an area, beyond existing practice, is important in appreciating and advancing the field, and is not easily acquirable outside the university.
Programming languages and technology are not taught in Harvard courses, but something learned primarily on one’s own with help from “section,” hosted by teaching assistants. I find the mindset that one needs to go to school to learn technology quite amusing, but this may be the unfortunate outcome of teaching technology rather than theory.
The philosophy reflects a Harvard’s general predisposition to theory. Harvard does not have an majors in accounting, medicine, law or business, because of their practical nature. Future accountants and business students take economics, law students take government and medical students take biochemistry. Perhaps that is the right focus as an astonishing ninety percent of Harvard students eventually attain a graduate degrees. Stanford, Harvard’s polar opposite on the West Coast, was founded with a more pragmatic orientation with a more open to teaching technology. Stanford has a course on using multimedia applications and another on CS 193P: “IPhone Application Programming,” (perhaps the P refers to a professional course), neither of which would ever be admitted at Harvard, but then I noticed that Harvard's statistics department is guilty in offering Statistics 135: “Statistical Computing Software.”
Dare Osabanjo invoked a quote from Djikstra, “that computer science is no more about computers than astronomy is about telescopes” in response to Coding Horror post on the need for a more relevant computer science curriculum, which doesn’t seem to appreciate the differences between a computer science and software engineering. I am not sure that some of the suggestions such as deployment and source control, belong in either program at a top school.
I tried to dispel misconceptions of a reader, who aspired to attend a top university for very mundane programming reasons. I told him that my “Theory of Computation” course didn’t reference actual computers until the last week in which a “random access Turing machine” make theory more relevant. “Data Structures and Algorithm” included no programming, but rather was heavy on problem sets to prove properties about algorithms. My programming languages course didn’t discuss any popular programming language, but various mathematical formalisms. Harvard’s database course probably doesn’t teach SQL, but will probably give you the mathematical foundations, such as relational calculus and transaction processing, to build a database management system in the abstract.
After the heavy theory in school and being acquainted with papers on proving programs, I was somewhat disheartened by the absence and even distrust of mathematics or an academic theory in my actual work experience. Data structures were mostly limited to hash tables, arrays and linked lists, and programming felt much more like “glue” code.
I lament that I focused a lot more time on learning technology than theory during college, as I have found that technological knowledge depreciates quickly but yet never catches up to theory, yet I benefited from having used expensive $10K workstations and products so that when personal computers became unconstrained, I still came out ahead. As I have started working on advanced projects in natural language and static analysis, I found that computer science theory actually have serious applications, initially in designing my algorithms, and later, in directly representing and manipulating mathematical operators in memory.