I’m writing this post as an extension to the answer Casey gave last night on mathematics and game programming. Mathematics, and the education thereof, is a subject that hits close to home for me - so much so that I felt obligated to write this quick blurb directed at people who are questioning their math abilities, but who are interested in (game) programming. I will try to keep this short, since I could go on ad infinitum on the subject.
I don’t want to take anything away from Casey’s answer, but I want to share my thoughts from the other side of the fence. Casey is a phenomenal programmer who has taught himself the required mathematics - I am a mathematician, from a very highly regarded university, who is trying to teach himself how to program (though I now work in the software industry). The following rant is based off years of experience teaching students, and collaborating with faculty about what makes a successful math student at the university level.
The first point I would like to make, is that although I’m a mathematician, I consider myself a lousy programmer when measured up to people like Casey. So rest assured, we all have things we need to learn and improve upon :)
The second point, is about learning math. I believe, very strongly, that your ability to do well in these programs is in no way representative of your capacity to learn math. There are many reasons why this has become the case, which I won’t get into, but the result is that “math”, as far as the general public is concerned and that is taught in many of these programs, has been reduced to cheap parlor tricks, shortcuts, and memorization - all which completely contort, mask, and bastardize the underlying ideas. It makes me very sad hearing the general public talk about “math”.
Pure mathematics, at it’s heart, is an honest conversation you have with yourself about eternal truths; “do I understand this absolutely?”. All the notation is just a language developed so mathematicians can unambiguously communicate their ideas and understanding - don’t get lost in it. You can fake understanding on exams, or in conversations with people, but you can’t lie to yourself. Herein lies (one of) the connections I see between mathematics and programming; if you don’t understand exactly what you are doing, you are failing. After hearing Casey talk for a few weeks now, I am perfectly confident in his ability to learn math, and am not surprised at all that he was able to teach himself everything he needed. Why? Because when programming, Casey has the fortitude and conviction to dive deep and understand what is going on at low levels in the computer, at the CPU. Unfortunately, the computer is bound by physical laws and thus there is always a layer beneath that which we may never understand - but the dedication and devotion to his craft that drove him to this level of understanding is what is important - at least in mathematics - and I can only presume it is one of the reasons Casey is a great programmer. This is one of the reasons I felt encouraged to write this post directed at the viewers of Casey’s stream - just the fact you are here, following this project, and have the desire to learn the intricate, low level internals of what makes games tick without dependence on external libraries, makes me confident that this audience has the potential to succeed in mathematics.
So, if you’re not confident in your math abilities, what should you do? Analogously to programming, when you start, you should not start with something like Ruby - you are far too removed from the actual CPU. You should learn C, learn how the operating system and computer works, and build everything up from there (my, limited-experience, opinion). In math, this means that if you want to learn linear algebra, you should go to MIT’s course website, find out what book is being used in their first year linear algebra class (for mathematics majors!!) and read that book. You will have a far better shot learning the concepts of math staring at it in the face, rather than looking at a faint, foggy reflection of math through the veil of cheap parlor tricks. Then, when you’re learning, you need to be perfectly honest with yourself about what you do and don’t understand. Don’t move on until you truly understand the last concept. This takes discipline, time, and can sometimes be a painful mental process as you chase thoughts around in your own head - but it is the only way to make true progress. Mathematics is really a self-taught field; people can guide you in the right direction, but ultimately the onus and responsibility is on the learner to ensure they actually understand and can internalize the concepts. There appears to be a similar paradigm in computer science.
I believe explorations in mathematics can be extremely enlightening and rewarding. The logical foundation, and self-discipline developed while learning pure math can’t be understated. It is this shared desire to “understand” what is going on is what I think links people who are good at math and people who are good at programming (though I can really only speak for the former). Furthermore, developing a traditional mathematics background is certainly directly advantageous if you ever want to do any complexity analysis, or develop complex algorithms, data structures, compressions schemes, graphics, etc (it’s the reason I currently work in the industry!). But my overall message I would like to send to the audience of this project, is that if you are here, then I have confidence that you can learn the math needed to program games, if you truly want to.
- edited to remove personal vendetta against early mathematics education systems.