Tuesday, January 21, 2014

Response to "Math is Not Necessary for Software Development"

Ross Hunter recently wrote a blog entry on Mutually Human arguing that math is not necessary for being a good software developer.  I agree with his thesis -- math isn't necessary.  However, Ross shouldn't then jump to the conclusion that math isn't useful for software development. Math may not be necessary but it can certainly be useful.

I'll start by addressing relevant points in his argument and try to clear up perceived misconceptions.

First Argument:

  • The skills that make a good mathematician are not the same as the skills that make for a good software developer.
  • Math is the process of breaking down complex problems into simpler problems, recognizing patterns, and applying known formulae.
Math is often taught in a way where students learn how to solve problems by identifying patterns.  Once the student identifies the pattern, they can solve the problem using the approach they memorized.  It's unfortunate that math is taught this way because people like Ross come away with a very incomplete and distorted picture of math.  I would call this "computation" rather than math.

The reason we have "known formulae" is precisely because of the practice of actual mathematics. In my mind, mathematics is the process of analyzing a formal system with logic. A mathematician starts by defining the basis of a formal system by specifying an initial set of rules by way of axioms, or statements which are held to be true without proof.  Next, the mathematician recursively applies logic to determine what the implications of the axioms are and if any additional rules can be then be defined.  As more and more rules are proven, the system becomes more powerful.  

Often times, mathematicians will be looking to see if a specific rule can be implied from the initial set of axioms.  If they find that this is not the case, the mathematicians may apply creative thinking to look for more specific cases where the rule does hold true or may change the axioms.  A good example is the complex number system.  When faced with the square roots of negative values, mathematicians had to define a new mathematical object (the imaginary number) to be able to reason about such results. This process can actually be quite creative.

Speaking from personal experience and comments made by others, a good math education can be a significant advantage.  Reasoning through complex arguments and formal systems has made me much more detail oriented than I was before.  Math has improved my problem solving skills.  It's also enabled me to reason formally about software, which can be very important when developing distributed systems, for example.

It's unfortunate that the way math is often taught fails our students.  Students are often taught the results found over thousands of years, but not the methodology for discovering the results.  Classes like algebra, calculus, and introductory statistics are examples which focus on results rather than methodology. Unfortunately, these are also the most popular math classes since they are required in most high schools and college science majors!

Ross points out that he loved his discrete math class.  Discrete math, along with others such as geometry, graph theory, and combinatorics, are much better courses for teaching students the methods rather than results.  All of the subject material can be derived from a few simple definitions and axioms, giving students the opportunity to learn the mathematical process.  Imagine the benefit for students if they were taught Real Analysis or Modern Algebra instead of calculus?  As Ross rightly argues, in many cases, a solid foundation in logical thinking can more broadly applicable than calculus.

(I would also like to correct Ross's description of discrete math.  Ross implies that discrete math only consists of logic and boolean algebra.  This is, of course, wrong -- discrete math covers a range of topics such as set theory, combinatorics, and graph theory as well.)

Second Argument:
  • In Math, there is only one right answer, but in software development, there is rarely a singular right answer.
Ross assumes that if a student is trained in mathematics, they will not be able to deal with grey situations.  Maybe Ross assumes that people are only studying math?  Or maybe he assumes that people are not capable of learning new ways of thinking or analyzing situations critically? Either way, this argument doesn't hold water.

Like any skill or way of thinking we have developed, learning where and when to apply it is an important part of gaining experience.  Ideally, a student would also be exposed to the humanities or cutting edge problems in the sciences where there are not clear answers. (Science education faces a similar problem -- a focus on results, not methods.)  Even if the student only studies math, it would be safe to assume that people can learn and adapt as they gain experience.  That is fundamentally part of being human.

There are also cases where math rarely involves a single correct answer.  A mathematician may have multiple ways of defining the initial axioms, each with their own trade offs.  For example, there are variations on Euclidean geometry that change the initial axioms and end up with very different properties.


Math IS Useful:
Although math education is not necessary for software development, it is useful.  I've already described how math teaches good problem solving skills and critical thinking.  With the shift towards "internet scale" systems and big data, math is even more important than before.

Consider the case of evaluating and tuning a complex software system to squeeze out every last bit of performance.  A well-controlled experiment and appropriate use of statistics is necessary to accurately access the response of the system under various conditions.  A software developer doesn't want to waste time performance tuning the areas of the system contributing least to the run-time -- they want to know what's eating up all the time so they can use their time efficiently.

A better example would be the rise of machine learning and data mining.  Users leak data left and right, which is collected by nearly every internet company.  The data is then processed to predict what the user might like to target ads or improve the user experience.  Machine learning is also used in the banking apps on our cell phones to read hand-written checks.  The popularity of machine learning is exploding as more and more uses are found.  I predict that many software developers will need to be proficient in machine learning techniques in the future.  Since machine learning is based on math and statistics, there may be a time when most software developers will need to know some linear algebra, statistics, and calculus.

All Knowledge is Useful:
Every subject offers an opportunity to apply our skills in a new way and train our brains to be even better.  One of the benefits of a liberal arts education is that students are expected to take a number of courses outside their major.  A programmer who decides to study math, literature, history, or art may find that they have developed a number of skills and tools that traditional Computer Scientists lack.


So is Experience:
Experience is a great teacher, especially in software development.  Spending hours debugging code is a great way to learn how a project works and to remember what caused the bug in the first case.  The next time you see a similar bug, you won't have to spend nearly as much time hunting its source down.

Experience also offers the benefit of knowing what works best in practice.  Ross points out that sometimes clever people will write code that is TOO clever.  They have sacrificed readability and effort for laziness or intellectual satisfaction.  This is not a problem of mathematicians, though.  This is a problem that comes from a lack of experience.

In the end, I agree that math is not necessary for software development (yet) .  I also think that we could and should change the required math courses for computer science majors to reflect courses that will focus on logic and reasoning.  But, we shouldn't be attacking math or implying that it has no value.  For some of us, math education has been a valuable part of our training.


18 comments:

  1. I found your article to be a good stab at the problem of understanding the role of math in the more applicable field of computer science. However, I will criticize you on the fundamental point around which you organize your perspective: mathematics, whose body of knowledge has been and continues to be a fundamental scientific pursuit of all human knowledge throughout history, does not need to validate itself at the feet of immediately applicable, profitable applied computer science.

    What you call software development is really the software development of the moment. It's requirements will change astime moves on. One requirement wont' change and that's a knowledge of mathematics, for computer science, and software development as a consequence of its development, will never make due without math. The opposite is not true.

    ReplyDelete
    Replies
    1. Can you clarify? I didn't see how I was arguing that math needs to proves its value. I was trying to stand up for math! :)

      Delete
  2. The axiomatic approach is too deterministic for an AI future, it's more of an engineering approach, tolerance-driven with build-measure-learn loops

    It's like Computer Science fighting Computer Engineering.. neither can take ownership of the future! Play nicely and work together :)

    ReplyDelete
    Replies
    1. We can learn a lesson from ecology here about the importance of diversity. By allowing and using a wide range of approaches, we don't limit ourselves.

      Delete
  3. Your point about the way math is being taught really stood out for me. I didn't really understand why were 20 calculus formulae thrown at us to memorize. I lost interest before calculus could look beautiful. And the high point of maths for me would be when we were taught heights and distances right after learning trigonometry. That was the first time I understood what the practical application of a formula was. Eye opener.

    ReplyDelete
    Replies
    1. Your response really resonates for me. I fared badly in Pure Mathematics at school, 20 years later watching my own children going through this, I understand why I did badly.

      There is a wide spread of what stimulates the retention and comprehension - that eureka moment. I'm definitely inspired by application of knowledge. I missed the opportunity to make concrete the principles we learned by applying knowledge at the time we learned it during my in-parallel Physics class. That moment only arrived very late in my course, when curriculum eventually converged.

      The loss of confidence through lack of "sticky knowledge" is very demoralizing. It was made worse by my Math lecturer focusing on getting past basic calculus when I struggled to see the "why" in the first place. With confidence blunted - and only a late burst of "lightbulb" clarity - I eventually failed.

      20 years later I find myself following my daughters pre-calculus using the applications I eventually learned in Physics as examples. She struggled a little, but now it is making sense.

      Ironically, the Math lecturer who failed me also told me I'd never make money playing games. Yeah whatever...

      Thanks again fritzrage,

      Steve Butler, Architect, Xbox.

      Delete
    2. It's unfortunate that math education has alienated so many people. I hope that this changes one day.

      Delete
  4. IMHO, the main thing "math thinking" and programming have in common is the use of abstraction to encapsulate complexity. The idea of a "function" is essential in both domains since it allows us represent arbitrary input-output relationships.

    This is the main "pitch" I give to people who are afraid of math (see my book's website http://minireference.com): if you learn math you'll be able to model the real world and think abstractly. That's the real power of math --- not computation or arithmetic. Let computers do the boring parts ;)

    ReplyDelete
    Replies
    1. Interesting point!

      I think math could take a few things from programming. I often wish math did a better job of defining the types in its syntax, especially in the context of physics.

      Delete
  5. Awesome, you hit the nail on the head. I think it's fascinating in the way people learn computer science when its in the main self taught and people seem to come away with a much deeper understanding of computer science whereas they have a very superficial understanding of math that they're taught for years in school

    ReplyDelete
    Replies
    1. That's a really good point! I had to take two of my math classes as independent studies. Those were also the classes I did best in because I was the only one responsible for the material -- I found that depending on someone else's lectures made me lazy and passive.

      Delete
  6. I was lucky — for my Bachelor's degree, I majored in Interdisciplinary Studies. This allowed me to replace the systems analysis courses of the CS major with mathematics courses instead. Math helps you think about problems differently, and work on more interesting software problems.

    ReplyDelete
  7. Pretty remarkable post. I simply came across your blog and desired to say that I have really enjoyed searching your blog posts.
    Policy administration

    ReplyDelete
    Replies
    1. Thanks! I'm going to post more in the future.

      Delete
  8. in tertiary studies needing a Learn Math Analysis and mathematical background, you need to do a lot better than 40%. If the courses and marking are dumbed down to try to push pass rates up, I would expect at least a B in maths before I would be convinced the student had basic competence.

    ReplyDelete
  9. It depends, but good knowledge of maths is definitely help in programming fields.

    ReplyDelete
  10. Acetech software development company is one of the leading software company India.

    ReplyDelete