What Math do You Use?
e_lehman asks: "I've been associated with MIT's introductory 'Mathematics for Computer Science' course for a number of years. The course has emphasized different topics in different years: logical foundations, proofs, probability, combinatorics, etc. But this is at the whim of instructors. What mathematical topics should we be teaching to budding computer scientists? What mathematics do you actually use or need, working in the computer industry? Here are some candidates: boolean logic, graphs, number theory, combinatorics, proofs, set theory, relations and functions, approximation methods, solving recurrences, generating functions, analysis of state machines, asymptotic analysis, and addition of small integers."
A solid grounding in maths is always good. When pushed far enough it caus you to develop different thinking patterns that address problems in new ways. Which are always useful for any problems.
I believe that Computer Science != Software Engineering. The job I actually ended up in is a programming job, which means that not all the CS I had is relevant. But that is good - they aren't meant to be the same thing.
For instance, in CS, to calculate the time efficiency of some algorithm, some really hairy analysis may be needed to decide it's actually O(n log log n). This is important as a part of CS. What is important for CS is not defined by what is important for getting a programming job. The science is important for its own sake, as a branch of math.
That said, logic, sets, graphs, relations, discrete algebra - the "discrete stuff" so to say, is both what I like best and what I think is central to CS.
I believe posters are recognized by their sig. So I made one.
I think it's less about how much math you will use and more about how math changes the way you approach problems. Exposure to math teaches people to approach problems systematically and logically. You may think that you're never going to use matrices and eigenvalues in The Real World, but math classes are worth more than mere knowledge.
My dingo ate your honor student.
Their analysis, NFA to DFA transformation and the applicability of FSMs to most stateful problems
(protocols, lexical analysis, communications, etc.)
Use of graph representations for the analysis of many of the same problems mentioned above
Methods for modeling continuous phenomena discretly.
(Euler Integration, FEA, Meshing, etc.)
All these thing consistently make my job easier, more interesting and, continue to provide a level of insight to tricky problems (especially the first two) that exceeds simple 'programming'.
The two most under appreciated courses of all time in Computer Science education have to be the Theory of Computation (FSMs etc) and the Discrete Mathematics (Graphs, Numerical Analysis, etc). An alarming number of new graduates cannot phathom how to apply this stuff. It's powerful and once you start using it, you'll always see things a little bit more ''completely''.
Set theory is extremely important in "the real world", especially for developers who write in any kind of query language (and really, what developer hasn't had to do that at some point, think SQL, EJB-QL, etc).
If every developer had a formal background in set theory, I wouldn't see quite so many bad SELECT statements, misuse of joins, etc. Bad queries can be a huge bottleneck in a DB drive application.
If I had to pick something else, how about a brief (but mathematical) introduction to cryptography? Public key schemes are easy to learn, and very interesting to the average computer science student. We covered this in one of my first math courses in University, and it interested me enough that I went back to take the dedicated crypto course in later years. The knowledge I gained there has been very useful in settig up servers, evaluating products with crypto, etc.
A long time ago, in a galaxy far, far away ... I was admitted to the CS/SE honors program at the Univ of Houston. Had some of it paid for, but finances were not the issue - all Freshman honors students had a mandatory 6 hour 'kick your ass' English / History class designed to weed out the wannabes.
... but it was about -learning- those maths. Face it, Differential Equations, the higher layers of Statistics, the higher thought planes of Calculus - those are all some friggin'eh difficult concepts to grasp. DiffEQ is the Star Trek of math - all I remember about that was taking a very evil math equation and saying 'Ok, we morph this through the time-space continuum and in an alternate universe we use their math to solve an equivalent equation and then we bring it back to our universe by applying the Heisenburg principle ... voila - Solved!'
It worked. Neither English nor History were my strong suits and I wasn't about to subject myself to that kind of hammering when I felt that as a software engineer I should be focusing on other things. I didn't enroll at UofH and went to another University in Texas on a full ride scholarship. No 'freshman destroying' 6 hour English class required.
Perhaps all the math (more hours of math than the math major, as I recall) wasn't about -knowing- diff'eq, four semesters of Calculus, eight discrete maths, three semesters of statistics, etc
Think about it - in the event you actually do work for NASA or the NSA or whatever, do you want your group of peers made up of 6 week wonders with just enough MFC training to develop C code on Windows, or do you want a guy that can learn four chapters of advanced calculus in three weeks? Well I generally learned it overnight because I neglected the 'daily attendance' part of a few courses, but you catch my drift.
Right knowing that somebody got through college with their BS/CS under the Department of Engineering tells me that they do not know FEA (finite element analysis) but it also tells me that they can learn it in a few weeks. Ditto pretty much any language, or OS, or platform. It tells me that they can optimize a boolean expression in their head and if they don't know the answer to something they know where to find out.
Hard math in college is good - push em until they break. Then push em some more.
Glonoinha the MebiByte Slayer
Are you, perchance, a mathematician? Your answer seems to contain the classical mathematical assumption that analysis is the elixir of the gods from whence all other mathematics sprang forth.
Granted, in most university undergraduate programs we choose real analysis as the place to start teaching "real mathematics" (instead of: insert integral/matrix/etc., turn crank, get output)... but this does not, to me, make analysis intrinsically fundamental. Of course, if you're going to go on to learn things like general topology... then it *is* important... but I do not believe topology is a field of principal importance for computer scientists (yet...).
The fundamental problem with your assertion is that analysis deals with real numbers. Theoretical computer science is all about *discrete* sets. In fact, if you give me a computer with just a single register that can hold a real number... I can easily show that computer to be capable of computing non-computable (in the sense of the Church-Turing thesis) functions.
Studying real numbers simply doesn't make sense for computer scientists (at least to start) when the domain in which they will be working is inherently discrete.
I *heartily* agree that they should see:- Logic, How to set up proofs and Full induction. These are absolutely fundamental.
However, why teach them about real-valued functions? No computer, nor any reasonable model of computation, can work with real numbers... why take time to develop an inapplicable theory? What would be much more relevant would be to teach the theory of recursive functions... primitive recursion, total and partial recursive functions... *these* are directly applicable to the world of computation.
Personally, I see fundamental mathematics for computer scientists as being: set theory (preferably axiomatic), logic, combinatorics, some abstract algebra, recursive function theory, formal language theory, automata theory and formal semantics. I think those alone would overburden a modern cirriculum... but then I am of the mind that computer *science* is mathematics... as opposed to the vast majority of my colleauges who seem hell-bent on turning CS into a tradeschool for Visual Basic programmers.
Still, to be fair to you, I would be overjoyed to see Computer Science programs start requiring a course in analysis. Not so much for the content, but for the exposure to mathematical rigour... something which is sadly in extremely short supply in modern CS cirricula.
The most interesting course I've ever done is Quantum Computing.
A very interesting but very difficult course.
This has several goals/reasons: