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.
Personally, I found a great deal of education in my oenology courses. Well, they weren't really courses. Or at school. Mostly at home with friends.
But to get back to your question, I don't find any of the math that I took applicable to any of the work I do. I don't write 3D software, music synthesizer software, or calculate missile trajectories, so all that math is lost on me. The most applicable mathy CS thing I learned was covered in an hour regarding big O notation. Along with a good course on data structures, that has been the most beneficial thing I can say I learned.
But that is besides the point. What you do in the real world doesn't necessarily have to be relevant when choosing curriculums (curriculi? curricula?)
Give them the works! Everything from Calc through Topo and everything in between. Not all of them are going to grow up to be rocket scientists, but so what? The more knowledge you give these kids the better. I'm not saying you need to wipe them out or flunk them out or even use the math as a weeding tool, just that what you want to do is give them the tools to look at other sciences and not be befuddled.
There's nothing worse than a CS graduate that doesn't have a full grasp of math.
Enough Said.
Seriously, what useful work ever gets done without mathematics? Maybe pushing bulk data around into and out of databases, but who other than a C-grade CS student in a third world outsource farm is interested in doing that?
About the word "if": If bullfrogs had wings, they wouldn't bounce around on their little green butts.
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 hope someone besides me tries to answer this question.
Which courses you take absolutely matter and who cares what learning besides math has helped you; that wasn't what the dear reader is asking us.
That which has helped me the most is Discrete Structures, which wasn't even offered as a math class, but as a CSE class.
This is more on the course style rather than content.
I took EE/CS courses at Southampton Uni (UK). The staff were always trying to make the Maths courses more accessible and were very open to feedback.
However they could never win; the years they offered structured courses, the student feedback demanded self-paced courses (i.e. less lectures.)
Of course, those years they offered self-paced courses, many students struggled (i.e. were lazy - like me) and requested - more structure!
Statistics is the only maths course that I wish had been treated with more care in my CS degree, and in my Software Engineering related job(s) it's the one that I have had the most use and need of. Whether it's relevant for "pure" CS I have no idea, but would suppose that proper understanding and use of statistics is relevant for all science and engineering disciplines.
Adding to that, though it's not exactly maths or CS as such, a better understanding of economics and the practical economic or accounting mechanisms and tools used in business and life would come in handy.
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?
Intelligent Design!
PUN Complete!
-- 'The' Lord and Master Bitman On High, Master Of All
...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
In relation to computer science, I got a huge boost from linear algebra, probability & statistics, and a very discrete level of calculus material like riemann sums, taylor/maclaren series, root-finding algorithms (newton's method), etc. I also found that taking a logic course was very beneficial. It was from a philosophy standpoint, but was mathematical in nature, and boolean algebra was developed out of it after all. My uni also has a discrete math course which covered things like the fundamental theorem of arithmetic, set theory, counting laws, graph theory, and some other things useful in comp sci.
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
I'm not a Computer Scientist- I'm an EE- and I may be biased towards the engineering type courses, but I think some digital signal processing type courses would be incredibly useful (beyond just engineers). Of course, there are a whole bunch of prerequisites, including calculus, differential equations, signals, and probability/stochastic processes. Not every CS major is going to be working on making new OSes- there has to be some application processing going on, and if you are working on data derived from meatspace, DSP and all the prerequisites are vital.
There are lots of electrical engineers forced into programming because the Computer Science guys just don't have the math background- and what we often end up with is pretty poorly done code because the coursework behind the engineering degree is lots of math and relatively little code. What I'd really like to see is a combination of better code and better systems to run that code.
Depends totally on what direction you're planning on taking.
If you want to go onto grad school, double major in math and take everything you can. Electives and even core requirements probably have heavy overlap. It tends to be one of the easiest combinations in terms of course load. Also consider testing out a fall semester grad class or two in your senior year. These will probably look a lot like math classes. If you can't hack an undergrad math degree, odds are very good that the graduate CS program will kill you.
I have to confess that I have limited experience in computer science myself, but I've seen a couple uses for various areas of mathematics.
I was doing an optimization problem where I was trying to find the maximal distance apart of two points on a given surface along the surface itself. To begin with, in these kinds of optimization problems you want to know when you've found the answer and what kind of accuracy you have. To answer those questions you're going to need estimates and approximations, things that you learn in analysis. If your calculation is of critical importance, you don't want to just eyeball something, you want to know that you've got an answer with the appropriate accuracy.
The surface was basically defined in two different pieces glued together along their boundaries. I needed to calculate lengths along these boundaries where they were joined together. To calculate these lengths explicitly was literally impossible given the types of curves, and I ended up with an integral equation I couldn't resolve. So I used a combination of approximations for the values of the integrals and something like Newton's method from calculus to get a quickly converging answer to a problem that ground Maple to a halt when I tried the naive solution of just plugging it in.
If you're sampling data and using it to estimate the behavior of something, say a flow (like the movement of the wind or a river), you're going to want to know how accurate your data needs to be for your model to produce good results. This is a question in dynamical systems. Granted, this analysis may not be performed by the CS guy, but being able to do this sort of thing combined with having a good knowledge of computers opens a lot of exciting possibilities in science.
Similarly, in robotics, the configuration space of things like different joints on robot arms is a multi-dimensional surface, an object that is studied in differential geometry and topology. Using methods from calculus you can find the critical points in the configuration space, which it is generally a Good Idea to avoid (like a robot with its arm extended straight out) because of the fragility of the tolerance there (again, back to dynamics).
If you have a recursion, there are some fairly standard tricks you can try to apply to obtain a generating function, which can often lead to an easier computation or even a closed-form solution. There is a free text available on the internet, generatingfunctionology, which could be used as the basis for an independent study.
Things like encryption algorithms have found good uses for number theory. Graph theory can model relations between data or routes over a network. Statistics and probability are very useful for all sorts of things. Straight-up algebra and logic courses are great tools to get your mind working, though admittedly a lot of topics in your standard undergrad algebra course might be of limited use unless you're planning on pursuing a graduate degree. DEs and their solutions are great for most scientific applications. Discrete Math is usually the name they give to the mathematics course that is tailored towards computer science applications, so that's almost a no-brainer.
"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 article you quote bears me out ... it was an error in failing to do a conversion between standard and metric units.
Teach them not to use the good old "hogsheads to the furlong" measuring system. The excuses don't wash. Neither the "1 solar panel" nor the "not using ground tracking" were "unforseen events". They screwed up. Specifically:
Note my original post, where I said that one of the problems is people not being able to recognize errors that are one or more magnitudes in size from the correct answer ...
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.
I have heard that this joke works when you are studing for obstetrician, too.
And for eugenetics, too.
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
CS Student = Dork
Dork + No Shower = Typical Programmer
Typical Programmer + Fat + Slob = Slashdot Reader
Discrete Maths
I think all major mathematics courses should be taught within a computer science curriculum. There is real-world purpose for all forms of mathematics. A software developer with a strong foundation in mathematics can develop programs to efficiently analyze or simulate real-world phenomena.
I think the most important are the following:
Discrete mathematics, otherwise finite mathematics should be taught because it is the best way to represent a finite machine. A computer is a finite machine with many countable sets.
Calculus is great for computer science. Students who take calculus develop strong problem solving skills. Multivariable calculus should be optionally taught to those who want to design 3D games.
Statistics and probability theory should be taught. Statistics is used to analyze, interpret and present data. Computers are used to perform calculations on data. The combination of statistics and computers facilitate decisions in all areas of science, business and government.
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
Not related to CS or Engineering, but I think that the most amazing piece of math is Cantor's diagonal argument. So simple, so beautiful, so insightfull. And such a strong conclusion: infinite comes in many sizes. It's 10 years since I been first exposed to the proof and I am still filled with joy when I contemplate the simplicity and power of its truth.
I've got a CS degree. When I began taking graduate courses for 3D graphics, I was quite upset that numerical analysis wasn't pushed onto me in undergrad. It would have been nice to not have to learn monte-carlo integration alongisde ray tracing. That way I could have given enough time to both to fully understand. Instead I felt rushed through both topics :\
To contribute to the topic, here is what I took:
Calculus 1-3 (3 was most important for me since it was about 3D analytical geometry)
Differential Equations
Discrete I (combinatorics), Discrete II (Finite Automata & Language Theory)
What I wish I had taken:
Linear algebra (matrix stuff)
Numerical Analysis SOMETHING THAT TAUGHT QUATERNIONS!!!!
Every math course I've taken has in some way been useful to me as a computer scientist (this is partially because the area I'm interested in researching is applying mathematical concepts to CS topics, however). I would recommend at least minoring in math if you're going to do a CS degree.
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
... were Boolean algebra, numerical analysis, matrices, queueing theory, and a semester of descriptive stat. I didn't find linear algebra of any use to me, nor the year of formal stat. Calculus is kinda like long division -- I don't use it much (if at all), but it's good to know it's there.
Oh, and some of my pals recommended formal logic. I skipped that, 'cause I wasn't terribly interested in spending a semester playing word games. I don't think I've ever missed it, but someone else who actually took the class might straighten me out here.
Bar none, the best math class I ever took was a freshman seminar with no textbook, no lecture, no assignments and no exams. You were graded 100% on class participation, and the topic was... math. The prof stood off to the side and would start the conversation: "How many integers are there?" might be a typical query. He'd sit back while we discussed the matter in Socratic fashion, sometimes nudging us in a particular direction. That semester we "invented" limits, cardinalities, discontinuous functions and other groovy things. I doubt that this particular class had much direct application in my professional life, but it was the first fun math I'd ever done in my short life.
At my university, for the Computer Science students, the core math classes taught are Calculus I, Calculus II, Discrete Mathematics, Linear Algebra, and Probability and Statistics. Then, depending on the track you choose, you will either take Differential Equations and Numerical Analysis, or Theory of Numbers or Discrete Mathematics II.
From what I have been told, multiple semesters of Numerical Analysis used to be required. I don't know why it was changed. Maybe they thought it was overkill for an undergraduate?
I have heard good arguments for placing Linear Algebra above Calculus in importance in today's digital world, however, it looks like Calculus is still what is being required for a full year.
I personally would like to be able to fit in some sort of Computer Statistical Analysis/Computational Statistics course before I graduate (I am a Software Engineering student, not a Computer Science major, and interested in sports statistics) but I doubt I'll be able to. There is just too much material to cover these days in an undergraduate Engineering curriculum, especially if you, like me, switched your major at some point. I hear that probability theory is a good one to take if you are interested in getting a job in some sort of prediction-based industry.
It seems like there are never too many possibly useful math classes one can take. I'd like to know myself which ones are the most practical, by their industrial application, however.
Which was required for my degree. As a DBA today, you have to use this, as even single machines are going into parallel processors. So one has to use Prob and Stat to calculate what the machine is going to do. And while I was working on Teradatas, with as many as 150 parallel processors, I lived in that world.
Even the micros today are going to parallel processors. Calculas? Haven't touched it in 25+ years in the business world of CS.
The other course that was useful was data structures. Tought me to think in linked lists. In one case it taught me to look at the problem from the link point of view. So the process I was on was codeable in 4n lookups, instead of n! + 3n lookups!
Oh, and to all the doubters there. When calculating the processing power of multiple processors, don't forget to subtract off the OS on each processors. Most venders won't tell you about that little probelm when calculating the machine size.
I received both a BS and an MS in computer science at Stevens Institute of Technology back in 1993. Most of the classes people are suggesting here were all required to earn the undergrad degree there; in addition to 3 semesters of Calculus, you also had to pass discrete mathematics, statistics (two semesters of that), and linear algebra as part of the standard program.
Out of the required math classes, two stood out as being particularly helpful for my career in software development. The introductions to logic, graph theory, proof, and other topics in the discrete math course were absolutely vital to understanding more complicated computer science constructs. I recall trying to understand how compilers were built before that time and being completely confused, but everything made perfect sense after completing that class.
The other class was in operations research, a subject I didn't notice anyone bringing up here yet. OR really made an impression on me as it provided a bridge for how to apply several types of mathematical approaches that had seemed completely theoretical to solving the kinds of real-world problems computers are good at helping with. As the most obvious example, I feel that having a solid practical understanding of how to model a complicated queue or flow across a series of queues is wildly more useful for building software than anything related to big-O analysis will ever be, unless you're one of the rare people writing basic algorithm libraries. My experience is that you'll see dozens of messaging queue issues in business software design for every problem that requires an understanding of complexity analysis. And learning how formally construct decision trees turns into a great tool when you get far enough along that you're managing projects instead of just working on them. I considered it unfortunate that I didn't discover this class of mathematics until very late into my time at school, as I would have gladly taken more of it and benefitted from--something I can't say about statistics or linear algebra, where I felt the basic introduction gave sufficient understanding for normal programming tasks.
Suddenly I was good at math. Not only that, but I got a whole lot better at computer science. The more advanced classes focus more on how to think logically, and how to operate in procedures. Cryptology is especially important because it is one of those items which most computer scientists will use, but only in passing, and using it badly is often worse than not using it at all. An understanding of cryptology brings with it a lots of logic, set theory, and optimization skills.
That boolean algebra/logic be taught as well. You would think that would be a 'no-brainer', but that's the phrase I used to describe some code recently. And I can't tell you how many times I've had to fix someone else's program because they had a series of conditions totally messed up.
At least one, I rewrote the whole thing, because not only did the other coder have the wrong logic in place to try and solve what he wanted to solve, it was also ordered very poorly.
At least one class on probability and statistics would be good, vector math/algebra, a topology course (ok I took that and oddly it helps), trigonometry if going into graphics processing/modeling, and a number of other courses I took but can't remember. The only thing I haven't used in the last year, the rest of the above I have, is some of the higher level calculus.
Atomic batteries to power! Turbines to speed!
You've already acknowledged the constraints: there are only so many math courses that one can "squeeze in". I assume you mean, "squeeze into a four year CS degree". So stop doing that: take the Math/CS double major, and take an extra year if you need it. For students coming into the university with AP, IB or dual-enrollment hours, they may even get back onto a four year schedule.
I can't speak for the entirety of the technical industry, but I feel pretty comfortable with the following statement: anyone who considers herself a professional Computer Scientist would most likely have benefited from a double major in an appropriate field: stats, math, physics, chemistry, engineering (probably won't have time for one of these), biology, meteorology, oceanography or philosophy. I listed here the subjects with strong analytical or computational components.
A CS degree is always better in a double major.
So tell me Tom, how's the Canadian space program? Oops, that's right, you've got to ride shotgun with the US since you don't really have one eh?
Right about now is when you should trot out the argument about how the US stole the Avro Arrow engineers who helped put the US on the moon. Too bad fools like you never seem to mention that they were almost all of UK extraction and immigrants to Canada after WWII and not indigenously developed. Then you can follow up with the work on the shuttle arm for an encore.
At least an introductory course in numerical analysis should be included. I know, I know - no one does arithmetic with computers. But somehow, in my career, it has arisen time and tine again.
Symbolic Logic (I know this is usually a Philosophy course, but it helped me with programming)
Trigonometry
All the Algebra courses
Calculus 1 and 2
If "disco" means "I learn" in Latin, does "discothèque" mean "I learn technology"?
Most CS students are taught math as it is and they then have to connect it themselves to their programming classes, etc..
This, of course, is absolutely stupid: math should be taught through programming and not the other way around..most of it is useless to a good programmer anyway as they will intuitively figure out the solution to their problem without having knowledge in the specific math required.
As for the courses...trigonometry, linear algebra, sets, blah blah blah..the list goes on and on!
Infinite time means everything that can happen, will. You being you is absolutely incidental. You do not exist.
While calculus is a core course, in my exerience it hasn't contributed directly to my CS studies. The courses that offer the most benefit are set theory and logic (as previously mentioned). Any math course that focuses heavily on writing proofs is also a strong plus. Finally, from a computer graphics perspective, no math curriculum would be complete without linear algebra. Afterall, at the lowest level, compute grahpics is nothing more than applied L.A. :)
...fill memory and cause a crash before your next performance review. That would be sufficient for many of the CIS majors I've met.
About the word "if": If bullfrogs had wings, they wouldn't bounce around on their little green butts.
At the university I went to, we took all of the classes you mentioned....They were all required to get a CSC degree. In fact you only need ~10 more credit hours to pick up a math major along with your CSC degree. It seems to have worked well for me.
"If you're taking computer science then getting as much mathematics as you can is probably a good idea."
Assuming (a big assumption, I know) that you are getting a degree in computer science in order to go into either programming or networking of some sort, I completely disagree with your statement. Other than some very basic statistics (averages, standard deviations), most programmers hardly ever need to use any math that was beyond trigonometry. There are some exceptions to this rule (for instance if you're writing a program like Matlab or a physics engine), but in the relative scheme of things those are a 1% niche market.
That being said, I would think that if you're taking computer science then getting as much COMPUTER SCIENCE as you can is probably a good idea. Having a general idea about things like algorithms, operating systems, and databases will make a huge difference (you wouldn't believe the number of people who I've interviewed who can't figure out how to sort a list, what a thread is, or how to search a database).
Maybe not a full semester, but at least a couple of weeks in a discrete math class should be devoted to information theory. Even if you can't implement a state-of-the-art one, you should understand the basics of error correction, cryptography, data compression...
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.
The two things almost all CS students lack is an understanding of probability, statistics, and hardware interfacing (i.e. writing and reading registers to control hardware). This restricts the number of CS grads that are able to make the transition to embedded programming and digital signal processing. The result is that most embedded programming and digital signal processing gets done by electrical engineers who learn how to program on-the-fly.
Apparently its a lot easier to learn programming on-the-fly than it is to learn probability, statistics, and hardware interfacing on-the-fly.
Differential Equations.
If one wishes to work on engineering projects and have any idea of what is going on, this is critical. Even better is taking a finite differencing and/or finite element numerical methods class. This is obviously only for a subset of programmers, but the lack of CS trained people able to convert partial differential equations into code means that engineers end up doing the programming instead...with predictable results.
Anecdotally, I didn't get a CS degree, I'm an engineer that happens to be able to cobble together code (poorly). I keep ending up coding on projects because it takes so much effort to get the programmers up to speed as to what is desired, what it means, how to optimize it, etc. In the end my code is awful and inefficient, but functional. It would be a vast improvement if we could get some CS educated guys who at least remembered their calculus.
-------------------------------END--COMMUNICATION
I think ZFC would be good.
Since it requires 22000+ steps to prove 2 + 2 = 4, then it is sure to encourage efficient programming.
For my degree I had to take a year of discrete and and two terms of linear algebra. I thought they were very relevant. I also had to take calc, of course, and I've never had to use it since and have forgotten it all anyway. :D
How about geometry and graphing for graphics engineers? I found the stuff I learned in the lower division math supremely useful in game design.
Python: 'And then suddenly you have a language which says "we're all stuck with whatever the whiniest coder wants".'
Definitely:
Optionally:
Unless you're going to be an engineer or scientist, I don't consider Calculus and Differential Equations to be essential. Only insofar as they contain material that's prerequisite to Numerical Analysis and/or Linear Algebra.
I am from CS background, and I third the nomination of digital signal processing. I had to go to the EE department for the course, and managed to get through is without taking linear algebra first, but that would have made it easier I think.
I haven't found many uses for fourier transforms, but low-pass filters and auto-correlation functions have been extremely useful in a variety of applications.
I dont know if they still contnue this, but when I was in grade-school they always taught us generally useless set theory in elecmentary school arithmentic. Concepts like "associative", "communitive', "union", "intersection", etc. Ironically this stuff become more useful in CS- for structured programming, compilers, digital circuit design.
On a different note, I think a broad mathematical education in first-year would be good for CS students. Many students are sadly lacking in a sound knowledge of mathematics. For example, the other day I overheard two final year students arguing about whether Pi is exactly 22/7.
Slashdot: news for Apple. Stuff that Apple.
The Computer Science program at most institutions includes such classes as Discrete Mathematics and the Calculus series. In the program that I was in it also required two additional upper level mathematics courses which could include, Graph Theory, Matricing and Linear Algebra, Number/Group Theory etc. While I agree that the Calculus based option is probably not the best for the computer science discipline, it is required to be able to complete the Physics courses required over here, so I guess I had to take them for a reason.
CS is not math. You can get by in CS having just taken algebra and geometry.
CS does involve a lot of number theory, which falls under philosophy departments at most universities (number theory is not math; it also analyzes non-mathematical properties of numbers.) I highly encourage anyone interested in CS to take a lot of philosophical logic classes; many of the techniques for analyzing sets/possible worlds are highly applicable to data structures in CS.
I'm not an expert on what colleges offer, but I can share that here at GA Institute of Technology their Calculus III class is specialized for CS majors. We don't take the same one as everyone else, it is more geared to computer science. Also certain threads require certain math courses for that speciality within computer science. Its really a lot to explain, but its the direction that computer science will be going in the future. Check out the link: http://www.cc.gatech.edu/content/view/692/144/
This topic surprised me. I had assumed that the majority of CS degrees (4 year B.S.) tended toward the same set of math requirements: calc, diff eq, linear & abstract algebra, discrete, probability & statistics, numerical & complex analysis, with optional courses like partial diff eq, tensor calc, etc. plus the traditional CS classes [programming techniques, data structures & algorithms, compiler theory, operating systems theory] and perhaps some more hardware oriented classes depending upon your focus.
Does that tend to fall in line with other curriculums, or is CS becoming a bit more watered down these days?
Trust me. This is an inactive account. Regardless of what the
I don't like Math. Too much brain, and not enough heart.
it will develop their ability to write, speak, and communicate. this is what is lacking in CS people/programs. not 'math skill'.
it will also lead directly into formal logic, which is an attempt to 'automate' philosophy somewhat, or 'automate' thought, which is what computers are all about in the first place.
the rest of mathematics can basically be reduced to formal logic, so, really, teaching differential equations to most CS people is kind of a waste, unless they are going into some field that needs it. but i guarantee that the ability to write clearly, communicate, and deal with logic are a lot more important for CS grads than how to memorize a bunch of differential transforms (Which is what a lot of calculus is - rote memorization)
Object-oriented math:
Billy has four apples. He gives one to his friend Janet. How many apples does Billy have left?
four apples and a nasty rash
Don't kid yourself... Without a strong understanding of math and it's concepts you don't stand a chance in CS. It's less about the actual math (depending on what you want to do) and more about the kinds of problem solving skills and thinking that goes with it. As a CS major I had to take Calculus I, Calculus II, Discrete Math, Linear Algebra, and a high level Statistics class. I would further recommend Calculus 3, though I didn't have to take it, I wish I had. I also took Physics (2 sections), Chemistry(2 sections), and Astronomy. It's a science major for a reason. There is a far easier route, however... take CIS instead if you can't rally hack the math. The hardest math they take is maybe Business Calc with virtually none of the Science requirements as you're getting a Business degree more so than a Science one.
A jack of many skills is always less exact then the master of one skill or a few.
Do we want programmers that can do complex/theoretical math, or a theoretical scientist/mathematician programming? I think NFWay to both possibilities.
Do we want programmers that can draw complex/abstract artistic representations of dimensional unknowns derived from vector interactions of a multi-dimensional place, or artistic clutter programming by a very creative artist.
Never stretch a master out of their field, but teach/mentor all Masters/Ph.Ds how to collaborate/communicate as a community of very high performance professionals (with respect for sometimes significant personality differences).
Being slightly paranoid/eccentric and asking for help (collaboration) are two true signs of genius. However, collaboration is far more productive, and mentally and emotionally healthy for everyone.
Unaccountable leaders are masters, and unrepresented people are slaves. How do US and EU fare?
There are a number of suggestions already mentioned, and to be honest, there is a huge range of courses that would be valuable. A standard weakness I see in CS grads is poor exposure to analysis of algorithms and computational complexity. CS students often struggle with those topics because of either poor preparation in discrete math or not enough exposure to mathematical proofs.
As far as getting good experience with mathematical proofs to my mind, just about any pure math course which is interesting to the student and has some emphasis on proofs would be useful- combinatorics, algebra, analysis or even topology or logical foundations. Getting comfortable with mathematical proofs will serve CS students well, not from the particular topics covered necessarily, but from making complete (hopefully concise) arguments (proofs.) Being able to express your arguments precisely and convincingly is a very important skill. People will judge your development and coding skills through the window of your communication skills so doing as much as you can to improve your ability to communicate mathematically/precisely will work well.
If you are looking for a valuable course from a range of possibilities, don't underestimate the "shop around" method for electives. Depending upon how your institution's registration process works, you may have the opportunity to sit in on a bunch of possible course the first week and decide which professor/subject matter appears to be most valuable. Typically, there is a great deal of variation from professor to professor, so you may find it more valuable to take a course where the topic doesn't seem immediately applicable, but which has a professor who can communicate the mathematics well and who can help students develop their abilities to prove things.
It's psychosomatic. You need a lobotomy. I'll get a saw.
A lot of the latest work in OWL can be related to topos theory which is used by mathematical logic but is grounded in Grothendieck's scheme theory from algebraic geometry. This gets into very abstract stuff, on the other hand people working in embedded systems may do better with a grounding in differential equations and classical controls theory. I think that computer science has become too big to consider as a subject to be mastered, rather it (as mathematics, physics, engineering or biology) is a large umbrella over over a variety of sub-disciplines each of which has a distinct set of pre-requisites.
Ivan Handler
I would definitely suggest teaching discrete math; its ties to algorithm design and efficiency are very strong. I use it all the time with various job-related functions.
The wheel is turning, but the hamster is dead.
I think numerical analysis would be an excellent goal for a CS major. It combines math skills from linear algebra, calc 1-3, and some PDEs. Plus, you talk about computer arithmetic and actually get to implement many numerical algorithms. It's been my favorite class, math or otherwise, so far and i feel it has helped me to better understand some of what happens behind the code.
At my undergrad, we had a course called DDS, which stood for discrete dynamical systems. It was required for all students, not jus CS students. It was developed to deal with real world situations, and converting them into methods that can be solved by a computer. Its focus was on modeling in MATHCAD, but the underlying concepts are very applicable to computer science. Really, what is computer science but trying to convert real world situations into things a binary mind can understand, and then converting the results back?
http://bgcommonsense.blogspot.com
For my CIS degree, right now, I'm enrolled in class called "Discrete Math" - it is part of the CIS program, not part of the Math department (although it's taught by a mathematics professor). Discrete Math covers set theory, logic, truth-tables, proofs, logic circuits, venn diagrams, algorithms, functions, etc.
For me - with a very poor math background, this is a very difficult class. I think most of the other students are having a really hard time with it too. The other classes in this program, the programming classes in particular, are like a vacation in comparison. It's not just the workload, it's the concepts. The teacher acknowleges that its one of the most difficult math subjects to teach, because of the chicken/egg nature; foundational concepts are functions and set theory, and you need to know functions to understand set theory, but you also need to understand set theory to understand functions. So the big problem is bootstrapping into that little cyclical dependency. But an even bigger problem is, for writing proofs, the student needs to have a good background in mathematical stipulated definitions and axioms. That's outside of the scope of this class, and depends on a strong background in algebra. (as in; you can't have coasted through your high-school and college algebra with c's).
I've dabbled in programming for 14 years, and there are many programming-type tasks that I can do. But after a couple of weeks in this class, I've learned that this class presents the foundational concepts to computer programming, and equips students with essential tools to get past some of the most basic problems in computer programming, and progress to some of the really more complex issues of branching logic, and database design, etc. I don't know if I'm going to get as much out of this class as I could. I'm considering re-taking it. Not because I need a better grade - but because, after 14 years, this class, and the concepts in it, is really the main thing I need to take with me in my career as a professional programmer, out of the entire CIS program.
These are my friends, See how they glisten. See this one shine, how he smiles in the light.
Back when I got my CS (actually CSE) degree from Auburn University (graduated in '89), we had to take Discrete Math from the math department, a discrete match course in the computer science department, and a computer logic/discrete math course from the EE department. There was about an 80% overlap between what was covered in these three courses. The terminology was different, but it was all boolean algebra and set theory.
I had a horrible professor for linear algebra - that would have been a useful thing to have learned more about.
We only covered graph theory in an algorithms class. I had to teach myself a lot of graph theory in my job later (while working on tracing algorithms for GIS).
I think the biggest problem (way back when I was in school) was that, as CS majors, we could have done much more from a computational/programming point of view even in our "pure" math classes. Maybe it's better now.
-- stream of did I lock the front door consciousness
I am in 3rd year computer science night time. I have worked for 10 years in IT doing everything from development to support etc... I have never had to endure such useless rubbish as the 2 years of heavy maths I have had to do. 1) It is completely useless to my daily life - it may be nice to know what DY/DX means and "rise over run" but in the real world we write programmes to make money 2) It was a waste of time - the industry moved on 2 years while we had to sit there doing nothing useful with our time which new technologies came out. 3) "Improves logical thinking"? I am unsure as to what that means - you don't need to know the statistical properties of the binomial distribution to write a beautiful sorting system in Java. 4) Universities are moving to ditch it completely from CS courses - hopefully Trinity College will get their act together and catch up! my manager at work doesn't care if I sit down all day trying to work out the probability of a case coming in on some mad adapter being related to DNA! he only cares about me doing my work and getting the job done right!! it is only now that my course has actually got useful! learning to write XML correctly, understanding assembly etc etc - useful stuff that I am able to use right away! So whatever dim-wit thought in the University World "oh yes they need maths" should actually get a job in the real world where the aim is not just chalk on a blackboard (or projector if they are somewhat able to use electricity) it's to make money and write better code. Of course that is my opinion and I totally accept that others will not agree with me - so that is why I think it should be an option in college - not a law almost! David A crap-at-maths but amazing programmer person :-)
ps-perhaps Computer Science could have psychology included - that would be much more useful! then we wouldn't have so many engineers who are afraid to talk or hold conversations like math-heads!
I learned everything I needed to know about the fundamentals of mathematics from the Zakon series: http://www.trillia.com/products.html
http://www.coderoshi.com/
The having taken a ton of CS and Math classes, the class that helped my coding/programming the most was a predicate logic class offered by the philosophy department. Any predicate logic class worth taking will have you go over a lot Newton's and Cantor's work, having you create for yourself proofs of the foundations of calculus.
Computer Science is a different field, and hence requires a different curriculum from Computer Technology.
Subjects such as Turing Machines, the Lambda Calculus and Predicate Calculus are instructive for showing three different approaches to the same ideas, and have good utility in building the conceptual frameworks necessary in Computer Science. But they have zero utility in Computer Technology (a.k.a. "Computer Programming"). Same thing with abstract algebra.
There is a continuum to the underlying math that forms a bridge between Computer Technology and Computer Science -- set theory forms the basis for a great deal of logical thought, and pretty much the entirety of relational databases. If you're going to be doing any significant numerical analysis work (such as one might in engineering applications), then you will require the concepts in calculus, and possibly differential calculus, along with the calculus of finite differences for proper consideration of the accumulation of errors.
Because Computer Science is less related to the application of, and more properly aimed at the understanding of ALL the concepts involved in ALL branches of computing, it requires a substantially stronger foundation in mathematical concepts. Computer programming does not need nearly so much in the way of math, especially if all one is aiming at is constructing web sites and variations on already existing applications.
87.3234543 % of people don't really understand statistics.
Ever tried to explain that if a penny is tossed and comes up heads, it's _NOT_ more likely to come up tails next time.
How about relative stats.
If a test tells you with 99% accuracy that you have X.
But only 1 in 1,000,000 of population have X.
What is the actual likelyhood that you really do have X.
In fact, the test will incorrectly show 10,000 people out of every 1,000,000 as having X.
And 99 times out of 100 it will show the one Guy with X as having it.
If you test 1,000,000 people then of the 10,001 people who show up as having X, only 1 really has.
See if your doctor understands this before you accept his advice based on a test.
http://davesboat.blogspot.com/
In my case,I have a masters degree in music and have switched over to the computer science field. I am currently enrolled in a masters program in computer science, but the last math class I took was almost 20 years ago. I have already completed courses in data structures, descrete math, algorithm analysis, and operating system design and I'm still going strong. The point is, well, honestly, I'm not sure what my point is. Sure, this would be a lot easier if I had the math background, but it is possible 'learn as you go'. On that note, back to my homework...
- Familiarity with the use and manipulation of abstract symbols...
- ...so as not to be afraid of formal 'mathematical' descriptions.
- An appreciation of the various 'mathematical' tools and what they're used for
Of course this last item is huge. At the top of my list would be :- Number Theory
- Linear Algebra
- Probability
- Numerical Analysis
I left out Discrete Math because at my school it was a CS course and required. Also didn't include Predicate Calculus because it was in the philosophy dept, or Calculus because I'm pretty sure it's required by any decent CS program.I'm a Computer Science major at RIT - our math sequence is Calculus -> Discrete -> Probability and Statistics. Discrete and Probability of course being the most relevant for computing.
God, I'd like to vomit all the math I've taken as a CSC student. So much Calculus and Linear Algebra...it's so pointless! The second that final is over you forget every last bit of it.
Computer Scientists should be taking only one type of math: "How to make a computer do math for you".
No contest, in my mind.
I taught a course in BASIC programming back in 1980 at a small computer store, I spent the first few weeks of the course teaching the associative and distributive laws, so the students could understand how to write simple equations that parsed correctly. A couple of the students went on to take night school college courses in programming and said that my instruction in simple math was more valuable than anything taught in those classes. I don't recall just when I learned the associative and distributive laws, but it must have been when I was a sophomore in high school.
So never underestimate the importance of teaching the absolute basics of math, and never overestimate the knowledge of students.
What better way to understand recursive data structures as fixed points of functors? What better way to understand operations on such structures than to factor them through initial objects and terminal objects in the appropriate category? What better way to understand side-effects than through monads? What better way to understand functions parameterized by type than as natural transformations? Without Category Theory you're like the proverbial blind men feeling an elephant. They'll perceive the individual parts, but they'll never see the unified whole that links the parts together. If your job is merely to feel the shape of the trunk, maybe that's good enough for you, but when you see the bigger picture you'll never be able to go back.
Doesn't it make you feel good to know that our freedoms are protected by politicans, lawyers and journalists.
* 3 Semesters of Calculus
* Linear Algebra
* Discrete Math
* Numerical Analysis
* Statistics
* Logic (philosophy dept, usually)
That should pretty be the core set of classes. If you want to take operator theory, topology, real/complex analysis or group theory, by all means it will only help, but the courses I outline above include material (such as rounding error, parameterization and combinatorical counting) that is of more direct practical use to programmers.
"Lawyers are for sucks."
- Doug McKenzie
Computer programmers repeatedly screw up with empirical data. The CS curriculums in most university act like logic and graph theory are the end all be all (they are important, but not THAT important), but only require a stats course because the large institution does. The "stats" course I had was 4 weeks at the end of a semester of Probability and Statistics. Statistics are extremely important because they show 1> How to test for capacity of programs 2> How to determine error sources 3> How to correctly estimate (well, stats are a requirement to do this, but not all that's required) 4> Understanding of different ideas of random and 5> Understanding how to detect causation and people who have mistaken themselves about causation. These errors cause programmer to say and do rediculous things all the time. --Michael
Want to see every step I took to start my company? http://www.rowdylabs.com/blogs/pitchtothegods
No math needed (for the most part). Been itching to use my calculus on computer science since I started but haven't found a use for it. Teach them a course on one-off-bugs (that's math for you ;) ).
Admittedly I'm not a CS -- just a computer-minded astrophysicist -- but one of the two or three most useful courses I had in graduate school was discrete signal processing. Anyone who's doing original work in data mining, signal compression (video, sound, text), communications (packet routing, protocol design), or signal recognition (image interpretation, sound recognition, handwriting recognition) absolutely needs to have a good overview of basic DSP techniques. Anyone who uses those things seriously, which is pretty much anyone who reads Slashdot, ought to at least have an overview of the field.
Abstract algebra is important because it opens up large pathways of logical thinking -- even if you're "just" monkeying around with basic SQL queries, you'll be much more effective if you have had a course in linear algebra or (preferably) abstract algebra: it will make you think differently about the data you are querying. Even if you can write elegant, fast code at a basic language-usage level, algorithmic design is also subject to a bajillion types of boneheadedness and stupidity. Knowing abstract algebra will help you write algorithms that are faster (both to write and to run) and cleaner.
So -- at least one upper division proof-oriented math course (linear algebra, abstract algebra, advanced calculus) and at least one DSP course (Z-transforms, DSP, data vector spaces, Hanning codes, the channel capacity theorem, and compression theory) should be required!
Analysis helps me the most as student working on both a CS and mathematics degree. It teaches a person to examine a problem from beginning to end with complete comprehension and logic. This is best used in designing efficient algorithms that will rarely need changing or updating. My 2 cents.
At my own university, the required courses for a Computer Science major in the mathematics area include three levels of discrete mathematics (309, 511, 512) as well as at least two courses in algebra (combined linear & abstract). The ideal at this university is not to teach linear and abstract algebra as seperate topics but rather to integrate them. Since I am a double major Computer Science & Mathematics, I'll end up with plenty of mathematical exposure but it is my feeling that universities should have a strong base in discrete mathematics, analysis (at least to a Calc III level), and linear/abstract algebra. I'd allocate at least 18 credit hours in the mathematics.
What Math Courses Should We Teach CS Students?
None. They arein CS, not math.
Have you read my journal today?
I have taken trig, calc 1 and 2, matrix algebra (I chose the senior level although there is a similar course in the sophomore level), discrete mathematics, numerical methods and statistics for engineers/scientists (opted for it instead of probability).
At my college this is enough to get a minor in Mathematics. If I really wanted to I could spend my last 2 semesters going for an Applied Math supplementary major as well as my CS degree but I'm burnt out on math.
"Some fight for law. Some fight for justice. What will you fight for? One day, you will see."
Funny you should mention that: one of my buddies in graduate school was courted heavily by Wall Street to do exactly that. They wanted him to apply n-dimensional non-Euclidean analysis to stock market prediction to see if there was some additional arbitrage to be had that way. At a time when physics post-docs were earning ~$35k per annum they offered him something like $180k per annum with incentive bonuses on top of that.
When I finished my own post-doc and was scouting around for a position, I was courted by several IT firms precisely because I was familiar with n-dimensional calculus and non-Euclidean spaces. So that kind of knowledge does appear to be in demand for business applications -- perhaps just not in your particular sector.
not just YES, but DEAR GOD IN HEAVEN YES, THANK YOU JESUS!
(and coming from a non-christian, no less)
i'm working on my phd in computer science right now. math was my undergrad, and every single course i took i'm finding of use. all that practice w/ proofs? hello, algorithms. abstract algebra? automata. graph theory? AI, baby! even probability, the series i suspected i would use the least when taking, has probably been the *most* useful. (machine learning, AI, NLP, you name it it has probabilities). and let's not forget both numerical and complex analysis... knowing the math behind the the techniques/applications you're learning in CS...i almost feel like i'm cheating it becomes so easy.
short answer: take every math class you can get your grubby little hands on.
http://kered.org
I got it all. I was a Math minor...
1. One year of Calculus. While calculus itself is not necessary for CS, calculus is necessary to understand the bulk of mathematics.
2. One semester on Linear Algebra in finite dimensions, and group theory
(with a focus on finite groups).
3. One year of probability theory and applied statistics. Thats applied statistics, not theoretical statistics.
4. One semester of discrete mathematics.
5. One semester of numerical mathematics, with a focus on things such as error analysis, roundoff errors, propagation of errors, numerical stability, and analysis of efficiency of numerical algorithms.
I am assuming Europeans style universities, where students have had 12+ years of math in school before they join the university. North American colleges probably need to add one year of preparatory courses.
Topics for advanced courses:
I. Optimization theory
II. Numerical solution of differential equations (such as from computational fluid dynamics)
III. (algebraic *and* algorithmic) Number Theory, especially the mathematics of large prime numbers
Thomas
software engineering and compiler writing courses
Software QA
formal theory classes and proofs
Software Optimization
knowlege of big O notation, lock-race conditions, and algorithms Software Architect
Sometime MIS works here for buisness applications, but for math intensive work I'd still go COSC. Hybrid Degrees
Being able to make good code for group that has a tough time doing it on their own.
just my $.02
Storm
Call me flame bait...
Computer science students should not require any math - as very little math is used in any computer science unless its a niche (graphics).
Here is what I needed to take for my degree; linear algebra, discrete, and calculus. One year of each. (Statistics might have been useful, but I didn't need to take it.)
There was virtually no application to any of my computer science courses. Restated, I never had to solve a series of equations, never had to apply formal proofs from discrete math to a "computing" problem, nor optimize anything via calculus. Hell I was lucky to use basic algebra.
However, much more effort in computer science could be put in algorithms, complexity, testing, and design. I mean the "science" of them; to optmization and performance, complexity measures, code coverage, and "software engineering" and the boat load of methodologies. This is far more useful to the "science"...
/\/\icro/\/\uncher
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.
As a mathematician, this attitude is strange to me. You do CS just for the sake of doing CS; why doesn't that bother you, too?
I took many CS courses. Some were rather fun (Compilers and Translators, for one: I guess we mathematicians like our languages and transforms) -- but others were just mind-bogglingly dull (like Computer Graphics -- yes, really).
Do CS courses have a "purpose"? Does physics have a "purpose"? What does that mean, and why is it important? I guess statistics may have "purpose" if you're a statistician; I've never used the stuff.
Physics is a lot closer to mathematics than most people realize. If you don't see the purpose for a particular mathematics course, you can almost certainly find it in a higher-level physics course.
But since CS, like mathematics, seems to fundamentally be about dealing with abstract concepts (hi Don, hi Edsger!), I wonder why the issue ever comes up. If you just want something with a "purpose", learn to weld.
However, I think physics should be part of the standard curriculum for a CS degree, but sadly (at least at my somewhat-reputable school) it was (is) not. The reason I say so is because modeling the real world would probably be impossible without using (and understanding) physics, and I found myself lacking the appropriate knowledge when it comes time to, say, program a realistic-looking bounce of a ball.
Change is inevitable, except from a vending machine -- Robert C. Gallagher
Linear Algebra --- explicitly listed in your Graphics and Compression categories.
Engineering makes use of calculus, but the only math a computer can do is addition and multiplication, i.e. linear algebra. Fortunately this is good enough since differentiable functions (the ones of interest to engineers) are locally linear.
Business applications also benefit from linear methods.
If CS people want to have an interface with the electrical engineering community, it usually comes in this form. I just about shot myself last year (as an EE) working on software to handle radar signal processing and was eventually monkeying with semaphores n crap. Ugh!
---------
No matter how thin you slice it, its still baloney.
Baysian Statsics. That's the future (present in research).
As a Ph.D. in Computer Science, with an undergraduate degree in Mathematics, I have always found it amusing that the math courses that the math professors call "non-applied" are the ones that are actually useful.
"Non-Applied" mathematics courses include: set theory, logic, abstract algebra, language & automata theory, graph theory, category theory, computability and complexity, and even combinatorics. All of these are very useful in computer science. Indeed, these subjects form the core of computer science.
The "Applied" mathematics courses include: calculus, differential equations, etc. These are nearly useless in computer science. They are really only useful if the particular application requirement is to solve such problems.
There are a few subjects that are useful in every field, such as Statistics. But even there, my undergrad department offered two versions of the course. An "applied statistics" course for engineering and science majors, and a "nonapplied statistics" course for math majors.
Calc I sure. Calc II maybe. Calc III and Differential Equations maybe not so much, although DiffEq does kinda jive nicely with functional programming.
Graph theory and set theory yes. Combinatorics in general yes.
Linear Algebra yes, for graphics programming. Likewise Numerical Analysis (approximation/interpolation stuff).
Logic, well DUH.
Category theory, don't know much about it... Abstract/"Modern" Algebra, wish I'd have taken it. I run across some great theoretical literature that I feel I could learn a lot from if I understood it, and which seems to use a lot of these two.
What CS courses should be required for a Mathematics major? When I was a student (about 10 years ago), we still used FORTRAN for most of our work in computational methods and numerical analysis. Is a better programming language for this task available?
I know this is off-topic but what most CS folks (who tend to self-select as happy in the computer world) need is classes on writing, thinking, and communicating. The math is gravy.
Further, I've never seen such a thing, but I think a fantasti thing would be what is analogous to the above (from the humanitees world) in the math frame: a class on how to teech YOURSELF any mathematical discipline. How to read math books, apply the theories, evaluate and decide whether to pursue, etc. any given disclipline within math.
How, as an employer, I would love people who could learn math on the fly as needed.
There are lots of algorithms that would benefit a programmer's training. Lots of math behind those algorithms. So if you're training a programmer, have them pick the area they'd like to go into (networking, graphics, etc.) and teach them the math that pertains to those algorithms.
I don't think anyone should train programmers though, I think people should train software architects who will have to do programming early in their career. For them, teach math that deals with abstraction. Linear Algebra, automata and computability, graph theory, set theory, relational calculus. Then go into some nitty gritty stuff like differential equations (yuck!!!) just to show them that the world is not as fluffy as modeling concepts lead you to believe. But please, max 1 semester of this horrible math stuff, it rots the heart IMHO
I think a class in computational methods and numerical analysis is critical. It brings together algorithmic ideas (e.g. what's the computationally efficient manner to arrive at a solution to a first order differential equation) and computer data manipulation limitations. It is unusually instructive to calculate the expected error when using Gaussian elimination to solve 10 + 100000000000x = 11. It's the sort of thing that engenders thoughtful consideration of the algorithm to balance computational efficiency against the application's tolerance for error and precision
Absolutely none. Maths are boring and are not related to programming at all.
It's a tradegy of the primary and secondary education system that logic puzzles are consistantly of the form "Bob is tom's neighbor, dave's house is not green" and so on such of the form of Einstein's puzzle. In formal logic, the meaning of english sentences is lightly touched upon, but far from the focus. Instead, the focus is on things like Natural Deduction (things like, if and only if, Law of Excluded Middles, and implication), first order logic (for all x, such and such is true, or there exists an x such that blah is true). CS courses typically use those as a starting point for moving into programming logic, which is useful in proving that a does something useful, like sorting an array. Much of it you use in your daily life implicity, and most of the consequences are built into a good programmer's mind pretty much universally before they have the chance to learn about it. But it should come as no surprise that it's possible to construct a program that is difficult to be sure is correct, and formal logic is the toolset we use to fall back on in such cases.
I Browse at +4 Flamebait
Open Source Sysadmin
We'll overload the mathematical operators anyways.
My most beloved math class @ the university was History of Mathematics. We learned about the basics, Euclid, Newton, etc. They were the innovators, the builders of unseen worlds. If CS students, learn to think like them, a java class is no problem. Thinking is what CS is about.
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.
I switched to CS after a couple of years in a traditional engineering program.
In the CS program we covered discrete math and statistics (everyone in science and engineering had to do first year calculus and algebra courses).
We also had a special course in logic (we used SPARC assembly for assignments).
But one topic that was not covered in CS, but I got in a second year engineering calculus course, was numerical methods (especially the 'gotchas' of machine math vs. real math).
Maybe it is just the type of work I've done (structural analysis software, and compilers), but that is one topic that I really would have missed (although I probably wouldn't have known it) if I had done CS right from the beginning.
Be who you are and say what you feel, because those who mind don't matter and those who matter don't mind. - Dr. Seus
That's right, I have used almost no college math in my seven years in the programming world. Heck, earlier this year, I had to do some math, but unfortunately it wasn't a kind I'd ever had: spherical geometry, preferably relating to it being on the actual Earth.
Anyway, my college was on a three "quarters" system (don't look at me like that, that's what they called them), and as a CS major I had to have:
Calculus I, II, III
Differential Equations I & II
Discrete & Combinatorial Math I & II, with III fulfilling a math elective
Linear Algebra
Intro to Probability (in contrast to the engineering majors Statistics class)
And, IIRC, two more math electives. I took Fractals and Cryptography.
And sadly, I don't think I've used any of it at work.
ALL branches of mathematics are relevant to computer science. Sure, you can get by without going as far as you possibly can, but you'll probably end up wasting a lot of effort. I've witnessed many engineers over-architect simple solutions simply because they haven't been exposed to enough math... even for problems with KNOWN solutions. Math is a critical foundation for all logical thought. If you're studying for CS and thinking about cutting back on math, then you might want to reconsider your career.
A little off-topic, but:
Given the need for natural language processing in many real-world applications, not just AI and database engineering contexts, would a bit of formal linguistics be appropriate for a CS degree? I don't have such a degree, so I'm also wondering if CS departments have a way of handling these subjects under their own mantle.
The first sentence of this post is false.
Any CS major worth his/her salt should learn the theory of functions of several complex variables. I use it all the time.
I should have thought of applying to Counter Strike school when I had the chance, after all, my career advisor told me to focus on what I was best at...
Anyway, anything that explains the trajectory of my Flash Granade?... ("(f^k(x)){kN}" or something?)
*sigh*, I tried...
I didn't take any math courses, binary was taught in Comp Sci 101. Unless you plan to program for a fertilizer company, you don't need calculus. Unless you plan to program for an online casino, you don't need statistics. Heck, you don't even need to know what pie is unless you hope to work in a bakery. Math is for scientists and nerds, not computer geeks! Just say no to math!
My schools all thought that we needed Trigonometry, Calculus, and Statistics. The truth is, in computers (or much of real life even) you won't need anything NEARLY so advanced unless you are either writing a program for a Trig, Calc, or Stat class or you are designing CPUs or other microprocessor chips. The truth is, on the fundamental levels of things like programming and such, computers use some of the most basic maths out there.
I am an advocate of Algebra though. It teaches you to look at solving problems from different angles. Eg you don't always know the direct solution, but you can often find an indirect solution using the methods Algebra teaches. It seems like it may be a good idea to have more than just the basic Algebras given in high school, or at least require that CS students have taken a college level Algebra and demonstrated a reasonably passing grade. It's such a basic class that chances are they already are quite familiar with it -- heck, my school let me skip college level Algebra because I scored high enough in math on the placement exam to show that I already knew all it could teach me from high school. One of the many reasons I switched from CS to CIS was the fact that I just couldn't handle three levels of Calculus however. Now that I'm out here in the real world, I'm finding that for some reason not many people are demanding that I know Calculus III like the back of my hand. Go figure. Actually, some of the more advanced Algebra lessons are useless out in the real world too, but it's nice to pound in that mindset of solving problems from angles you normally wouldn't even think of. Doesn't hurt to get an early and healthy understanding of the concept of variables I suppose too, not that they are actually the same thing exactly.
I learned about fourier series in Linear Alg. but it's applications in the computer science/ engineering field are numerous. Also number theory is a good class especially for Cryptography.
At my university we did Discrete Mathematics, Automata Theory, Graph Theory, bin/oct/hex numerical systems, statistics and probability and a whola lot of other stuff
N.B. I'm talking about what passes for "Science" today in most academic CS departments. I'm *not* talking about the Turings, the von Neumans, the Knuths, or even the Rivests of the world.
Grumpy Old Scientist
What I've found most useful is Graph Theory and Formal Languages. I have a B.Math in CS and I've used just about every kind of math in my CS work.
My all time favorite university course was philosophy course on logic, we did pages and pages of predicate calculus, made our own Turing Machine, and studied the WWII Enigma machine. I found this course more useful than the maths I took.
While I was forced to study maths as part of my degree, I still think it was a waste of my time. Talking to my Head of Department before I left, he said it was purely a method to weed out those who would be poor CS students, when they didn't have the funding to cover all students, based on the fact that good maths students often == good CS students. Basically, you don't need mathematics for most computer science subjects. It's a complete waste of your time, avoid it if you can.
What a piece of work is math!
How noble in reason!
How infinite in faculties!
In plots and graphing, how express and admirable!
In Algebra, how like an angel!
In Analysis, how like a god!
The beauty of the world...
The paragon of sciences...
And yet... to me...
What is this quintessence of arithmetic?
Math delights not me.
Nice strawman arguments. Of course, it totally ignores my point ... which is why you trotted out the "straw man wookie look at this hand" ...
Basic math skills would have avoided some very costly mistakes. Of course, if the US had gone metric along with pretty much everyone else in the world, again, this mistake wouldn't have happened ...
Why math? I would argue that a solid writing or law curriculum might be even more valuable. You learn a great deal about logic in the course of writing and evaluating analytic essays/studying law, and in addition you learn the art of written communication, which is often lacking in CS geeks. I was a CS major and I've been a writer all my life. I often find myself using the same skill sets, whether I'm outlining an essay by breaking it down into logical subsections, or outlining a piece of code in the same manner. Logic appears in many disciplines.
Furthermore, whenever I get a job, I'm always told it's because I have great communication skills in addition to my standard technical background. The ability to write clear and effective documentation and comments is just as important as the ability to code, and of course those skills are linked, too. So I'd kill two birds with one stone: learn written communication, and practice the art of logic, by studying literature or law rather than loading up on math classes.
First IAACSM.
Here are the math classes that are traditionally required for CS majors in order of importance.
1. linear algebra (if you ever want to do graphics you need this).
2. discrete mathematics (usually 2 courses on this covering various topics, such as graph theory, proofs, etc).
3. stats. (Honestly I haven't taken the course yet, but stats comes up enough in other courses, like AI, that I wish I had.)
4. calc. (primarily because taking calc guarantees you can do all the little bits of arithmetic and geometry you will need. also, being able to differentiate a function is handy occasionally.)
There are people who will argue that calc should be number one, and I'm not saying it isn't absolutely essential *for some problem spaces*, but for the core problem spaces associated with computer science, you won't need it.
That said, all the math classes that are required for CS deps (at least the ones I've listed) are pretty handy tools to have in your box, and I don't feel like calculus was a waste of my time. It's just that if you absolutely had to scratch one of the four out of the curriculum, you'd probably pick calc.
Addition -- its all a freak'n CPU can do, remember?
- Linear Algebra
Sophomore Year- Diff. Equations
Junior Year- Design and Analysis of Algorithms
Senior YearTo do any significant research in CS, one needs significant amounts of calulus, statistics, and descrete mathmatics. All were used in my graduate studies, and the foundations of this help me to this day to any type of performance analysis.
why single out set theory?
Databases.
I only look human.
My mother is a halfling and my dad is an ogre, so that makes me an Ogreling
I studied calculus in college, but the most valuable course for getting my head around computers has been a rigorous high school geometry course, taken over forty-five years ago. The formal proofs of theorems help a person discover and learn to lay out a step-by-step algorithm of traveling from point A to point B in a process, which is what using computers and programming is all about!
Goddamned kids! Get off my lawn!
If I'm told that it will help me, then I will take it... I used what I learned in computer science to help me do my IB HL mathematics coursework last year.
ugh...
No Maria Callas for you then (or equivalent in the programming world).
Sometimes you have to put up with prima donnas if the benefits they bring outweight the problems thay cause.
IANAL but write like a drunk one.
For anybody related to scientific or engineering fields.
IANAL but write like a drunk one.
None, we should teach them MathS or Mathematics, but defiantly not Math, since it doesn't exist
Computing Science programs are designed to produce 'generic' candidates with no particularly strong skills in any particular area of IT. This philosophy assumes that the person 'should' be able to learn whatever they need to know for whatever job they want to do -- but this makes most graduates effectively useless and unsuitable for any particular position.
;)
In my view, the key for a CS candidate is to choose and specialize in one particular area they wish to work in -- be it multimedia, cryptography, and even in the software development area -- to focus on one particular area of specialization -- business software, scientific software, graphics and visualization software, etc.
So, if the question is what kind of math you should take -- the answer is in what you want to end up being able to do!
In my own case, complex math has proven virtually useless -- 99.9% of what I do that is mathematically-related is cost analysis spreadsheets where the business functions I need are built-in and not particularly difficult. If you wanted to specialize in cryptography, and had the desire to understand or build new algorithms, you'd need some heavy math, but just 'using' cryptography to accomplish the business goal of connecting offices through a VPN, you'd be better to take some courses from Cisco or Microsoft.
I would find a graduate-level course in graph theory to be more useful than any math class my university currently offers.
Of course, that's probably because my research involves graphs...
Twenties Retirement