What Math Courses Should We Teach CS Students?
Coryoth asks: "If you're taking computer science then getting as much mathematics as you can is probably a good idea. Ultimately, however, there are only so many math courses you an squeeze in. Given that, what areas of mathematics should we be teaching CS students for maximum benefit? Traditionally university math courses are structured around the needs of the physical sciences and engineering, which means calculus is what gets offered. While a decent calculus course can teach a certain amount of formality in reasoning, wouldn't CS students be better served with a course in mathematical logic and foundations with its greater degree of formal reasoning and obvious connections to fundamental concepts in computer science? Are courses in abstract algebra and graph theory going to be useful to CS students? Should courses in category theory (yes, it applies to computer science) be required of students going on in theoretical computer science? In short — what areas of mathematics are going to be the most useful and most applicable to computer science students? What courses were of the most value to you?"
Whichever branch of maths you follow it encourages logical thought.
init 11 - for when you need that edge.
Well, perhaps because it has something with what I do, but I was surprised computational statistics isn't on that list. Perhaps it's the other way around, statisticians need to learn to program. Regardless there is quite a bit of overlap. This is also one of the few areas remaining where the speed of your program actually matters.
It has been statistically shown that helmets increase the risk of head injury.
probability (heavily skewed towards combinatorics), number theory, geometry (the plain euclidean one because this is really the best way to train a human brain for logic that's been found in the past few thousand years), calculus (of 1 and 2 variables... the rest is a waste of time unless you are specifically training programmers whose skills will be heavily computational in nature), linear algebra, and formal logic. Category theory (which is really just object-oriented math) could be familiarized with, but showing its applications would be more useful than going rigourously through proofs.
Any guest worker system is indistinguishable from indentured servitude.
Linear and Multilinear algebra
Logic (Philosophy) -> Discrete Math -> Discrete Math 2
Calculus 1 - 3
I would probably put those as the core of any good CompSci program.
(For the benefit of members of institutions with other sizes of courses: When I write "one course" below, I mean "1/40th of a standard Bachelor's degree".)
For students who just want to get a job as a programmer, I'd say that a first year course in discrete mathematics should be enough; it won't actually teach them anything by itself, but it will increase the odds of them understanding what the smart guy on their team is talking about when he says "this is a standard graph theory problem...".
For students who want to be that guy who tells the rest of the team how to solve problems, I'd suggest two discrete math courses, two calculus courses, a linear algebra course, and either a number theory course or a statistics course.
For students who want to actually do research in computer science: They're in the wrong department. The best preparation for graduate work in computer science is an undergraduate degree in mathematics. If they insist on getting their undergraduate degree in computer science, I'd recommend as an absolute minimum three calculus courses, two general discrete math courses, one linear algebra course, one course in number theory, two courses in statistics, one course in real analysis, one course in complex analysis, two courses in numerical analysis, one course in linear programming, one course in formal languages and automata, one course in graph theory, and one course in combinatorics. Depending upon the student's interests, I'd also recommend courses in group theory, galois theory, and coding theory.
Tarsnap: Online backups for the truly paranoid
being able to use asymtotic notation for bounds on algorithm running times, and a good basis in proofs in order to prove them once you've come up with something. Also solving recurences, and proving them is invaluable. There are some other things that are very usesfull on a day to day basis, like linear algebra (spesifically coding theroy), geometry, graph theroy, counting and probability (but thats more of an ai thing)
I was a math minor at Penn State, and I decided to concentrate on Stat because that is what interested me, but everyone is different. I would say that if you are interested mostly in "pure"(not pure!=better) CS, then courses like graph theory and combinatorics are probably best. If you are interested in applying your CS degree to problems in engineering and science, then differential equations and numerical analysis is your best bet. If you want to go into the business/actuarial side of things, statistics is obviously best. The most important thing is that you take a lot of math, and hopefully math that actually interests you.
Monstar L
As a current student majoring in both (CS-Math), I've found useful all of my Math courses to CS. I'd say that Analysis, and Measure Theory have helped too. :-) )
However, we should not forget that it's suposed to be a CS major, so I'd recommend as "priority" ones: Calculus (one-many variables), Linear Algebra, Probability, Statistics, Linear Optimization, Non-linear Optimization, Combinatorial Optimization, Numerical Analysis, Computational Complexity, Graph Theory and Information Theory. As subjects of further study I'd choose some Logic, Abstract Algebra, Functional Analysis, Set Theory and Category Theory.
It is important that a CS student could get as much Math as he/she can, because it helps to provide a useful mental framework for thinking, and because helps to get chances of right use of some mathematical tools.
As I see it, many engineering majors are as teaching a student to battle with some weapon, teach some mathematical tecniques related to the subject, and some practical things about the tecnique ("the weapon"). But learning as much as Math as you can, is like to learn how to use a swiss knife: if you know how to use it properly, sky is the limit (you can be a "science McGyver"
I think the first question you need to answer is why you're doing a CS degree in the first place. Personally, I don't see any point in them. It's not the best way to learn to program (how can you really learn Java in a lecture theatre? It just doesn't work. Just get a good reference book, find some good code to copy the syntax from, and work it out as you go along.), if you want to know the maths side of it, do a maths degree (picking courses that are useful for the job you have in mind - you might have to pick a uni accordingly), you'll understand it far better (doing a few courses in maths is much harder than doing lots, because so many parts of maths interlink). If you want to be a Systems Administrator, or something, then I can't see why you would need a degree at all, it's experience that counts in those kinds of jobs.
Can anyone name a job for which a CS degree is the best qualification?
...but generally I received much more maths than I've seen mentioned in other posts in my five years of university while studying CS (not in the US).
The biggest chunk of it all was 6 semesters of Analysis and 4 of numerical analysis.
I was also told that only two other professions get slightly more maths: "applied mathematicians" and physicists.
Am I wrong to assume that CS education is much more maths based in the EU than in the USA?
It takes a man to suffer ignorance and smile
Be yourself no matter what they say
Start by making sure you understand the distinction between Computer Science and its related disciplines, and that this is a CS course. Read the overview report from the ACM Curricula Recommendations..
It is apparent from the ACM's recommendations (amongst others) that a lot of mathematics traditionally covered at universities(such as calculus) is not strongly related to Computer Science. That said, there are many applications of computing that require strong skills in these areas (scientific computing and cryptography for example) so they are not a bad option.
Important numerical and logical fundamentals that support the learning and use of undergraduate Computer Science include:
i-name =twylite [http://public.xdi.org/=twylite], see idcommons.net
"Statistics" (2 semesters at least) and "experimental design". "Modeling and simulation" is closely related, but is somewhat covered if you take the stats and experimental design courses.
Here's why...
When starting on my PhD research, I pretty naively thought I'd just write a network simulator to try out my idea and to compare its performance to other network protocols. That would be fairly acceptable in today's CS climate, but STUPID.
People using simulators face a number of questions that they often don't ask, and therefore make their conclusions nearly meaningless. Are there specific hypotheses they're trying to test? How do they know they've performed enough simulation runs to draw conclusions at an acceptable confidence level? Exactly what is the distribution over which the inputs are randomized, and why was distribution chosen? To what extent is the model even validated (ok, this is more of a Modeling and Simulation issue than a stats issue)?
Psych and biology majors have been forced to rigorously answer these questions for a long time. We, the supposedly "mathematically superior" CS majors, have often ignored these details as though they're irrelevant. But if left un-tackled, we can produce crap research whose conclusions have little clear connection to reality. These is even true for when we can afford to do real-world tests and thus are less at the mercy of simulation model inaccuracies. How many real-world tests do we perform before we draw our conclusions? How do we randomize the inputs?
Much of today's network-related research sucks. Not because the ideas being generated are bad, but because the analysis of the new ideas and their comparison to the performance of pre-existing ideas is crap. Without taking stats and experimental design courses, even the reviewers of these papers don't realize that those weaknesses exist.
If you want your network research to be meaningful, test your ideas with meaningful experiments and analysis.
The CS students who make it through a lot of math often end up being better programmers. I'm not sure if that's a true statement, but it certainly seems to be true where I go to school. Calculus Calculus Calculus! So important! At least one semester of calc is necessary, but I would say if you can squeeze in multi variable calculus, you're good. Multi variable + Linear Algebra (matrix math) is really good. I would say the matrix math is much more important though. And discrete! Now, we actually have a class in our CS department that is our own little private discrete class, but I'm totally planning on taking the math department's discrete. Plus, my math department has this computer programming class for math majors. It's all logic problems. I'm taking that too. Statistics. Now, this one isn't as important because if you get the basic concept then you can just look stuff up, but consider it an easy A (hopefully). I am so glad I took AP Stat in high school. I have used information from that class in almost every class I have had here in college. In short, if you can fit in a math minor (or major), go for it. My CS department has you take 3 math courses, and then you only need 4 more for a minor.
For CS students, the fundamentals of discrete math and set theory are probably some of the most important. More focus on these in a CS context would be helpful to people such as myself who find math more interesting when it has a purpose. I did not mind the physics and statistical math courses. I could see the point behind them clearly. But doing math just for the sake of doing math never seem to have a purpose.
I only look human.
My mother is a halfling and my dad is an ogre, so that makes me an Ogreling
I recently graduated from NJIT with a BS in Computer Science and a minor in Applied Mathematics. The fundamental courses were 3 semesters of Calc(I/II/II). Probability & Statistics, Discrete Analysis, Differential Equations as per the engineering requirements and enforce formal thought (except maybe discrete, that is considerably more out of the box). One of the most important courses I took was Linear Algebra. Dealing with matrices is fundamental... but more to the point: anyone even considering graphic theory needs linear algebra. OpenGL models / graphing simulations rely heavily on constructing matrices and working with them to represent 3D images in a 2D world. Another class that provides some very deep insight is Numerical Methods. This study of mathematics requires some programming knowledge to automate error analysis (particularly the big question is always: You all have an answer to a set of problems, but just how accurate is your answer and within what bounds? 10^-6 ... 8?). The class also provides insight and formulas for detecting propogation of errors. Any computer scienctist is going to deal with computational math and at some point you will goto another research or a project lead and they will ask "are your results correct?"; You will comfortable with your results, given some background to know that they are correct.
I have a CS undergrad too. I had the same concerns about areas of weakness in the education I received.
I highly recommend the MIT Open Courseware and the Webcasts at Berkley.
Each provides a quite different approach to CS education. Just remember that you did not learn everything you will ever need to know in college. Hopefully your undergrad taught you how to learn new information quickly.
I only look human.
My mother is a halfling and my dad is an ogre, so that makes me an Ogreling
No, but there's a strong connection between onanism and the study of Computer Science.
Ron Graham was head of Math Research at AT&T Bell Labs back in the '80's. Knuth should need no introduction.
Concrete Mathematics
DMCA - Chilling free speech since 1998.
Proofs. Proofs. Proofs.
Algebra, geometry, calc, who cares. It's the Proofs that make math apply to Comp Sci. Having obscure formulas memorized means squat. But being able to look at a problem and break it down into the most simple of building blocks, that is a critical skill.
-Rick
"Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
The Discrete Cosine Transform would be a fantastic goal. DCT is used in MP3, JPEG, and MPEG compression (amongst others). The practical applications for lossy encoding are hardly difficult to see.
Such a discussion should probably replace vector calculus. I only used Groves/Stokes/Divergence/Gradients in a single course (EM Theory), and I've never had a practical application in my career. My Digital Image Processing class spent too much time on the Discrete Fourier Transform and dismissed the DCT with some hand-waving (and this after two years of pointless control and communication theory - when was the last time you used Vestigal Sideband Modulation?).
The math that should be taught in computer science should reflect the math used in computer science. DCT certainly qualifies, and a lot of the current curriculum(s) do not.
Maybe talking to the guy who maintains the PAQ compressor might also be good. That is interesting software.
SQLGuru is absolutely right. If you want to do graphics, or want to be a game programmer in general, you should absolutely study linear algebra.
I would also like to emphasize that as much as university programs tend to be focused on theory, it would be beneficial for the students to have some inkling of what the applications of these various branches of math are. I studied linear algebra in college, but I was forced to do an aggressive review of it, later in my career, because I had retained very little of it. Had I understood how important linear algebra was to 3D graphics, back when I was studying it, I'd have been much more excited about the topic, and would have retained the information better. Unfortunately, our program provided no context, whatsoever, for what we were learning, so we never really knew why we were studying it in the first place.