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?"
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
Yep I find that most CS majors I've worked with the last couple of years lack a solid understanding of statistics in general. IMHO this is a very important skill.
The danger of not teaching it is that most guys that need it in their professional life think they are very smart, start using it and suffer from the "sourcer's apprentice syndrome".
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.
Actually, I didn't learn how to code in my CS classes. That was expected knowledge. Yes, CS doesn't teach coding here, instead they expect you to know how to write code and why x=x+5 isn't completely insane.
What I did get taught was how to write good code. How to make use of binary trees and how to optimize algorithms. How to plan software projects and what problems to expect. How to plan, lay down and manage a network.
As a low level SysAdmin, you certainly won't need a degree to figure out a subnet mask for a single router lan. But networks don't simply scale, they tend to get very tricky and complicated as soon as you have a few layers of routing between them. Not to mention that you won't be able to even plan such a network sensibly if you don't know the theory behind it, how to streamline it and what happens "inside". And yes, that's where the math comes in.
A good university education will give you a heavy dose of theory. And while you won't be able to apply this directly, you will know WHY something works, not just how. And, more important, when it stops working you'll have a clue why it did. And you'll have a plan how to fix it, or at the very least, you'll know where to look.
We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
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
I am VP of software development at a software company. I hire a lot of recent graduates (and am always looking for more good talent).
What I look for as a starting point is a solid understanding of how programs work, and enough programming experience that I am not teaching the basics. Experience with both lower level languages (C++) and higher level languages (Java, VB, etc) is required just to get past HR. Also, knowledge of the context (networks, operating systems, databases) is required.The above just gets you to the point that HR will really read your resume, and possibly pass it on to me. Once I get a resume, I assume those skills are present. What I look for are things that are more intangible.
The graduates that can show these traits are very likely to be hired. Those that don't, won't. Some of these characteristics can be taught in formal courses, others have more to do with personal development and maturity. Specific languages can be taught to the right person very quickly. A solid background in math is also essential (Algebra, Statistics and Calculus) but I have yet to use n-dimensional calculus in non-cartesian space for practical business applications.
I would say that it depends on the focus of the student.
Graphics programming - Linear Algebra (matrix math) would be invaluable
Business application programming - plain old Algebra and maybe some statistics
Engineering apps - physics / calculus, stats
Compression programming - linear algebra, "new math"
etc.
When I was in college (90 to 94) at an engineering school, my CS degree required Calculus through the third one (because it was in the Engineering department) and statistics (because otherwise, noone in their right mind would ever take statistics) and an elective "math" the your advisor would point you towards based on what type of work you were interested in doing. I think this approach has worked out well for me.
Layne
I'm not quite sure how you're planning to teach statistics in any meaningful way without using calculus.
You're right that professional mathematicians, depending on their field of course, don't need much calculus. For instance, group theory is pretty hot now, and it doesn't involve calculus, unless you're studying some algebraic properties of something involving calculus. Graph theory doesn't involve calculus really. But statistics certainly does involve calculus, unless you're planning to teach a quite naive form of statistics. A naive stat will involve necessary weaknesses which will quickly begin to be exploited by newspaper studies, just as a complete lack of statistical knowledge is exploited now.
My own field, physics, is the same way. You can teach algebra-based physics, but it is much harder to learn than cal based physics, and you can't do nearly as much with it.
SIGSEGV caught, terminating
wait... not that kind of sig.
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.
I took software engineering at my school. There was a lot of math courses. Calculus 1 and 2, Discrete and Logic 1 and 2, Algebra 1, and Statistics. I also took Algebra 2 as an elective. This doesn't even include math heavy courses like Vector Mechanics, Chemistry, Physics, Elec. Eng., Economics, and others. I think all this math helped out a lot. Not only in math heavy computer related courses like Graphics and robotics, but also in my day-to-day programming needs. Logic and Algebra are probably the most useful, but that's just me, I'm sure others would find calculus invaluable, even though I don't think I've ever used it.
Anthropic principle: We see the universe the way it is because if it were different we would not be here to see it.
A "naive" statistics course is indeed more valuable than none at all. I took a stats course for psychology majors that replaced the calculus with lookup tables. I didn't really get the math involved until later, when I took calculus, but in the meantime, I was able to interpret statistics, understand key concepts, and tell when I was being lied to with numbers.
That said, a "naive" stats course is more valuable to creating a good citizen than to building a foundation for success in computer science.
Let's make something clear, here: You're not hiring computer scientists. You're hiring developers. The two sets share members, but they are not one and the same thing. It should come as no surprise at all, I suppose, that /. folks never know the difference.
Ultimately your influence (and other industry folks like you) moves the direction of undergraduate computer science departments and education in a direction that is absolutely orthogonal to where it should be going.
"practical business applications" have zero to do with computer science.