Programmers should know math.. just not all of it
giorgiosironi.blogspot.com
giorgiosironi.blogspot.com
I would also be inclined to have basic probability theory join combinatorics for the simple reason that the two subjects are so closely related that you tend to learn about them together. However statistics should remain a specific application of mathematics.
Otherwise a good list.
"I could theoretically develop a solution within a day, but I have no idea what you are talking about!"
I hope such programmers make sure that they can work on the next twitter and such things and don't have to implement solutions for financial controllers and the like.
I'd argue that beyond arithmetic and maybe a basic understanding of functions (e.g. f(x)), most "programmers" need to know very little math. But they also tend to produce shoddy, inefficient code and look at problems as "moving bits around".
Computer Scientists on the other hand need to have spent some time understanding the theory of computation. Calculus is one way of computing things, so is lambda calculus, and turing machines, and formal grammars, various algebras like regular languages, etc. Slinging code is just another way of computing things to a Computer Scientist.
Given this, most typical programming trade jobs are approached by Computer Scientists as a computation problem (or at least an application of a computation theory) vs. just hauling electrons about. This gets you something both qualitatively different in their code output as well as quantitatively different.
Besides, calculus is one of the crown jewels of mankind's intellectual achievement. Not knowing any calculus ought to be considered on par with not knowing anything about the theory of evolution, or that the Earth orbits the Sun.
However I don't think that Calculus is applicable to most programmers. For many programmers it is important, and that is why I suggested it be moved to the application specific list. But more programmers will get more value from, say, basic combinatorics than from Calculus.
In fact I think often when people recommend graph theory for computer science, they're thinking more about order theory (trees, DAGs, posets etc), or failing that, more the "basic algorithms over graphs" stuff than the "let's prove a bunch of clever theorems about k-colourings" kind of graph theory which you might get if you bought a book on it.
I take issue with the "actually useful" part. Had we been early 20th century citizens, you might have said that about number theory, but where would modern cryptography be without it?
And to clarify, there is nothing wrong with non useful Math.
You mean: there is nothing wrong with not yet useful Math. Math is always useful for finding Truth, and only sometimes useful when scientists find phenomena which can be described by it.
With that said, it is not necessary for a working programmer to know large amounts of math. I have known more than one programmer with a successful career that never studied any math beyond the required introduction to calculus and had long since forgotten most of that.
In short, I think the study of mathematics is very helpful to a programmer in both the general sense of improving their overall thought processes and in the specific of helping with certain types of problems, but it is not necessary for most.
This is true. Most of the absolutely best developers I've ever worked with were Math majors. The second best were Physics majors.
They had long since forgotten most of their formal training, but they knew how to think about problems in the right way.
That's just Propositional Logic (or Boolean Algebra, if you want to put it in a slightly more abstract setting, which wouldn't hurt since you can then apply it to other related things like set union/intersection/complement).
First-order logic is really useful for Relational Algebra though. Which you should know if you do anything with relational databases.
I think one of the reasons that OSX and other Apple products have a reputation of being so approachable is that they give the illusion of a continuous mapping between user actions and results.
(I just re-watched the video on seam-carving and even that seems like one of those obvious ideas once you have a good grasp of analysis.)
You also have category theory, proof theory, model theory, recursion theory, type theory... They all fail as "foundations" because they all emit paradoxes. In some cases these can effectively be ignored because they don't play into anything (ZFC, for example), and in others they can be ignored because we can work around them (e.g. category theory).
In fact, few working mathematicians actually care about mathematical "foundations" because there is no way to know if they are "correct".
Working mathematicians ignore the shortcomings of ZFC because foundational issues just aren't what they concern themselves with day-to-day; I'm sure you're aware of the remark that mathematicians are platonists during the week and formalists at the weekend. It's generally left to logicians and philosophers of mathematics (two tribes which, while not coextensional, have a rather large intersection) to worry about these things. Certainly according to structuralists like Shapiro, this is not actually a problem. [1]
[1] Shapiro 1997, http://bit.ly/3om0CO