This topic comes up every so often. I think my previous comment applies here [1]:
I started a Math degree after 16 years of programming without any Math beyond high school (the highest being high school calculus). Most of my work as a software developer didn't require any "higher" Maths.
Once I began studying math, including Modern Algebra, Analysis, Graph Theory, Category Theory, etc., I realized I understood many topics on an informal level, in a non-rigorous sort of way, through programming. I had a good sense of major algorithms and data structures as well as their running times. Once I did have more math under my belt, things did become easier, and I started to see connections and commonality between problems across different domains, i.e. more than one way to skin a cat.
Part of the reason I began studying math, is that I felt it was my limiting factor. The range of problems I could tackle as a programmer was limited by math. It turns out this was partly true.
The biggest misconception is that in Math there is one "correct" answer. This is almost never the case. Some of the most interesting solutions in Computer Science come directly from Math topics that were once considered "abstract". Likewise, some of the most interesting problems are solved through approximation algorithms of seemingly intractable problems, often requiring a bit of "hacking" and real world experience beyond what you'd get from a formal education in Math or Computer Science.
I'm in a similar boat as you. I went up through Calculus in school and hated it. Around 5 years ago I developed a strong interest in learning relevant applied math and have been enjoying it since.
Some things I'd add:
1) Math is fun! If you have the aptitude and disposition to enjoy writing software you'll love working out math problems. They're little nuggets of mental stimulation that you can work on with just some paper, a pencil, and maybe a pocket calculator.
2) You're spot on about an experienced programmer already having an intuitive but non-rigorous understanding of many concepts. It's mostly a matter of learning to read and write comfortably using the notation, which is really similar to learning the syntax and semantics of a big computer language with poor reference material.
3) You really have to have basic math down. This means going and re-learning stuff like applying FOIL to a binomial or dividing by a reciprocal.
4) Calculus and Linear Algebra are the father and mother of applied math. You'll save yourself a ton of grief if you learn them first (and I mean really learn them, maybe you took a calculus class in college but can you apply the Chain rule right now?). I'm learning Linear Algebra currently, which is something I should have done years ago. Part of the problem with self-teaching is getting things out of order.
I agree that getting things in the right order is important, but would argue that the order in which math is usually taken in the US is not the optimal one!
I recently took calc-1,2,3 and linear algebra through my local community college, and then started working my way through a wonderful book on mathematical proofs:(http://www.amazon.com/Mathematical-Proofs-Transition-Advance...), as preparation for working on higher level math. I would now argue that being able to understand and write proofs is a (the?) key mathematical skill to understanding what I would call 'real' (higher) math, and could be learnt by most students following high school algebra. My impression of the calculus series and linear algebra courses was an excessive focus on calculation, the math proof book was way more fun, surprising for a subject that is often thought to be too difficult for first year college students.
For those who are intimidated by the idea of a book on proofs (like I used to be), an example from the third chapter:
Theorem: Let x be an integer. Then x^2 is even if and only if x is even
It seems so simple, and I think would be accessible to anyone who had completed high school algebra but I found that even having done those calculus and linear algebra courses, I had now idea how to go about actually PROVING this! The book however, goes through the thought process step by step, and teaching the skills needed to be able to understand the real math books like Rudin.
I wish there were some sort of open-source prerequisite chain of what order to learn any subjects in. That's the hardest part of self-learning. Elon Musk had a reddit AMA recently where he was asked how he knows so much - he responded that he thought everyone had the capability of learning more than they thought, but that the key was to look at knowledge as a semantic tree. If you learn things in the wrong order, they won't have anything to hang off of.
Number theory. Set theory. Category theory. Combinatorics. Graph theory.
Linear algebra certainly has applications in some of the above. But I don't think that calculus & linear algebra can be fairly described as "father & mother" to these areas. (Am I wrong? I could be missing some connections; I'm not a mathematician.)
Not wrong - the poster above you probably means pure math in the analysis sense - real analysis, topology, functional analysis, algebraic topology. All of which are abstractions/generalizations (zoom out, if you will) from the real life world of 2 and 3 dimensional calculus/LA to N or infinitely many dimensions.
I probably should've thrown in combinatorics, which certainly existed before calculus or linear algebra, and certainly plays a role in applied math.
I would say graph theory is part of combinatorics, and set theory is part of logic.
Category theory was born out of trying to abstract the relationships between different objects in abstract algebra, so is kind of the child of abstract algebra and logic. I think it's fair to say the parents of abstract algebra are combinatorics and linear algebra.
Number theory at an elementary level is combinatorics, but at higher levels branches into analytic number theory (Calculus) and algebraic number theory ((Linear) Algebra).
> 4) Calculus and Linear Algebra are the father and mother of applied math.
> You'll save yourself a ton of grief if you learn them first
Baby Rudin and Axler are used currently by Harvard Math 55 to teach those subjects. Rudin might not be very didactic (I would be happy to hear about alternatives), but Axler is a fantastic choice.
If you liked Axler, you might check out Abbott's Understanding Analysis, also in the Springer UTM series. I think it covers somewhat less than Rudin (e.g. looking at baby Rudin's contents, I'm pretty sure Abbott doesn't touch Lebesgue integration) but it's a pretty great introductory analysis book IMO.
As a math graduate student, I second the choice for Abbott's "Understanding Calculus". It's a wonderful beginning book for analysis. Walter Rudin's "Principle's of Mathematical Analysis" is an amazing book but it's difficult to start with.
For a quick intro to Lebesgue integration you can read the beginning of Rudin's "Real and Complex Analysis" or Halsey Royden's "Real Analysis".
I haven't read Axler's book. I liked Hoffman and Kunze's "Linear Algebra"
It's fun because its incredibly rewarding! The elation of the "a-ha!" moment in math is second to none.
> 4) Calculus and Linear Algebra ...
Though I wouldn't get too caught up in the rigor of analysis or vector spaces right away. If you are self-studying, just spend enough time to feel confident computing and manipulating integrals, differentiation, and matrix math.
Then find a good intro to discrete math textbook covering a wide range of topics: number theory, graph theory, logic, set theory, etc, and learn how to write a "good" proof. This will open up a number of mathematical doors.
This has been my biggest realization as I started learning more math. What before seemed very arbitrary and unrelated becomes much more interesting and exciting once you have a bit of background. Unfortunately, I don't know of any way to get people to see the fun in math until they already know quite a lot of it... this was my experience at least, and seems to be pretty common among people who didn't gravitate towards math immediately.
Thanks for writing this. Over the last 4 years I switched from studying computer science with applications in mathematics, to studying math and symbolic logic with applications in computation. I did this alone, without interacting with anyone in the field. I thought I was going insane because of how many direct 'abstract' connections there are from computer science to mathematics and back again. I know these abstract connections exist as words in the world, but many times it feels like I have to go hunt for the word when I already have the idea.
I haven't really found any real world applications of the concepts I've learned, aside from having to hold a meticulously constructed symbolic reasoning world inside my head for a really long time without observational reality confirming it's correctness as a model to describe all things. This makes me pretty good at programming things that are incompletely described, I think, but also explains why Tarski said he was the only sane logician.
I never really hear about autodidacts talking about their experience. It can be really rough most of the time. I literally think it's just luck that I stumble across the right words. I also think it's luck when I manage to understand things and make a connection between them. I have managed to connect such disparate symbols together and maintain that connection strongly for long periods of time (with absolute conviction), that it all really seems like magic when it does work. But, giants, shoulders, yada yada.
> meticulously constructed symbolic reasoning world (...) connect such disparate symbols together and maintain that connection strongly for long periods of time
The construction and maintenance of my psychology using mathematics and symbolic logic to model, explain, extrapolate, analyze, and manipulate it.
I use computer science to explain psychology, in a way the makes the person being judged correct, instead of requiring their behavior to be altered based on personal opinion.
Imagine you have two conflicting sets of data from observation in your mind, and you have to process this data quickly. Taking an arbitrary and insufficient amount of data is selective and results in bias. Over time this results in contradiction even though both instances of inference are correct with regards to the logical model they rely on, and the data fed to the model. Now imagine that you received this data because over a short period of time, you have experience such a wide range of life experience that your observations allow you to collect both sets of data simultaneously and with correctness. Both data models model the world correctly, but when separated into distinct models of 'knowing things' instead of 'one confusing mass of data', you get contradiction.
So imagine someone endures trauma in their life, and has their mind molded in a specific way based on the current state of psychology, because over time the thoughts in the patients mind are shortly transformed to the thoughts in the therapists mind. Psychology did not experience the trauma, so how can psychology have an opinion on the consequences of bad things happening?
Making inferences adds to data and alters future data models and inferences. How people are judged while they are being 'helped' affects whether that help harms or helps them. I was in a group therapy for victims of domestic abuse and my "counselor" told me that she hated people like me.
There's no dependency between learning functional programming, including Haskell, and category theory. I say this as someone who is reading a CT book (Conceptual Mathematics) after being first exposed to the topic by learning Haskell.
> The biggest misconception is that in Math there is one "correct" answer.
Well written...and I'd argue the same is for both Computer Science and software engineering in general. When teaching beginners, it still astonishes/annoys me how many students tell me, "My program didn't work"...as if there was just one reason why it didn't work, as opposed to hundreds of possible reasons.
I wish more people would scream this from the rooftops. There's that whole movement trying to get more people into programming like code.org and they all say "If you're good at math you'll love this". I feel like that's scaring away lots of people who would otherwise do just fine.
Examples, there's almost no math running Hacker News. There's no math in programming most blogs. There's no math in most apps. There's no math in most text editors. etc etc etc. Most programs don't need anything more than arithmetic.
I'm not saying math won't help with lots of problems. Like you said you found it limiting at some point. But you managed 16 years as a programmer without much math. I'm in a similar boat. I've shipped 17 commercial games, written 6 game engines, world on Chrome for 5 years. My math sucks. Would I be better if my math was better? Of course! But that I've been productive without much math knowledge shows, at least one data point, that you don't have to be good a math to program
> I feel like that's scaring away lots of people who would otherwise do just fine.
I am much in agreement with this. I know that the guidance counselor on staff when I was in high school would heavily steer people away from going into computer science/programming if they hadn't completed the entire catalog of math classes available at our school. Her assumption was that you needed to be some sort of math wizard in order to be successful in a CS or programming degree.
I would have thought game engines would require a strong grounding in maths across a lot of their "moving parts"? Not being dismissive, just curious how you found working in that environment without strong maths skills.
Modern 3D game engines need math in the renderer, physics, maybe the AI but the majority of a game engine doesn't. Loading files, reading inputs, displaying UIs, the object system, scripting languages, most tools, font rendering, localization systems, game save system, networking system. Nowadays teams either buy middleware for the parts that need math or else they have specialists on the team for those things.
On top of that lots of game engines aren't 3D. 2D Mario? No serious math in there, at least not the SNES/NES ones. The 2D Zeldas? Even less. 2D Metroid? Probably less than Mario. Those games didn't use real maths for physics which is about the only place they could possibly use anything more than basic arithmetic.
> Part of the reason I began studying math, is that I felt it was my limiting factor. The range of problems I could tackle as a programmer was limited by math. It turns out this was partly true.
I started studying math intensely (doing every exercise in books, etc) when I realized the same thing: math was a limiting factor for my programming ability. Michael Abrash hints about this in some article, and I sneered at it until I realized it was true.
I considered going back to do a math degree but the amount of hassle involved, as well as other life changes required, made that impossible.
I would like to know how it worked out for you. Are you glad you did a degree program? Do you feel you met people and made connections that were valuable, that couldn't be made by an autodidact?
It was a big hassle and a big life change. But I've always had in the back of my mind that I wanted to do it and I'm glad I did. I put it off because the money I was making, and the places I was traveling, was too good to pass up at the time. So I saved money with the idea that I would get the chance to go to school.
I did try to learn math as an autodidact before I began the degree. The more abstract the math, the harder it was for me to self-study. It was inefficient at best. At worst, I'd hit a wall and not have anyone to reach out to.
I am guessing you went for a graduate degree in math. How hard was it to get admission? Would you like to recommend some good schools for doing something like you did. I am just a little younger but hungry for math knowledge.
Thanks for the reply. My solutions to the problem of not having anyone to reach out to have been to make friends with mathematicians, and to hire grad students as tutors.
I had a couple of things in mind. One was means. That you can solve a problem by restating another way, in a way that it's almost indistinguishable from the original. e.g. solving a problem in linear algebra that also solves a problem in graph theory. solving a group theoretic problem that gives you an answer in topology. solving a problem using category theory that gives you a combinatorial answer, using quaternion algebra to compute a rotation, etc.
The other thing is that in Math you are often dealing with the same question but with very different objects or variable types. The same question where your numbers could be real or complex, integers or finite fields, vector spaces or topological spaces, etc., change what the "correct" answer to the question might be.
While this is true, I've always found applying mathematical analyses such as algebraic reasoning to computation admits a single, minimal, canonical solution in the end.
I started a Math degree after 16 years of programming without any Math beyond high school (the highest being high school calculus). Most of my work as a software developer didn't require any "higher" Maths.
Once I began studying math, including Modern Algebra, Analysis, Graph Theory, Category Theory, etc., I realized I understood many topics on an informal level, in a non-rigorous sort of way, through programming. I had a good sense of major algorithms and data structures as well as their running times. Once I did have more math under my belt, things did become easier, and I started to see connections and commonality between problems across different domains, i.e. more than one way to skin a cat.
Part of the reason I began studying math, is that I felt it was my limiting factor. The range of problems I could tackle as a programmer was limited by math. It turns out this was partly true.
The biggest misconception is that in Math there is one "correct" answer. This is almost never the case. Some of the most interesting solutions in Computer Science come directly from Math topics that were once considered "abstract". Likewise, some of the most interesting problems are solved through approximation algorithms of seemingly intractable problems, often requiring a bit of "hacking" and real world experience beyond what you'd get from a formal education in Math or Computer Science.
[1] https://news.ycombinator.com/item?id=7104566