You Don't Need Math Skills To Be A Good Developer - What About A Great One
skorks.com
skorks.com
A developer I know (a very good one, but without much of a math background) showed me a network routing problem he had. The problem: he was trying to organize a distributed system to process data and pass it to the end user. After spending a week or two doing it by hand, he wrote a python script which played around with parameters automatically (for a fixed topology).
(See http://www.sce.carleton.ca/faculty/chinneck/po/Chapter10.pdf... an example of the type of problem.)
I showed him how to set it up as an LP problem and use glpk to solve it, which imposed no restrictions on topology. He immediately resolved to learn LP. He told me that since then, he used LP to solve several problems he would not otherwise know how to solve (or at least would have solved mainly by fiddling/guess/check).
Also, math is a very broad field, and a lot of it is specific to certain problem domains. I'm just rambling, not sure if I have a real point ;)
Category theory to the rescue!
In the last years mathematical abstractions have become more popular. Think of functional programming and other declarative languages.
One early example of the same thing have been regular expressions and grammars.
Most programmers think in objects and arrays/lists. While this may result in the most efficient program it's not the most efficient use of your time. Many problems can be modeled much more concisely and easily with structures that are used in math.
Here's a challenge for HN: write an AI for Dawson's chess [1] that can determine whether a position is a winning position or a losing position.
[1] http://www.madras.fife.sch.uk/maths/games/dawsonschess.html
I did these stuff of things back in college, ACM contests and all. Time to grow up and build real things.
Buddha preaches balance.
I think a lot of programmers were turned off to math by boring classes that focused way too much time on how to calculate rather than applying it. This typically happened early in their life and was unfortunately followed by reinforcement in later classes that that is all math is.
The biggest leap I took in math was when I started unlearning this math brokenness due to a great math teacher in middle school. Had this not happened, I doubt I would have been excited about the math.
On my blog, I've been trying to show very cool applications of slightly advanced math such as explaining how the Xbox Live TrueSkill algorithm uses some basic statistics to rank and match people. It's a beautiful application of "statistical machine learning." In addition, I tried to show how the Advanced Encryption Standard (AES) uses some really neat finite field algebra.
The hardest part is overcoming people's fear. This fear has been reinforced so much that you really have to go out of your way to break through the fearful blank stare people get when anything math related is mentioned. I'm just trying to take baby steps now; it's really hard.
Math is simple language that has been refined for centuries. It's sad that so much fear is associated with it. Leslie Lamport's interview on Channel9 goes into this more.
As for math, unfortunately it applies to the general public too. It's part fear, but also they keep telling themselves they're not good at it - and not trying in response. Math is a mature field, and as such, there's quite a bit of it to get going. It's tough to catch up years of math without doing it.
A peculiar part of it is that some people correlates math with calculations at an early age, the simple arithmetic operations. Maybe it's unfortunate that it is such an easy metric to see who's better at it - easy negative reinforcement.
One of my algorithms professor in college explained to me that in (research) math, it's all about being creative, seeing things and making connections, and teaching understandings. I try to keep that in mind whenever I read up on math, though I am eager about everything to learn in general!
Although I already knew and understood TrueSkill before your post, it helped solidify my understanding. I hope you write more articles like that in the future :)
Sometimes it takes a month, but the TrueSkill one took about six months.
I've learned that deeply understanding a topic (especially one that has non-trivial math involved) doesn't cause a net loss in the amount of "math fog" in my head, it just moves it to a different place (often one that I never new existed before).
As a schoolboy, it was tempting to think that one day I'd "arrive" in math. I just don't think that's realistic. At best, I've just learned to be comfortable wandering around in the perpetual fog.
I went back to school. Now I'm knee-deep in 400 level mathematics and while realizations of utility aren't daily, it is definitely a regular occurance where I see something and think, "ah, so there's a useful way to approach problem x." The other thing is even if some specific technique of MATH 4XX isn't useful, the thought process might be. I've noticed that my approach to problems has been tweaked in a mostly subtle but advantageous way.
Of course it's true. Most of the database fetch print store work wouldn't benefit from this work, but I don't want to do that anymore. Hopefully it proves to be worth the trouble professionally, even though personally it's definitely beneficial.
Of course, I started with a bachelor's in mathematics and then moved into programming professionally. I am currently working on my masters, so I see things differently from some of my colleagues that got traditional CS degrees or were entirely self taught.
I'm very sorry to tell you, the solution is obvious and you've thought of it already: hard graft. Pick a project, work at it, read text books and watch video lectures as you come across unfamiliar territory. Solve lots of problems. Rinse, lather repeat.
(Yes, I've been through that journey, and I can slowly see myself coming out the other side. Took me about 2 years so far, it's still the beginning but it's not scary anymore.)
Tips:
- You ARE smart enough. It's this hard for almost everybody else, too. Our brains were designed to gather fruit.
- Find other people to physically sit and work through problems with. (This is really where college shines).
- Read some meta-math books. Like How to Prove It and How to Solve It.
- Use Gershenfeld's "The Nature of Mathematical Modelling" as a guide. Do all problems. Find other sources on each topic, use those to help you.
- Get on MIT OCW and do 18.085 and 18.086. Do all the problems. If you haven't had linear algebra, calculus, or diff EQs, do those courses too (this will take a while if you have to do all of it from scratch).
- If you want to use (rather than invent) basic stats/ML, all you need is probability, simple linear algebra, simple calculus, and convex optimization (free book from Boyd). For many applications, you need substantially less.
- Spend time in a technical library. Just browse. Find a book that's interesting and in which the first two chapters seem comprehensible (though probably not obvious). Take it home and do all problems.
- Read Peter Szekeres "Modern Mathematical Physics". This book more than any other made me realize math is fascinating rather than scary.
- It sounds stupid, but I learn better (and enjoy it more) when I let myself get genuinely excited about the material. Even the Intermediate Value Theorem is seriously cool when you really think about it.
Remember: there's a lot to learn. You're trying to teach yourself what people spend years paying $50k/year to (barely) learn from lifelong teachers. It's always hard. But it can also be fun, once you're not totally lost.
If I'd known about things like Gödel's Theorem or mathematical logic as a teenager, I would have seen the big picture.
Kids don't get to internalize numbers, and all of what comes after, because it's all built on more complex abstractions from there on. Come to think, they don't even "get" the concept of "abstraction" in itself. The education system as of now (and 200 years ago) still brute-forces through this very basic thing, and many students just don't come through, which is to be expected.
To me, developing software is largely a means to get to a goal. I enjoy it, but only in the same way I enjoy cooking. I personally have no desire to "cook" in a factory for thousands of people. I only enjoy the creativity of creating meals, learning some cooking techniques, and of course eating it. The actual problem of 'how to create the meal' is not interesting in the same way when it scales up to thousands of orders.
In the same way, I personally have no desire to delve into creating search algorithms, complicated physics engines, or complex business logic. I would want to do the creative thinking to move those projects, but not the actual logic and development themselves.
the idea that technical knowledge and creativity are separate is very restricting. it might seem like that at school when you're surrounded by idiots and the teacher has to cater to the lowest denominator, but to do good creative work in almost any field requires mastering the technical aspects.
i think that's a good point (and have voted you back up from zero :o)
i do think i can make a different argument which makes a better case for maths, but i can also see a valid objection to that. i'll sketch it out anyway:
abstractions / tools cannot make fundamental limitations go away; they can only hide them or present them in alternative ways. so at some point you still have to address limitations in your physics engine, or your renderer. if you refuse to understand the underlying maths then you are (1) very much at the mercy of the api / designer of the tool and (2) at a big disadvantage in looking for workarounds.
the same idea more generally: maths (or logic; the two are closely related) is a very powerful language for dealing with complex systems. if you don't master that language then you are not going to be able to handle the same level of complexity as someone who can.
the objection i see to that argument is that great art doesn't necessarily require breaking technical boundaries (it can even be motivated by constraints).
so yes, i agree - you can make great art by using tools provided by people who understand the technicalities.
i guess my only comeback to that is that the original title is "great developer" not "great artist"...
Admittedly, you might be able to get by mindlessly plugging in values into someone else's function without ever having to bat an eye. But when something breaks, you're going to be absolutely screwed.
"Programming is one of the most difficult branches of applied mathematics; the poorer mathematicians had better remain pure mathematicians."
-Edsger Dijkstra
As an aside, the picture at the end of the article gave me flashbacks to when I tore my ACL doing backrolls on the wakeboard...ouch!
What I think really makes math generally useful, though, is that, at its root, mathematics is a formalization and generalization of problem solving. That is what formal systems and computability theory, for example, are actually about: how, in general, problems are solved.