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
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.
Or be a woman and take take both; whichever suits you.
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".
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.
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.
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.
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.
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.
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
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 :).
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
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
Discreet has more practical application to designing software and understanding compilers themselves. Practical applications of graph theory apply to the design of state machines and numerous other programming topics. However, if you have the time, do both. You can never have to many maths.
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
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.
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.
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.
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 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
If you haven't had discrete, you WILL need it as a programmer.
Set theory is useful for more than just DB theory, as suggested by some here. Set theory is what your brain goes through when you create complex if-else statements, case-switch statements, etc.
--"insert clever quote here"
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 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.
... 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.
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.
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.
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 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!
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.
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".
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
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.
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.
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.
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.
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.
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.
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
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.
That is cause the non-math people think that math is pretty much just what they learned in elementary school. There are just bigger numbers and lots of that "X" stuff.
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...
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 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 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...
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
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.
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.
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
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
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.
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
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.