What Math do You Use? 102
e_lehman asks: "I've been associated with MIT's introductory 'Mathematics for Computer Science' course for a number of years. The course has emphasized different topics in different years: logical foundations, proofs, probability, combinatorics, etc. But this is at the whim of instructors. What mathematical topics should we be teaching to budding computer scientists? What mathematics do you actually use or need, working in the computer industry? Here are some candidates: boolean logic, graphs, number theory, combinatorics, proofs, set theory, relations and functions, approximation methods, solving recurrences, generating functions, analysis of state machines, asymptotic analysis, and addition of small integers."
Useful (Score:2, Insightful)
Useful for culling the herd? (Score:5, Insightful)
It worked. Neither English nor History were my strong suits and I wasn't about to subject myself to that kind of hammering when I felt that as a software engineer I should be focusing on other things. I didn't enroll at UofH and went to another University in Texas on a full ride scholarship. No 'freshman destroying' 6 hour English class required.
Perhaps all the math (more hours of math than the math major, as I recall) wasn't about -knowing- diff'eq, four semesters of Calculus, eight discrete maths, three semesters of statistics, etc
Think about it - in the event you actually do work for NASA or the NSA or whatever, do you want your group of peers made up of 6 week wonders with just enough MFC training to develop C code on Windows, or do you want a guy that can learn four chapters of advanced calculus in three weeks? Well I generally learned it overnight because I neglected the 'daily attendance' part of a few courses, but you catch my drift.
Right knowing that somebody got through college with their BS/CS under the Department of Engineering tells me that they do not know FEA (finite element analysis) but it also tells me that they can learn it in a few weeks. Ditto pretty much any language, or OS, or platform. It tells me that they can optimize a boolean expression in their head and if they don't know the answer to something they know where to find out.
Hard math in college is good - push em until they break. Then push em some more.
Analysis (Score:4, Interesting)
- Logic
- How to set up proofs
- Full induction
- Rows (pardon me if this is not the correct english word, something like Sum[v=0,eternity] of 1/v!).
- Functions (differential, integral)
- Differential Equations
- Function theory
Basically anything that will teach them what maths is really about and give them the ability to get along with maths in a scientific way on their own.
Re:Analysis (Score:2, Informative)
Series (and summation of series)?
Daniel
Re:Analysis (Score:1)
Re:obligatory anal math geek reply (Score:2)
Re:Analysis (Score:2, Insightful)
Granted, in most university undergraduate programs we choose real analysis as the place to start teaching "real mathematics" (instead of: insert integral/matrix/etc., turn crank, get output)... but this does not, to me, make analysis intrinsically fundamental. Of course, if you're going to go on to learn things like general topology... then it *is* important... but I do not believe topology is a field of principal importance for computer scientists (yet...).
The fundamental problem with your assertion is that analysis deals with real numbers. Theoretical computer science is all about *discrete* sets. In fact, if you give me a computer with just a single register that can hold a real number... I can easily show that computer to be capable of computing non-computable (in the sense of the Church-Turing thesis) functions.
Studying real numbers simply doesn't make sense for computer scientists (at least to start) when the domain in which they will be working is inherently discrete.
I *heartily* agree that they should see:- Logic, How to set up proofs and Full induction. These are absolutely fundamental.
However, why teach them about real-valued functions? No computer, nor any reasonable model of computation, can work with real numbers... why take time to develop an inapplicable theory? What would be much more relevant would be to teach the theory of recursive functions... primitive recursion, total and partial recursive functions... *these* are directly applicable to the world of computation.
Personally, I see fundamental mathematics for computer scientists as being: set theory (preferably axiomatic), logic, combinatorics, some abstract algebra, recursive function theory, formal language theory, automata theory and formal semantics. I think those alone would overburden a modern cirriculum... but then I am of the mind that computer *science* is mathematics... as opposed to the vast majority of my colleauges who seem hell-bent on turning CS into a tradeschool for Visual Basic programmers.
Still, to be fair to you, I would be overjoyed to see Computer Science programs start requiring a course in analysis. Not so much for the content, but for the exposure to mathematical rigour... something which is sadly in extremely short supply in modern CS cirricula.
series and infinity (Score:1)
As others have pointed out "rows" are probably "series." [wolfram.com]
It is said that mathematics is the universal language. It is still damn hard to have a conversation about it if both parties don't speak the same language.
Please God, let Parent be a troll... (Score:2)
- Logic
- How to set up proofs
-full induction
-Rows (pardon me if this is not the correct english word, something like Sum[v=0,eternity] of 1/v!).
-Functions (differential, integral)
- Differential Equations
- Function theory
Sheevus, I hope this guy is kidding. I had all that crap - minimal spannign trees, Dijkstra's algorithm, proofs - and I have NEVER used any of it. What I could REALLY have used was a far better grounding in linear algebra and such - fast matrix inverting schemes, etc. A class in pattern classification would be GREAT and would be a perfect lead-in to AI.
The best arguments I have heard is that these classes serve as good weed-out classes to get the idiots out of a CS program ASAP. OK, they work to that end, but wouldn't a hard but USEFUL class be better? Or just teach assembly for CS 101 (hell, if we're doing things chronologically, that should be first anyway...assuming we don't teach low-level machine language).
Re:Please God, let Parent be a troll... (Score:2)
So you've never worked in compiler implementation, in deductive databases, in network routing, in operations research and so on?
It's okay that you haven't found a use for these things (yet). You would be well advised not to diss hammers just because you've never seen a nail.
Re:Analysis (Score:2, Insightful)
This has several goals/reasons:
That's a good question! (Score:1)
Well, a great question sir, I have been studying 2 computer science courses last semester (erm computer science math). These courses talked about most of the things addressed in the question, and I doubt I'll ever need some stuff there in my real computer science life.
Well, we still studied some interesting stuff with applications in computer science, however, isn't it more useful to make the course more concentrated in stuff we will use all the time in the future!
I hope there are not much such courses in my university career anyway!
A couple of things... (Score:1, Informative)
-- Formal logic, so that I'm more used to judging e.g. that a function always returns, and properly, or
-- O( calculation, so I know how slow my worst-case scenarios are.
Hope this helps.
Jobs aren't the whole story (Score:5, Insightful)
I believe that Computer Science != Software Engineering. The job I actually ended up in is a programming job, which means that not all the CS I had is relevant. But that is good - they aren't meant to be the same thing.
For instance, in CS, to calculate the time efficiency of some algorithm, some really hairy analysis may be needed to decide it's actually O(n log log n). This is important as a part of CS. What is important for CS is not defined by what is important for getting a programming job. The science is important for its own sake, as a branch of math.
That said, logic, sets, graphs, relations, discrete algebra - the "discrete stuff" so to say, is both what I like best and what I think is central to CS.
Re:Jobs aren't the whole story (Score:3, Informative)
So, yes, all the "discrete stuff", as you say, but I view these more as the basic tool box for a programmer, and most people who are cut out for this work will pick up what they need in this area without a lot of formal training. The main reason to go deeper with this area is for a better understanding of cryptology and related stuff, and if you are getting into the "guts" of runtimes and garbage collectors, a more formal understanding of these ideas will be important, but I would say that the "Formal Languages" sutff is more important to programming work.
We create new "languages" all the time in the course of our work, so knowing what can be recognized and parsed with regular expressions (and the equiv. finite state automatons) vs. context free grammers helps when trying to specify something that is consistent and unambiguous.
I would also say that the math core (18.01-03 in my day, calculus through differential equations) isn't really essential to much, but probablity and statistics is a lot more important. I would also say that I didn't get much in my formal training that covered the topics important to analysing systems performance. I'm talking about the areas relating to latency vs bandwidth and throughput.
In retrospect, the "Computational Structures" course (6.032 in my day, which became 6.003 after I took it but before I graduated) lost it's relevance very quickly, or maybe I just forgot what I learned in this course. This was before the emergence of RISC architectures, and there has been enormous change in these areas since then, and I expect this to continue and maybe even intesify in the near future, so I would put more emphasis on these areas. IMHO, one of the main reasons that a lot of interesting new architectures fail (e.g. the connection machine) is that we don't have the basic mental and programming tools to deal with non-vonneuman architectures. Well, this really goes way beyond anything you can address with a course of study, but it would help.
Re:Jobs aren't the whole story (Score:3, Informative)
Algebra, set theory (including relational algebra and relational calculus), Boolean algebra, statistics, matrix operations, linear programming.
I've never had to use PDEs, Tensor stuff or even induction since graduating. Of course it depends what sort of programming you want to do. Systems programmers don't it, but an applications programmer in the engineering industry might well do.
Too far! (Score:2, Funny)
I know it is supposed to be an academic study, but this is just going to be too demanding. Where could you even find people qualified to teach such exotic stuff?
Re:Too far! (Score:1)
One thing, though I think EVERYONE should learn is trig. If someone can't program an anolog clock that plots lines from 0,0 to X,Y at a standard rate they arn't geeks. (y=r*sin(theda), x=r*cos(theda), theda = (secs/60)*2*pi)
Re:Too far! (Score:2)
A) try calling it Theta [reference.com].
B) your trig assumes that you've got a square screen. Most computer displays use non-square pixels.
Definitely (Score:1)
Algorithm. I wondered why you asked this question. The CS degree courses around the world rely on MIT's textbook [amazon.com].
While you here, would you ask them why this book is freaking thick? We can complete no more than half of it before examination.
Re:Definitely (Score:1)
Probability and Queuing Theory (Score:2)
Math is more than just math (Score:4, Insightful)
Re:Math is more than just math (Score:2)
Re: Math is more than just math (Score:2)
> I think it's less about how much math you will use and more about how math changes the way you approach problems.
I agree (mostly), and would go further to say that it changes the way you approach problems because it changes the way you think about the world.
I added the "mostly" qualification because IMO we'll soon reach the point where society wants us to concentrate more on getting our products right than getting them out the door, and at that point "programming" will be forced to become a math-based engineering discipline, and we'll start using our maths very explicitly.
As for the "Ask Slashdot" question, the math needed for programmers to understand what they're doing is all the 'discrete' stuff people are mentioning: logic, sets, relations, functions, graphs, basic proofs, etc. You may never use these things explicitly during your programming career, but they will inform your intellectual life and have a big impact on the way you write programs. (Hopefully, in a way that causes you to produce fewer wrong algorithms.)
IMO the other good stuff so many people are mentioning, such as linear algebra, trigonometry, calculus, differential equations, numerical methods, statistics, etc., are not fundamental to computer science, but rather are important to specific types of application. Thus they should be moved out of the core CS curriculum in order to make room for as much of the discrete stuff as possible. (Or maybe leave in a "pick one" advanced math requirement.)
Still, I would encourage students to study these "non fundamental" mathematical topics if time allows, because some of them really will fundamentally change the way you look at the world. It would be nice for a CS degree to include them all, but the typical CS program is already so packed that most students can't finish in 4 years.
As an aside, IMO one of the most important courses a CS student should take is an algorithms course. (It's a killer hard course, so you may want to take it on a pass/fail basis.) The course will include a mathematical treatment, and you'll have to thoroughly master all the 'discrete' math stuff before you attempt it, but it will really open your eyes to the possibilities of what you can do algorithmically.
Maths I Use? (Score:5, Informative)
FSMs , Graphs, Numerical Analysis (Score:5, Insightful)
Their analysis, NFA to DFA transformation and the applicability of FSMs to most stateful problems
(protocols, lexical analysis, communications, etc.)
Use of graph representations for the analysis of many of the same problems mentioned above
Methods for modeling continuous phenomena discretly.
(Euler Integration, FEA, Meshing, etc.)
All these thing consistently make my job easier, more interesting and, continue to provide a level of insight to tricky problems (especially the first two) that exceeds simple 'programming'.
The two most under appreciated courses of all time in Computer Science education have to be the Theory of Computation (FSMs etc) and the Discrete Mathematics (Graphs, Numerical Analysis, etc). An alarming number of new graduates cannot phathom how to apply this stuff. It's powerful and once you start using it, you'll always see things a little bit more ''completely''.
Re:FSMs , Graphs, Numerical Analysis (Score:3, Insightful)
I worked at a large defense contractor and we developed OCR and hand writing recognition software. We used many ideas from controls systems, including FFTs and many image processing algorithms. Finally we placed our own customized (and patented) neural network over the top to categorize the images based on the results of the other algorithms. 99% of the math that I used for this job was either AI related (Neural networks, Support Vector Machines, Simulated annealing) or image/controls related (scale reduction, FFT, filtering, etc).
Currently, I work in quantitative finance and I study quantitative finance at NYU. Although the program is *very* mathematical, my computer programming has been limited to solving partial differential equations using Finite Differences and Monte Carlo simulations. Although neither of these seems like a very sophisticated numerical method (compared with FEA and Galerkin methods), there is much math involved in tuning the finer points of both methods.
Finally, I consider Numerical methods something different from understanding the mathematics of computer science. The numerical methods are something that should not be taught in a Mathematics of CS course. The mathematics would be to understand the underlying PDEs that need to be solved or understanding exactly what each image processing algorithm is telling us.
I believe that finite state macines and graph theory are useful in computer science from the professor's viewpoint, but when it comes to a practitioner, modeling/PDEs are most widely used.
Re:FSMs , Graphs, Numerical Analysis (Score:2, Funny)
* Finite State Machines
* Graph Theory
* Numerical Analysis
Hey! I've never had to do that sort of thinking with Windows Visual Basic
Why just the other day, I was getting stuck declaring a variable, and was just sitting there pondering, and all of a sudden this really smart paper-clip comes up and says "It looks like you're defining a variable!" - He was really helpfull!
Try VB.NET and you be a much more productive prorammer with only 5% of all that difficult thinking!
Re:FSMs , Graphs, Numerical Analysis (Score:2)
* Finite State Machines
* Graph Theory
* Numerical Analysis
Hey! I've never had to do that sort of thinking with Windows Visual Basic
Why just the other day, I was getting stuck declaring a variable, and was just sitting there pondering, and all of a sudden this really smart paper-clip comes up and says "It looks like you're defining a variable!" - He was really helpfull!
Try VB.NET and you be a much more productive prorammer with only 5% of all that difficult thinking!
(I reposted this because some stupid modaraotor flagged my original as flamebait - it's supposed to be a joke. Maby a poor joke, but that's another issue)
Re:FSMs , Graphs, Numerical Analysis (Score:1)
Well I liked it.
From a 4th year student (Score:2, Interesting)
Definitely set theory, how about crypto? (Score:4, Insightful)
If every developer had a formal background in set theory, I wouldn't see quite so many bad SELECT statements, misuse of joins, etc. Bad queries can be a huge bottleneck in a DB drive application.
If I had to pick something else, how about a brief (but mathematical) introduction to cryptography? Public key schemes are easy to learn, and very interesting to the average computer science student. We covered this in one of my first math courses in University, and it interested me enough that I went back to take the dedicated crypto course in later years. The knowledge I gained there has been very useful in settig up servers, evaluating products with crypto, etc.
Math is Essential (Score:1)
My experience. (Score:2, Funny)
The fact is that, after all this time, the most useful and frequently used math isn't algebra, or geometry or calculous, or statistics. The amazing thing is that most of the math is on my fingers.
Re:My experience. (Score:1)
Re:My experience. (Score:2)
I'm still at uni and already I've worked in places that needed karman filters and extended karman filters.
Re:My experience. (Score:2)
Re:My experience. (Score:2)
Control theory (Score:4, Interesting)
There are all kinds of embedded applications that require a lot more knowledge about resonances, loop gain, bode diagrams, filters, etc. than I got in CS.
Any sort of feedback loop can oscillate or ring if it's designed improperly, and there's a whole science to designing them properly that I wish I'd studied.
Any sort of modem (includeing cable, DSL, and radio) requires FFTs and filters. Cepstral analysis seems to be incredibly cool given how often it comes up when breaking audio watermarking schemes, but I don't know much about it.
Group theory comes up a lot in error-correcting codes.
3-D graphics requires a solid grounding in linear algebra and trigonometry. (And games these days involves feedback loops of NPCs responding to players and each other - see above.)
Re:Control theory (Score:2)
Aren't some of them supposed to do that?
And aren't those things you didn't get enough knowledge about in Computer Science the kinds of things that one studies electronics to learn about? Or are we getting into an unresolvable discussion about exactly what Computer Science is?
Re:Control theory (Score:1)
'Amplifiers oscillate, and oscillators don't'
You never quite realise how true this is.
Exactly what I've learned (Score:1)
Don't forget trig! (Score:4, Interesting)
In grade school I had one CS teacher want me to help a fellow student animate a sprite-based ferris wheel on the screen; I used a simple loop from 0 to pi/2 in small steps, with sin and cos functions to place 4 cars on the wheel. The teacher was amazed at how smoothly the wheel ran, and didn't seem to understand how it all worked...
Re:Don't forget trig! (Score:2)
Re:Don't forget trig! (Score:2)
Really, the only way to teach this is to go on to either calculus or linear algebra, and then go BACK and redo trig.
Excellent question! (Score:2, Interesting)
The phycist's approach has changed over the last few decades with the improvements of the personal computer. While there used to be "the theorists" and "the experimentalists", there is now a new group: "the computationalists".
Phycisists are usually well trained in applied mathematics, calculus, applied PDE's, group theory, linear algebra... you name it, but that's not OUR main problem: we suffer from not being great coders. As a computationalist, I can tell you that many a phycisist will apply brute force and rely on the power of computers to get them the answer by the end of the week, rather than writing elegant, efficient code that might give you the answer in an hour! I suppose this is a little off-topic, but keep on focusing on execution time and algorithms, and spread the good word of computer science to other branches of science. Physics, Chemistry and many of the physical sciences rely on computation, and make huge Beowulf clusters and MPI to do their calculations for them. Perhaps they could save a buck or two, OR get results faster by learning a healthy dose of solid computer science.
Secondly, I just heard a quote from an unknown source: "There's the right answer and the wrong answer. In modelling, there's the third option: the irrelevant answer". Focus on teaching people what is relevant, and what should be solved by other means than sitting behind a computer.
Re:Excellent question! (Score:1)
As a computational chemist, I can sympathize with your plight. My undergraduate training in chemistry exposed me to some of the more practical higher maths, and my graduate work armed me with a thorough understanding of Clebsch-Gordon coefficients and the Grand Orthogonality Theorem; yet All I Ever Knew About Computer Science I Learned From Commodore 64 BASIC! Unfortunately, "know" and "want to know" are two different things.
Nevertheless, I _do_ program and I consider myself a programmer. My meager self-made computer skills provide me with a good intuition about the most straightforward, bare-bones process to solve most computational chemistry problems, since many are inherently serial (equation 1 begat equation 2, etc.). When the problem is more complicated than that, I find my algorithms skills are not quite up to the task. That's not too surprising, since eventually everyone comes across a problem they can't intuit away. What I find most surprising -- and disheartening, too -- is the utter lack of primers to teach scientific programmers the computer science they need. Sure, the basic books on modern programming languages are legion, but go searching for good examples and you'll find little help among the game, database, and web guides. Not everybody is trying to build an accounting system!
A request to "applied" computer scientists out there: could you please share your mad optimization and algorithm skillz with the hard science types who lack your fine touch? We've been using C/FORTRAN like a sledgehammer because we don't know how to use a chisel.
Re:Excellent question! (Score:2)
Quantum Mechanics (Score:3, Insightful)
A very interesting but very difficult course.
Re:". . . do you use or need ?" (Score:2)
>What mathematical topics should we be teaching to >budding computer scientists? What mathematics do >you actually use or need, working in the computer >industry?
This seems to be two seperate questions.
A knowledge of quantum mechanics is very highly regarded by many scientists.
I personally would say it should be taught to those who want ot know it.
Application-Applicable (Score:2)
Something else that seems to capture my imagination (at least) is the physics of raytracing--materials, specularity, translucency, refractive indices, caustics, radiosity. It's all great stuff to learn in conjunction with OpenGL and DirextX. But what's state-of-the-art? What's the most advanced technique? Teach them some cutting-edge stuff pulled directly out of recently published papers.
Other things that are tremendously interesting are media compression types--wavelets, fourier transforms, etc.
Well I think so anyway.
Most Important use of math....... (Score:1)
Mathematical tools used in CS sometimes:
- Probability [used in simulations to some degree and algorithm analysis however for most algorithms made by programmers it isn't necessary, and usually if an algorithm complicated enough to need it for analysis is used, it is a standard algorithm with the analysis available in a book. For simulations many times the equations/numbers needed are taken by simple formulas based on frequencies]
- Combinatorics [used in statistics/probability but can often look up solutions required. Used in algorithm analysis, but usually simple either addition principle or multiplication principle for nested loops. Most combinatorics algorithms are well known though and can be modelled based on a standard algorithm]
- Induction [most programmers I know run with input instead of using induction to prove correctness]
- Calculus [ mostly unused by programmers..any transformation on a calc equation is often done by the business users of a system. However differentiation is simple but libs/maple can do it for you. Integration, mostly you use numerical methods since the majority of real world problems can't be integrated...tons of libraries for that. Maple or Mathematica can handle any transformation you can't]
- Linear Algebra [ tons of good libs to solve equations. and trying to solve it on your own can result in incorrectness ]
- Numerical Analysis [ most algorithms taught in that class are available in psuedo code from a good algorithm book]
- Differential Equations [ equations we can solve in class for real are limited. Mostly it comes down to numerical approximation methods see Numerical Analysis]
- Algebra [Widely used but can get along with out. Comprehension of variables is VERY helpful in learning computer language though so recommended]
- Logic [ Mostly I found logic obvious, but it is important. Obvious and means both or none, or means either or both, xor and so fourth. Some of demoir's theorems come in handy. For hardware though k-maps and other logic simplification devices are very valuable.]
- Relations/Sets/Relational Database Theory [I recommend this because relational databases are important and a lot of people working on them still don't understand what a join does or why their query generates a cartesian product and so forth. It is possible to learn relational databases without it, I did just fine. However the math theory would help many misconceptions about it]
- Number Theory [much of cryptography is based on this. But the typical user doesn't care. Aka RSA used number theory and came up with a recipe Z = (p)(q) and all the rest of the equations. You can look up the mini algorithms used in an algorithm book ( find prime, solve modulo equation, etc. ). However most users would just use a cryptography library anyway so the point is mute ]
In conclusion I see math as unimportant to a computer programmer in the sense that you can't program without math. However taken as just another tool in a programmer's vast toolbox, math is useful. And knowledge of algebra definitely makes programming go faster than looking up equations or using maple for them. However the mathematical form of thinking is valuable. And problem solving skills are gold. That is the key for being a programmer. So I recommend you all take physics!!! For theoretical work a mathematical background is useful though. For hardware work, mathematics are vital to simplifying the hardware. Knowledge of the standard algorithms and definitely O notation and at least enough algebra to know O(E^x) much much much much much worse than O(n*ln[x]) is good for the good programmer. However most programming work is just logic and looping based on business rules. But there are fun jobs which require more complicated techniques. Most problems can be modeled as a standard algorithmic problem, but it helps to understand the measures of efficiency to know which one to use. it also helps to understand the weaknesses of each algorithm. Don't end up like Rando the demon on Yu Yu Hakusho, he lost the battle for not understanding the weakness of his own stolen technique! Also keep in mind that most higher math is done by specialists and the equations are given to programmers. As one example, statistics work and equations are quite often done by a statistician who has a graduate degree in math/statistics. Accounting equations are often done by an accountant. So for general programming you don't need to know most higher math. But if you are looking to work on theory then yes you should know as much higher math as possible. Then go solve an NP complete problem with a polynomial algorithm so you can make yourself famous!!!!
And that's the bottom line, because cervo said so...
Trig Everyday (Score:1)
I use.... (Score:2)
Accounting. My checkbook. Nuff said.
My wife also uses Bistromathics.
Logic and Analysis (Score:2)
Whew... (Score:1)
Ignore the specific topics for the time being: let's teach students better problem solving skills or better communication skills.
Problem solving skills lets you work better independently and makes you an asset to a team.
Communication skills ensures that you're not wasting team time when you have to ask for help.
Or how about teaching students how to learn (outside of a class)? New technologies emerge all the time. You are going to have to continue to develop your knowledge once you leave the school. School seems to focus on teaching the current technologies, what about future stuff?
Not knowing what purpose the DOM serves isn't going to make you bomb your job interview, but not communicating well certainly will! School should teach employable skills.
Too broad a question. (Score:1)
After more than 20 years in the industry I've found Computer Science to be an excellent general preperation for future specialization in a particular field. Computer Science is a major, not a career. As such, the roll of a CompSci track is to give as broad a range of knowledge to the graduate as possible.
The reality of the situation though is that (unless you are a professional student on the professorial track) once you graduate and get into the "real world" you will immediately specialize. This almost always means taking more classes which specifically apply to the area your in. A System Administrator may program (I do often) but the mathematics I use is entirely different than someone who writes compilers or crypto, etc. In my career I've had the opportunity to have many "specialties" over time.
When I was programming for a company that integrated shop-floor equipment with their job-scheduling software I had to learn a lot about different algorithms for scheduling complex jobs in and industrial environment. Later, I was involved in writing custom accounting software that required a lot of knowledge in fund accounting. Well, back to school I went... I am currently employed as a Systems Administator and have to use math every day. Some of it I had never learned fully, or had forgotten. However, I do have a good solid background which makes learning "new" math skills much easier.
I guess what this is all leading up to is that any good CS program should teach a good solid mix of basic mathematics courses and then offer specialized high-level courses that apply to specific "tracks" in the technology world that the student feels drawn toward. I think most CS programs do this. And, although I feel math is extremely important in the computer field, I don't think, for most people, the higher level mathematics courses will be critical to success in a future career. If they have a solid general background they will be able to take specific courses later on to cover areas they may need for specific situations. Contrary to many graduates beliefs, graduation isn't the end of learning, it's the beginning.
That being said, if I had to pick 2 courses that were MOST consistently usefull to me over time though, I'd have to say logic (boolean algebra, et al), and statistics (all flavors). I don't think anyone can have too many statistics classes as it is so usefull in all areas of analysis, prediction and whatnot.
Just my $.02All of it! (Score:2)
Graphics -> Probability
Hardware -> Boolean Logic
Software Engineering -> Graph Theory
Basically Everything -> Discrete Math
But the most important skill you'll learn in a CS Math course is to look at a problem and know intuitively if it's possible, and whether it's going to be easy or hard. Exponential search space, but we can limit it to 24-bit integers? Easy. Requires 100-bit precision? Probably doable, but hard if I don't have good libraries. Optimize an 8-input boolean function? A bitch by hand. A bitch to code. Numbers don't matter, we have the best tools of any profession, including mathematicians, for dealing with numbers. It's feeling these values and knowing how to deal with them that is the valuable skill. And, really, a one-semester course can give students a feel for basically anything... if it were my course, I'd skip probability and such, and make them take a specialized class there, and then try to cover boolean loggic, discrete math, and set and graph theory, probably along with some estimation techniques in a non-rigorous fashion.
Re:The problem with math.. (Score:1)
Unfortunately, that approach has a serious flaw - it tends to produce students who get lost when they have to deal with a situation that wasn't covered. I remember doing the applied maths courses when I was preparing for university and some people would just plug numbers into their familiar formulae even when the formula didn't apply
First Principles ... (Score:1)
The mathematics that I believe should be taught as the very first thing would be linear algebra - in all its formal glory.
This may not go over particularly well, but a mathematician that I respect a great deal offered this comment:" Most of mathematics deals with linear things; since linear mathematics applies to a lot of mathematics itself, this should be the very first thing taught. The formal proofs and other mechanics of mathematics are included in the price of admission. And, it has immediate practical relevance. The concepts are simpler then real analysis." ( the basis of the calculus)
In my work, I found this to be the case. Electrical Engineering is now full of group theory ( abstract algebra of galois fields for error correction, coding, spread spectrum stuff, etc, and it all runs on micros - which is within CS)
At a guess, I would have to settle for what Knuth considers to be important, or courses which make the reading of the Art of Computer Progamming easier. Not because Knuth is Knuth, but he does have a very practical view of algorithms and their design.
Other posters have fairly extensive lists as to what they found useful - reading them ( and modding them up) would be a nice gesture!
Maths... (Score:2)
Re:Maths... (Score:2)
Actually, it means sin*(csc^2-1)(2csc(csc*cot))... or something... I don't know, and since I'm not in first semester calc anymore, I don't care. Well, I guess trying to be a smartass just backfired. Anyway, all I care about right now are series and parametric equations, the current topic in third semester calculus. Will THAT be used, I wonder?
Re:Maths... (Score:2)
Calculus mixed with trig is fundamental to many kinds of numerical simulation problem. Admittedly, you generally solve such problems numerically rather than symbolically, but still.
my votes (Score:1)
discrete math, boolean algebra, linear algebra, and differential eq's.
discrete math for creating the habit of asking, "does it work for _all_ cases, or could there be an exception i've overlooked?" i ask myself that way more often than i ask, "is there a way to simplify this conditional test?" and i'm so glad i paid attention to deMorgan's laws. i've never had to use differential equations, or linear algebra, in any of my programming classes so far yet, they have been good training - linear algebra for recognizing that there are _ranges_ of solutions, not just one, and differential equations for recognizing that there's usually a simple pattern buried somewhere in the big ugly mess.
my favourite example of this: if you write out the formal definition of e^x, wtih x set to pi*i, you'll see (if you step back a bit and squint) two overlapping patterns: one is the cosine of pi, the other is the sine of pi. it's a thing of beauty.
It depend...... (Score:2, Interesting)
I've been a generalist for the last 21 years. I've worked multiple indiustries, been everything from architect to team lead, grunt, QA and CM Nazi.
Most of what I use is boolean algabra. Actually a logic class in the philosophy dept was a killer and helped a lot.
Anything with word problems. The old junior HS if a train going east.... Or the first semester Calc differential equasions. Anything where a problem is stated and a solution has to be found. anything where you have to get from point A to Point B and show how you got there.
Set theory is needed.
The Math learned from "The Dragon" book on compilers was good.
Being able to do hex/octal/binary math is required with debugging sessions and TCP/IP programming.
Where a lack of math failed me:
Embedded == Calculus (Score:2)
BTW, when I'm talking about 'embedded' here, I'm talking about the traditional embedded industry: industrial control, security systems, fuel injectors, medical instruments, satellites, etc. There's another so-called embedded industry that's all about set-top boxes and PDAs, but it's a lot less electronics-oriented and less hard-core. Most of the time, when people talk on Slashdot about 'embedded', they refer to the second form. However, if you go buy a magazine about embedded systems (Circuit Cellar, Embedded Systems Programming), it will deal mostly with the first one.
A place to share code and algorithmic knowledge??? (Score:1)
I already answered to this /. question, but here I go again: The suggestion of the fellow above is a good one. It would be nice if there was a website that would post, store, distribute, collect code, algorithms, mathematical tricks, hints on what approach to take to a given problem. Example: about a year ago I wanted to solve a set of coupled, nonlinear, stiff algebraic differential equations. I found LSODA and other excellent code from Lawrence Livermore Labs, written in Fortran, but after fiddling with the code and entering my problem, the original code didn't seem to want to solve the system for more than ~10 coupled equations, and I needed to solve it for ~1000. I happened to find out about Matlab's implementation of DAE solving, which incidentally uses LSODA, but the implementation was optimized such that it solved my 1000 equation computational problem in a matter of seconds, compared to minutes for the 10 equation problem with the original Fortran code.
Long story, but my point is this: it would be great if I could go to "www.applied-math-and-cs.com" (that's the name of the site that we should make!) and find out about this instead of spending weeks on the wrong solution and then finding the better way to do it by fluke! I asked many physics and cs-people along the way, but noone could give me this simple advice of using Matlab's interpretation of LSODA.
Many computational problems are common in the physical sciences. People get introduced to Monte Carlo simulations through the simple explanations of their grad-school professors ("you calculate the probability of the next move based on an Arrhenius behaviour, and move your atom if a random number is less than this probability..."). Sounds easy, but of course you're wasting many many loops when this condition isn't met. Then, you learn about kinetic Monte Carlo which uses every loop... etc.
It would be nice to have a "resource center" for this kind of problems. Anybody interested in starting this? Or perhaps it already exists? I know about "MUG" (the Maple User Group, out of U. of Waterloo, I think), and this group is good, but too Maple-centric and heavy on the pure Mathematics, but so focused on the applied side.
Re:A place to share code and algorithmic knowledge (Score:1)
B) Another GREAT book is called "The Algorithm Design Manual" by Steven S. Skiena. It focuses more on the algorithms than a mathematical analysis of them. It teaches you how to model problems. The second part of the book is just a catalogue of algorithms. The revevant part to your discussion is here [sunysb.edu]. It is the algorithm repository. It contains many implementations of algorithms in each langauge. Some implementations have weird licenses but aside from that it is a great site.
In my experience... (Score:2)
...just about every area of mathematics that a typical CS undergrad learns is going to come in handy some day.
Take, for example, predicate logic. Most of the time, you don't need it. Until, that is, you have complicated business rules to enforce in your program, at which point the best solution is often to encode the rules as axioms and write a theorem prover (or write this part in a logic language, such as Prolog or Mercury, but you still need a grounding in predicate logic in order to use a logic language). Theorem proving also turns up a lot in compilers, in type analysers and optimisation passes, where a transformation may only be valid if some property of the code holds; so you have to prove the property correct before you proceed.
In the end, though, I think the most important skill for a software engineer is to be able to choose between tradeoffs. Determining what the possible tradeoffs are is something that only comes with experience. (If I give an experienced software engineer a problem, they should be able to see at least three potential solutions to it.) However, the training comes in when it comes to evaluating the possible solutions. Which has better algorithmic complexity? Which has better constant factors? Which uses less memory? Which has better cache locality? Which has better lock contention? And, once you've answered those questions: Under what circumstances are the previous issues important?
Evaluating possible solutions may in general require all sorts of mathematical skills from the analysis of algorithms, to graph theory, to statistics, to approximation theory, to asymptotics and so on. If there was one skill which isn't currently taught that I'd nominate as vital, it's the ability to estimate (i.e. to perform informed back-of-the-envelope calculations).
Re:In my experience... (Score:1)
Anything more is a waste of time for most programmers, at the very least since if they can't learn it as needed then they won't be able to remember it from their college years either.
Math Is Evil (Score:1)
Math BAD!
um, boolean logic (Score:2)
Mathematics for Software Engineering? (Score:1)
important math (Score:1)
Godel, Escher, Bach (Score:1)
This isn't exactly what I'd call `practical' computer math, but I would by all means try to expose people to it. I first heard of it when our Computer Science teacher (12th grade; language was Pascal, to give an idea when this was) read some of it to us, to try and illustrate the concept of recursion and recursive algorithms...
Reading this book, years ago, first gave me the inkling that mathematics and computer programming could be interesting and cool in and of themselves, and eventually this grew into the impetus to learn more.
Of course, when you tell people that you really became interested in Computer Science because you were interested in Godel's Theorem, they think you're pretty strange. But, from a learning standpoint, it's easier to learn if you have a genuine interest in something; and for me, it's these strange, paradoxical-seeming branches of math that don't necessarily seem to have any practical applications (like Godel's Theorem, or Cantor's countable and uncountable infinities, or Quine's Paradox) that made the rest of math come alive.
I'm sure this is a little off topic, because I'm speaking of make I like, not math I use. I just couldn't resist plugging the book that got me interested in math in the first place... A good review can be found here [genie.co.uk], Google will find a lot more. Oh, what the heck, I'll save you a few keystrokes: here [google.com].
Re:Who let the nerds out? (Score:2)
Linear algebra, I think.
(the courses I've done that specifically dealt with this sort of thing were called Algebra & Geometry and Linear Mathematics, if that's any help)
If you need to wait until a college professor instructs you about computing then its already late to get into computing IMHO. =)
As a second year maths student who writes programs in his spare time, I can agree with that one