Which Math For Programmers?
An anonymous reader writes "It is no news that the greatest computer scientists and programmers are/were mathematicians. As a kid 'hacking' if-else programs, I was not aware of the importance of math in programming, but few years later, when I read Engines of Logic by Martin Davis I started becoming increasingly more convinced of this. Unfortunately, math doesn't return my love, and prefers me to struggle with it. Now, as the end of the semester approaches, I am faced with a dilemma: What math subject to choose next? I have two choices: 'Discreet structures with graph theory' (discrete math; proofs, sets, algorithms and graphs) on one side, and 'Selected math chapters' (math analysis; vectors, euclidean space, differentials) on the other. I'm scared of the second one because it's said to be harder. But contrary to my own opinion, one assistant told me that it would be more useful for a programmer compared to the first subject. Then again, he's not a programmer. That's why I turn to you for help, fellow slashdotters — any advice?"
I don't disagree that mathematicians make great software engineers, but I think most of the great software engineers in the past were physicists and electrical engineers.
It is no news that the greatest computer scientists and programmers are/were mathematicians.
I caution you that there are many other science professions which require math to varying degrees. The above statement could also be true of phycisists, chemists and maybe even biologists. The vectors, proof and algorithms that math provides a foundation to (or is) can be compared to the statistics that a biologist relies on or more generally processing empirical data in any science. We teach our kids basic math so they understand home loans and taxation later in life. Similarly, your best x in any science related field will likely have strong math skills to take what gets thrown at them.
I have two choices: 'Discreet structures with graph theory' (discrete math; proofs, sets, algorithms and graphs) on one side, and 'Selected math chapters' (math analysis; vectors, euclidean space, differentials) on the other. I'm scared of the second one because it's said to be harder. But contrary to my own opinion, one assistant told me that it would be more useful for a programmer compared to the first subject. Then again, he's not a programmer.
But he's definitely correct. The second is going to give you practical skills in programming -- a wide array of practical skills. The first is most likely going to give you some automata theory for computers but unless you're going into theoretical research, the second is the obvious answer. Graphics and games are all vectors, the web is becoming even more so with new browser rendering technologies. Rendering is all euclidean space transposed onto a two dimensional plane (screen) using points (pixels). Differentials are huge in the vision and image processing world and again, in graphics. This is your obvious selection although I challenge you to take both. Also, look for courses on classes that blur the lines between stats/math and computer science. Like courses on error correcting codes or computer language design and theory.
I don't know about you but I would rather take a seriously difficult course and learn a lot with a grade of C+ than take a seriously easy course and learn little with a grade of A+.
Unfortunately, math doesn't return my love, and prefers me to struggle with it.
As a brief aside, it's entirely possible you simply were never exposed to fun math or been exposed to a really influential teacher. It will not give you the joy that primary school math league gave me nor will it be a perfect substitute but Martin Gardner has some really fun math. While this won't get you excited about graph theory and linear equations, it might spark something in you to devour math regardless of how dry it is. Talking about quadratic sieves in regards to finding primes is really boring stuff when it's a paper full of symbols. But if you know what kind of power this holds in regards to cryptography, one can get really zealous about it. Remember to help your kids with this should you decide to procreate.
Also if you haven't read Godel, Escher, Bach, it might be time. Copies of those sell for cheap used online.
My work here is dung.
Take Both. Make time for it.
Programming is a HUGE field. There is plenty of work that doesn't require significant math.
Go with what interests you and let the details work themselves out.
When information is power, privacy is freedom.
If you ask a university's Comp Sci. program, they'll most likely say either suggest some combination of 4-5 Calculus classes (Calculus I-IV and Multi-variable Calculus).
GLaDOS for President 2016! "Well here we are again. It's always such a pleasure." -- GLaDOS, 2011
As a MS in programming (BS too) and a video game software engineer I recommend the Discrete Structures and Graph Theory (was also one of my favorite undergrad classes)
If you're just worried about the programming (coding and maybe some design) side of things, then the math you need is going to be the math that applies to what you're coding (calculus for physics engines, algebra for accounting packages, statistics for reporting ,etc...).
On the other hand, if you think it will benefit you to know more about what underlies the code (it does me, but we may think in different ways), then I would say absolutely that you should take the Discrete. Computer Science is 95% applied Discrete Mathematics. Computer Science is also a lot of theory which, truth be told, tends to be very specialized in usage to developers unless they're going to the very low levels. After taking DM for my degree, I found that my code has improved, but I also admit that it is anecdotal.
anything its to take business math. It has to take some amazing math to turn - X billion in profits into +xx million in bonuses.
This is the fundamental math for computer science. The other is useful for other subjects, some of which will need software... but if you want powerful fundamentals, it's in discrete structures.
One and one make two, two and one make three
Or be a woman and take take both; whichever suits you.
This Discreet structures with graph theory. Unless you know you will be programming math applications, get the discreet structure knowledge. You will use it forever. Forever.
- AZ
I've taken 5 semesters of calculus, and the most useful math I've ever learned for programming is set theory. Tremendously useful in the database world, it'll make CJ Date's "Introduction" make much more sense.
you will learn more.
Is the one class actually called Discreet structures with graph theory as you put in quotes? If so, then it's got my vote as having the best name.
Seriously, I only clicked on this story to make the joke that you should take "the discreet math classes" because that way the ladies won't have to know, but then I read the rest of the summary and you did most of the heavy lifting on the joke for me. Thanks!
You can never have too much math so you should, if possible, take both. Having said that the option that maps most directly onto your space is the "Discrete Structures" course.
I believe that my courses on Set Theory (aside from the obvious basic maths like Calculus and Differential Equations) have been the most useful to me as a programmer. It looks like 'Discrete Structures with Graph Theory' may be the way to go, but I recommend taking as much math as you can. Like an earlier comment stated, "Make time for it".
Discrete structures. Its more useful on a day-to-day basis than the other class.
sometimes also called "about eleven and a half days"
and pretty much the only math I use on a daily basis (when writing code and designing software) is the discrete math. (I did take both classes when I was in school, and lots more besides) so, in my experience the first course would be much more useful.
In Soviet Russia jokes are formulaic and decidedly non-humorous.
The first course will be far more useful to you than the second course. You need a solid background in discrete math to prove algorithms are correct and to prove things about their running times. The second course would be more useful to someone who will need advanced math for modeling things. Even if you eventually go on to take the second course, the first will definitely prove useful to you.
My blog
I would take the algorithms course first. I'd suggest taking both of them, since it sounds like you're not doing nearly enough math, but graphs and algorithms are central to so much computer science that it will definitely help to take that one first.
Venn Diagrams. Intersection. Union. AND/OR/NAND/NOR
I constantly run into people screwing stuff up because they get lost in the logic of stuff like "if this is part of that group but not contained in this set".
I want to delete my account but Slashdot doesn't allow it.
Don't rent the attic room in that really old house. No matter how cheap it is.
First, any math class can be useful to programmers. I went full double major CS and Mathematics and found all my classes useful. Set Theory perhaps is the most closely related to CS, but all of them can have value depending on what you get into after your studies. Also, whether one is "harder" should not make a difference. If anything it should make you want to take it more. Exercise your brain in all different ways, it will benefit you in the end regardless.
If you struggle with math, I would definitely take the discrete structures class, not the second class. 3D Vector Calculus (e.g. Maxwell's equations) was one of the toughest subjects I've ever taken, and guess what -- I've never used it since! Set theory, on the other hand, is used constantly in CS; in fact, boolean algebra is just a subset of set theory, and I believe Relational Databases are built on top of set theory.
I've abandoned my search for truth; now I'm just looking for some useful delusions.
If I were you, based on your submission, I'd work on my English first. All the math in the world won't make you a better programmer in the field if your written communication is that poor.
Discrete math and graph theory underpin Computing Science (notice computing, not computer). This will give you the background for algorithm theory, computability and complexity, and automata modelling.
The vectors and differentials will be usefully applied to some specific solutions you develop, especially graphics, but discrete/graph math underpins development itself.
I'd go with algorithms and logic if you can only choose one of the two. While the other stuff is doubtlessly useful, nothing will serve you better in programming than a firm understanding of algorithms, and logic which can be used to know when to employ them and how to create them. Just my $0.02, YMMV.
I am a CS student, and out of all 7 of my advanced math classes, the ONLY one I have ever found useful with programming is Discrete.
"One can not truly appreciate Shakespeare until you have heard it in it's original Klingon" -Star Trek
is the one that you will find usefull for actual software development. The second one will just give you math "background" (which might not be that bad but probably not what you ask for).
if you don't have a good understanding of algebra and geometry, computer graphics coding is going to suck for you. You will not only find the work daunting, but your coworkers will be very frustrated with the duct tape work-arounds you will need to employ in order to compensate. My advice would be to work your butt off to grok both classes. It will only make your quality of work life more enjoyable later on. Trust me, math hated me as much as I hated it and I've had to go back and do it over.
boycott slashdot February 10th - 17th check out: altSlashdot.org
The first set of topics will give you a solid foundation that you can apply to many areas of programming. I think Discreet Math, sets, algorithms, and graph theory can be used in a wide variety of fields to solve many types of problems.
The second set of topics will help you in some very specific programming tasks related primarily to games, AI, and graphics programming, which comprise a small fraction of total programming jobs. Also, you don't typically need to be intimately familiar with vectors and euclidean spaces, beyond what a simple google search will tell you about them, in order to use them effectively.
Things you think are in the Constitution, but are not.
Take Discreet structures with graph theory. I was a CSCI major, and I think from a programming perspective, that class was one of the best math classes I have ever taken.e
For example the latter course sounds like something if you're inclined to graphics programming, but might be largely useless with desktop applications. Graph theory on the otherhand is an important, but pretty specific field. I.e. I don't think I've ever had to implement a graph or A* after the college course.
What I would recommend is a (math) course in logic and complexity theory (i.e. understanding the difference of O(n log(n)) and O(n^2) and O(2^n)). Those are always relevant.
For most business related programming you really only need a good grasp of algebra and some set theory (for SQL), the basics covered in high school will suffice. If you want to get into some serious Wall Street level quant programmer jobs and bill more than $250/hr (yes, for real) then you need an advanced degree in Maths. Not sure what you need for 3D game programming. Bottom line however, if you just want to crank out business apps then algebra is all you really need.
I do computational biology. Both of those would be useful.
Set theory and graph theory come in handing when programming.
Some variation of the "traveling salesman" problem, a graphing problem, shows up in every industry out there so it would be a good idea to be familiar with its nuances and the various approaches to getting it mostly right (i don't think it has been solved).
Set theory is a good place to start thinking about just about anything. You'll probably also cover combinatorics, formal logic, and predicate calculas along with set theory which are also great tools to have when programming.
I came to the datacenter drunk with a fake ID, don't you want to be just like me?
I'm not directly familiar with either course (and the one-word summaries are a bit limited for providing informed advice!) but it sounds to me like the first one would be generally useful and you should take it regardless of what programming you intend to do - it sounds like it covers sort of the "mathematical fundamentals of programming". The second sounds more like it's useful for certain *types* of programming - perhaps 3d or game programming. Unlikely to be terribly useful for writing database-backed web applications, for example.
Take other classes, like Econ 101. Get a broad education, and with real life applicability.
Plus the chicks are hotter.
Take the Discrete Math stuff first since you are just beginning to learn Computer Science and it will fit better with those courses. You should then take Numerical Analysis to totally break your concepts that computers are precise. Finally, take the classical Calculus & Differential Equations track just so you can take Partial Differential Equations, at which point the math will start becoming useful for real world Engineering problems.
It all depends on what kind of programmer you wish to become. All coders require basic algebra... isolate variables, some basic math skills. Obviously, boolean math is important. Some very basic math functions understanding is also necessary.
Then, 3D requires proper matrix knowledge, financial requires solving knowledge, sounds and music requires linear algebra, and so on.
I cannot say one is better than the other, since I don't know what makes your heart beat and where you want to go later on. If you are unsure, I'd go with something that basically covers the widest range of topics, while not being an expert on any of these, you'll be able to pick up what you're missing as you go in your programming career.
For example, if you wish to do 3D, you'll do tesselation algorithms once and then you'll know how it works, but beforehand, you only need to know the technique exists. Then, if you are expected to better up what you did before, you'll be able to dwelve in arcane books and publications, and improve on the algorithm.
Same as me, well almost. I was a math major and before that I was a computer science major, so I have both. Unless you are working on a latest game engine in a video game company, chances are you will be using set/group theory more from your first class. I speak of experience, I actually work in one of the top 3 video game companies in the world and yet I am using more "math" from the discrete branch than the calculus branch. But yea, do both as someone else said, I am glad I did.
Tired of my customary (Score:1)
I'd strongly recommend going with choice #1. There's a huge amount of application of graph theory, etc. in both computer science and in practical programming.
My undergrad degree is in Math, and I have -never- used anything I learned in the classical mathematic topics past linear algebra. The courses in statistics and probability, and the 2 Operations Research courses (I was very lucky to get both of them) have been the really useful items. Unfortunately I was unable to take the graph theory course, but I bought the book anyway.
In conversations with my Alma Mater, they have substantially changed their curriculum, moving away from the classical analysis topics and more into discrete math.
For most programming, discrete is very useful, as well as being one of the more fun math courses you can take. It definitely helps in understanding CS theory, and a lot of the more interesting CS problems out there are graph theory questions (e.g. vertex coloring). If you're looking at, say, attacking the whole P vs NP-complete question, that's the way to go.
However, if you're expecting to do game or scientific programming, then the vectors, calculus, and statistical work of the other course will probably serve you better.
The absolute last standard I'd use for picking courses is which one is easier/harder (which the assistant might also be doing, just pushing you in the other direction). It depends a lot on who's teaching what, for starters. Plus, in college, your goal should be to learn something, not just to take the "easy" classes and get out of there with a good GPA.
I am officially gone from
Proofs, proofs, then more proofs.
Programming is all about isolating the smallest part of a problem and simplifying it out. Doing proofs is effectively the basis for programming.
Understanding trig and calc is handy for specific projects, but for every single program we write we have to be able to see the problem, to isolate components of the problem, and to simplify them.
-Rick
"Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
I had to take a symbolic logic and set theory class in undergrad that had a book written by our professor. Though initially tough it has proved invaluable to my thinking patterns and knowledge of computer science.
Life==Jeopardy. All the answers are right in front us - the hard part is coming up with the correct question.
Do the Algebra/Logic first, it is more directly applicable to computing and will allow you to understand undecidability (Goedel) computability (Turing) and of course graphs, groups and algebras. Also modern approaches to what people call Calculus, ie diferentialability etc are much more algebraic in the arena mathematicians call Analysis. Read Don Knuth's Fundamental Algorithms in parallel
If you are only going to take one, I would recommend discrete math. It is more programmer oriented - algorithms, solving problems with discrete math, doing proofs for equations and so on. This is the stuff that comes up in programming again and again and again.
As far as the other math subject you mention, differential calculus and so on, that also comes up in programming, and it is good thing to know it.
But if one or the other, discrete mathematics is more important to understand in order to do programming.
If I had to choose one of the two listed, I would go with the first. As a student currently finishing his CS Undergrad I can tell you that discrete maths like Combinatorics and Graph Theory will help you much more than Continuous maths like analysis and calculus. I'm not saying Calculus isn't important -- it is to an extent when you're working with the design and analysis of algorithms, but Graph Theory is something that you should not miss out on.
Graph Theory is used all over CS: it can be used to model network flow, it can be used in AI to represent search spaces, and don't forget that the majority of cool data structures fall directly from Graph Theory. If you're looking for more practical uses, think of the flow of a computer program. You can use vertices to represent states of your program such as assignments, branches, and so on. Connecting these states with edges determines the flow of your program.
Plus, overall Graph Theory is fun to do! The proofs are rigorous, but everything is very easy to visualize. If you're having trouble with a concept, in most cases it's easy to draw up a graph and see for yourself that some theorem holds. All in all, it's quite an experience, and as a Computer guy you'll definitely get more practical uses out of it.
I always thought it all boils down to simple arithmetic. Add, subtract, bit shifts...etc.
If your only tool is a hammer, every problem becomes a nail.
Discrete maths are more useful because you can prove the operation of your program. The other crap is useful for you to write scientific applications, physics simulators, and clones of Quake-- in which case, you need to be able to understand your own complex logic flow to make sure your program is executing those complex mathematical computations correctly, on the correct data, with the correct output.
Support my political activism on Patreon.
You could take an entire math degree and still not have enough math to be a decent computer scientist (being a programmer is another matter, I suppose). Discrete math (or at least I hope you meant to say "discrete". "Discreet" math would be much less useful) is extremely useful for all areas of computer science. Analysis is extremely useful for a lot of areas of computer science, but I don't think as comprehensively as discrete math.
Take both for sure!
The first will strengthen you comprehension of logical constructs and help facilitate those times when you must create an algorithm to solve a tough problem as well as making it easier to understand the working nature of algorithms you apply every day, like searches and sorts, and the second will allow you to open the wide world of graphics and 3D computer modeling. I took both and constantly find discrete math concepts help me to structure my design and logical flow as well as helping understand others work, when approached as a system of logical functions, and i find vector, matrix and spatial math is immensely valuable any time i design a simulation, usually motion, in 2D/3D and of course in any instance where i want create a graphical application in 3D.
And, really, you're better off suffering both now instead of finding yourself in your professional career and needing to teach yourself a complex subject - i wish i had studied higher level maths as i find i have to teach myself if i want to learn them now...and as we all know, that takes lots of self discipline and time, two things i don't always have extra of.
Programming is about algorithms. Proving them, or better yet, deriving them (you may find deriving is a lot easier than proving, I did). Graphs may come into play, but that depends on your particular interest, they do give a great insight into complexity though. Knowledge of sets is extremely useful.
To me the first looks absolutely essential for a computer scientist. The second is nice if your interest lies in that direction, but it doesn't have anything to do with programming in general (it does seem essential for a mathematician though).
My advice: Learn Logic rather than math. It is far more useful.
I know personally I am a JAVA programmer...JDBC, GUI, logic...and I SUCK at math. I never understood why everyone always told me I "you need math if you are going to program".
Well I am here to tell them "No you don't!"
My career is doing quite well and I have been able to program anything that has been put in front of me.
I'll try anything once. Twice if it tastes good
Start by not taking anything called 'Selected Math Chapters'.
Analysis, multivariate calc, and differential equations are fundamental subjects. If you want a background in math then you need more than just the first third of each.
It ultimately depends on the kinds of problems you're going to end up working on. Any sort of graphics programming is going to require a solid understanding of geometry. Designing games requires probability/statistics, where the actual math could often be understood by a bright junior high student, but gets combined in complicated ways.
Calculus is overrated for anyone not going into Physics or Engineering. I wish schools would put more emphasis on statistics instead, since that's useful for anyone who picks up a news report and sees that there's a 2% spread of support for a pair of political candidates.
More importantly than any of that, IMHO, is being able to see how the program fits together on an abstract level. This can be described as a form of math, but it's well outside of what most people think of as math. Which is fine, because what most people think of as math has nothing to do with what mathematicians do all day. Just the same, it's not necessarily anything that gets taught by formal math courses, either, at least not directly. Rather, more advanced math leads to better abstract thought in general. So just take more math, whatever it is, and you'll be indirectly learning how to be a good programmer.
Not a typewriter
Linear algebra is how every single difficult problem is ultimately solved on a computer.
Ordinary Differential Equations (ODEs), Partial Differential Equations (PDEs), Vector graphics manipulations, etc. are always reduced to a system of linear equations to produce an approximate solution.
Learn linear algebra first, how to program its solutions, then move on from there.
I'm no longer working on engineering systems, I deal with more common users on business management software. I have to interact with clients and executives with no clue what a developer actually does.
Constantly, my thorough (that was a painful class) grounding in boolean logic helps me to write concise code.
Often, I use my discreet structures knowledge to split up a my work in to manageable chunks.
Sometimes, my understanding of graph theory to helps me explain concepts to non-programmers.
Rarely, I use concepts from vectors when designing code or describing a concept to another high-end programmer.
I haven't used any basic math above algebra (ex. trig or calculus) since 1990.
'Discreet structures with graph theory' will be more helpful for most programming. The methods of reasoning you will be exposed to in discrete math will help you reason about programs, and make you a better programmer.
If you plan to write software that requires simulating physical systems or 3D rendering, 'Selected math chapters' is definitely worth taking. However, if you can't take both, the discreet math class should take priority.
I assume you are a college student. Do not be afraid to take classes that you think are too hard. If you have no hope of getting a good grade, consider auditing the class. You get two things out of collage:
1) An education.
2) A degree with a GPA.
When I was in school I feared hard classes because I would have a lower GPA. I knew the education was valuable. However, I thought that because the degree and GPA were measurable to employers, they were more important. This is true for your first job out of school, but becomes less important over time. Ten years out of school, an employer will care what you achieved at your last job more than your grades in school. You should try to get good grades, but you are hurting your education more than helping your GPA if you get good grades by avoiding hard, important classes.
An engaging professor is worth a lot. A good professor can make a dull subject come alive. A boring one can do the opposite.
Also, there are many flavors of math so you might want to sample to see what suits you. I would suggest a course in "linear algebra". Linear algebra has very low prerequisites - basically arithmetic - there are no "limits" to be taken. It is very useful for almost everything technical and it offers exposure to theorem and proofs. Plus you can use Octave (or Matlab) to try out programming with vectors and matrices and get some hands-on experience with the concepts.
Yoghurt
Basically the logic goes like this. Jobs requiring high level of math are managed by people with high level of math knowledge. They tend to be hard nosed and quite stringy with money and difficult to bullshit with and get a phat pay check. Financial managers, on the other hand, are often clueless and they overpay, they can be hoodwinked into believing the job is much harder than it really is.
sed -e 's/Chuck Norris/Rajnikant/g' joke > fact
Seriously, if you applied for a job but the interviewer told you some people said it was hard, would it stop you? My guess is that you would ask slashdot again. How about some background information about your interests? What kind of decent computer science program doesn't require both? My advice: Don't ever tell anyone that you had to ask slashdot to decide what classes to take!
I'm a software engineer so I had both, plus some more, plus physics classes so I've been doing "math stuff" a lot. IMO, discrete mathematics is probably the best "generic" choice as it is mostly geared toward logic. However, if you want to do 3D work or work with algorithms, you should take "analysis" because the match concepts will be more advanced. In the end, I think the math class that was the most useful in every day work is neither, it's statistics, but that is another story :).
As a former CS instructor, I'd take the graphing before the vectors. It has wider immediate application to your coursework. Then, I'd take the vector course - especially if you are interested in graphics or physics modeling.
Optimally, you'll want to get as much math as you can, especially in the realm of proofs, number theory, and combinatorics. They're particularly useful because they directly map to computer science in computational complexity and computability. Knowledge of complexity and the ability to establish the best, average, and worst case performance of an algorithm is quite helpful in ensuring your programs run quickly -- especially if they have slow parts outside of your control (GC, I/O, etc.) or if you're working on large data sets where the difference between O(log n) and O(n log n) can be substantial. On that basis, I'd recommend taking discrete structures with graph theory. Personally, I don't see where the advantage of the selected math chapters course is for a software developer, unless you're planning on coding for domains such as engineering or quantitative finance; however, as I said, the more math you get, the easier certain topics will be for you (e.g., functional programming).
That said, you might also want to consider taking a course in computational linguistics if one's available; they're often offered out of your local psychology department. Computational linguistics deals with large to enormous data sets and will teach you how to work with techniques such as dynamic programming, caching, lambda expressions, tree traversal, and probabilistic models. It's a great fusion of math, linguistics, and computer science that I feel is an excellent capstone course. If you can't find such a course, I'd still take the general principle here and look for a course that will require you to integrate your computer science and programming experience with some other field. The more connections you can find between your pure computational knowledge and the real world, the better the developer you'll be.
The Freelance Wizard
If you can only take one, definitely take Discrete Math.
It should not be an easy class if Math does not like you, but the algorithm and graphing portion are very large programming topics. Sets certainly are too, but proofs are more of an academic game.
The other stuff, vector algebra, etc, are useful topics, but not nearly as useful as understanding algorithms and graphing (if you understand graph theory, then it helps a great deal with understanding a lot of very important programming paradigms).
I use concepts from my discrete class on a daily basis, and have at my game software job, my enterprise software job, my cable tv software job, and my gps software job.
I've also taken the other kind of class, but I've never used:
math analysis; euclidean space, differentials in 15 years of work.
I have used vectors on occasion, but that is really not hard to pick up.
"Who is the Journal of Quantum Physics going to believe?" --Stephen Hawking
While math certainly is not required for most programming jobs it certainly helps. I double majored in math and CS in college and the math always comes back in strange ways to help me solve problems. Also doing mathematics trains your mind for solving problems. Even if you don't use all of the stuff you learned directly the mathematical maturity you gained by dealing with all the abstractions will help you be a better problem solver.
I'm a math nerd so I would say take both classes if you can. If you had to choose one, discreet math and graph theory is defiantly more readily applicable to computer science. Many programming problems involve graphs somehow. Discrete math techniques commonly come up when analyzing algorithms.
programming is about logic. causes and effects. about interactions in between created, derived logic sets.
mathematics is a much more bigger procedural set which bases all its procedures and operations and practices on the framework of logic. its, therefore, a derived set.
what you need to know good is logic. if you are able to utilize logic good, you will be able to do good programming. being a mathematician would help only because you would sharpen your logic skills while working on mathematical problems. if you already have a good logic skill, or you have other ways to develop your logic skills, you dont need to take on mathematics.
after all, the basis of all thought is logic. the keenness about understanding base interactions and cause effect relationships in between concepts. anything else is derived.
Read radical news here
The problem with the relationship between math and programming is that math is of absolutely no use to a programmer, except when it is. That's a rather obtuse way of saying that all the math in the world won't make you a better programmer if you don't already have the foundations of programming, but if you've already mastered most facets of programming knowing more math will help you. Depending on exactly what you're doing, and with what languages you're doing it, you'll get more or less use out of different math fields and theories, but exactly what you'll find useful is going to vary wildly from project to project and language to language. Of course your basics like algebra will never steer you wrong, and to a lesser extent calculus can be useful. Beyond that a light sprinkling of statistics, basic boolean logic theory, and the odd bits and pieces from set theory are all you'll really need unless you're using something specific for the project at hand in which case you'll probably need to brush up on whatever it is anyway. Since your in school now you might as well expose yourself to as wide a range of maths as possible in case something should happen to prove useful down the line, but I wouldn't be too terribly worried about it if you struggle with anything specific as you probably won't need it anyway, and if you do you can worry about it then. The most important thing to take away from it all is a basic understanding of what's out there available to you so you know what to go looking for in the future.
Curiosity was framed, Ignorance killed the cat.
Or at least remove it from RSS? I swear, it feels like half the "news" that comes through the RSS are these banal, you should have asked them on a forum, questions. I pay attention to slashdot for the news, for the things that you see here first, not this banal "gee, I have a question that I really should have asked on a niche message board" chatter. At the very least, would it be possible to simply do an RSS feed WITHOUT the ask slashdot waste of time so that my RSS reader isn't constantly warning me of "news" that is simply a waste of time?
I took both (2 semesters of discrete math, in fact; 3 semesters of traditional math). In my work, primarily in integration and web apps, I find the set theory and discrete math (logic) a lot more useful. However, if you do other things, you might find the "traditional" math more useful. But I wanted to share that in my own curriculum, I was required to take an Algorithms and Data Structures class that covered almost exactly the discrete math topics. I took them at the same time. The A&DS class was (in theory) more practical, but much of the theory was the same. Learning proofs will make your brain hurt (in the "no pain, no gain" sense), but I doubt you need both A&DS and discrete math unless, as others have pointed out, you plan to go for a PhD and go into research.
Social media and technology thoughts: http://jasonkinner.wordpress.com
I am not a programmer by trade but have written lots of small programs over the years. I first majored in electrical engineering and later switched and graduated as a math major. One thing I know from experience, the study of math continually sharpens your analytical abilities.
I cannot speak to the latter course you mentioned, but the Discreet class that I took was one of my favorites because of it's practical application of logic to several different areas of Math.
I contend that the most important field of math for programmers is algebra. I worked in a computer lab while attending college and most of the questions arose out of a lack of understanding of algebra.
The bulk of what you learn in that class you will end up using in some practical sense, especially algorithms, if you have no prior study of such. Plus, discrete math (to me) was a more enjoyable subject.
"Better to be vulgar than non-existent" -Bev Henson
Discrete if you plan on developing algorithms or data structures
Vectors etc. if you plan on doing 3D graphics or physical process simulations.
During my programming career, I have used every math and stats I've ever learned in a course. So like tohers say, take both. By the way, discrete was my worst mark, but also where I learned the most.
You should probably take both of these courses: requirements aside, both are important for a truly solid CS education.
Take Discrete Structures first, especially since it has graph theory rolled into it. This will be more directly applicable to your CS coursework as discrete math and graph theory pop up EVERYWHERE, and when you get out into the real world you'll benefit from a solid understanding of these concepts.
Math Analysis will be useful too, as will the linear algebra components that seem to be buried in that class somewhere.
As others have said, make sure you get a good professor. Sit in on a lecture if they'll let you. A dull, droning, Ben Stein type teaching either of those courses will cure your insomnia, but your GPA will suffer.
Final word of wisdom: Do not take the advice of a random (non-CS) teaching assistant, "general" academic advisor, or (ESPECIALLY) Slashdot. They're idiots (even me). Talk to other students, professors in your department or your major advisor for course order recommendations.
/~mikeg
it is string manipulation at its most basic. unless you are doing math and programming is a end not the means, then math != programming for the most part.
If you are dealing with higher dimensional data and metric spaces, I think topology and related disciplines may be of value. Understanding the structure of your data will allow for the design and development of unique tools with which to handle it, an example being new dissimilarity metrics. As an aside, some of the best programmers I have known were musicians and linguists, with little understanding of the math behind the problem, but an intuitive and often very different instinct for unique solutions.
No no no! This is a classic wrong answer to the question. The kind of euclidean stuff and analysis stuff used in games and visual processing is mostly, if not entirely, elementary-level. Knowing why differentiation is robust is no help here. If you already know the derivative of a polynomial, and you can do dot products and cross products and matrix multiplication, you're good for everything except developing highly advanced algorithms of your own, which is a speciality rarely found outside of academia. Everything else you need will be in books, and you can happily forget it afterwards.
To become a better programmer (which was the main raison d'etre) you need to learn to use maths to understand the function and structure of computer programs. Choice #1 is therefore the only useful choice. You will then, through life, proceed to learn more and more of this type of stuff. This is the kind of level of knowledge you need to, for instance, properly architect massively multi-core programs.
You will find #1 easier because it's more relevant. Much of #2 will be to do with solving the heat equation in closed form and other such stuff which is made fundamentally archaic by the very existence of computers.
The other must-have is a proper numerical analysis course, unless you don't ever intend to use the float or double datatypes.
As for error-correcting codes, that's part of discreet maths so will be in course #1. ECCs are usually covered in the first few group theory courses.
As for Godel-Escher-Bach, I don't recommend that either :)
Finally, if you have a problem with understanding a piece of maths, try to find an application for it in computing, and you'll probably find an article online somewhere which explains the maths you can't understand. Maths isn't hard, but maths textbooks are fucking awful.
Is taken both an option? I did a double major in computer engineering and biomedical engineering for my bachelors, and the computer engineering alone require 3-4 courses in discrete math and calculus/vector-calculus EACH, not to mention statistics and matrix algebra (and all the chemistry, physics, and engineering courses to top it off). I find the discrete stuff is key to understanding abstract data types and you will likely use it all the time no matter what kind of application you are working on. I work in medical research and require a very thorough knowledge of complex number spaces and transformations, and vector-calculus is about as common to this stuff as kids math is to algebra. So in my case, both are essential. IF (WANT_TO_JUST_PROGRAM) DO(discrete); IF (WANT_TO_PROGRAM_ADVANCED_STUFF) DO(both); ELSE DO(change degree);
Vector and such math is good if you want to go graphics and the like.
Algorithms and Automata theory is good if you want to go the Database administration route.
You pays your money and makes your choice.
As for Mathmaticians making the best programmers - sounds like a mathmatician talking to me. It ain't neccessarily so.
I chose the automata route myself, and I employed as a DBA for a fortune 10 company. However, with todays DBMSes, you might want to get some statistics under your belt.
I've got an O'level grade B in maths (For non Brits, that's what you do when you're 15/16 years old and 2 levels below a degree i.e. worthless) and that's it. I've been programming for 30+ years and I don't think I've needed any maths beyond the basics. Given that most of this has been writing stuff for banks, you'd kind of think maths would be used all the time but nope, just the simple stuff. The only maths orientated programmers I've met were in the market analysis/tracking/predicting area and they used Excel and Mathamatica mainly rather than coding per se.
I want a list of atrocities done in your name - Recoil
The second class sounds like a crammed together sampling of different topics that will leave you without enough knowledge in any one of them to do anything useful. If you want to do some sort of computational physics in the future then you will need many more classes than that one, so you might as well start at the beginning and take them all individually. It will be less overwhelming, and you will have a much better understanding of the subject.
If you don't want to do computational physics, then all that continuous math is worthless. I took Calculus 1-3, ODEs, PDEs, Vectors, Complex Analysis, and like VAXcat have never once used them in my job as a programmer (still working on getting a masters so I can get a job where I will use that info). Discrete math *is* useful, especially if the focus is on algorithm analysis and graphs.
In either case Numerical Methods is a very good class to have - depending on the level it is taught at, this may be a good time to do so, or you may want to wait till after you've had at least Linear Algebra and possibly Differential Equations.
You don't say what you want to do, long term. If you want to do interesting things in programming, then certainly, pile up the math, and don't shy from hard courses - you want to be pushed here.
Something to keep in mind, however, is that coding isn't all about 'l33t algorithm skills. Rather a lot of it is using other people's APIs, and if you're good, creating the same. This, fundamentally, is a communications problem, not a coding problem. It has been my experience that the best coders are also very solid communicators, and I don't believe this is coincidental. Even if you think you write well now, learn to be better at it. This is also future-proofing; even after the Singularity, metahumans will still communicate, and in the mean-time, you may find that you don't want to code for the rest of your life. People mock English majors a lot, but working your writing skills is something that is very, very broadly applicable.
I forget what 8 was for.
Pick the Discrete Math course. Really.
Consider this: first of all. there is plenty of software engineering to be done that doesn't require mathematics at all (web development, administrative systems, etc.). Second, for the jobs that require math from your second category (i.e., calculus and linear algebra), you almost always require the first category as well, lest you want to become one of those scientists who write unmaintainable scientist-code :-) Third, the jobs where that category of math is required are rare (game development: linear algebra, signal processing: linear algebra, calculus and function theory), and if you don't like math, you should probably not try get into those fields at all.
Background: I have an MSc in Computer Science (we don't have a major/minor system in The Netherlands) and I've always had a strong interest in mathematics, so I'm not afraid of either topic. I currently develop software for scientific applications in various application areas, where both these fields of mathematics are very important. My job is relatively rare compared to what most of my former uni-mates are doing. Most people I know have jobs which require algorithmic knowledge, but not calculus or linear algebra.
You should have been a music major if you want to program.
As an engineer who graduated with a BS in Biomedical Engineering and now does programming for the federal government any type of mathematics will help you with your programming skills. Math analysis; vectors, euclidean space differentials are definitely more practical particularly if you are going to deal with any form of physics, mechanics or statistics logic/formula in your programs. Discreet math is also a very valuable course as well however after algebra, geometry and calc 1, the absolute most important advanced mathematics course you can take with regards to programming is LINEAR ALGEBRA which deals with solving multi-dimentional problems through vectors and matrix. This becomes invaluable when visualizing complex variables in programming (eg. arrays). Trust me.
At my school, both math courses are required. Graph theory is becoming ever more important these days, especially as the web (and more specifically, social networking) grows. The first course helps form the foundation for a solid understanding of algorithms. Sure, you don't need it to be a solid programmer. But many, many programmers just *apply* algorithms (such as Dijkstras) without actually understanding the theory behind it, which is important to be a top programmer. The reason the best programmers have a solid math background isn't because they're good at math, but because they have that extra level of understanding of the theory.
The second course is also crucial in order to work in an area that is graphics dependent, 2D or 3D. Again, it's not *absolutely* necessary (I did a fair bit of work in real-time 3D before taking any formal linear algebra courses), but the understanding it provides will really help improve efficiency.
The question you need to ask yourself is, do you want to be a developer, or a code monkey? One can adapt, extend, and create. The other implements. Not to say one is better than the other, but both require different skill sets and a different level of theoretical and practical knowledge.
As an aside, I currently work as an intern for the BC Cancer Research Center, where I'm helping to develop imaging techniques for automated breast cancer screening. I use math that both courses cover on a daily basis.
Best of luck!
Ps. Take a stats course too ;)
As an alternative (or prelude) to the second group of subjects mentioned, you should take a look at geometric or Clifford algebra. It's far simpler and more intuitive. If you're going to do 3D graphics, study the ins & outs of quaternions. Using quaternion algebra, it's easy to do sophisticated operations with a bare minimum of computation.
Only his tendency toward a dazed stupor prevented him from screaming aloud.
This is actually quite simple. The trick is to recognize gains as soon as possible, while waiting as long as possible to write off losses. This is the motivation behind FASB's rule change at the beginning of April 2009 (at the kind...er, suggestion...of the large banks) that allowed any asset marked as "held to maturity" to be valued at whatever they want (so long as it doesn't exceed the maturity value). That means that if 50% of your loan portfolio is delinquent and has no chance of ever accruing, you can put a label on it that says you'll hold it to maturity, and you don't have to recognize a 50% loss in your loan portfolio until 30 years down the road (so long as you don't foreclose on the debtors, of course). By simply waiting on the foreclosures, you can make billions off of free money from the Fed discount window (heck, you can even borrow that money from the Fed at 0%, and loan it right back to the federal government at 3%!), and rake in billions in "profits" (and bonus payouts). And then when your bills come rolling in, it doesn't matter that you have no income and all your assets are worth less than a Pontiac Silverdome... you've already cashed in your stock options. As they say, patience is a virtue!
I am curious what school does not require you to take both of those?
To me (not that anyone cares) a serious interest in computers results/goes hand and hand with a significant interest in Mathematics, Physics and even Chemistry. All of which were requirements for my degree in computer engineering. I never understood people who say things like "I am a software guy, I hate dealing with hardware". Similarly I have trouble comprehending someone who enjoys programming but doesn't enjoy math.
Advice:
Take both classes and any other math class that you have time for. Get a minor or a second major in Mathematics if possible.
Discreet structures with graph theory. It is less mathey. I hated Trig and Calc but I rember enjoying Discreet Structures because I just got it. It was pretty easy to get through and what math I learned helped me in the 400 level courses way more than Trig or Calc (the real mathey class)
Mathey (pronounces "math-e" )
def. A course that requires more addition, subtraction, multiplication, and divison and less math theory.
usage. Algebra is more mathey than Geometery because my Algebra problems take half a page to find for X and in Geometry I get to draw circles and triangles.
Hope this helps
I can confidently tell you this after two decades of programming: learn as much math as you can possibly handle. The more the merrier. Algebra, calculus, differential equations, numerical analysis, the works.
Of all of courses I took for my bachelors, the one I remember the most vividly, that was both fun and hard as hell, was numerical analysis because it was the first time after 2+ years of being miserable with my calculus courses that I took a math course with immediate, real world application.
If you can also get some logic for programmers, even better. My school's philosophy department had logic courses aimed specifically at engineering majors instead of forcing us to take the general (what we called poets') version.
It is knowledge that is general and very portable, you can apply it to almost everything that you will ever do as a programmer. You simply can't go wrong.
Pedro
----
The Insomniac Coder
The course I took was a senior-level course but any high school student who did well in high school algebra and who has the brains to do well in Calculus can understand it.
My course in a nutshell:
Integer math with wrap-around. Think clocks, where the minutes start at 0, go to 59, and wrap around to 0 again. 30+30=0, 2-10=52, 5*12=0. You learned what a field and a ring are.
I wish I'd had this in high school or as an underclassman.
I doubt your college will let you substitute this, but if they do, go for it.
As for the two options you have:
For logic-type programming in any application that doesn't deal in continuous or analog-like data, 'Discreet structures with graph theory' will do you better. If you will be spending your life handling "analog"-like data, 'Selected math chapters' will do you better. If you were going to be a math major or enjoyed math, I would say take both.
great article ...
www.pressalive.com
http://www.pressalive.com
I am a mathematician (set theory and topology) and a programmer. 'Discreet structures with graph theory' (discrete math; proofs, sets, algorithms and graphs) is more applicable to programming, but there's a catch. At the undergraduate level, "sets" probably mean "naive set theory". (In naive set theory, the statement "x is an element of y" means that "y is a set".) Naive set theory is not mathematics. What you need as a programmer is Constructable Set Theory, which is mathematics, but is usually not taught at the undergraduate level. (In Constructable Set Theory, the statement "x is an element of y" means "x is a set". y may only be a class. Knowing the difference between a set and a class is important.) So, my advice is to take as many math courses as you can (it's just programming in disguise) and sort out the fine points later.
I would like to do woodworking in the future. I am going to the hardware store, and among the tools I have two choices: a 'hammer' on the one side, and a 'screwdriver' on the other.
What you choose to put in the toolbox depends on what you want to build. As others have already observed, there are some fundamental bits and pieces and that you really won't want to do without.
And ten years from now, when you decide you'd like to hand-carve a canoe paddle, you're going to have to go out and buy a spokeshave anyway.
~Idarubicin
You want a stats course in there too.
Then again I had enough credits for my mathematics major before I started 3rd year CS.
And I also found my mathematics courses harder than all my others (CS is a walk in the park in comparison)...
Years ago, I met the guy who ran the company who made most of the wheels for Rollerblade. He's not a chemist, or an engineer. He's a former helicopter pilot who flew soldiers in and out of the jungles of Vietnam and later became a contract helicopter bush pilot, doing firespotting and transport for the US Forest Service. When he realized he was getting sick of risking his life for not much pay and very little thanks, he started looking for something else to do. Through a friend, he heard that IBM was looking for someone to assist them with an issue with rubber compounds-- they needed a specific rubber formulation for parts that wouldn't degrade even under the worst conditions. He didn't know a thing about rubber, but figured it couldn't hurt to give it a crack. Six months of studying, phone calls, etc, he got a line on it and contacted a friend who worked at a rubber company to produce a prototype. They did, and he presented it to IBM and won a contract, which grew into a business, etc. The point I'm making is that an open mind is substanitally more important than the chunks of knowledge that you're going to get from a degree. The best programmers I've met had college degrees or no college degrees. One had a master's in Speech Pathology (he ended up designing and implementing lease accounting systems). Another flunked out of college and traded his drum kit for a computer so he could play games (and ended up learning the system from the ground up). Another was driving a forklift in a warehouse and realized the picker routes the ordering system was generating were wrong or hugely inefficent (and ended up redesigning and eventually rewriting the picker system). In each case, they learned the skills they needed along the way. Having said that, the kind of maths you're looking at are good to have "in the toolkit", not so much for a specific skill, but because they give you a different way of looking at data, problems, solutions, testing, and implementation.
I took the "both" route. In my career, I have used the "discrete math; proofs, sets, algorithms and graphs" route far, far more often. It's easy to explain when I think about it. That set of knowledge gives me the ability to understand the relative merits and deficiencies of all those little tools our CS or CE program has armed us with. For instance, recall the plethora of algorithms you were taught to consider when faced with sorting a list? They all have problems and there is a best choice each time you face the issue. What if the list you will sort is backward, or nearly so, or even often nearly so? A bad choice, in that case, would be quicksort, which is the common sort routine in 'C' runtime libraries and most folks default. Learning why that is so has been invaluable for me and learning how to rank your options when faced with a programming problem can mean the difference between flailing and success.
The other route will give you a good, broad, understanding of the math fundamentals for many domain specific engineering and science fields. It won't give you what you need, in general, in order to implement efficient algorithms solving the problems in those fields, though.
If what you want is to be a good programmer, with the ability to work on most any kind of project, go for the discrete math sequence. If you have a specific subdomain you will be working in for the rest of your programming career, the other route may be a better choice.
I've worked in startups, small companies and am currently a principal eng for one of the top 3 largest software companies in the world. I've worked on, designed, coded business apps and tech platform apps. I've built apps that require linear and non-linear optimization, data mining, (mathy-things) but have no formal academic math training at all. From my perspective the deficit in engineering isn't math, it's analysis skills- being able to come up with a sound, maintainable, robust design from top to bottom. There are a number engineers under me who have graduate degrees from MIT, Stanford, etc who are math geniuses but seem completely unable to think in a way that takes advantage of what OO has to offer. Their code is a tight knot of a thousand lines of loops and conditional statements which demonstrate their genius but ultimately is brittle, un-extensible and inaccessible to most people.
... you have will have to break through that wall at some point.
Maths is not a memory-based subject - you have to build the manipulation skills that Math requires. The only way to acquire that ability is to keep doing the maths problems until they start to click. You need to build a set of tricks to change problems from ones you don't recognize into ones you do. Be prepared to grind it out. Find a set of problems that increase in difficulty and hack at them until they make complete sense. Don't rush and don't attempt to do them all at once.
You also need to find some Math tasks that are fun or interest you. If you are learning about complex numbers, go look up some fractals and look at the formulas. Picks some starting values and play with the numbers. Get a sense of how the numbers move around and a firm underpinning about what is going on. If you are doing calculus, play with the equations of motion and work out what a canon ball does under constant acceleration. Try modelling a N-body system of planets moving around in 2D on a computer. All the time, you will be building an internal model about the way that all this hangs together.
Maths can be extremely rewarding once you grok it. But if you don't get past the struggle phase, it will never give you any pleasure and you'll miss out.
Cheers,
Toby Haynes
Anything I post is strictly my own thoughts and doesn't necessarily have anything to do with the opinions of IBM.
don't forget to take a foreign language and design
As an electrical engineer, I often choose to automate my tasks through Perl hacking (previously Cadence SKILL). I have never wished I had spent more time in differential equations or euclidean space, but I have often wished my training included far more graph theory.
Graph theory has proven interesting, for example, when it is necessary to hand wire a net. Sure, one wire is easy to do, but dozens are tougher. Sometimes vendor provided tools are not sophisticated enough to understand all the constraints that an engineer or even a technician understand, but I have often thought that a graph theory centered automatic scoring approach could take into account all the tradeoffs I consciously make.
That said, every college graduate should be required to take at least two classes from the college of business or management. Time value of money, specifically, should be taught in high school and again in college. It's just that important. If half of America understood something about interest rates and risks, we'd all be better off. Except rent-to-own and payday loan places.
My school requires us to take the second course you described only if you're considering a graphical track as opposed to a systems track. But it really depends where you feel you need the strength. From my own experience, if you've taken Calc 1,2 and Differential Equations already, the second course should be easy. In general (unless you only have one semester left) I would suggest taking both (but then again I'm a math major). If you feel your logic skills need reinforcement, take Discrete Math.
As a math major, both of these courses were really interesting and as a CS minor I understood the applications and implications of both on computer science. I can't exactly list them unless you were to give me a specific problem or example.
Things that will be useful from math for the practical programmer:
combinatorics
linear algebra
analysis and differential equations
Get as much of those as you can, if they get too hard stop.
Some times statistics courses are best for the combinatorics stuff. You will run into problems that are shuffling things around efficiently, that is where that is useful. Some of the graph theory stuff though may not come from the lower numbered statistics courses though, but you should get enough of that from CS courses. The statistics will give you background for things such as RMSE that come-up in practical coding.
The linear algebra and differential equations often come from math courses targeted towards engineering and physics students. Basically any hard problem that is solved by approximation comes down to an algorithm that is essentially a bunch of linear algebra. Then in many practical areas you need knowledge of things like FFT, PID, etc and the analysis as apposed to discrete math helps there. For a lot of these things if you just have enough knowledge so that you can understand some article, papers, and docs, then it is much easier to use libraries that others have written. That is why you should not fret if too much if the math gets too hard.
Other than that you should get enough abstract algebra and other discrete math from your CS courses. Along the same lines, you should stay away from geometry, it tends to be abstract algebra in disguise, and algorithms courses will have what you may have wanted presented in a way that is useful for programming. Logic is another area that is not very applicable to the practical programmer. You should get enough in some CS courses and some proofs that use applicable techniques there as well as in the combinatorics.
That said if you want to pursue CS, then all the above is VERY poor advice. Then you need as much logic and math as possible. You should love it too.
I'm a mathematician who develops methods for partial differential eqns, and who spends a hell of a lot of time programming. While the second course would be a great class for you to take (and you ought to if you can manage it at some point), the first will be *far* more valuable to a programmer/computer scientist. That's been my own personal experience.
It really depends on what the rest of your curriculum looks like. If you're in a Computer Science program it is likely that you already have a required Algorithms course, usually with some sort of discrete math prerequisite. In that class you'll have the most important math concepts for computer science hammered into your brain. In that case, I'd take the vectors course because it covers math which, while very useful for a large number of fields, usually doesn't get covered in a CS curriculum.
If, on the other hand, you're in some other discipline and are looking to improve your programming skills either for work or for your own enlightenment, take the discrete course. It'll do a much better job at improving your programming skills, and will expose you to some very interesting parts of math that most primary- and secondary- school curricula ignore.
is that if you aren't involved in low level programming requiring true applied mathematics, that you can almost always google whatever math algorithm you might need. Today's mapping applications often require some sophisticated geospatial mathematics, but you can almost always google up what ever you need.
if you can't Discreet math is more suitable for programming. Differentials ans stuff like that is more for Electrical Eng ...
I have a MSCS from Stanford (1985), and the field has changed since then. Back then, it was all about discrite math - number theory, combinatorics, mathematical logic, computability, and proofs. There was no number-crunching at all in the curriculum. Of course, back then, an FPU was an extra-cost option on a PC. I've actually done automated program verification work. But outside of IC design (where formal methods are routinely used), there's not much of that going on now. Now, number-crunching has come to the fore.
In the 1990s, I spent several years on what turned into ragdoll physics for games. That's all about differential equations and number-crunching. I had a hard time switching over. But I finally got used to deterministic number-crunching. I have no mathematical intuition for it, though; I took it up too late in life.
Now, the leading edge of computer science is probabilistic number-crunching. Take a look at Stanford's CS229 - Machine Learning class. That's the technology that's driving AI now, and it's working across a broad range of domains. The logicians are out, and the statisticians are in.
Discrete math is 90% or more of programming. Von Neumann architecture digital computers (er.. what we all use) are inherently discrete entities. You'll use the first course every day of your programming career, whether you are aware of it or not. If you are only going to take one, then it has to be the first choice.
You should do both though: know the math 'cause you'll run into it somewhere and its a b**** learning on the fly. If you go into robotics or control systems then the second choice will be useful, although a little FFT knowledge goes a long ways.
eh, have fun!
Discrete is so useful for DB work and logic of programming flow but what I missed most and had to teach myself was statistics and finance. It's hard when you are in a meeting with a bunch of finance guys who couldn't lick your boots in a diff calculus class but think you're a moron for not being familiar with variance or amortization.
As an IT professional with 15 years of IT experience I say that you do not need any Math beyond most rudimentary arithmetic and some statistics used in spreadsheets and reports. If you need to calculate something and to figure out formulas you will likely use Google or a mailing list. Even logic as programming logic is pretty basic and far away from predicate calculus that one studies in school. One may say that this may change but for millions of COBOL, VB and Java programmers nothing has changed about this in the past thirty years, except that you may only need less math now.
As a PhD student in CS who *has* to be good at Math both for theoretical work and for the craft, so I have few advices to offer gathered from personal experience, learning and exploration:
Most math ever required to be decent at Computer Science is concentrated in the (hybrid) field of mathematics called Discrete Mathematics. If your skills are strong enough to know this field well then you are set. In addition, you should probably be good at series and limits as they are fundamental to asymptotic analysis and at linear algebra.
As an admirer of Math I can tell you that the most fundamental skill for Computer Science is Mathematics. True, fundamental Computer and Computational Science is Mathematics. To be really good at CS you need to be strong at Set and Number Theory, Probability and Statistics, Calculus through Differential Equations, Graph Theory and Linear Algebra.
Regards,
Edmon
My blog entries on math and science are here.
Which is discrete math. Vector math is highly specialized. If you're not good with math by now, you're never really truely going to excel at it. This isn't a terrible thing, just have no illusions of becoming a John Nash. The fact is if you plan on going into Vector programming you're going to be using math ALL THE DAMN TIME. The fact that you even asked this question tells me that you probably don't want to do calculus for the rest of your life. That's fine. Be a happy person and take discrete math only and get on with your life. You probably won't be programming the latest and greatest 3d Engine vectoring programs ever, but programming basic graphics and the like and the fundamentals of programming will always be within your reach. In terms of game programming, you might not be contributing directly to the graphic/arts department, but you will have a solid shot at overall game logic, dialogue trees, game mechanics and pretty much everything else that isn't 3d modeling. Quite frankly 3d modeling is all done by artists with fancy packages these days, Vector programming is mostly useful for writing those packages, rendering apps, and hardware stuff. Very niche, probably not something that's too exciting unless you were into it at an early age.
I agree with the other posts that discrete math and graph theory come up more often in programming but the decider should be which will you enjoy. Any math will be helpful because of the rigor and problem-solving aspects. I took a graph theory course as part of a math major and rated it the most stimulating of all the courses.
One class has "algorithms" in it, the other is general "hard math" good for just about anything. Discreet math, in general is better "Focused" at the needs of programmers, in my experience, as well. I'd say go with the first one. You're likely to learn the math basis for O(n) notation of algorithms and other computer science underpinnings.
My manager is a comp sci grad from a few decades back. He's one of the best computer geeks I know, and he continually says that graph theory is the most useful course he took in University. A programmer in our group also says that essentially graph theory is an abstraction of programming theory.
"People who do stupid things with hazardous materials often die." -- Jim Davidson on alt.folklore.urban
If you're writing GUI programs, implementing business logic, accessing databases, and doing many of the workaday tasks of the grunts of the technology world, you don't need much math. Plenty of people have become very good professional developers with neither a degree in math or computer science.
However, mathy programming is (to some people) more fun, and if you angle yourself correctly, it's harder and a more rare skill set, so you can get more money. Knowing math is also pretty important if you want to become a professor of computer science, which if you care more about vacation time and benefits than salary, is one of the sweetest gigs going.
Combinatorics, probability, linear algebra, and graph theory are probably the most applicable to the widest range of problems. I'd put combinatorics at the top of the list, since it's going to be used to figure out the time and space complexity of any complicated data structure or algorithm. If you want to do anything with peer to peer software or networking, then graph theory is more or less essential. Linear algebra is all over any simulation of physics (games, control software for vehicles, pretty much anything with some sort of sensor or motor) as well as finance (there is mad money in financial computing, not as much as two years ago, but still a lot). Probability is good for figuring out things like hash collisions, average performance of algorithms.
Number theory is used almost exclusively for crytography. Which is an awesome thing to work with. The NSA has a lot of good jobs if you're cool with that morally.
If it was 30 years ago and more programming jobs required the actual manipulation of 1s and 0s, then boolean algebra and discrete math would be at the top of the list. They still do if you want to work with embedded systems, compilers, or anything under the umbrella of EE/CS.
Numerical computing (like if you wanted to build MATLAB) uses all sorts of math, and I'm sure there's someone somewhere simulating quantum physics who's up to their neck in Abstract Algebra (which is a fascinating subject if you've got the stomach for some tough proofs)
There's probably not much undergraduate math that ISN'T useful for writing code in some problem domain or another.
If you want a good book on the kind of very useful computer math that isn't taught to undergrads nearly enough, check out Hacker's Delight by Henry Warren. It's a beautiful little book that will come in very handy if you ever need to write efficient C or assembly. And if you dig it then dive into the insanity mandala that is Donald Knuth's The Art of Computer Programming.
In Capitalist America, bank robs you!
You must take discrete math. If it isn't a requirement for the degree, it should be.
Any other sort of math is useful. Every tool you add to your toolbox increases your programming ability to a greater or lesser degree.
Without seeing the curriculum or the syllabi in more detail, I can only speculate, but "selected math chapters" sounds as if it might be some carefully chosen topics for programmers -- for example, you need to learn differentiation to the point of being comfortable with L'Hopital's rule if you want to be able to do much asymptotic algorithm analysis.
Math isn't just used in computer science. Computer science is math. A computer scientist is a mathematician. Your first choice is basically a pure computer science course.
The problem is many people believe that computer science = programming. That's like saying physics = smashing things together. True, you'll often do the second part if you're studying the first, but that doesn't make it the core purpose of that field of study. Now because most people want to do programing when they go into a computer science program, extra emphasis is usually placed on the practical programming aspects. But a person could actually study computer science without ever typing a line of code, and theoretically oriented computer scientists often do huge amounts of work without a computer.
This is why a lot of people try to make a distinction between computer science, the pure mathematical aspects, from software engineering, the practical application aspects. Most people probably want to study software engineering, not computer science. They want to be like mechanical engineers, not like physicists.
Maybe understanding this distinction will help you make your choice. If you're really interested in the mathematical field of computer science, go for the first class. If you're interested in the practical application of software engineering, go for the second. Though as others suggest, take both if you can. Also keep in mind that computer science is a different kind of math from things like calculus and differential equations. If you're struggling with classical math classes, you might still be able to do, maybe even enjoy, computer science math classes.
The programmers I know who do serious math, such as very complex DSP algorithms, game programming, complex statistics analysis, etc. get paid a fraction of what a I do for business/consumer web apps. That's not to say there aren't some brilliant folks out there getting paid a lot of money to do complex mathematical program, but they seem to be the exception, not the rule. Most of my work tends to be logic monkey stuff. Algebra I and II would cover it the stuff I do. I say current with tech, know how to talk to business folks, and get paid very well for my services.
Even when I do things like insurance rating and underwriting application; the Actuary has already done the hard math and distilled it into a fairly very simple table of rating factors that are handled using simple arithmetic.
It's kind'a sad to see Advanced Math only pays for a small percentage of programmers.
In my opinion discrete math is useful for almost any kind of programming. Being able to do proofs helps you ensure your programs are correct. Sets and graphs are useful data structures for many different application domains. I work as a software engineer and I don't think I could do my job well without discrete math.
Math analysis is useful when dealing with physics or signal processing (lossy audio/video compression, for example). Vectors are useful for computer graphics and coding theory (crypto and error detection/correction). But it is domain knowledge, in my opinion, not a generic programming background. In other words, when programming in some fields you can't do without it, but in other fields you will never use it.
In practice, the math analysis you need is often already solved for you. For example, for audio/video compression you'll most likely work with existing codecs (from a library or implemented in hardware) instead of writing your own. And it is not recommended to do your own crypto implementation unless you are an expert in the field. Of course someone will have to design the codec and write the crypto library, but unless you actually enjoy analysis enough to study it thoroughly for several years, that person won't be you.
Note that any educational institution you may want to study at in the future might have a different opinion on this, or just require the "hardest" type to get only the bright and/or hard working students, so look into that before you choose.
I did both, by the way, and in my experience discrete math relies more on insight and analysis relies more on practice. I got good grades, but only by doing a lot of exercises: I think my analysis homework took me almost half of my total homework effort.
I dropped a psychology course I knew I wasn't going to pass and was wandering around the music education building trying to find something else to take when I poked my head into a room full of computers - a whole mishmash of Apple II's, DEC terminals, punch-card equipment (yes, I'm old) and an antique IBM1130 mainframe. I was about to back out again when the prof waved me in, sat me down, then forced me out the door eight hours later 'cause he wanted to go home and have supper. I taught for three years then gave into the dark side and went back and got my certification in what I should probably have been doing in the first place.
At MO S&T (formerly UMR) Discrete Math with Graph Theory wasn't just a required freshman/sophmore level class, but was actually a Computer Science class and not from the Math Department. I would talk to your academic advisor (assuming your school has such a thing). It's their job to answer this sort of question and provide guidance.
I am surprised to see people even thinking this is a debatable issue. Discrete math and graph theory: hands down. Sure, if you are going to be doing signal processing and special-purpose projects, then differential equations can help, but what percentage of programmers actually wind up working in those areas?
Most ACM-based CS curriculum do a big disservice to 95% of the students, but those where Discrete Math and Graph Theory are requirements do les harm than most.
All of the suggestions that have been modded to 5 are too high level, in my opinion.
The most useful mathematical tools to **anyone**, IMHO, are logic and statistics. (I'm not considering arithmetic or algebra "math" for this discussion.)
Logic, or pure math, is often a second-year undergraduate course for math programs at liberal art schools in the US. It's often called "intro to math", "abstract math", or "number theory" (though strictly speaking number theory should be considered a subset of logic/pure math, but a good and fun course to take after a intro to logic course). It is important because it teaches you how to generalize and analyze problems in a rigorous manner, basically how to reason.
Statistics should follow after logic since the tools learned in logic will be used to build the tools of statistics. Statistics is important because it teaches you how to rigorously collect, interpret, and model data, basically how to make educated guesses about what happened in the past what might happen in the future.
These tools are what have made human progress so amazing, and serve as the foundation for the rest of science. While you won't explicitly use them every time you write code, they will be the bedrock that makes it possible to convert difficult, real-world problems into good code.
Two additional suggestions: discrete math will help you understand how computers work at a fundamental level, and numerical analysis (continuous math) will help you figure out where errors will occur and how to deal with them. These are tools that turn you from a code monkey into a systems analyst.
obviously no deficiencies vs. no obvious deficiencies
I'd stick to the first subject, as it's related to graphs: you'll use them a lot, depending on the nature of the problems you'll face through your programmer life. Some classic computing problems can be addressed by graphs, and it's likely you find instances of these problems every now and then. On the other hand, IMHO you'll hardly ever use things like "math analysis; vectors, euclidean space, differentials" while programming...
Because in terms of math, cutting edge theory, and elegance, Haskell just blows everything I’ve seen out of the water.
Try #haskell, to get you started on the theory. But don’t be surprised if it feels like another planet, when they make jokes about The One True Monoid, and Unlambda. ;) ;)
(The are also much friendlier with mathematical questions, than the #math channel, where every free thought or idea is punished with anti-troll trolling, aggression, hate and the banhammer, and socially acting even remotely like a human is taboo.
Any sufficiently advanced intelligence is indistinguishable from stupidity.
Discrete math is "easier" because as someone who has written programs, you already have an intuitive understanding of some aspects of formal logic and set theory and the higher level stuff in that class is within reach of where you probably already are. If that class has anything to teach you, it will be immensely useful, in a fundamental way. Nobody manages to be a good programmer without understanding at least some of that stuff but a fair amount of it comes to you if you program. If it were 1870, that material would be just as hard to learn.
The other material is probably great and would be useful to many programmers but I had no use for any of that stuff. It's certainly a bit removed from pure CS which adds that mystique.
That said, there's no total ordering over knowledge. Take both. And read some EWD's while you're at it.
Other than the obvious "take both" I would suggest the second. Understanding that stuff is NOT just useful for games programming as many have stated -- it is a gateway into all of the mathematical sciences and will change the way you understand, cast and reason about technical problems. The important parts of the first are relatively easier to pick up by self-study and the rest isn't all that useful for solving "real world" problems. Yeah, computers are discrete, but double precision floating point is good enough to be worth getting comfortable with real numbers.
My only reservation would be that "Selected Math Chapters" sounds a bit dodgy. A lame lecturer/syllabus could make it harder than it needs to be.
I got a CS degree, and I was required to take a whole bunch of math courses. Which I think is bunk. I mostly work with information systems as a disclaimer, but other than your usually high school math, the only stuff I use even remotely regularly is perhaps 1st and 2nd year statistics (which by the way is boring as hell, with possibly the exception of probability as you can use it for gambling). The rest of it, I mean it is somewhat useful as back ground material, but I doubt I have ever used Calc or Linear Algebra for anything. I took Binary Algebra also, and while interesting, it was more computer science than it was math. Most the math that I took I would say has been useless to me, and I could have better benefited from additional CS courses or perhaps the ability to take additional electives to generalize a bit more.
CS unless you are doing it for academia, or a really hardcore field, really depends on what you are doing with it. If I hiring someone to write code for a physics program, having some advanced math might be useful, however having a more advanced understanding of Physics would likely be even more useful. Heck having a Philosophy course on logic might help some people more. Anyway I think all the math requirements they have for CS are a bit much in most cases. I know I feel I could have saved myself a lot of work in university (math and I were not friends) and directed it elsewhere more useful.
In every school I went to, discrete structures is a CS requirement. Don't graduate with out it. But programming is about solving problems, so the question you need to ask is "what kinds of problems do I want to solve?" Then, pick a math or science that matches that.
If you want to use programming to solve physics problems, than the "Selected math chapters" sounds useful. The vectors and euclidean space sounds great for video games or robotics.
But let me ask this: if math is not your thing, would IT be a better major? Computer science is a science, and science is math. In the past, computer science was programming, but now it is far more than that. Many CS students approach the upper-level CS classes (algorithms, finite automata, etc.) and find that they really wanted to administer a network, write Python code, and make web sites. CS may not be the best place for that.
Take a lot of math. If you end up programming a digital filter, you'll be glad you had Taylor Series in your Calculus classes. If you end up in Computer graphics, then Linear Algebra/Matrix Math is useful. If you end up doing digital electronics, then Discrete Mathematics/Boolean Algebra is useful. Heck, just to learn about rounding errors, a good Numerical Methods Course is a great course for computer programmers when you're approximating the analog world with finite floating point values. There are mathematical simulations for modelling everything from human behavior (Game Theory) to Wave equations, Partial differentials, Statitistics, and Probability. There's no shortcut. Don't think that because you're taking a math class it has no application. Don't shortchange yourself, get as much math as you can keep up with. Even logical proofs have their place (Formal Verification) in computing.
http://www.beanleafpress.com
The second class will not be very useful to you. I've heard this rumor propagated time and again, and no one can ever give me a convincing argument why such a class would be useful, other than for graphics and numeric computation.
The first class would be much more useful. Algorithms is the more or less the study of the math of programming. If you are seriously considering programming, you should learn this topic in great detail. Judging by the number of topics covered, I am assuming this is a lower-level course. You should definitely take at least one low-level computer science theory course!
One other area you may want to look at is logic -- look for Dijkstra's book "A Discipline of Programming".
You should probably take a variety of intro math classes and see what gets your interest. I'd definitely suggest Information Theory, which is a great mixture of CS and Math and an excitingly young field to be working in.
Your description of 'Discreet structures with graph theory' sounds like things we use every day. 'Selected math chapters' sounds more useful for numerical analysis programming. If you struggle with math, numerical analysis is probably not the field for you.
more cowbell
As a software developer, I've used little calculus-based math since college. Unless you want to develop software in a specific problem domain that uses a lot of higher math, your encounters with math beyond Trig will be as sparse as a carpenter's.
That having been said, since your degree probably requires more math I would steer towards graph theory and discrete math. Stay well clear of differential equations. Graph theory has some relevance to computer networking while differential equations a) damn near killed me and b) doesn't buy you anything in CS that I've been able to figure.
Moderating "-1, Disagree" is simple censorship. Have the guts to post your opinion.
A lot of writing programs for other people to use actually involves getting into their heads and understanding what they're thinking, as well as accepting the bizarre way they sometimes think.
When someone says a feature in a software project you inherited doesn't work, before you spend 100 hours debugging a feature that you're not able to find anywhere in the code, it's helpful to understand how the brain works and be open to the possibility that the feature that everyone swears was there only exists in a constantly reconstructed human memory.
If you have problems with math, as I did, you might want to consider forgoing the classes and just buying a book and teaching yourself at your own rate of learning. The ability to pick up a book and teach yourself is a very important skill for a programmer to have.
Is what you are most likely to need.
Funny, in Mexico I did both. UNAM rules yet again.
IANAL but write like a drunk one.
Your math knowledge depends on two questions: 1) What domain do you intend to work in (continuous or discrete), and 2) Do you plan to do research.
If you might deal with data coming from a continuous domain like the Real World, you need linear algebra, calculus, and statistics, i.e. engineering math. This spans professions like signal processing, image processing, graphics, data mining, machine learning, simulation, financial engineering, and AI (where you need to recognize and manipulate complex patterns).
However, if your data will arise entirely from discrete domains, i.e. the mainstream world of computing, you'll still benefit from probability (to understand and characterize the range of variation in input data), but you won't need more than the first term of calculus (differential) or linear algebra, and probably not even statistics. This domain covers 95% of the work of programming: web technology, databases, networking, GUIs, mobile, etc.
In any case, you *will* need discrete math (to understand the theory of computing). And in no case will you ever use real analysis (the theory of calculus).
If you want to do research, plan to take more math regardless (like queuing theory and statistics). But which math you need will depend on which area of research you choose.
In my experience, alot of computer science majors are dilettantes. They don't know much about math, but know tons about programming languages and computers. Many mathematics professors I deal with just laugh at many computer science majors for their misguided efforts due to lack of theoretical knowledge. There are exceptions to this as I have met some incredibly intelligent and knowledgeable computer science graduates, but the math requirement for computer science majors at many universities is a joke. I recommend as a minimum taking up to vector calculus, discrete math, advanced linear algebra, numerical methods, probability, statistics, as well as a couple senior level advanced math topics related to your field. An example for advanced topics would be Fourier analysis, Wavelets (related to compression and image processing), as well as Numerical Analysis. Any differential equations as well as topology wont be incredibly useful as a computer science major until you are a grad student. If you are wondering about my qualifications, I am a math grad student working as an RA on image processing and facial recognition. I program in C and matlab. As far as the question, definitely take both classes. It may be hard but you will know so much more.
That brings me to an interesting point, / . is just "the ramblings of socially-inept, technology-literate news-mongers".
Graph theory underlies every datastructure ever designed - link-lists, trees, etc. It is also how you build the schema map for a RDBMS and remove redundancies through normalization*. It is also needed for modeling program, data, network and other sorts of 'information flow'... including recursion.
* Yes, Dorothy, most databases in the business world are RDBMS as most systems do not benefit from the obtuseness of object based DBs.
Discrete is very handy when you have to convert from one number space to another. Not all systems are UNIX/ASCII based. I do a lot of work in the print industry - the core of that is still built on OCTAL character representation and a great deal of EBCDIC.
Combinatorics - Basically, how do you count. Again, you need this to know if your elementary math is giving you the correct numbers. A lot of things have been automated (BCD and the like), but that doesn't mean you will be working on a 'new' system when you graduate. There is still a lot of COBOL out there. It's not sexy, but it pays well and is generally a stable gigl
I would also suggest you take a course on Linear Algebra. Again, I'm in print and so use it more than most, but any time you need to lay something out in 2-space (e.g. a web page) and you need to translate that space to another (e.g. iPhone) LA will come in handy to fine tune the output. ... As well as a calculus based course on Stats. With today's data sets, analysis is no longer being done against the entire set, but a sample of the set. How to set up the sample and what sort of distribution you use is different than for algebraic based stats.
Calculus, IMHO, is only good for the rigor unless you get into engineering, graphics or physics. It's still good to have.
Lastly, Take at least two classes in communication. One on public speaking (your in meetings a lot and have to learn to communicate what you know to someone who doesn't - e.g. your boss). The other on writing - you will be writing a lot of system documentation, proposals, e-mails and the like. Other than your core CS/Math, I would say to have very, very solid communication skills. They never hurt.
Enjoy!
Of course discreet math would mean that it's subtle and below the radar, which is an interesting concept but probably not worth university credit.
If you have to choose between the two, then discrete math is really the best one. As a long time programmer and CS professor, the basic concepts of graph theory and propositional logic are probably the most useful subfields of math to computer scientists, especially when a class like that includes stuff about functions (i.e. prove/disprove that if f is 1-1 and g is 1-1, then (f o g) is 1-1). Even if it doesn't, you need to understand deMorgan's law at a deep level, and that sometimes a complicated logic expression can be simplified down to nothing if you just think about it. The concept of a graph is incredibly useful for representing data of all kinds and even if you don't remember the relationship between the number of edges and vertices in a tree, seeing graphs once will give you a really useful abstraction that handles heaps and heaps of real problems you'll encounter as a professional.
People tend to fear and/or discount a class like your discrete math one because it involves proofs, and few programmers use proofs in their programming. But IMHO, the point of teaching proofs is not that programmers should be good at proofs. It's that writing proofs requires you to learn a system with a completely new set of rules, and apply those rules very carefully to achieve your result (aka, teaching you a new kind programming and helping you hone those skills so when your boss drops a new language manual on your desk and says you need to be programming in it in 48 hours, you stand a chance of succeeding).
Also, doing (real) proofs requires you to think really deeply about problems. I tell students mathematicians do proofs to 1) show something is always true, 2) learn something deeper about the problem itself. Both are useful in programming, but #2 is especially so, because that sort of thinking is what enables a programmer to keep track of the forest for the trees. When you're debugging annoying bug #257, you're more likely to notice that this larger solution will solve #257 plus a whole bunch of other annoyances at the same time.
As many others have said, the vector math is great for graphics and signal processing. But I think the best thing you can get out of that class is an intuitive understanding of the concept of a vector-space, because if you get that, it's useful across a far wider swath of programming than just graphics and signal processing. Unfortunately, you don't often learn that, because in a standard linear algebra class what you learn about vector spaces is proving their rank, their null space and a whole bunch of stuff that I don't think has much application even when you're doing graphics and signal processing.
Finally, since I'm already on my soap-box, I'll point out that you might actually enjoy discrete math in spite of your dislike of math. All the math you've likely seen so far is what mathematicians consider Analysis. The other two big branches of math are called Algebra (you'd see a bit of this in discrete, but it has nothing to do with what you learned in high school), and Geometry/Topology (which doesn't have much to do with what you learned in high school). I never enjoyed Analysis that much and there was some serious arm twisting to get me to try the other two branches. But I found out that Algebra used most of the same thought processes that I'd already developed with programming, and it took my programming to a whole other level, not because I often directly used that kind of math in my code, but because it helped my brain think in a more abstract way which let me tackle harder problems in code than I could before.
It's like lifting weights -- I don't think I often do things on a day to day basis that could be classified as a military press or a leg curl, but I know that if I life it just makes me a stronger and healthier person and that's good enough for me.
Do yourself a favor and check out the Matrix Logic books by August Stern. I don't understand why the simple concept of logic as a vector process (a matrix process) isn't better known. I regret even mentioning the words vector and matrix, lest they put people off of understanding how simple the idea is. Conceptually deep, though.
Matrix Logic will completely reshape your head. I hope you truly want what you asked for.
Are most useful, in general, for comp-sci (compsy?, har)
Go for 'Discreet structures with graph theory' . Or both.
As a grad student in CS who has also worked in industry, I've never directly used any but the most basic of math (matrix multiplication etc.). The reason math is important for programmers is that it teaches you to think. It doesn't really matter what kind of math you take - as a programmer you're unlikely to ever use it directly, and even if you do you really only need to know the practical aspects. What's important is that you take something that makes you prove things and think analytically. Those ways of thinking are what is important for all computer scientists and programmers.
Took two semesters of it when I first started college, if you think of yourself as a logical or analytical person you will find it incredibly fun.
Learning math & OOAD are not mutually exclusive choices.
I do agree with what you say to some extent though. I've seen code written by math "geniuses", and it often looks as you describe. Somehow they appreciate the elegance and beauty of mathematical theory, but fail abysmally at translating that into practical code that shares the same sort of beauty. In fact, this describes my current software rescue project quite well.
But I would advise learning math, and OOAD, *and* other programming disciplines like functional programming - objects are not the right choice for all problem spaces. And do get into the beauty, elegance and power of all of those things!
Mathematics, unlike the poster, was my first love. My interests in computers grew directly out of my love for mathematics.
Alas, not everyone is so predisposed. I have never taken a "math course" outside of high-school, and was bored to tears by what the high-school had to offer. Oh well.
Enough of me tooting my own horn, the math courses you choose to take, beyond the fundamental stuff like logic, set theory, and discrete systems, should reflect your eventual goals with your computer science/software engineering career. If you want to delve into, say, bioinformatics, you will need some stuff, for instance, with combinatorics, just for starters. If you are going into physics, then obviously all the calculus and vector courses you can get your hands on will be your focus. If you just want to work in boring IT departments or deal with databases, then you'll need some database theory - related courses, etc.
If you want to be able to do anything and everything, then go broad and deep. But you really have to *love* mathematics. Math can be extremely fun; the way it's typically taught would lead you to believe otherwise. It all depends on the teacher. Forget high-school math -- totally useless.
Ruby Neural Evolution of Augmenting Topologies
I am a Professor in a strong, research-oriented, Computer Science Department. I think that discrete math (proofs, sets, algorithms and graphs) is essential material for a computer scientist and - if this is a straight choice - would be the course I recommend. Having said this, we are currently radically rebalancing our own curriculum to put much more emphasis on more 'conventional' mathematical analysis and, in particular, statistics. This is what applications require and more significantly is relevant to problems of scale. I think 'internet-scale' problems require a different approach and different maths.
It won't matter which one you take, whatever job you end up doing, you will be solving specific types of problems based on the type of work. If you are smart you will become skilled at those types of problems just by working with it all the time. College is not there to teach you everything you need for your future job, it just isn't possible and employers know this. Companies look for smart people who have the aptitude to learn as both technology and your job requirements evolve.
Trust me, I barely passed my high level/advanced math course, but when it comes time to put it in practice in real life rather being stuck in an academic/testing environment, it suddenly makes a lot more sense when you actually know what it is useful for. The grades you get in classes typically have little to do with how you will perform in real life unless there are other reasons such as irresponsible/self destructive behavior which could make you difficult to employ. The most important thing is that you "get" programming. I can't tell you how many otherwise intelligent people there are out there who just don't "get" programming, it almost seems like it is a genetic trait.
Computer geeks are a varied bunch. Since I have been in the field a while (and grew up as an aero engineer first, biologist, and software architect), this may be useful.
Depends on what you think you will do.
Calculus is always useful...it is the language of the sciences, and explains the basics of any problem set.
Ditto for Matrix+Linear algebra. Vectors and matricies are live and die for any programmer.
If you steer to hw/embedded work, add in discrete math/binary math.
If you head into software architecture or AI/Neural networks, add in a course in math of systematics...relationships between lines, etc.
You may also need other math for various subject areas (Diffi-Q, etc.), but these are the basics.
Just a thought...
I know I personally use the information I acquired in my discrete math class on a daily basis. Along with the day-to-day use, taking the discrete class really expanded my thinking and (I feel) ultimately made made a much better coder. But like most of the other posters are saying, take both classes. While earning my degree I was required to take both, and actually end up using the vector stuff on a fairly regular basis too (not as much as discrete, but some).
As a recent CpE graduate who had to take classes similar to both, I would recommend taking both of these, but if you can only take 1 of these, you need to take the Discrete Class. It will help with a lot of the advanced logic required for complex programming. Discrete would be especially useful if you are interested in Artificial Intelligence.
How strong is your intuitive pattern-matching? Discreet mathematics as a direct, explicit application of math in computer science. Meanwhile, real/complex analysis is abstract, and requires _you_ to make intuitive connections between its concepts and _your work_, in order for it to become applicable and useful. (If you know for a fact that math isn't your strong point, then go with Discreet.)
Furthermore, don't think of the two as being exclusive! They're not separate. Discreet mathematics is a _subset_ of real analysis. When you jump right into discreet mathematics, you're just skipping lower-level details of analysis.
College math lecturer, former game programmer. Sounds broadly to me like the first class (discrete structures) will be a bit better for you. Yes, the second class might be better if specifically you expect to focus on 3D graphics programming. (Note: I had a year long sequence in computer graphics in college but even then never actually used it in my two game programming positions... did more game logic, AI, audio, networking, etc.)
Just my take.
We know where leadership by an anti-intellectual "strongman" who scapegoats minorities and likes boisterous rallies goes
If you don't know what you want to do, take as many courses as you can so you don't limit your options down the road.
Except for ending slavery, the Nazis, communism, & securing American independence, war has never solved anything.
>Selected math chapters' (math analysis; vectors, euclidean space, differentials)
The fact that vectors are in here, is great, and should be looked into, as well as anything with logical circuits and boolean algebra.
I once was able to use boolean algebra to create a flowchart of a regular conversation between 2 people (albeit it was in a controlled format) which lent much to analyzing people's responses based on their emotions at the time....sort of almost using words to figure out if they were telling the truth or not...(actually "and not" ....get it...!)
The fact that they guy suggesting which course to take was not a hardcore programmer with years of exp. and many years of proof reading people's work or code. You can tell the real mathematicians when you read their code.
Keep in mind, also that you are embarking upon a field which not only can totally enthrall you, but consume you as well, to the point of making you want to leave programming altogether.
I'd start with "Basic" math, to be sure.
The 'discreet structures with graph theory' course sounds like it'll be more use for things like systems programming, databases, compilers and the like, whilst the other sounds like it'll be more use if you want to go into graphics or scientific programming.
Class #1 sounds like the better of the two, and a better foundation for programming itself.
But I'll also add that I've been studying a lot about machine learning lately, and vectors/statistics are absolutely necessary. (And I've also found statistics to be the most counter-intuitive math I've been exposed to... it's taken SEVERAL exposures to it over the years to become reasonably comfortable.) And it's also quite important if you're doing any kind of research or if you're trying to KNOW whether method B actually improves on method A or not.
mathematics are in no way in real world related to exquisite or plain programming. its got to do only with binary or if you will silicon manufacturing.
never ever mathematicians can realize what the hardware does, or an operating system is, built functions for it, and put then in good use in an application.
if they wonna play with formulas, tell them to use openoffice formula and leave the computers to engineers ! not even the CS majors.
regards.
ps I'm too old for this....
Might I recommend both? For me the second course you talked about is the easier one, but I absolutely loved my discrete math course. If anything, both courses teach you how to approach and solve problems. Good skills to have for any programmers. While you are at it, if it isn't already required I'd suggest taking some physics for scientists and engineers as well as some calculus courses. Trust me, I was in your shoes a few years back and won't say it wasn't hard, but it was definitely worth it.
Of course you need that, but it's hard to get into anything else when, oh I already have a routine for that and it will work every time. Matrix math at some point you will need along with the obvious or is it obvious to begin with? I suck at math but not so bad that I can't get the right answer out of a computer except maybe the "theory of everything" and multiverses and things like that. I think you need chalk and a chalk board for that.
If I had mod points, I'd mod you as a troll.
I am a systems engineer (no, not a computer tech, the other kind) and I am sick and tired of all the belly aching from software when you ask for even the simplest linear algebra. If I want to say, multiply a matrix times a vector, they want me to spell it all out for them. Asking for solving a linear set of equations using Guassian elimination or Cholesky &c and it is suddenly a major million dollar undertaking. God help you if you want something advanced like singular value decomposition.
No matter that libraries like LAPACK for this have existed for over 30 years. Open up Golub and VanLoan. Why should I need to re-explain this stuff?
The problem, as I see it, is that there is insufficient overlap between domains. The systems people could do with learning a bit more about software and the software people need to understand the domain. Software is not just software. You should see the crackpot monstrosities that are written from insufficient understanding of the higher level structure. I'd rather have the engineers write the numerical/math code and leave the user interface to the pure software guys.
No doubt, BLAS and LAPACK are kind of awkward when used from C or C++.
Yoghurt
Math isn't just "learned". It is "practiced". Much in the same way that you don't just "learn" to throw a 90mph fastball, you don't just "learn" to do math. Math is a set of techniques, combined with skill that must be developed.
A large part of math, especially that done in high school and college, is just exercise for the brain. There may be some practical application in the future, but the vast majority of people will never have a need to take a derivative any more than they will have the need to throw a 90mph fastball.
What they will have a need for, is the mental capacity to think methodically, logically, and mechanically about a problem. I cringed when my son's college writing professor said that "Luckily, journalists don't have a big need for math." That sort of braindead mindset is why we have reporters not bothering to question how federal healthcare will ever save money in the US. Journalist are not trained to wrap their minds around logical concepts like "If A=B, and B=C, then A=C". Those neurons have not been exercised.
The goal of taking the math class is not necessarily to learn a specific set of mathematical techniques. It is as much about developing the mental capacity as anything else. When you start developing, it will be very difficult to cope if you haven't developed those mental muscles.
Aah, change is good. -- Rafiki
Yeah, but it ain't easy. -- Simba
The byproduct of learning math is that teaches you how to teach yourself how to learn, how to think and how to solve problems, something you do impicitly many times every minute you are a programmer. While learning Calculus, differential equations, linear algebra, etc... may not be important on the surface, it will DEFINITELY go a long way to helping you in these areas of critical thinking, make new technologies easier to learn and new styles of programming easier to decipher because you have the training to be able process difficult problems on your feet in a top-down, analytical fashion. I find that the training I received in Mathematics (was a double major in math and comp. sci) was more important to my long-term growth as a developer and team leader.
Last time I checked, computer science *WAS*/*IS* applied mathematics. If you don't like math you should probably consider a different career, or be ready for a long hard road of slogging through a career while the more mathematically inclined advance right past you in the market. I started a software development company last year and I will not hire anyone who is not more proficient (or current/fresh) at mathematics than I am, and I'm pretty good.
If you really, really want to be a developer I'd say to suck it up and take BOTH classes. There's no such thing as too much math if you are a CS major, or just someone that wants to be a developer.
This This is a gross simplification, but there are sort of two kinds of math. There's logic math, and there's numbers math. It sounds like the the two courses roughly divide according to this line. When most people hear math they generally think of numbers math.
If you are a programmer then you do already love the first kind of math, and it does love you back. It's the second kind of math, the ugly numbers math, that scares you.
Math is not merely "important in programming", programming literally is a specialized form of math. Most people don't realize programming is math because because people think of "numbers math" when they hear the word math. Everything software is and everything software does is "logic math". The math of manipulating complex information, the math of manipulating complex logic relationships.
The math of manipulating data.
'Discreet structures with graph theory' (discrete math; proofs, sets, algorithms and graphs)
Programming extensively uses sets, discrete math, and graphs to organize data, to understand data, to manipulate data. A program is literally nothing more than one big algorithm built up out of several smaller algorithms. And in a deep sense, programs and proofs are the exact same thing. There is a math proof that every program can be directly translated into a proof, and every proof can be translated into a program. They are fundamentally identical things with identical logic and identical properties. Reading proofs and writing proofs uses the same precise step-wise logical analysis as reading and writing software.
This course is the math that is the very essence of programming. It's the sort of math and logic that you already you already use every day as a programmer without realizing that it is math - the sort of math you *will* use every day in the future as a programmer. The insights and logic skills in this course will directly advance your every day skills and capabilities as a programmer.
'Selected math chapters' (math analysis; vectors, euclidean space, differentials)
There are things that can be useful *in* a program, but they are not really useful *to* programming. For example if you want to handle or simulate physics-systems, falling rotating moving objects, manipulating 3D objects and graphics, then vectors acre extremely important, along with good intuitive spacial skills. The math analysis and differentials are generally even more rare and specialized. Computers are fantastic at handling that sort of stuff, and sometimes you really need an advanced math-programmer to do literal "rocket science" aerodynamics and orbital mechanics, but most programmers will never need to touch the stuff. You don't need scary-math analysis or differential equations to program an operating system or a webserver or any normal business application.
If you're not doing that sort of sciency-math programming, then you'll never use that stuff. If you're not working on that stuff but you do come across a case where you need to pull in a small piece of that stuff, you can usually just copy-patse in the ugly equation you need even if you don't have any grasp of the math behind it.
The biggest issue there is if you want to do 3D graphics manipulations. A lot of those math equations can be copy-pasted in semi-blindly, but you will seriously choke on that sort of work unless you are good with vectors and have a good intuitive spacial skills.
So in short you definitely want to take the 'Discreet structures with graph theory' course. It will make you a better programmer. The other course merely allows you to specialize as a mathy-sciency-programmer. Take both if you're up for it, but that sort of mathematical programming is not everyone's cup of tea. You can get by fine without it.
one assistant told me that it would be more useful for a programmer compared to the first subject. Then again, he's not a programmer.
Exactly - he's not a programmer.
He sees the course expanding your ability to write programs
- - You can't take something off the Internet! That's like trying to take pee out of a swimming pool.
If the question is pay, the answer is get out of CS or programming entirely.
Do your undergrad in psychology, get an MBA, have the programmers work for you. You'll make more money and never need more math than addition and subtraction.
As to the question of, does math pay? This supposedly insightful comment proves itself wrong.
So the programmer doesn't need math because the actuarial tables have already been worked out. I'm willing to bet the mathematicians putting those tables together make more money than the programmers using the tables. So how is it that math does not pay?
If you're looking to maximize income, getting a degree in CS or working as a programmer isn't even worth considering, so the parent comment is completely off topic.
However, to reply to the actual question, for a programmer, I recommend the course on graphs and sets. Discrete maths have general applicability to computer science and programmer tasks (unless, as others have said, you have specific plans to work in areas requiring consideration of the continuum).
I got a Ph.D. minus epsilon in Math, but never took a statistics course prior to dropping out during the dotcom boom to start a software company. I would trade most of the math I know for a solid background in statistics, which comes up all over the place, from the performance of data structures and algorithms, to dataflow analysis, to mining databases, to projecting performance failure rates, etc. This is not just basic statistics (which I managed to pick up on the street), but a deep knowledge of statistics can make a big difference. I just co-authored a paper on a very simple data structure for which the key step in analyzing its performance is to apply the Kolmogorov-Smirnov distribution.
Unless you really want to become a game programmer and you will have to really want it in order to become it STOP taking graphics courses. The best programming courses you can take are:
Databases
Operating Systems (not that you will use what you learn but it gives you an idea on what is expected in the real world when you are placed on a project)
Networking
any java and c# courses you can find (even if you don't have to take them)
College will not prepare you very well for the business world and there are many more jobs out there that have nothing to do with games or the math you are forced to take. Having 3 years experience in programming I find that I just don't use any math skills beyond Trig and have forgotten most of what I learned in calculus 2 and beyond. Remember that your professors are generally people who entered the business world and couldn't cut it so they have no idea what you really need to learn and focus on theory and math skills you will never use. This is ok if you want to become a professor or want to go into theory but for most of use it is useless and a waste of time and money.
Go with discrete. As a Computer Engineering major, I've had to take both, but discrete had far more programming applications in my opinion.
And, if you give your best effort, are you up to the more challenging math curriculum? Those are my only criteria for such decisions and all the answer I can offer to this question.
"I can't imagine how things could get any worse!" (some guy) "That could just be failure of imaginatioÂn on your p
Which course should you take?
All of them.
Graph theory is highly practical (it has a perfect model relation to the actual data structures/algorithms/problems)
Algebra is usually needed for graphic-related tasks and similar heavyload computation (encryption too).
And analysis is finally needed for actual inventing and proving stuff.
Have fun :)
But contrary to my own opinion, one assistant told me that it would be more useful for a programmer compared to the first subject. Then again, he's not a programmer.
In general I would say, it's a good think you asked for programmer geeks to comment and didn't take the math geeks advice. My wife, an early childhood teacher, took a math class titled "Teaching Math for Early Childhood Educators". It was taught my someone in the Math PhD Program where she was taking her education classes at the time.
When they suggested to the instructor that they would never use what they were being taught (note: there were special educators in this class as well), his response was "Sure you'll use it, it's fun and easy." Several of them couldn't control their laughter. I was tutoring her thought matrix algebra and teaching her the shortcuts (He only taught them formal methods). She still gives me that "I will set you ablaze" look when it comes to mind, guess we can survive anything.
The good advice is to take what interests you, what you think you can survive and seems to apply to what you want to do as a programmer pretty much in that order. I'm a member of the more math can never hurt when your a programmer but, it might lead to divorce.
Some of the old-timers will remember the post-Sputnik elementary-school math books where you spent the first couple weeks of the year on set theory. I thought it was a waste of time then, and still think so. But that stuff reappeared in college digital electronics courses, desiging gate-arrays etc.
I believe the intention was to teach "logical thought" as a premise for doing mathematics. But elementary school math must be brutal and make you memorize the dull algorithms of tables and long division for you to succeed.
I actually hold two undergraduate degrees - one in mathematics and the other in computer science.
Unless you are interested in Numerical Analysis (used heavily in contracting/simulations/engineering) then you want to go with the discrete option. Never forget that computers are discrete machines themselves and are much better suited to discrete tasks than continuous ones (which is what you would be studying in the analysis course).
Understanding graph theory, tree theory, and recursion (all topics covered heavily in most any introductory discreet mathematics course) will always be more useful to the computer scientist than understanding the fundamental theorem of calculus.
Take both. But if you have to take only one take the first, discreet logic is too important to pass up.
If you are in it for money take first. Computer games, 3d programming, computer vision, image processing, machine learning - whatever cull area are there they all relay heavily on calculus and linear algebra, and often their more arcane derivatives like optimization, groups Lie etc. Even google page rank uses eigenvectors. From the other hand it's possible to slog through the whole career in business applications/databases without touching calculus or linear algebra.
"...then hand over their work to skilled software engineers that are qualified to turn it into good software."
As a physicist I only have to look at the code we use and write to see your initial point (try looking at ROOT from CERN for C++ that will make you want to cry!). However your solution simply does not work. You cannot "hand it over" to a non-expert in the area because the usage and purpose of the code is something that they do not understand and so the result will be unusable (there was one program I remember as a grad student which was a beautiful design but the overhead was so large that one senior physicist calculated that he would be retired before it had finished one pass through the data!). The best scientific code I have seen is generally written by an expert in the field who has experience of good software design. Even close collaboration between physicists and software engineers rarely works because neither side is willing to compromise functionality for design or vice versa.
I don't get why you'd want to mod me troll, since I don't see we disagree? Of course knowledge of basic linear algebra is an important part of the skill set of anyone who writes computer programs. But that's not the same as being able to write a linear solver from the top of your head and it's also not the only or most important aspect of software engineering.
As an example: during the job interview for my current job I was asked to spell out a program that calculates the intersection of 2 lines, to integrate expressions and other math trivia, over the phone. I couldn't do it though I was able to formulate the steps to do it offline. Other questions we're purely questions about basic C and Unix trivia, which I was able to answer easily though most if it was in fact irrelevant or obsolete facts for todays software engineering. The interviewer found it really strange I wasn't able answer 'easy math questions' while I did seem to 'know a lot about software engineering', completely backwards to my impression about the interview. After that interview I've implemented simulation software containing non-linear regression, all kinds of matrix stuff, dft's, half of Matlabs basic linear algebra tools, image processing and more. Not because I can tell you how to do an SVD but because of good software engineering practices, by and making efficient use of existing solutions to common problems. That's the difference between writing software on a larger scale as opposed to using computer programs to solve mathematical problem. It's also why I view so many math and physics-related software as 'badly engineered' (though often well-written), mostly because it's confusing, the documentation is minimal, absent or dense and incomprehensible, sensitive to misuse, inflexible, in other words: difficult to use safely in production software. All the math stuff I use in our code is wrapped into sensible and safe interfaces that are well-documented and easy to use, which is what allows us to rapidly build complex but robust software from it.
It's also for these reasons I think basic knowledge of applied mathematics and intricate knowledge of algorithms, data structures and development methodogies is more valuable than intricate knowledge of mathematics but only basic knowledge how to build and maintain quality software.
I think you should go with Discrete Math. There is so much in there that applies directly to Software Engineering especially if you right systems software, as opposed to Financial or Scientific software. Graph theory, queue theory, Maps, etc. You can't go wrong with Discrete Math. It will also be easier for you if you already think like a programmer.
They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
It's a bit of a toughie, but I think I'd go for analysis. It provides a fundamental insight into how math is done.
Math is made up of three basic ingredients: analysis, geometry and algebra.
You're much more likely to understand a lot of the reasoning in other courses after you take analysis,
as the logic applies much more generally than to vectors, euclidean space and differentials. Those are more examples on how to use analysis,
and of course could be annoying to get through if you don't like that sort of thing.
In your non-math (ie. programming/cs) courses, you're very likely to meet graph theory, sets and so on anyway,
and because you've taken analysis, you'll have much more intuition on how to use those tools.
In my experience, math is almost completely irrelevant to computers; logic is what you need to know. Speaking personally, my one year of undergraduate-level Catholic theology and Aristotelian logic has been more useful to me in computer programming than anything in my four years of undergraduate-level mathematics, with the sole exception of set theory.
I have a PhD in Math. Employers didn't care about my PhD. They cared about my BS in CS. Math isn't in demand as a skill.
Can someone please provide a pie chart of these responses so I'll know what to do?
The teachers I have learned the most from have always been the ones with a reputation for being difficult -- with the exception of the freshman sociology prof who couldn't stand the fact that his course was regarded as an easy A and set out to make it difficult. And even from him, I learned a thing or two to avoid doing if I did not wish to be considered an ass.
"Who controls the past controls the future. Who controls the present controls the past." -- George Orwell
I advise not getting too caught up in Math...
An awful lot of the "Advise" being dished out here is over inflated opinion... I know.. I know, somebody had to point that out...
Both are useful sets of courses, but neither will land you that dream job. Experience is key in all careers...
But I would hate to burst some bubbles, not all great software engineers are mathematical in anyway.(I'm not ether of those).
In fact when you've seen the real world a bit you might notice a tend in your dev teams... Math Grad = Hopeless at even the most trivial of tasks
Personally, as a CS Grad, I'd go Graph Theory, It appears in alot of different places (Like in testing or verification you might use a control flow graph),
Its not overly difficult and ties in better with Computer Science and more importantly Software Engineering (The real world stuff).
End of the day, its your choice, don't let the slashdot masses ruin your life (Like mine and many others before me)
There's usually a 3rd-semester "Intro to Advanced Mathematics" class offered by the Math dept., that's the one to take.
A proof should satisfy the conditions of "necessary and complete" proof of the theorem in question. i.e. nothing extra, nothing missing. Applying this line of thinking to programming makes for lean, efficient code.
"The ability to delude yourself may be an important survival tool" - Jane Wagner -
I have lived and worked in various IT environments over the last couple of decades and I have observed a very interesting thing... The best programmers I have had the pleasure to work with/for were also musicians. Usually amateur musicians, but musicians.
It seems there are very important skill transfers between the two.
I am also able to watch my own kids... and the musical one has chosen to go to university to get a software engineering degree... and is doing amazingly. By the way he also took every math he could get in high school and first year university.
seriously all kinds of maths are importants.
If you don't do statistics, you'll never see the difference between that's noise and that's relevant information.
Discreet structures are the basis of algorithmics. No algorithmics, no efficient code.
Linear algebra is the basis of... everything including non linear equations So you'll need it for equations solving, optimisation (including in discreet structure), graphics 2d or 3d, sound...
calculus, derivations (or whatever it is called in your country) leads to data analysis, trends...
Mod me troll if you want but if you want to do more than selecting colors on a website, you can't have too much maths...
If you are majoring in Computer Science I would definitely go with Discrete Class. As you get into more advance computer science fields and plan a career which has to do with coming up with optimized solutions to problems. However if you are aspiring to a game programming career dealing especially with Graphical programming vector analysis will very important. Ideally I would take both because they would help your understanding of the math you will need to know, but one thing you have to realize is that when learning discrete requires a little different type of thinking.
You can get by without either as I have seen many programmers do. Now their code is unreadable by most humans and even most of the compilers for the languages they work with, but that has not stopped them from creating reams of code that almost does what is needed. Their BA in Art History did not require Math beyond basic addition and subtraction.
Now if you are aiming for understanding the math you are taking, it sounds like you have already found a point where you are struggling. It might be time to take a step back an assess the foundations to make sure those concepts are fully understood.
The way I see it, the OP is approaching this question from the wrong side. I did things the other way round - I have a PhD in maths and ended up in computing. The reason that I studied maths, and the reason I now work in IT, is because that's what interested me at the time. Pick whichever course you find more interesting. You are likely to get better marks and end up being steered towards work that suits you later on. Treating maths like a chore that has to be done so you can get on with programming is the wrong way to go about it - take an interest in the maths itself and the rest will follow.
Incidentally, every job I have had has been programming related and I have used maths from both areas that the OP mentions in my work in the past. The work I currently do involves virtually no maths. This is because I realised I would like to interact with end-users and non-technical people some of the time I'm working, and (in my experience) the hardcore maths side of programming tends away from that sort of interaction. Difficult is not the same as boring, I find understanding people and turning their requests and ideas into useful code much more difficult than bashing out maths code, but ultimately it's proved more rewarding. Follow your interests, even if they may be difficult, and I think you will be happier for it.
https://alephnull.uk/
I've never been required to use more than basic Algebra skills. Maybe "great programmers" need these skills. Most programmers just need basic math skills (Algebra) and know how to use data structures.
I took no computer science classes in college although I did take math up to Calculus. I taught myself some stuff about computers, read a few books, played with programming on my own and took a few community college classes and now work as a programmer. I've worked with people who got phds, they have the same job. Funny, sort of. I mostly goofed off and had fun in college and got a degree after 5 years... in Ecology.
I teach mathematics (e.g., continuous optimization) and computer science (e.g., cache oblivious algorithms) in a French engineer school (undergraduate and graduate level). I'm also a researcher in machine learning, a quite in between field.
My experience as a teacher is that learning by yourself discrete mathematics is far easier that learning continuous mathematics (from measure theory to probabilities and statistics). This is seconded by all my colleagues. If your know about programming, you should be able to understand most of want you will need by reading something like "Introduction to Algorithms" by Cormen et al. and complementing it by a random discrete mathematics book. Trying to do that with reference books in continuous mathematics (like "measure theory" from Doob) will be extremely difficult if you are on your own. Learning probabilities and statistics on your own will also be very painful. Therefore my advice is to go for continuous mathematics and learn the rest by yourself.
Good luck,
Fabrice
I think which path you choose depends on what you want to do. From a foundational strand point, I'd seriously suggest the discrete stuff. In any sort of higher level algorithms classes you should probably be exposed to, you will need the graph theory. On the more practical side, data structures are vital as any sort of practical programmer. Without a decent grasp of the material in a data structures class, I'm pretty sure you're going to struggle finding decent jobs. The other stuff--the continuous math--is a blast (I myself started out CS and have since been wooed into pure math as a grad student), but as some have pointed out, unless you're doing development in computer vision, gaming (physics engines, graphics, etc.) or some sort of scientific computing in a national lab or university, etc. I don't think it's really going to come in handy all that much. Just my $0.02.
...I started becoming increasingly more convinced...
I lol'd at this - OP managed to take the 4th derivative of 'convinced' in his post.
...in both developing and teaching, here's my take:
Computing:
- Some kind of hardware (microprocessor, etc) course
Computational Math:
- Discrete Math: Logic, Sets, Relations
- Algorithms and Complexity
Application Math:
- The Calculus
- Statistics
- Geometry & Trigonometry
- etc... (depending on the industry to which you're attracted)
I really believe that the computational math is strongly supported by an understanding of the practical implementation of stored program computers. This helps both your programming and debugging/troubleshooting, in that you understand the impact of your little creation on the hardware.
Application math is application-dependent, ha-ha. I went for a long time both as a developer and teacher before I encountered advanced statistics or differential calculus; there are more folks out there doing this in aerospace than you might think.
I think the distinction between computational and application math helps to compartmentalize your consideration...
I took discrete math myself and found it to be somewhat useful for computer science
unless u plan to get into sm music, graphics or game development....i doubt tht d other course would help
Ed Post has already answered this question, and many of the topics that have been raised in the comments he has put to rest as well. Here is and excerpt from the Article, which can be found in it's entirety here: "... What kind of tools does a Real Programmer use? In theory, a Real Programmer could run his programs by keying them into the front panel of the computer. Back in the days when computers had front panels, this was actually done occasionally. Your typical Real Programmer knew the entire bootstrap loader by memory in hex, and toggled it in whenever it got destroyed by his program. (Back then, memory was memory-- it didn't go away when the power went off. Today, memory either forgets things when you don't want it to, or remembers things long after they're better forgotten.) Legend has it that Seymore Cray, inventor of the Cray I supercomputer and most of Control Data's computers, actually toggled the first operating system for the CDC7600 in on the front panel from memory when it was first powered on. Seymore, needless to say, is a Real Programmer. One of my favorite Real Programmers was a systems programmer for Texas Instruments. One day, he got a long distance call from a user whose system had crashed in the middle of saving some important work. Jim was able to repair the damage over the phone, getting the user to toggle in disk I/O instructions at the front panel, repairing system tables in hex, reading register contents back over the phone. The moral of this story: while a Real Programmer usually includes a keypunch and line printer in his toolkit, he can get along with just a front panel and a telephone in emergencies. In some companies, text editing no longer consists of ten engineers standing in line to use an 029 keypunch. In fact, the building I work in doesn't contain a single keypunch. The Real Programmer in this situation has to do his work with a "text editor" program. Most systems supply several text editors to select from, and the Real Programmer must be careful to pick one that reflects his personal style. Many people believe that the best text editors in the world were written at Xerox Palo Alto Research Center for use on their Alto and Dorado computers[3]. Unfortunately, no Real Programmer would ever use a computer whose operating system is called SmallTalk, and would certainly not talk to the computer with a mouse. Some of the concepts in these Xerox editors have been incorporated into editors running on more reasonably named operating systems-- EMACS and VI being two. The problem with these editors is that Real Programmers consider "what you see is what you get" to be just as bad a concept in Text Editors as it is in Women. No, the Real Programmer wants a "you asked for it, you got it" text editor-- complicated, cryptic, powerful, unforgiving, dangerous. TECO, to be precise. It has been observed that a TECO command sequence more closely resembles transmission line noise than readable text[4]. One of the more entertaining games to play with TECO is to type your name in as a command line and try to guess what it does. Just about any possible typing error while talking with TECO will probably destroy your program, or even worse-- introduce subtle and mysterious bugs in a once working subroutine. For this reason, Real Programmers are reluctant to actually edit a program that is close to working. They find it much easier to just patch the binary object code directly, using a wonderful program called SUPERZAP (or its equivalent on non-IBM machines). This works so well that many working programs on IBM systems bear no relation to the original Fortran code. In many cases, the original source code is no longer available. When it comes time to fix a program like this, no manager would even think of sending anything less than a Real Programmer to do the job-- no Quiche Eating structured programmer would even know where to start. This is called "job security". Some programming tools NOT used by Real Programmers: Fortran preprocessors like MORTRAN and RATFOR. The Cuisinarts of programming-- gr
I have a master's degree in pure (theory) mathematics, but now work as a software engineer. You may or may not ever use
stuff like numerical analysis, differential equations etc in your programming career, but studying these subjects improve your ability
to understand abstract concepts and to think logically. I've known many older computer science majors who had a hard time learning
object oriented programming due to the fact that it is more abstract than the sequential programming they learned in school.
So I would say take both. The discrete math related stuff (graph theory, theoretical comp sci) is essential to computer science. The other stuff is good
for your brain and could be useful at some point in your career. I would recommend studying numerical analysis and statistics/probability if you have a chance.
Actually if I could do it over, I would double major in comp sci and applied math.
He's on crack. By and large the discrete math will serve you better because it's the sort of thinking that is essential to programming algorithms.
That being said, if you intend to pursue work in graphics, or writing physics simulations or engineering software, the vectors/euclidean/differentials will be a big help. But that's really only for those cases. None of that is at all useful to the average developer.
Discrete math, logical conclusion, sets, graphs, and (duh) algorithms are a must though.
FWIW, before being a CS major I took a humanities philosophy class called Intro to Logic. After being a CS major I was required to take Discrete Math. I aced the latter because it was exactly what I'd learned in the former, with different notation and namespace.
Terrorists can attack freedom, but only Congress can destroy it.
Definitely, Discrete math... that is what you would be using a lot as a programmer. specially database, web, network etc
differentials and all that are more for engineers and researchers. Or if you get into 3d modeling and those kind of thigs.
Go for graph theory, sets, etc. as these things appear in CS all over the place. Graph theory stuff can be used with DFAs and other automata and Petri-nets. It can also help in managing semantic data. Sets are used for almost everything. In my actual position I will develop a domain specific language (DSL) which includes the description of some sort of automaton maybe something based on sync charts. Also the DSL shall be able describe things on different abstraction levels or for different abstraction levels. And on the upper level networks have to be described and verified analytically (if possible). This all involves graph theory. Vectors, euclidean space, differentials (analysis) is used mostly in simulations and sometimes (rarely) in stochastic/statistics. So go for the graphs. I also recommend learning something about description logic, Turing machines, horn clauses, languages etc. (but that should be already part of the required curriculum in any Bachelor program).
Having a degree in Mathematics and having worked with and briefly as a developer for a large IT company, I say take discrete math. The other class is probably more computationally intensive, but what you do in programming is much more logic based than computation based. Discrete math will deal with topics that are more related to programming and should build logical thought processes in your mind. Also, proof writing very frequently requires extreme outside-the-box thinking which is also a very important thing in development.
Take both. Really. They're both useful. In fact, stay on long enough to take one this term and the other another term. If you have to wait a year or two for the second to come around again, even better. You can use the time to boink co-eds. And besides, the job market is still sucking.
That is all.
WHAT!? thats utter bullshit and he has no freakin clue what he's talking about! If you are not about to write a 3D Engine or an Algebra system (like "derive", "maple", etc), the second subject is mostly useless for you! Take the first course, because nearly every problem you encounter in practice, is equivalent to some graph problem... also you need graph theory in EVERY course on theoretical computer science (complexity, computability, randomized algorithms, efiicient algorithms, parameterized algorithms), these are very closely related to graph theory. Also multithreading and thread synchronisation are discrete systems and even good string processing (compilers, scanners, etc). Heck, you meet discrete math even in artificial intelligence, logics, logic programming, relational databases, game theory, designing micro-chips, routing, networking, sorting algorithms, you name it! everything about computers and programming has to do with discrete math, because processors, operating systems and programs are discrete systems (equivalent to turing machines) and they operate on a discrete set of data (because you only have finite RAM and HD and "discrete" basically means "enumerable or finite")
The MAFIAA is a bunch of mindless jerks who will be the first up against the wall when the revolution comes
""It is no news that the greatest computer scientists and programmers are/were mathematicians."
I just threw up a little.
The Kruger Dunning explains most post on
Go for the discrete math. class. It has tons and tons to do with the basic computing theory of turing, which is the father-mother theory of the whole thing and learning to make and evaluate mathematical proof is the true signature of the masterful engineer. You will learn enough to invent algorithms and move on to the hairy part of computing: IA, genetic algorithms, fuzzy thingies and that kind of shit.
Discrete math IS the immediate superset of computing theory.
NO SIG
In the context of the thread [advanced math for programmers] you never got close to answering the question at hand. How does advanced math really help a programmer? There are small subset of low paying programming positions where one may apply that craft. The majority of programming jobs simply don't need advanced math.
With regard to your narrow definition, you are correct that advanced math is not a "requirement" for the programming positions that report (and have reported) to me. But the individuals with math-focused academic backgrounds have generally displayed intellectual rigor that delivers exceptional results. This often leads to promotion into leadership, tech-lead, and mentoring positions that pay more. I pay them more because they deliver higher quality results than delivered by peers.
This is not in any way to discount the value of contemporary C.S. degrees. When opening occur, I interview both. When figuring out who to hire, I am most concerned that my team is composed of people with multiple backgrounds, not one or the other.
Don't discount other disciplines in shaping your career. I have met a scary number of people who were math majors with skills in classical music theory and composition. Their combination of creativity and discipline translated into outstanding programmers and database administrators.
As either path can result in a nicely paying career, why not instead investigate what subject areas give you the most satisfaction? People who do what they like are likely to do the best work in any given area. Compensation at that point is mostly a factor of the supply and demand for your skills and experience by any given employer or industry.
Live Long and Prosper - Thanks Leonard. You are missed.
Mathematics and software programming are most definitely intertwined and mathematics can definitely support your programming, I would not necessarily try to suggest one set of courses over another - rather there are benefits to either stream and it depends on the specific problems you end up tackling, so it might be best to go with the stream you enjoy the most. Better to have to work at something that might be hard, yet you enjoy, rather than something that is just hard.
With the touchy-feely stuff out of the way, below is a quick account of my experience:
I have an MSc in Mathematics. However, I have always loved programming, and taught my self to program over the years. Today I work professionally as a free-lance developer. I would say that my mathematical training has been indispensable, but not because of specific knowledge of vector spaces or differential equations (most of which I no longer remember or ever use) etc. but rather because of the mode of thinking I learnt. Mathematics is built upon layer after layer of carefully constructed (well defined) abstractions. For me this is most clearly seen in abstract algebra, or topology etc.
The key underlying principle that is critical to building complex software systems is abstraction. If you can understand how to create clean well defined abstractions of the problem at hand, then you will be able to build complex yet flexible software. In programming languages these abstractions are directly supported via constructs such as interfaces, inheritance, libraries, procedures etc. or indirectly via patterns and principles such as inversion of control, loose coupling, delegates etc.
All complex software systems rely on such abstractions.
In contrast, I would say that only a small percentage of the code developed ever relies heavily on specific algorithmic knowledge (e.g. linear algebra for 3D graphics, or hashing algorithms or cryptography, or specific knowledge of red-black trees for hash table implementations). Very often these are simple imported via a suitable library, or coded based on a well know reference implementation, or developed in conjunction with an expert in the specific field.
So, in summary, if you have some special area of interest that would be supported by a specific tool set, then clearly you should pick that up. Otherwise, any well taught mathematics course (irrespective of the specific subject matter) should highlight the abstractions that enable related concepts to work together, and emphasise the need for well defined definitions in order for things to be computable.
I got a Ph.D. in Philosophy back in '78 (am I going to have to specify that in four digits soon?), and one day when I was moaning around because I couldn't find a job with reasonable pay and even minimal dignity, a friend said to me, "go into computers, Vomact". I said something like, "huh? But I'm terrible at math!". He told me not to worry, "there's no math required, it's all logic". Overall, I've found that to be true. Basically, you need a mental tool-box to solve programming problems, and those problems have been mostly logic problems for me, so my tools worked just fine. I think that maybe studying mathematics gives you similar tools, but I've always suspected there's some kind of mathist prejudice at work in CS departments that require calculus as a prerequisite. I think they just put it on the list to act as a filter to keep people who should get an M.B.A. or something else trivial from wasting their time. But it's a filter I couldn't have passed. Luckily, there were very few formally trained programmers back in the early eighties, and someone like me could talk his way into a software job.
It's obvious, of course, that if you intend to write programs that actually use mathematics, then you'd better study math—if you're going to be a scientific programmer, for example, just as you'd better understand statistics if you want to write actuarial programs for insurance companies. In fact, depending on what kinds of software you design or write, there are a lot of things you might be called to know...and you can't know the list in advance, when you're still in school. Just be prepared to keep learning when you leave school—in fact, that's when the learning really starts.
No, I am not saying that studying maths is a bad idea or a waste of time. On more than one occasion, I've gotten essential insights into difficult programming problems that involved mathematical and geometrical understanding from mathematicians, so I'm quite prepared to respect their training. I just don't think it's a prerequisite for the job.
As others have pointed out, the article summary invites confusion by conflating computer science with programming. I dont' see why you need calculus for either, though.
Great men are almost always bad men--Lord Acton's Corollary
I finished my degree last year and all the maths that we did was discrete math; proofs, sets, algorithms and graphs and my degree was mostly maths. I found it pretty hardcore as I didn't have that natural flair and the mathematicians could make head or tale of it. Graph theory and algorithms are useful for parallel programming etc. Of course it depends on the type of programming you want to do for example, for example if you want to work in a financial institute, do some financial maths. I'd say do the first. Get a copy of 'Introduction to Algorithms - Corman', 'Computability, Complexity, and Languages - Davis' (silly oxford comma) and 'Introduction to the 'Theory of Computation - Spiser' all great fun to read, I never got through them, hence my degree classification was cr*p. Have fun.
In my CSE program, we were required to take both. Much lost sleep, but worth it.
Disclaimer: Math has always kicked my ass.
It's not easy to do well. So many GUI designers end up doing stuff like "add more themes", flashy stuff and wobbly windows, instead of actually improving things.
I know I may be going off-topic (I can feel the karma burning already), but I'd like to rant about why the Linux GUI rocks. And I'll praise emacs a little too. And I'll shame emacs too.
So, let's talk about usability. What is it? According to Wikipedia, "Usability is a term used to denote the ease with which people can employ a particular tool or other human-made object in order to achieve a particular goal."
So, ease of use. What makes something easy to use? Well, some criteria might be
One of the most brilliant little things that Linux gets right is alt-dragging to move windows. Instead of having to hit a small title bar, you have a (comparatively) huge window to hit with the mouse. Fitts's Law would predict that you can do it faster, i.e. that there's increased efficiency. My intuition approves of this message :)
Then, if you enable sloppy mouse focus and disable raise-on-focus, you can work in one window looking at information in another window that's on top of a part of the work window that you're not working in. That makes you more efficient, and means you don't have to fiddle with resizing windows. That also makes people more satisfied---people really want their windows to have lots of space (plus, some websites cope poorly with resizing, especially if you also zoom the text).
And if you use the infinitely configurable compiz, you can have increased memorability---nothing helps you remember a bunch of random data better than you yourself choosing which random data to remember. That is, setting your own hotkeys means you can remember them more easily, so it's easier to learn what the hotkeys are.
And here's the part where I praise emacs: putting the text navigation keys on ${ctrl or alt} plus ${some letter} really is a boon for efficiency: if you're typing, you're holding your fingers close to the letters. Besides typing, the most common operation is moving around in your text (I claim without evidence). So you can switch between the most two common tasks without moving your hands, which is much more efficient than having to move your hands to the cursor/endhome/pgupdown keys. Of course, that still works if you want that.
Also, Linux gives you a lot of flexibility, which means you can set up your box to work exactly the way you want it to. Having a tool that works how you like it rather than almost how you like it is bound to affect your level of satisfaction. I know it does that for me.
Now, for the negatives: although I love emacs, it's not exactly the king of learnability. I mean, the emacs tutorial is long. Not particularly hard to follow, but no one's going to guess on their own that C-x C-C is the way to exit, and C-x C-s means `save'.
And even on a fairly vanilla Ubuntu install, the default Metacity configuration could be made better for windows users: have only a single virtual desktop, bind alt-F4 to "close application", make Windows+{E,D,F} (AKA Super+{...}) do what they do in Windows. That way it's easier to learn, because there is nothing to learn---the user already knows how to do things.
So, despite not being perfect, Linux does get some usability things right.
I suggest you get some books that make math more interesting.
For any software developer, the math in the "Aha!" books is appropriate. I was able to understand this math in high school, so I'm sure hard-core math nerds will sneer that this is too easy, but I stand by the claim that these books are worth your time.
Aha!: A Two Volume Collection on Google Books
Aha! Insight on Amazon
Aha! Gotcha! on Amazon
From my own personal experience, I have never needed calculus or differential equations or any of that advanced sort of math in my whole career. I'm now doing somewhat advanced DSP work, and even there I haven't needed advanced math. (I don't entirely understand how the FFT works; I just know how to use its properties to get the result I need. Other people wrote C versions of the FFT for me; I haven't needed to write it.)
The math that has been useful to me is basic logic stuff, to know how to write conditions for if statements and the like; O(n) estimations, to help you choose the best algorithm to solve your problem; and basic probability stuff, to help me understand how caches work and such. So the first class sounds better to me than the second.
I'll recommend one more book to you. It's a sort of encyclopedia of algorithms... it will expand your mind with possibilities (if you don't even know something exists, you won't be able to use it to solve your problems). It's engagingly written, with "war stories" that make it more lively.
The Algorithm Design Manual on Google Books
The Algorithm Design Manual on Amazon
The author's web page for the book
steveha
lf(1): it's like ls(1) but sorts filenames by extension, tersely
Take them both. No, I am not kidding. I took the equivalent of both and they have both been extremely valuable.
Stonewolf
I suspect the grad student is trying to sell you on the course. You can get by on high-school algebra, and almost any kind of math beyond that will help, because its the kind of math you will learn to program. Algorithmic courses are always good, but geometric and trig courses are good for graphics. So, in which direction do you want to go?
Agreed. It completely depends on what kind of software you want to write or what kind of computing research you want to do. I love continuous math, so I took a fair bit of it, but I've hardly ever used it because of the application domains of most of my software development thus far. I never really liked discrete math or statistics, which is too bad, since they're both a lot more applicable for what I do.
And for Software Engineering as a discipline, math is not a high priority. It's more about prioritizing, process, requirements, documentation, dealing with other humans, and other stuff I'm probably forgetting just now. It's a far cry from a lot of scientific or engineering-oriented programming, which is often done by by small teams with more training in the application area than in computer science or software engineering.
I'd say do the math you like and pursue software development that uses that math.
I actually took both those courses (or courses that covered each of those topics) this past semester, and I must say that Discrete Math was the more beneficial in my mind. Not because the topics discussed were particularly more useful than the others, but because that course put the person more in a proper mindset for programming and systems in general. thinking logically is the core of a programmer, and Discrete Math aided that aspect more. Thus, I would go with that.
Most of the people who are just programmers cannot solve complex problems though they may be the best with their tools. What maths teaches (unfortunately taught right) is you look at objects and their relationship - concrete or abstract and create a model expressing that relationship. Basically addition is the only operation that is needed. Multiplication is a shorthand for successive addition, exponentiation is short hand for self multiplication, negation is complimentary addition, factorial is successive decreasing multiplication etc. Discrete models use arithmetic and algebraic modality while continuous quantities like flow of air, water, electricity etc., use calculus for integration (addition with error margin). So all we learn are patterns of simple relationship and the ability to recognize these patterns. Pattern matching and pattern recognition are expressed via algorithms that are translated into programs with margin of errors. So, what is your goal? Do you want to try to test the limit of your imagination and intelligence, or just use the tools just to solve problems in some domain?
The best choice is take both streams of maths, one for future job and one as hobby. Eventually you will excel at least in one area. People who have lost job, went vertical like palm trees but you need to be good both horizontally and vertically. So, find some mentors who love to teach maths and try to understand the fundamentals - 1st principles of both discrete and analysis, vectors etc. Don't become an island. You may end up as one of the best in the industry down the road and may be you might create your own company. There is nothing to be afraid of maths as such but seek help outside this forum. Good luck.
hey now,,,
what about mathematical logic, or logical calculi, or modal logic, or constructivist methods of mathematics,,, or any math regarding
Godel, Church, Turing...pursue the issue of infinity and computability, and algorythms.
blahabaahahah
I took them both. I was an electrical engineer interested in doing VLSI design, which I never did, and have NEVER used anything from the analysis course. It was a fascinating course and I am sure that it made me a better human being, but it has yet to prove itself useful to me.
I have on many occasions used the information I learned in my discrete math course. I also got to meet a great math professor and even got to help him write his own textbook used in teaching subsequent semesters of the discrete math course.
Don't waste your time on the analysis course unless you enjoy serious math work. Do take the discrete math course. It's much more useful and more interesting to boot.
If you're serious about Computer Science and becoming a programmer you will eventually need to take a course in discrete mathematics, and ideally for a broader skill-set you ought to take both the classes you've listed. However, to decide for this coming semester, pick the course with the better professor. In my experience, the quality of professors in =200-level math courses varies really, really widely, and that can make the difference between getting a C+ after not learning much and receiving an A after taking one of the most enlightening courses of your life. Pick the one that most points towards the latter scenario this semester, and just make sure to have taken both by the time you graduate.
When you have a chance read the article in Wikipedia entitled Discrete Mathematics. And then read the one entitled Linear Algebra. It will help you make up your mind. FWIW, when I was working on a Masters in Computer Science the two math courses that proved most useful were: Discrete Mathematics for Computer Science majors and Linear Algebra for Computer Science majors. The distinction "for computer science majors" implies a greater emphasis on process, implementation, and analysis and none on "proofs". In that sense they are "practical" courses because it is assumed up front that the material presented is based on a solid foundation of proofs (referenced or 'appendicised' and "there's no need to get into all of that"). Math courses for mathematics majors and science education majors, in contrast, are entirely "proof" oriented because these people need to fully understand how to extend the absolute rigor of mathematical logic and theory, and also how to teach it. BTW, reading about how math proofs were achieved, with their creative leaps o' logic, can be fascinating and rewarding when they're presented from a historical perspective. It's remarkable how many proofs were actually locked down THOUSANDS of years ago.
I am horrid at math. Math skills are far less important, then the ability to think logically and problem solving. I have been a programmer for over 4 decades now - working on a variety of operating systems from Mainframes to Micros. Did COBOL, Fortran, PL/I etc. http://www.pkill-9.com/ Wayno
Depends what you are going to program. If you are looking at logic programming then the first is for you. Now, if you're into making graphics move all over the screen, then you would want to take the second course.
Generally any strong math background will give you leverage in CS. Rule of thumb for graduate math classes: take the easier one, you can always progress to harder class later (in grad or postgrad school).
Itemized list:
discrete math - yes
proofs - not relevant
sets - yes
algorithms - yes
graphs - most likely
math analysis - if you go for PHD
vectors - yes (esp. computer graphics)
euclidean space - same as vectors - yes
differentials - computer graphics
Personally, I always liked learning the 'harder' thing as that might expose my brain to concepts or ways of thinking that I wasn't already familiar with.
I would like to do the same, but I would always be concerned I'm not completing tasks fast enough, getting done what I could, etc.
Any thoughts? I will be entering the workforce soon. I suppose one could simply explain it as becoming more well rounded.
I am a programmer, with a master's degree in math. I have found no use whatsoever for the Analysis type of math in my job or elsewhere. I would highly recommend the Discrete class. Graph theory is extremely useful in computer science, and writing good programs is highly dependent on being able to write efficient algorithms. good luck!
I am a senior computer science major right now and I would say to go with Discreet structures with graph theory. If you have any sort of Formal Language Theory class it will be a great deal of help. It will also help with things like cryptography. It will mostly help with theory classes. If you do not have to take any theory then I would say you are just doing programming and not computer science in which case the other class may help more.