Math And The Computer Science Major
An anonymous reader writes "What sort of math are CS majors expected to take? Why are these classes useful? Does programming really have that much to do with math? Lineman.Net has published an article that answers these questions and more. If you are considering a CS degree, be sure to give it a look and make sure you are taking steps to prepare for your college career."
As a student graduating (June) from a CS similar degree, I take this opportunity to warn/help inform others about such fields.
:-)
If you truly love programming and want to code for a living, do NOT attend such Universities as DeVry, many State Universities, or other small "tech" schools. This may sound like common sense to some, and outright madness to others, but trust me on this one. I personally am about to graduate from DeVry, and, although it's surprising reputation, they in no way prepare a student to enter the world of programming. The majority (I'd say 70%) of the skills I've obtained have been acquired by means of self-teaching and learning from friends.
More and more, I've been seeing that "programming" degrees focus much more on the management side of things, instead of the developer role. Perhaps this is because of the apparent problem of off shoring IT jobs? The main problem is not that the Universities have changed to this approach, it lies in the fact that the said schools teach in such a manner, WITHOUT advertising so. It brings about a sense of deceit and trickery...but perhaps that's what they were going for?
01000001 01011001 01000010 01000001 01000010 01010100 01010101
Not entirely unrelated question about high school math: A couple of weeks ago I was out with my little brother who recently turned 18 for a beer and to shoot pool. He was having trouble making shots so I said "Imagine the table is a large sheet of graph paper when you plan your angles and shots." he said "I've never used graph paper."
He's graduating from Grade 12 this year, am I just a relic[0]? What do schools use now to teach geometry? I hope it's not all done on a computer, the practical hands-on stuff is invaluable.
[0] I'm 38; mom died in '82, dad remarried and could still get wood.
Trolling is a art,
At my school, Xavier University, Math and Computer Science are a single department. It makes sense, though - the study Languages and Automata is an extremely mathematical pursuit, but it's also very important to Computer Science. The same could be said of any number of different CS related topics.
My blog
As with many things you do, you can do it quite a while without getting heavily into math, but when you deepen yourself you have to understand math and master it to a certain extent. For several years I did quite a lot of sw development without really using math, but when later starting my PhD I would have been lost without math. Programs are math. Every program can be converted to lambda calculus which is a mathematical expression form. Programs are art, as well as math can be seen as, and... programs are literary work. A certain story or idea can be expressed in many ways, without changing he actual idea behind the program. This is also the reason why software can not and should not be patentable, as it is now within USPTO (due to an old mistake...).
For my BS in Comp Sci (1992 U of Wisconsin), I had to take 18 credits of math, and achieve a B average in those courses. The 18 credits comprised:
Calculus 1: 5 credits
Calculus 2: 5 credits
Calculus 3: 5 credits
Matrix Algebra: 3 credits
Although the University offered minors, my college (the college of letters & sciences) did not. If they had, I would have taken the remaining two credits in order to get the minor in math.
IMHO, the assistance that math has provided me has been invaluable in my career. NOT because I use calculus on a day to day basis, but because it forced me to develop critical and systematic thinking skills. And THAT has been invaluable. At the time I hated it, but in retrospect it was really good.
$.02.
Key to financial independence: Spend less than you earn. Save and invest the difference. Do it for a long time.
College is not a vocational school, although that many would argue that DeVry is a vocation school.
College is supposed to teach you how to think & learn... it's become a necessity since US secondary schools are so malfunctional. Your college classes should give you a base of knowledge about whatever you are studying, and the rest is up to you.
The reason that top schools like MIT are top schools is that they force their students to explore and learn new things. If you are a serious student, you can come away with a good education from almost any school.
Conformity is the jailer of freedom and enemy of growth. -JFK
Let me second this. A good software engineer still needs to know the math behind what he's doing. Intuition can go a long ways, but sometimes intuition is wrong. And sometimes there just isn't a good way to develop something without invoking a few formulas. (Anyone who's developed a file system, say "Aye"!) The bright side is that most engineering work doesn't really require anything more complex than high school math. (Assuming that they're still *teaching* high school math. Grrr...)
My best suggestion would be to shy away from any school that skips over the theory and math behind computational sciences. I myself ended up skipping the degree all together and picked up the various textbooks and papers necessary to educate myself in the field. That's not the path for everyone (especially if you're not very self-motivated), but for me it was better than trying to sort through which school was teaching the real thing and which one was dumbing it down to improve attendance.
Javascript + Nintendo DSi = DSiCade
THANK YOU for saying this! I got into a huge debate one time w/ a classmate because he was complaining about how Automata Theory (Language Theory) should not be a Comp Sci class. I was dumbfounded... This was perhaps the "truest" computer science class that was required for a degree at UT Austin... and in my opinion perhaps the most interesting class at that.
I'm only paranoid because everyone is against me...
Recently a "nuclear scientist" (the guy was a nut) was rather disparaging of Computer Sciences in an open forum. (Made the standard comments about "not a REAL science", blah, blah). He then went on to claim that in his younger days he had built the earliest computer cluster and that the software he wrote was so powerful that the cluster could have scaled up to infinity.
:-)
Suffice it to say, it felt really good to throw Amdahl's Law at him and call *bullshit*. He didn't talk to me after that.
Javascript + Nintendo DSi = DSiCade
It really depends on what you're doing. I tend to think of programming as split into two groups:
Computer Science programming - embedded, drivers, algorithms, etc...
Business programming - This involves moving regular data between buckets. Math isn't so important as common sense. Both seem to be in short supply.
It's been my experience that CS majors can perform well doing either. But there are other skills necessary for business programming that will allow a mediocre programmer to produce excellent work (such as knowing the business or being a wiz with SQL).
I speak from the perspective of a math major who does business programming. I work with a lot of other people who do just great but occasionally run into a brick wall when some strange math comes up. These tasks come up only rarely. The most common place to see a math weakness manifest itself is when they foolishly matrix a couple sets of data and everything grinds to a stop. Even that is easily fixed (as long as they tested full sets of data before going into production). The only time I've *had* to be involved was implementing some probability and statistics packages.
All things being equal, I'd take the guy with math. It means he can think, comprehend written works and probably has a good sense of when his numbers add up (very useful in business programming).
t
When Daniel Hillis, founder of Thinking Machines, and all around brain-wave, first went to MIT, he asked AI guru Marvin Minsky what he should study. Minsky said, "Study math, because that way, everything you learn will still be true in 10 years." I've been a software engineer for 8 years, and majored in math in college. I had some disadvantages starting off in trying to convince companies to hire me as a programmer, but once I had that critical one year of experience, the math degree has only been an advantage. Moreover, if you are the math guru where you work, you get to be the hero and alpha geek all the time. My sole regret in taking math? That I didn't take more.
"Math is vital to computer science"
Well, it's certainly important sometimes, possibly often. I used a lot of math writing a conversion library for 3D file formats, but not so much writing a user system in php.
Learning to think is what's really important. I got my first software job by explaining at the interview that my skills were in complex problem solving -- skill they had trouble teaching straight CS people they had hired.
"You really dont need much maths to write a shopping cart applications"
Possibly not, but... I taught applied calculus at a university for many years as a grad student and I always loved it when students asked me "When we I ever use this?". A seemingly silly question to ask in an APPLIED Calculus class to be sure, but the most important use was always that if payed attention, the course would give them problem solving and thinking skills that would help them advance in whatever field they chose. Bottom line: After school you may not remember the Fundamental Theorem of Calculus, but the thinking skills will be invaluable.
I recall trying to tell a coworker his logic wouldn't work because he wasn't following deMorgan's law (the !(x|y) result he wanted was written as !(x&y), not as (!x & !y)). I spent over an hour trying to convince him. He ignored it, said "perl logic doesn't work that way", and, then about two days later, came to ask how to fix it when it kept failing. So, it seems you can try to do it without understanding math/logic, but you may run into a few problems.
Boys from the City. Not yet caught by the Whirlwind of Progress. Feed soda pop to the thirsty pigs.
I actually swapped from CS to CIS because of Discrete Math II. The teacher made the class way too hard and didn't do a good job of explaining how all that stuff fit together. Interestingly enough, out of 4 CS/CIS majors that graduated together, I'm the only one doing actual work with computers (web development). I also failed graphics programming because of the math. That's bothered me ever since, and I've worked hard to improve my skills in that area. I think the real problem with learning math in the CS curriculum isn't the math, it's the math class. The class generally tends to be geared toward math majors, not people that are going to use math in computing.
As someone who just graduated with both a CS and a Mathematics degree, I would say any (good) CS program is going to require a few semesters of Calculus, a semester of Linear Algebra, some sort of Numerical Analysis class, and a Discrete Math course. Most of these would probably be of the computational/applied variety - e.g., not proof-based. Since I am a Math guy, I would add a second semester of Discrete Math, personally. Maybe one being proof-based and one more applied.
That said, personally I think CS majors should have a strong math background (the Calculus gives you that) but the only relevant Math, unless you are doing something specialized with a specific requirement, is what you learn in a Discrete Math course (what some programs actually call "Math for CS Majors" or similar).
This isn't about ego. There's simply no point in choosing CS if you shy away from math and won't be working in a field where CS skills are required. You wouldn't enjoy it and consequently wouldn't allow yourself to apply CS methods. There's nothing wrong with connecting databases to webservers. People want that done. It's just not computer science.
See, and that is the problem. Most jobs today in proramming require a BS in CS. Yet the majority of jobs I see have requirments like:
Backend developer -Must have BS in Computer Science -Must have 3-5 years Java experence -Must have experence in Oracle, SQL server, etc -Must be able to write SQL code for enterpise applications.
You don't need uber math skills to write good SQL or Java code for a database application. I found after college that while my math and writing skills had improved since high school, my database knowledge was lacking so I went to a technical school. There really should be some sort of IT degree that has a focus on practical knowledge rather than mathmatics. You will use high level mathmatics if you are working on video games, or CAD applications. But most programmers end up writing database interface tools.
I'd like to see some type of IT degree that taught programming, networking, and troubleshooting. I'd rather hire a programmer that had a strong foundation in networking concepts than one who aced calc 3.
Hell, they should also stress English judging by many of the programmers I've met.
You are most definitely right, CS is all math. When it comes down to it, all a computer can do is manipulate numbers. The sooner you learn that, the sooner everything a computer does makes infinitely more sense, and stops being a little black box.
And as was said before, if you don't know math, good luck writing video games. Games like Quake perform tons of mathematical operations every second. (I remember reading from Michael Abrash that the Quake engine itself used 2 or so FP operations in the inner loop itself.)
Also, the ingenuity that comes with being around elegant mathematics created from crazy equations REALLY helps in writing elegant and efficient algorithms. They are very similar in many regards, and the concepts transfer well.
Slashdot is proof that Sturgeon's Law applies to mankind.
I spent a summer doing just that. I was working with a group who had almost zero programming experience and just a little database experience. We made things work, but it took 3 quad-P3 servers to run the database (running about 80% capacity 24/8).
Since we were in the R&D wing, we threw the whole thing over to the operations people about the time I headed back to school.
The next semester in school I had a databases class. I was baffled by the lack of understanding we had of even basic database design.
Later I found out that a single operations guy did a complete rewrite of our code in about a week. He had all that useless math background and database experience. His version ran on a single server and was usually at only 50% load.
There are reasons to hire well trained and experienced programmers even for tasks that seem simple.
I had to take:
Calculus I
Calculus II
Calculus III
Discrete Math
Advanced Mathmatics for Engineering
Numerical Analysis I
Numerical Analysis II
Numerical Analysis actually has programming projects and I can see using many of the algorithms in "real-world" situations. Discrete Math obviously has uses. Advanced Mathmatics for Engineering also has obvious CS related topics. The only math courses that I probably won't ever use in programming are my Calculus classes. However, the other math courses listed above are all built off calculus so you had to take them.
P.S. If all you want to do is write average-joe database connections, perhaps CIS would be a better major rather than CS.
-
90% of the jobs out there are development positions. These require basic programming skills, understanding of the newest buzz technology and an eye for asthetics.
-
10% of the jobs are computer science jobs. These usually entail designing/optimizing algorithms or interfacing with "sciency" types like engineers(gasp), physicists and chemists.
A good COMPUTER SCIENCE degree is designed to prepare you for 10% category. If what you want to do is build java apps and database applications then go to college and learn those skills instead of all of the theory involved in a CS degree.What a load of fetid dingo kidneys. Does Newton's calculus or quantum mechanics ring a bell? Tell us how you want to be connecting webservers to a database for the rest of your life because you were too narrow minded to learn anything else. Math opens up the whole world of technology and science to you, you might find that refreshing after coming home from being told that a software program is going to be connecting that webserver to the database from now on.
And if you do not develop the joy of learning while you are in school, most reputable employers will figure that out before you even get finished with interview...they won't be happy you do not wish to learn.
By not getting a well rounded education, your brain as a muscle, will get soft. If you ever find a niche, you will be fed and cared for as a mushroom.
And you might find that the world is a bigger place than what someone will pay you for. Math and science education is central any country's future. You should want to learn it for that reason alone.
Companies run by math and science illiterates are an abomination, and they are no fun to work for either.
And I will stay the hell away from any employer with that attitude
I really like the way that sounds, and I agree with you whole-heartedly. Unfortunately, i believe that attitude is completely divorced from the reality of most (but not all) companies.
After 14 years in the industry with a BSEE and MSCS, my company closed it's St. Louis office in late 2001. I was out of work for 7 months in 2002 and underemployed for a year and a half after that. I have you're so-called "wide base of skills," but they weren't the right ones. Companies here in St. Louis were not at all interested in poeople who can "can easily adapt to new problems and environments," they were looking for those specific technologies and if you didn't have those 3 years of J2EE experience, they didn't want to even acknowledge your existence.
Of course I attribute this to the typical HR department, who wouldn't know a good engineer from a hole in the ground. So their method of separating the wheat from the chaff is a score card based on what technologies you have on your resume. So even though I had done Java and was well acquainted with OO through my experience and schooling, they wouldn't even talk to me because I didn't have "work experience" with J2EE.
Some of us who have families to support don't have the option to just walk away or cherry-pick companies. We're forced to take what we can get. This attitude runs rampant through corporate culture. I would love to be less pessimistic, but unless there is some massive groundswell, nothing will change.
Hopelessly pedantic since 1963.
There are a lot of great threads in this discussion. For the most part I am firmly in the "math is good" part. The more types, the better. The barest, most essential minimum is actually often taught in the Philosophy departments of universities: Logic. A thorough grounding in logic is essential to being a good programmer. And I don't merely mean being able to throw together a chain of ands and ors that work, but being able to optomize logical expressions to find the most compact and efficient expression possible. I can't think of a single kind of programming that doesn't benefit from a fairly deep knowledge of symbolic logic.
Beyond that, various mathematical disciplines have different levels of demand based on the work being done. I'm largely excluded from the world of real-time 3D graphics because I never went beyond the basics of the math that underlies it. (Some of the most terrifying evil geniuses I know are guys who can not only do all the math involved in projections and rotations, but can also implement it using only integer math -- they scare me!)
You'd better have your logic (deep) and at least your algebra, pre-calculus, calculus, geometry (with trig). From there, every bit of math you learn broadens you and gives you the potential to see solutions your competitors (other job applicants) might not see.
This is the value of all education: Having more knowledge at your fingertips is the rich soil that grows insights. I know a lot of people who think they they can use an Internet connection and Google and they are "programmers." To some extent, this is true. But you can't look for things you can't imagine or remember. Information and knowledge are not the same things.
I don't limit this to math education either. Even history, music, literature, biology, chemistry, physics, and philosophy can provide the mind with the possibility of new ideas. Anyone looking for "the easy path" through education to a job is short changing himself. University time is the time to wallow in the sea of human learning. The goal is to be an educated person, not a unit of productivity fitted to a particular cog in the great machine of industry. We make and use machines for our rote tasks. Your goal in education (to me) is to become maximally adaptable: to achieve cerebral fitness.
In other words, I think this question is the wrong question.
And as was said before, if you don't know math, good luck writing video games. Games like Quake perform tons of mathematical operations every second.
For sure! I don't know Quake personally (I'm not into video games at all), but I assume that it's another one of the 3D videogames where your surroundings change with your perspective.
That requires loads of matrix transformations directly out of linear algebra. It sounds terrifying, but it's just about having a group of numbers called a matrix. By multiplying them with a bunch of (x,y) coordinate in a certain order, you can do all sorts of warps and shrinks and stuff. If those (x,y) coordinates correspond to a bitmap of an object, you've just warped or shrunk the object, exactly as you'd have to do in a 3D maze or similar.
Then, there's calculus. There are two courses *everyone* should have to take in high school - auto mechanics (so you know how to change a tire, among other things) and calculus. Calculus means "small stones", as for counting. It's all about rates of change. You could tell the speed of your car by looking at your odometer and your watch, but that will give you only the average speed over a given time or distance. The speedometer, on the other hand, gives you your instantaneous speed - which is the derivative (calculus term) of your position (odometer) with respect to time. This makes sense when you think about it: speed is the rate of change of position.
(Actually, it's velocity, but that's a whole other kettle of fish if you don't know about vectors from Linear Algebra yet.)
Don't worry about the math. It's usually the easiest course in your university schedule - and I tell you that as someone who failed high school math classes constantly and who dropped out of high school because of math (that's a long story, though). Math *is* your friend. How's that? You can be guaranteed that if you do all your homework, you will get an A+ in the course. That's it. No reading, no stupid assignments which get marked by TAs who know less than you, nothing. It doesn't even matter how good or bad your teacher is. Just do all your homework and you'll get an A+. It's a non-linear relationship, do 50% of your homework (every second assigned problem) and you'll get a B+. Do 25% of your homework and you'll get a C+.
As an EE, I had to take 7 university level math classes.
Fire and Meat. Yummy.
If you get deeply into the science of Computer Science, you can certainly get into some math. But, it is important to note that practically no one gets employed as a computer scientist (except for people who stay in academe and study and teach Computer Science).
Most people going into CS expect to get jobs as systems developers of some sort. 'Code monkeys' might be the bottom of the pack; frequently they are just trained tool-users who write snippets of code behind buttons.
But to be a great developer is to be a master of a craft, not a scientist. This particular craft is mental - it is, as you imply, a matter of critical thinking and problem solving. It is being able to look at the world in different ways and being able to see how to express an aspect of the world using the tools of your craft. It is a craft with many principles and design patterns and ways of looking at the things.
To be a great developer requires talent. Picking candidates that are strong on math may be a useful way of identifying people with the talent. (This approach screws people like me, however; I believe that I have a great deal of talent in the craft, but my brain crapped-out after basic calculus.)
The vast majority of developers require no more than:
- basic algebra
- basic trig
- basic statistics
Some people need basic geometry.Sure, if you are getting into signal processing or astrophysics or a variety of other areas, you need lots of math. But that isn't where most people are going. If you are, and you are into math, great; otherwise, don't sweat it.
You don't write good SQL because you are good at math (as others have apparently suggested); you write good SQL because
Nothing beats talent plus experience.
"When the going gets weird, the weird turn pro" -- HST
I'm not suggesting SQL 2000 is in the same leauge as Oracle, but the project was for a single server install. Not some mission critical uber-install where Oracle even made financial sense. But you seem to have missed the *real* point: the man was *unwilling* to consider work outside of Oracle to the point he spent a *year* unemployed.
Would you want to work with someone so dedicated to a skillset that they would deride your company during an *interview* and was so fanatical about it that he would prefer to burn his savings than be gainfully employed? In my opinion, he was a *coder*, which was my point. He couldn't see past his coding skill set to understand that I didn't need regional failover between sixteen servers, I needed someone who could understand third normal form, write SQL queries and learn our system enough to be a valuable team member.
Sig under construction since 1998.
Theory CS theory consists of a wide range of problems: some very heavily mathematical (Does P = NP?) to the not so mathematical (eg. Theory of Distributed Systems). Although the latter is not "mathematical" in the traditional sense, it still requires strong mathematical reasoning abilities. In any case, needless to say, studying CS theory requires a good foundation in mathematics.
Graphics This one has already been described by other people. No chance in hell you're going to write a kick-ass 3d engine without knowing a lot of linear algebra (i.e. math).
Artificial Intelligence Machine Learning (Neural Nets, Support Vector machines, etc) is all hardcore statistics. You need to have a good knowledge of linear algebra and multivariate calculus to even begin to comprehend this field. At the other end of the spectrum within the AI field is Knowledge Representation; this type of AI is more logic based, and again requires good mathematical reasoning abilities.
Operating Systems Here's a field for which you may argue a minimal amount of math is required. Of all the subdisciplines within CS, this one probably does require the least math. However, that doesn't mean you'll get away without a math background. A lot of research done in this field involves understanding/presenting quantitative results. So you do need some basic knowledge of statistics. Besides that, a lot of OS research also involves proving systems correct; this is very heavily logic based stuff, and again an ability to reason about problems abstractly (mathematically) is extremely useful.
Numerical Analysis Math, math, math, and more math.
Software Engineering Proving systems correct and defining systems using logic -- very mathematical stuff. If on the other hand you get into the more wishy-washy side of SE then you may be able to avoid math.
Anyways, there's probably some sub disciples I missed, but you should get the idea. Math is required in almost all aspects of CS. The only reason it isn't required in the RealWorld(tm) is because most of the stuff done there is grunt work that involves nothing more than reinventing the wheel.
So, if you are really interested in CS, then do it right -- take as much math as you can. If, on the other hand, you are just interested in hacking, then don't go into CS. CS != hacking degree.