What Math do You Use?
e_lehman asks: "I've been associated with MIT's introductory 'Mathematics for Computer Science' course for a number of years. The course has emphasized different topics in different years: logical foundations, proofs, probability, combinatorics, etc. But this is at the whim of instructors. What mathematical topics should we be teaching to budding computer scientists? What mathematics do you actually use or need, working in the computer industry? Here are some candidates: boolean logic, graphs, number theory, combinatorics, proofs, set theory, relations and functions, approximation methods, solving recurrences, generating functions, analysis of state machines, asymptotic analysis, and addition of small integers."
A solid grounding in maths is always good. When pushed far enough it caus you to develop different thinking patterns that address problems in new ways. Which are always useful for any problems.
If a CS student is to ever make something useful out of his maths, you should be teaching him analysis:
... and so on.
- 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.
&& aemula C. ab stirpe interiit
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!
"What you 'seek' is what you get!"
...I've studied relatively little theoretical computer science to date (but am meaning to work through Art one of these days -- maybe when volume 4 (?) comes out), but there are two things that I have found extremely useful to me:
-- 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.
I believe that Computer Science != Software Engineering. The job I actually ended up in is a programming job, which means that not all the CS I had is relevant. But that is good - they aren't meant to be the same thing.
For instance, in CS, to calculate the time efficiency of some algorithm, some really hairy analysis may be needed to decide it's actually O(n log log n). This is important as a part of CS. What is important for CS is not defined by what is important for getting a programming job. The science is important for its own sake, as a branch of math.
That said, logic, sets, graphs, relations, discrete algebra - the "discrete stuff" so to say, is both what I like best and what I think is central to CS.
I believe posters are recognized by their sig. So I made one.
I 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?
Two that you left out, which seem to find constant application in Software Engineering, if not pure 'Computer Science'
What mathematical topics should we be teaching to budding computer scientists?
:)
:)
Algorithm. I wondered why you asked this question. The CS degree courses around the world rely on MIT's textbook.
While you here, would you ask them why this book is freaking thick? We can complete no more than half of it before examination.
Many problems of efficiency and throughput can be modeled using probability and queuing theory. Also, probability is useful for lots of other things, like spam filtering and such.
I think it's less about how much math you will use and more about how math changes the way you approach problems. Exposure to math teaches people to approach problems systematically and logically. You may think that you're never going to use matrices and eigenvalues in The Real World, but math classes are worth more than mere knowledge.
My dingo ate your honor student.
Statistics. I strongly wish I had a deeper grasp of statistics in almost everything I do. Finite state automata and directed acyclic graphs may be all the rage in compsci, but if I compreheneded confidence intervals and probability distributions I'd do much better work than I currently do.
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''.
I am a student at the University of Minnesota. I have been working with faculity from the physics and computer science departments on and off over the last 4 years. Most of the math we have been taught is not really used in computer science. You have some analysis of run times and memory requirements, but so far nothing that required higher mathmatics. Differental equations have been the most useful to me. They are used in all kinds of different science and analysis of situations (fiscal models are big on them). From what I have seen undergrad CS is an alright intro to the topic, but you do not get to any of the really interesting stuff(iw you need higher level math) until you hit grad school or start working with researchers. Then it is really dependent on who you are working with. I am currently taking a grad course titled "Intro to Parallel Computing" and the most mathmatics we have used so far is stats to look at an omega network... not really exciting or informative.Good class and learning lots of stuff, but not quite there yet. I really think that most of the mathmatics that the students should learn are dependent on the topics they are being taught. Discrete math is very important, but was not very challenging to most of the students that took it. Mostly the mathmatics that are needed for a paticular topic should be taught in the class the topics are presented in. Think along the lines of self contained courses. I know diversity of ones education is important, but sitting through discrete math was a wasted semester. Sets, unions, intersections, and the pigion hole principel are not that hard to understand... and I can not remember when "proving" something was correct was actually useful. (I read a story about how this researcher proved this very short peice of code correct. Three other researchers found MANY errors for how small the code was.) Proving code may have its place but it is not something 99.9% of us are going to be doing with any frequency. What I would have rather seen is software enginering concepts introduced eailer and the chance to actually USE and explore the ideas presented there. /me is still bitter about the poorly run software eng course he took. It was so bad they are totally changing the course.
Anyways:
-diff eqs are good
-software eng good
-discrete math good but we DONT need a whole semester
-get involved with your profs it is one of the best thing you can do!
-The UMN is a great cs school. They listen to their students, have great instructors (we have many that have worked in industry and know their stuff) and is generaly a good place to be (ignoring the code, you are cuddled up next to your sparc station right?)
Ben
Set theory is extremely important in "the real world", especially for developers who write in any kind of query language (and really, what developer hasn't had to do that at some point, think SQL, EJB-QL, etc).
If every developer had a formal background in set theory, I wouldn't see quite so many bad SELECT statements, misuse of joins, etc. Bad queries can be a huge bottleneck in a DB drive application.
If I had to pick something else, how about a brief (but mathematical) introduction to cryptography? Public key schemes are easy to learn, and very interesting to the average computer science student. We covered this in one of my first math courses in University, and it interested me enough that I went back to take the dedicated crypto course in later years. The knowledge I gained there has been very useful in settig up servers, evaluating products with crypto, etc.
http://www.cs.geneseo.edu/math-thinking/
After 40 years using math for EVERYTHING in my day to day life, including my professional life, I'm amazed at what is most useful.
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.
PS. I really liked learning about matrices and vectors but I have no idea wtf section of maths that this is a part of?
:-)
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
My experiences from work...
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.)
Reccurence relations and generating functions are the spawn of Evil, DONT TEACH THEM!
My university offers exactly what you described should be taught in two lower level, required courses. MACM 101 (approximately the first half of your list) and MACM 201(what is left). MACM is a Math/Computing Science course. Other required math courses are the first year calculus courses and numerical analysis (another MACM course).
Trigonometry, and its applications to linear equations, are important to anyone doing 3D graphics work. It's surprising how many people can't visualize sine, cosine and tangent functions nowadays.
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...
A long time ago, in a galaxy far, far away ... I was admitted to the CS/SE honors program at the Univ of Houston. Had some of it paid for, but finances were not the issue - all Freshman honors students had a mandatory 6 hour 'kick your ass' English / History class designed to weed out the wannabes.
... but it was about -learning- those maths. Face it, Differential Equations, the higher layers of Statistics, the higher thought planes of Calculus - those are all some friggin'eh difficult concepts to grasp. DiffEQ is the Star Trek of math - all I remember about that was taking a very evil math equation and saying 'Ok, we morph this through the time-space continuum and in an alternate universe we use their math to solve an equivalent equation and then we bring it back to our universe by applying the Heisenburg principle ... voila - Solved!'
It worked. Neither English nor History were my strong suits and I wasn't about to subject myself to that kind of hammering when I felt that as a software engineer I should be focusing on other things. I didn't enroll at UofH and went to another University in Texas on a full ride scholarship. No 'freshman destroying' 6 hour English class required.
Perhaps all the math (more hours of math than the math major, as I recall) wasn't about -knowing- diff'eq, four semesters of Calculus, eight discrete maths, three semesters of statistics, etc
Think about it - in the event you actually do work for NASA or the NSA or whatever, do you want your group of peers made up of 6 week wonders with just enough MFC training to develop C code on Windows, or do you want a guy that can learn four chapters of advanced calculus in three weeks? Well I generally learned it overnight because I neglected the 'daily attendance' part of a few courses, but you catch my drift.
Right knowing that somebody got through college with their BS/CS under the Department of Engineering tells me that they do not know FEA (finite element analysis) but it also tells me that they can learn it in a few weeks. Ditto pretty much any language, or OS, or platform. It tells me that they can optimize a boolean expression in their head and if they don't know the answer to something they know where to find out.
Hard math in college is good - push em until they break. Then push em some more.
Glonoinha the MebiByte Slayer
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.
Particularily logic stuff and linear algebra, but I think that anyone with a CS degree should have a solid grounding in higher mathematics--including the more abstract, theoretical stuff that they may or may not have a use for in their career. You never know what bit of mathematical insight might come in handy down the road.
The field of Computer Science is closely related to Mathematics; I think that someone looking for something different would be better served by Computer Engineering, Software Engineering, or some kind of more specialized college degree.
In my current job (at a bank) I mostly use statistics, and a lot of analytic calculus. I work with vectors and matrices, so linear algebra is also crucial, but nothing fancy like I did in grad school. I do optimization as well, and monte carlo analysis.
Number one: get a good grounding in numerical analysis if you are going to be writing code that involves floating point numbers. Type
=normsinv(-8)
in Microsoft Excel to see why.
The most interesting course I've ever done is Quantum Computing.
A very interesting but very difficult course.
Linear Algebra, transformations, mechanics, the physics of rigid bodies are all great and very enjoyable when put into the context of computer software.
:)
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.
you missed a big part of the question here. MIT and any other university can come up with dozens of very interesting courses, including quantum computing. But what do you actually use and need in the real world ?
Since your homepage is a university computing society, maybe you should shut the fuck up and LISTEN in this thread.
PROBLEM SOLVING. Generally ordinary math classes don't teach it very well. You learn how to solve a certain type of problem usually, applied to artificial situations (direct questions like find dy/dx of x^2). This is good for learning the basic math, but it is not good for application to the real world until you get a science class such as physics where you get the general problem solving. In a class like physics every problem is stated in words based on a real world situation and you have to extract what it is saying from the real world situation, then use the appropriate equations. In physics math is just a tool to be used to help solve problems. I say physics because that is the science course I took. Additionally problem solving is important because most standard tests (GRE, SAT, company hiring tests) are packed full of problem solving questions. Standard math is not enough to get through them with perfect scores. Additionally after enough math classes and a science classes you pay attention to detail and apply mathematical thought to extract the meaning of a problem.
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...
I use Trig everyday, those 3D CAD programs are a pain! ;-)
I do everything the voices in my head tell me to...
Accounting. My checkbook. Nuff said.
My wife also uses Bistromathics.
This sig no verb.
I would include the following: 1) Understanding the logic of programs. You need to be able to understand and state what is true about your program and its intermediate states. I think we should probably teach more program verification, not because automated verification will work in general, but just to get programmers to think about their program is doing. 2) Analysis of algorithms. Read and understand the Cormen book. 3) Numerical analysis/discrete simulation. You want this to understand how mathematics connect the real world to programs.
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.
ID-10-T is a way of life
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 $.02"terrorism" and "pedophilia" are the root passwords to the Constitution
I took that class in 1995, and it was one of my favorite classes at MIT. It's a good class. And I will list below some suggestions for additions to the math instruction.
However, I will preface it by saying that there's no way you can take my advice. MIT is already trying to firehouse too much into the students to fit in any more. The problem is that much of what is being taught is pointless, simply group masturbation to the academic fetishes and buzzwords of two decades ago. And you guys can't pull the crap out and make a efficient class that teaches what you need to know, because of professor's need to continue to claim that their Phd. thesis meant something.
It requires too much self-honesty to really teach. You have to put yourself in the shoes of the students, and disspationately tell them what they need to know, even if it means telling them that your field is a dead end, even if it means forgoing the ego-massaging game of making them suffer as much as you did to learn something pointless.
(I advise my younger siblings and other students not to go to an expensive school, but simply the cheapest decent state school; I advise them that if they spend more than 2 years there they are wasting their time. The goal should be to drop out with straight A's after 4 semesters. Any longer stay is only justified if you are looking for a mate. And note that many people who take 6.042 are juniors and seniors; if I knew then what I know now, I would not have stuck around MIT long enough to take the class, even though I know it to be one of the 3 best classes I took there.)
So now that I've made clear that this advice is not directed to you at all but to the students who will read this, here it is:
-- Statistics. If you can push Al Drake's class earlier in the ciriculum so that most of your students have already taken it, that would be good. Otherwise compress it to a 20 page handout and do it one week, and then follow it up with a week of practical problems (I know 2 weeks is a big chunk of a semester long class). In particular, communicate the idea that a statistical study is not valid if designed after the data is in hand; have them write a program to analyze their data, collect it, and run on the data to get the result. If you can subliminally communicate that idea to them you will have done the world a favor. However, focus on getting the students to actually use some tool, Matlab or anything else, to actually manipulate a few datasets. And finally, look through a current issue of New England Journal of Medicine or any other medical publication and pick out the article most obviously fraudulent and do a lecture showing how to take the numbers in the tables, add them up and manipulate them, and confirm that they are inconsistent, contradict the details of the text, etc. It's easy, there are two or three patently fraudulent studies every month.
-- Practical search and indexing algorithms. If you had a simple bit of framework code, so that without overloading the students with figuring out compilation errors they can make an index storing various meta-information of all their email and text files, and then have a searcher with various options, and test some indexes that are the size of the dataset but search fast, some that are 1/10th the dataset and miss hits, etc, and examine some of the mathematical tradeoffs involved, that would extrapolate well to a wide variety of real world problems.
-- Using a symbolic algebra system as a practical tool. You have to quit making the students do intergrals, limits, proofs, etc by hand on pencil and paper out of the closed and blind belief that it will give them some sort of insight into the math because that's how you got insight into it. This applies accross the entire semester. Make them check every bit of math with Maple or Maxima or whatever software works for that particular problem. If those assholes working on the Larch proof checker stuff have ever gotten their act together and produced something useful, have the students learn to set up the axioms and check and generate proofs. These tools have to become like slide rules to the engineers of the 50's, like google to a plagarizing english student, like an oscilloscope. The software and interfaces aren't there quite yet, but you have no choice but to suffer with the imperfections and try to teach them how to do it anyway, because this is the future of how people will reason -- assisted by computers.
(Sorry someone just called me and I have to go, I will offer more as a response to this post later this weekend.)
It really depends what you're doing. In my limited experience:
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.
I've had this sig for three days.
..is it's almost never taught properly.
Show me a math problem, and unless you're attempting to calculate the interphase velocity of the warp core dilithium widget radiological decay.. I'll bet you a dollar that there's an easy to use formula for it.
Therein lies the problem: Math teachers seem reluctant to say, "You've got X, Y, Z. X is this, Y is this, Z is this. Once you've calculated those, plug them into this funky looking thing and solve."
Nah. They make everything into 20 steps, expect you to remember that if A do this, if B do this, if C, well, by jove, that's a whole 'nother ball game! They expect you to remember the most obscure bits of mathematical knowledge that you'll almost certainly never use.
Unless you're a hardcore mathemetician, you're likely not going to discover something groundbreaking. So, why don't they just break math down into the formulas that CS/IT/etc. people need?
To teach people 'how to think'? Feh. English does that. History does that. Programming does that. Any form of learning 'teaches you how to think'.
Indeed, logical/rational thought, for computer people, should be taught in computer classes. Not math classes.
I think the main problem is, back in the day, you had to effectively be a mathemetician to work with computers. Decades later, that's obviously changed, but colleges and universities don't see it that way.
Differential Eqs was a BREEZE. It was like learning cookbook recipe math. I had 2 semesters of it as a physics major.
4-vector math, now that's tricky.
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!
This is progress?
The sad reality is that, in 35 years, including time at scientific centers of some of the largest corporations, the highest level of math that has been asked/required of me was by an ex-cop who, every year the department's statistics were published, would (re)visit my office with the same question:
IOW while not much will be asked of you, you can offer much, and what you offer is up to you. Your only reward will probably be the satisfaction of knowing you did your best.
I'm all for the teaching of discrete maths. However, I am against only one type of math. Calculus is great. Business calc is great. Calculus mixed with Trig is something so totally alien, that few students can relate to it, and even fewer will end up with a real-world use for it. That's stuff an engineer might want. The second derivitive of COS^2/SIN means absolutely nothing.
As others have pointed out "rows" are probably "series."
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.
fwiw, i'm a cs student with a solid background in math (waterloo contest medallist)
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.
united states nuclear device terrorist bioweapon encryption cocaine korea syria iran iraq columbia cuba
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:
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.
Washington, DC: It's like Hollywood for ugly people.
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.
- 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).
-Looking for a job as a materials chemist or multivariat
...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).
sub f{($f)=@_;print"$f(q{$f});";}f(q{sub f{($f)=@_;print"$f(q{$f});";}f});
Background:
:)
Master's student, computer engineering (VSLI design)
Math I use currently and have used throughout university:
calculus (integral & differential), linear programming (interior point and mixed integer techniques), various logical proof stuff, fourier transforms (convolutions are everywhere)
Math you should learn if planning on passing computer engineering at a good university:
calculus, algebra, probability, more calculus, more probability, more calculus, and possibly more probability
Math is evil. A requirement of math is what kept me out of college in the first place, and I'm sure it's prevented me from getting a technical job, even though I have the skills to do that kind of work better than the glorified sock monkeys that are doing so many of them now.
Math BAD!
I don't suffer from insanity. I enjoy every minute of it!
a) There Exists the MIT text book which is excellent and full of algorithms, it is taught to most CS majors in algorithm class. "Introduction to Algorithms" by Carmen et. all. It has been posted in at least 4 other posted in the discussion, including one with a direct link to amazon.com...a recommend the second edition though
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 . 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.
Though many types of math are important in programming, the most commonly used is probably boolean logic. if then else.... :)
SSL Certificate
I'm in statistics, and I find myself consuming as much literature as I can on graph models.
If your just talking about what is used on the job as programmer/software engineer, then logic, as taught in an upper-level math class. It doesn't apply to any problem in particular; but it has taught me how to frame my thoughts accurately and efficiently. Math applied directly to the job would fall in the category of combinatorics, graph theory, and finite state machines.
damkoziol
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, Google will find a lot more. Oh, what the heck, I'll save you a few keystrokes: here.
philcrissman.com.