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.
I have found that Philosophy, especially Logic, is also very applicable to Computer Science. It has been especially useful in relational database design and development.
I've never been one for math, specifically algebra. You see, before I had the opportunity to take algebra in middle school I had been programming with QBASIC. Having no formal training in Basic I ended up coming up with mathematical solutions using crude loops, variables, and goto statements. Not kosher programming now that I look back but so what, I was 12. When teachers tried to "teach" me algebra I felt like I was being unlearned. Most of the times I just scripted up some basic to help me with the homework.
Years later my high school offered a C++ class so being the geek I am I tried to get in it. Unfortunately the pre-requisites for the class were kind of high including algebra 1, 2, geometry and calculus. Like I said, I was never one for math, but programming i could handle. This was the teachers first year teaching C++, prior to that he was teaching QBASIC. When he rejected me based on my lack of pre-requisites I threw together some quick basic using RND, some colors, circles, and a few system commands to make it look pretty. The teacher let me stay and I got an A in the class. I may not have used the same formulas as the other kids in the class (They were Nerds, I was a Geek
Ok, so I may have actually stunted my growth in mathematics and developed bad programming habits (I dont need no stinkin XOR, I'll do it the hard way) but today I'm working as a web developer and use PHP all the time without problems (and yes I turned globals off, use sessions, and actually think the security through when doing DB stuff).
Just my $0.02
Im dreaming ofa big bndwdth, That can resist the
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
I am a math and computer science professor; I teach both types of classes. And I feel very strongly that computer science majors must learn to do proofs. And not fakey set identity proofs that they teach in Discrete. I mean real proofs from an axiom system like graph theory, abstract algebra, or analysis (pick one).
Why? Because in my experience, exposure to axiomatic systems greatly improves abstraction and critical reasoning. I teach a "bridge class" (what we call them these days since high schoolers are typically unprepared for math beyond calculus these days) which presents an axiomatic approach to linear orders and the topology on that line. Many students take this class before Data Structures and they remark that it makes the distinction between Interface and Implementation much easier for them (especially since search algorithms are all on various linear orders). They also know how to design APIs cleanly without having to write the program first.
The point I am trying to make is that you should not just take math because of the techniques you learn from it. (This is anecdotal, but) When I was at graduate school at Cornell, almost every math major I met who started programming after taking a lot of math classes was a stronger programmer than anyone who started programming first.
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
"trying writing even a simple Brickout clone without knowing basic trigonometry and you'll run into problems."
Having written a simple Breakout clone back in 1990, I can assure you that you need to know little more than basic arithmetic. I wrote several remakes of old arcade games (Breakout, Asteroids, Missile Command, Space Invaders) before I could solve even basic equations.
3D programming, to be sure, is a whole different ball of wax. That absolutely requires excellent Algebra, Trig., and Calculus capabilities to do anything useful.
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.
It isn't entirely true that (good!) CS programs aren't for people who want to write code. I went to a University of Wisconsin satellite school for a few years and took courses in their CS department. The CS major had different options for the "emphesis." There was the traditional theory emphesis which is what is being discussed above, but there was also a code-monkey emphesis for those of us who wanted to write code.
in retrospect, though, this might explain why the professors couldn't have coded their way out of a cardboard box.
The US doesn't have as many CS folks around anymore.
I was a CS major for one year back in the Summer 2001 through Spring 2002. It was quite enjoyable, though difficult. I quit because of all of the math classes. I was not looking to be a computer hardware engineer, but in what I want to do (business oriented, non-entertainment software) there is less of a use for advanced mathematics.
Sure, math is still important. I don't deny that. I'm saying that I am not going to be writing the next Photoshop (yay vector manipulation!) or video game with the "most realistic phyics yet."
Maybe it is because I've never ever liked math (except for geometry/trig) but that was my weakness in CS. Now I'm a liberal studies major, though I am a service technician for a major computer company now. Oh, sweet irony!
Computer Science was actually under the Faculty of Mathematics. So while I was majoring in CS, I had to satisfy all the requirements for a 4 year math degree. I ended up with an Honours Bachelor of Mathematics in Computer Science.
I remember thinking what an odd situation this was in first year. But, as time went on, it made more and more sense. The math turned me into a great problem-solver and honed my analytical skills. When programming tasks were given to me, I didn't think about which lines of code to use, I thought about the problem itself and how best to describe it, simplify it, and abstract it.
I always save my last mod point to mod up a good troll. You people are too serious.
I totally agree with your sentiment, about that class being the "truest". It's direct relation to programming languages, and even computers in general is so outstanding, it is sad that your classmate could not see it.
To explain mysef, relatively new programming languages are all just context-free grammars, and computers are just exceedingly complex Turing machines. Both of these ideas are part of Automata, and part of the deeper understanding of computing science.
Your classmate probably just wanted to learn to code (as in monkey-style), and not do anything more abstract.
If you want to be a programmer, a real hardcore programmer, you should major in something other than CS, and then minor, or perhaps double major in computers. I would suggest this to most people. Sure, there are reason to be a pure CS major, but think about the degree you have. Physics, Chemistry, Biology and Mathematics don't change nearly as quickly as Computers do, so your degree will be worth more longer. Plus, once the IT field hits rock bottom, you can simply move into the field of your degree. My cousin is a senior at NJIT, and he told me this straight up. I never went to college for programming, I just kind of picked it up along the way.
Th
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.
Finally getting my degree after 10 years in the business...
1. Statistics is good, as mentioned elswhere almost everybody in the business word could use a better grounding in statistics. For real world application this will help you from performance maonitoring to coming up with TCO numbers.
2. As mentioned above Discrete/finite mathematics can be usefull. From my experience it helped clarify some approaches to SQL queries... in other words between set theory and symbolic logic, you will get a better grounding on how to deal with large data sets. Plus logic is good for the daily political discussions in the lunch room!
3. Data structures... more abstract but if your a DBA for something like Oracle and decide you want to play with your file structure (e.g. heap versus btree, etc.) This will give you some insight into why one might option might be better than another. As for coding... its nice to know, but as pointed out somewhere else, modern languages take care of a lot of the plumbing for you so you don't really have to know it.
The rest... it's o.k. Out side of that I think, again this has been mentioned before, it depends as to what you intend to do after school. If you end up in the sciences, then you need the math as far as it applies to the area your in.
If you winde up in the business world, logic and stattistics are going to be the two big things you need. Plus, imo, a good grounding in gathering and presenting empirical data (e.g. not just tracking your time, but really looking at how long it takes you to do something or the server to do a batch process and showing to you superiors unrefutable data.)
Besides the basic Calculus everyone had to take, I took Discrete Math and Probability and Statistics. Boolean algebra is critical to anyone who programs using "if" and "for" statements, which should be everyone. "if (x == 7)" is easy even for non-programmers to understand, but a formal education in boolean algebra will give you a better insight into how complex conditional expressions work and how to simplify them (e.g. DeMorgan's Law). Statistics has limited direct use in computer science, but understanding it helps one to understand how important algorithmic efficiency can be.
Advanced math (i.e. beyond college algebra) is not critical for programming but it helps.
24 beers in a case, 24 hours in a day. Coincidence? I think not!
To be honest, that's just stupid. You should already be badass proficient in basic algebra and trig going into your final year of high school. I am constantly amazed by the poor level of preparation in mathematics of North American, and particularly US students coming in to College. Where I come from introductory calculus was covered in the second to last year of high school, and the only math course going in the final year (I'm counting statistics as its own discipline) was a pure calculus course. Most students didn't seem to have any difficulty with this. It seems to me that the US sets its expectations of students too low with regard to mathematics education at the high school level.
Jedidiah.
Craft Beer Programming T-shirts
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).
While I was an undergraduate I was first a math major and then switched over to computer science. When I got there, I was shocked by how much the other CS majors around me despised mathematics. After observing this behavior for some time and thinking about it, I have realized what the real issue is.
In the past, Computer Scientists really were scientists of computing, but now there is a new niche: commercial programming. Many people who want to be commercial programmers end up in the Computer Science major but have no interest in the theoretical aspects of computing. They just want their degree and their job. I think that the modern trends in commercial programming require a new approach. If you just want to be a programmer, a computer science degree is going to annoy you with lots of math and computing theory.
After working in the commercial programming world I have come up with a new analogy. Programmers are to Computer Scientists as construction workers are to engineers. One is a trade, one is a science, and we should stop lumping them together at the higher education level.
Just to know what makes a good program involves quite a bit of math. Nothing made the speed of nested loops clearer to me than this. Basically, it lets us define the best worst and median cases of general types of code with very simplistic functions.
O(1) - loopless program
O(N) - One loop from 0 to N
O(N^2) - One loop from 0 to N with another loop nested in it that is from 0 to N
So, the length and basically anything that is only executed once is considered inconsequential. It also shed light on is a stupid question.
Coincidentally (no it's not a coincidence), the number of CS sutdents that change their majors to something else during the first year is about 40%.
George II -- Spreading Freedom and American values, one bomb at a time.
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.
Proof?
For what it's worth, the best software developers I've ever met all had a good math background. The better the background, the better quality work done by the software developer. The worse the background, the worse the quality of the software.
Writing a high quality, very solid program is quite similar to proving a theorem by construction.
A good mathemetician covers every single possibility when proving a theorem and leaves nothing out.
Similarly, a good programmer covers every single contingency in his software. As a result, the software runs and it runs correctly.
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 took CS in college and remain somewhat bitter at the experience. The heavy emphasis on mathematics drove me away after two years.
I have now been professionally writing business software for about eight years, and in that time I have never used mathematics more complex than arithmetic and very basic algebra.
I do, however, use my English skills on a daily basis. I have to write documentation and communicate with clients. I have to explain things to non-programmers and I have to translate business speak to techs.
I have to understand the workings of business. My software exists to make businesses more efficient. If I do not understand the real world processes, I cannot improve them with software.
When I took CS, they acted as if we were scientists and would all get heavily algorithmic signal processing jobs or some such theoretical crap. The reality is that 99% of us end up in the business world helping people make more money.
It sickens me that CS is churning out people who took calculus but know absolutely nothing about the business world in which they will most likely be working.
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.
Yeah... and because you have no understanding of combinatorial mathmatics, you don't realize the horrible performance and scalability issues that you will be getting because you don't understand your problem or how the tools you are using work. Bad indices, poor caching, crappy queries, and a host of other things cause the project to be a dog and the customer and your boss aren't happy with what you did.
Most code monkeys think along the lines of: if you can't get it to work right, you need a bigger hammer. I've seen a ton of them like you. While having a CS degree doesn't automatically mean that you know what you are doing (I've seen plenty that don't), the odds are much higher that someone with a degree will be more disciplined than someone who doesn't have a degree. Plenty of folks take the stance: "I don't have a degree and look how great I am" and somehow think that they are the norm when, in fact, they are the exception (or just deluded because they've never been around *really* good programmers, almost all of which have higher eduction) when they are really just the big fish in a small pond.
The US students were by far the weakest in mathematics, and alarmingly, didn't seem to appreciate the fact when they were told to buck their ideas up. Many of them took the attitude that top of their class at High School should mean something to me and the world at large. Sadly, this is not the case. I care only for their ability in my classes. I must admit that it was very hard for me to get through to them in this topic, but perhaps that was my failing as teacher and not theirs. To add balance here, I must say that American students were probably the most respectful towards me, so in a way what happened didn't make any sense.
AC because I'm on campus...
I have to agree with GP more than you. I've got 5 years experience in Major Company's software division AND a Computer Science degree AND the complete math sequence from a Chemical Engineering major. IOW I've got quite A LOT of math background: only one course shy of a math minor and perhaps two courses shy of the Electrical Engineering math requirements (partial differential equations). I've also got: 4+ years DB2 experience (some really complex SQL to virtualize data cubes from a 3N relational schema, for example). I would be certified in both DB2 application and administration but for lack of time to take out of my actual job duties (and lack of my current manager's support for me doing anything new, but that's a personal problem on her part).
Reality check: my math skills are useless in the real world of "computer programming". I've actually gone about THREE YEARS between needing a floating point number at work! Now, if Major Company hadn't REQUIRED a Comp Sci degree to go full-time, I'd agree with you. But all the big employers require far more training in skills and creativity than they ask for.
The math probably DOES make us both better programmers, but its lack does not hinder anyone else from doing our jobs to 95% satisfaction of management.
I can pick up and learn a new language or API given a few months. It would take years of focused study for a random PHP programmer to acquire the knowledge I have.
And at this time in my life I can pick up the critical 70% of a new language/API in about 2-10 days. I'm not knocking you, I'm sure your skills are quite excellent, but they are shared by hundreds of thousands of others--who are paid exactly the same as you or I are--who have no math beyond trigonometry.
I always find it strange when people say taking Chem and Calc is worthless, etc, to a programmer because it doesn't teach you how to program.
If you want to be a programmer, save the money and go to a community college, or something. They'll teach you what you want to learn since they tend to be more of a vocational school.
It's a mistake to assume computer science is about becoming a programmer, and I think that's why there's so many, people in CS that shouldn't be. Computer Scientists build the tools programmers use.
Can't stress this point enough. I'm pretty tired of cleaning up 20+ line blocks of nested if/else statements--it's unnecessarily complex, bug prone, and impossible to understand.
This kind of stuff makes Baby Knuth cry. At least learn enough to know that there are no other options besides "true" and "false".And then there are the really mysterious things like this (I've actually seen this):
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.
Ah yes, HR, the favorite punching boy of disillusioned employees everywhere.
.NET.
The sad part is, I agree with you, and I am pursuing a related field (Industrial/Organizational Psychology) which is very similar but has one tool that many HR folks lack: We like to do research and find out what makes the best employee. Off the top of my head I believe that cognitive ability (sometimes called IQ) is most important in programming, not a particular skill (although that is helpful too). Trouble is, many HR folks will only look at what skills people are using, and not what is underneath those tasks, which is why they want someone with 15+ years of experience with
"We don't know what we are doing, but we are doing it very carefully,..." Wherry, R.J. Personnel Psychology (1995)
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.
Well, that really depends on what you want to program. For instance, to do probably about 80% of the programs out there, a fundamental knowledge of Algebra is useful - but not even required.
If you want to program video games, you'll need college level algebra just to program the physics, but again, you don't have to be a math wiz.
If you want to do cad/cam/cas programs, your ass better know some calculus and trig.
Point in fact, traditionally you've found that people program as a supplement to their chosen profession - mathematicians use computers to crunch large numbers. Engineers use computers to test and design structures. Biologists use computers to analyze and predict populatons. Chemists use computers to simulate complex chemical reactions.
If you want to get a better picture of where you use math (and a tremendous insight into computing mathematics), check out Wolframs A New Kind of Science. He developed this book while researching computers and mathematics, and its really an interesting read whether you understand wth he's talking about or not.
I don't know about today but, when I took CS in the early '80s at a Top-3 Canadian University, there were more required Math courses than required CS courses, probably because the School of CS was relatively new then and had grown out of the Math Department.
While I probably haven't directly used 99% of the Math that I learned in school, what I believe I gained was the ability to solve problems and to think abstractly, analytically, and rigorously.
The best programmer I have every worked with had a BS in Phys Ed. I got a math degree and have worked in dataproc/IT for over 35 years. Spent several years coding, db admin, now a network engineer. My math degree has not helped a bit. Thats not to say that you never use any math concepts beyond basic algebra writing most apps. But by and large, I coulda had a degree in 17th century french literature and probably done just fine!
From my experience as a programmer, I've never had to use anything beyond trigonometry in programming. Of course if you plan on doing scientific computing there would probably be a need for higher level calculus, but I would say 90% of the programming jobs out there make no use of it. A basic understanding of statistics can also be useful.
Now, thats for the actual programming. For being a CS major you will need to be pretty "good at math," whatever that means. I suppose it means be able to learn and have at least a passing interest in the subject. Binary logic is closely tied to what schools teach as "math" (algebra, calculus, set theory), so becoming familiar with these maths will prepare your brain to handle computing theory, which is why I suppose CS majors at my school (UCSB) had to take a lot of it.
Certainly you want smart people who can find or create solutions to your problems. But that doesn't necessarily mean someone with extensive math skills. Certain areas of compsci/programming will need advanced calculus, probability, etc.... But most CS grads will probably be doing programming or associated work on business apps. Most of the time, that requires little math. Now, tuning those apps (if any tuning is done at all) may call for some math, or not. Most languages and environments have established techniques for improving performance as well as more general methods (e.g. adding or removing an index, removing redundant or extraneous code, etc....) that may be math based but don't really require the programmer to have a detailed understanding of why they work.
If your firm thinks that 3+ years of java experience is the most important quality a new hire can have, then I really don't want to work for them.
Sadly, this is the shortsighted view most hiring managers seem to take. If their requirements say you should have 3 years of Java, you probably won't even get an interview with 2.5 years experience.
Ah yes, HR, the favorite punching boy of disillusioned employees everywhere.
The sad part is, I agree with you, and I am pursuing a related field (Industrial/Organizational Psychology) which is very similar but has one tool that many HR folks lack: We like to do research and find out what makes the best employee.
You just hit on the most important thing. You do research. Something that seems beyond the ken of most corporate HR departments.
I have absolutely no problem with using reasonable screening tools to help decide which employees will be best, as long as those tools have sound research behind them.
The reason why HR is the punching bag for us "disillusioned" employees is that they are the ones preventing us from getting a fair hearing with the people we would be working with, by using reasons that seem arbitrary and capricious. The perople who get rewarded accoring to typical HR measures are the ones who essential say, "To Hell with what the company needs, I need to use <latest technology buzzword> so I can put it on my resume."
Hopelessly pedantic since 1963.
If you're a member of ACM (one of the major professional organizations for CS folks) you can download the articles from the digital library - if you've already done away with your hard copy. Most University libraries should have the journal available for checkout.
Having recently received my PhD in CS, I can tell you that if you're going to pursue an advanced degree - then the math is TRUELY necessary. While I was an undergrad, I never understood the requirement - but once I started working in the 'real' world, a lot of it made sense. I don't necessarily use it on a daily basis - but there are times when I say "yeah, that makes sense now"
"Software is the difference between hardware and reality"
I agree. A large part of the reason employers want to see that you have done well at math and computer science in school is that it shows that you are smart and good at solving problmes. This isn't to imply that everyone with a degree fits this description, but you have to play the odds, and someone who has a strong math and cs background and has been successful in those areas is probably going to be better at solving the problems your company needs solved than someone who has read a "how to" book and knows how to copy and paste from code examples.
This is the same as in many other areas. For example, law schools are impressed by students who have done well in their classes in a difficult major, even if this doesn't give them skills directly applicable to the practice of law.
I'd rather be lucky than good.
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.
There seems to be a common thread here that if you didn't do a degree in math, not only are you "just a code monkey" but you're also not a "well-rounded" individual and you're clearly not using your brain.
Suffice it to say, there are those with other-than-cs degrees out there that must program as a function of their fields on a daily basis. NO, they're not computer scientists, but it's pretty fscking arrogant to imply that anyone programming a computer that doesn't have a paltry Bachelor's in CS (whoopee) is somehow an undermench incapable of abstract thought.
Get over yourselves...
BROWSER INCOMPATIBILITIES??? CS???
Umm, yeah, right.
OO design? No, not even.
*Maybe* "Distributed services", but only if you go in to analysing the graphs and their nodes, etc.
Security? Again, no. Possibly the math behind encryption and random tcp sequence numbers, but NONE of the policy and application-specific stuff that a user of the technology touches.
Computer Science IS math. The "Science" word is completely misleading on a number of levels. Computer Applied Math would be a better term.
Unless you're formally modelling and / or proving your system (Transactions, Concurrency, delays, etc), you're not doing Computer Science.
I wish I'd have saved some mod points; I don't mind the posts, it's the damnable ludicrous moderation that goes on.
Besides a mathematical inclination, an exceptionally good mastery of one's native tongue is the most vital asset of a competent programmer.
-Dijkstra
I have a BS and MS in computer science and worked for many years in the industry before becoming a doctor and founding Linux Medical News.
I SUCKED at math, working like a dog for C grades in calculus. My miserable performance was highlighted by a D grade in Differential Equations that I worked very hard for. This did not keep me from making straight A's in my programming classes. There is the phenomenon of mathematica 'late bloomers' and I understood it better when I hit 25-27 years old. However, I've never come close to being good or even mediocre at it.
In 20 years, I have yet to do an integral since those awful days and I have worked for IBM as a NASA contractor, the now defunct Compaq and briefly had my own software company. I am now working as a researcher in the highly technical field of functional MRI. I still suck at math. I was regarded by my peers as a good software engineer. Even though I no longer program professionally, I still have a good intuition for software problems and can write quickies without difficulty. I now use a sliver of my ability to make sophisticated spreadsheet models for successful investing. A beautiful benefit indeed.
Do not let lack of math ability deter you from an interesting field that will help you anywhere you go!
-- IV
http://www.LinuxMedNews.com Revolutionizing Medical Education and Practice.
I think you'll find that anyone who's too sloppy with spelling, syntax, or grammar (except intentionally) will be a pretty piss-poor programmer. Computers sometimes like to crash if you do as little wrong as misspell a variable name (much less misspecify an entire interface). If you can't even get the loose standards of human language right, what chance do you have with a computer?
(Very carefully proofread text...aaaaand submit!)
"A great democracy must be progressive or it will soon cease to be a great democracy." --Theodore Roosevelt
the real reason math is important for computer science is that fundamentally, science is a branch of human endeavor involved with forming mental models of some system and then exposing that model to Reality to see what jives and what doesn't. with computers, Reality is a bit difficult to find sometimes, but certainly if you go the way of the programmer, the programs you write are codification of your model and the input they handle can be considered the Reality in question.
anyway, everyone who constructs models learns an affinity for the "trueness" of the model (if the model is very true, it jives decently w/ Reality w/o need of hand-waving or too many kludges). math is important for judging trueness of the model, and for extrapolating not only simple truth from the perceived world, but the Ability to Perceive Truth.
many people read orwell's "2 plus 2 makes 5". it's not necessary to study math to appreciate the many levels of this falsehood, but studying math (and henceforth going into computer science) makes it easier to realize even more levels. fiction is a model. of what? society is a model. of what? control / cruelty / repressed-love / tipping-point torture / lies and truths; all are models. of what? all the above, varying over time, are models as well.
in the end, the scientist seeks to understand and change the mental models to be more true. but each scientist is part of the Reality, in Reality. math is essential to bootstrapping the nimble mind.
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.