Note that he specifically says native tongue, not English. Which makes me wonder why all of Dijkstra’s most important writings were in English, not his native Dutch.
In fact, Dijkstra’s essay about semaphores was written in Dutch.
They teach math all wrong in school. Way, WAY wrong.
Yes, in American schools they certainly do, but it’s typical of an ugly American to assume that whatever is done in the US is done world wide.
I moved to the States from Germany in my teens and started 9th grade here. At first I thought they were kidding when the math teachers expected me to memorize formulas to apply to math problems. Sadly enough, that is apparently the norm in schools here. Instead of teaching kids how to logically analyze a problem, they teach kids to memorize formulas. No wonder our kids suck at math!
I’ve always been good at math, as long as I can remember, and I believe it does help me with programming. However, maybe logical thinking and problem solving analysis are the important parts that apply to programming.
People usually say what’s important is the thought patterns math teaches. I think what they’re trying to say is that what you need is good logic skills. As a commenter above notes (mistakenly thinking that this is evidence of the importance of maths) De Morgan’s laws of logic are the sort of thing you’d use when refactoring.
Programmers should understand discrete math really well because you’re always dealing with sets, functions (domains and ranges), and relations whether you like it or not.
I agree with Dijistra… and a lot of people that has given specific examples of math being used… but I still feel a canonical example is missing.
Set Theory.
If you have write a SQL data manipulation statement, then the better that you are at math set theory, the better you will manage databases. Otherwise, go back to cursors and treat your data server as a glorified dBase storage… or google about it.
In North America math is mostly about formulas.
In Eastern Europe math is mostly about reasoning and proofs, from very early (11-12 years old kids do proofs, some fairly ingenious!). Numbers are one of the things you can do proofs about.
It’s a huge difference between the two views.
The german encryption machine (Enigma) was broken by a team of mathematicians. Not because they had to do heavy arithmetic (their calculations pretty much stopped at counting) but because they were used with the type of rigurous reasoning required for the task.
Math has been marginally useful to me in my career (understanding how good statistics work can help; big-O is a lot easier once you understand series) but I believe having been a physicist in a past life makes me a much better programmer. The experimental method makes you a better debugger, and in general a healthy dose of skepticism is a programmer’s best asset.
I expect ‘the math requirement’ is due to the origins of programming. The first essential use for computers and thus programming was to solve complex mathematical or physical problems (enigma, Manhattan project, moon landing). You can’t really solve partial differential equations with a computer if you do not know how to do them by hand. E.g. error estimation of numerical methods do require some math.
Now programming is ubiquitous. I think it was Clay Shirky who compares it to typing. There are hardly ‘typists’ anymore, and soon there will be no more ‘programmers’. Of course there will always be people writing compilers, but most ‘coders’ will be people writing tools for their not-so-mathematical profession. (See also todays post on www.freedom-to-tinker.com about programing for law professors.)
The most important thing programmers should know is the ‘big O notation’ I think. But this mainly trickles in through ‘leaky abstractions’ (see Joel’s Spolsky’s article), which might improve in future programming languages.
Personally, as an astronomy PhD student, math is kinda required. But again not as part of the programming an-sich, but for the things to actually implement. (All in English BTW.)
You might not need actual mathematical theories or constructs in day-to-day programming, agreed. But it seems evident to me that a strong analytical background and thinking is a big plus, even a must for good programmers.
So I don’t think mathematically inclined is to be interpreted too narrowly, but rather in the sense of having an analytical view of the world and the problems to be tackled. A natural reflex to view a problem in terms of its technical solution is just the foundation a good programmer needs.
While a programmer doesn’t necessarily have to know calculus and the like, it’s crucial to know and do all the pre-calculus stuff correctly, to know the numbers as they are in the purely abstract domain and in their purely concrete and limited incarnation in the computer hardware and software. Somebody who doesn’t know if he should add 1 to a value or subtract or do something else to index the right array element can never be a good programmer. Somebody who doesn’t care about overflows, underflows, and loss of precision can’t be a good programmer. Somebody who can’t estimate the complexity of their own code can’t be a good programmer. Those who can’t pay attention to detail can’t be good programmers. Somebody who can’t prove their code is right mathematically/logically, by a good test or a combination of them can’t be a good programmer. And a good test often times assumes some good math background or math inclination too.
I have seen so much crappy code, it’s unbelievable. And often times it was crappy because it was written inattentively with very lax math and the authors never bothered to actually prove its correctness or adequately test it. They just hoped it would work and it appeared to until put under scrutiny.
My math background and inclination has helped me to understand and correctly implement well-known algorithms, modify them to suit my needs, invent my own algorithms, write mostly correct code, debug code, test and review code (not only mine), find bugs in code, optimize code. Had I not had that, I would’ve been a disaster, not a programmer, let alone a good programmer.
no one has ever tried to localize… I had to stop reading right there. You should be teased about that one for a long time. Please tell Joel that you deserve to be the but of a joke on your podcast.
The first person who can lucidly explain Reed-Solomon encoding using just their high-school math and a bit of stuff they picked up because they needed it wins a prize.
You don’t need math to write something like StackOverflow, because the clever people already provided you with all the tools and the platform.
Maybe when StackOverflow’s search is as good as Google’s Jeff will have made his point.
We seem to have very different ideas of what maths is - to me Maths is a right brain activity, from final year school onwards. Aesthetics are very important for proofs - beauty is one of the key things a professional mathematician is looking for, and it’s the main reason many advances are made. How the blogger you quote could imply that abstraction isn’t a key part of maths I don’t know.
It isn’t obvious why maths is interesting or relevant - that’s why a lot of people don’t learn it. In my experience though, most maths is largely irrelevant for programming - worst case get the requirements documented by someone that knows the stuff. However the skills and abstraction you learn from doing high level maths are probably as useful as some of the skills you learn in a CS degree. And of course, maths is much more interesting than programming.
I think language and thinking skills are infinitely more important than math skills. Documentation and clearly written code are much more important than advanced theory and calculus.
See what happens when I go away for a week ñ Jeff posts a bizarre post like this and thereís little point responding as there are now over 200 comments.
But if you are still reading this, could you clarify what you mean by
ìOn the other hand, I have not found in practice that programmers need to be mathematically inclined to become great software developers. Quite the opposite, in fact.î
What is the opposite of the first sentence? That you need to be a great developer to be mathematically inclined, that being mathematically inclined will mean you wonít become a great developer, or that you need to not be mathematically inclined to become a great developer?