What is a variable? function? you might be astonished at how many lawyers don't even understand what true and false mean. I guess some programmers use algebra so much that they forget they are using algebra and consider it just writing. (You don't need to know how to move your legs man! All you got to do is walk.)
I don't see the point. Do lawyers need to know such things to perform well in their careers? Specialization is prevalent for a reason - it has given us modern civilization and all the fancy technology that comes with it - but there is such a thing as hubris, and I don't think condescension towards those not well versed in the tools of one's craft can be considered a good thing.
I think he was trying to say that programmers do use some math concepts even when they might not think of it that way. Lawyers or other non-programmers (rightfully) don't know about mathematical concepts that programmers just take for granted, given their background.
Most business software doesn't require more than basic algebra. As long as you know how to read math formulas and implement them in code, you can just look up most of the stuff on wikipedia.
Create a function to wrap the algorithm and test the inputs and outputs. Then you spend 2 days writing code and tests for the web interface around the function. In my job most programming is plumbing with infrequent math problems that only need to be solved once in a generic fashion. Heck, if there's complex math, there's an open source library for that. (Or a contractor! Or a web service. Or a contractor writing a custom accounting system that does the heavy lifting.)
Unless you're going to be specializing heavily on a specific problems, you don't need college level math, you just need your basic high school education and access to the internet.\
Note: My high school education included a semester of statistics. I would add my discrete mathematics classes in college have been useful but not strictly necessary.
I am one of the contractors writing a custom accounting system that does the heavy lifting. I have a whole support department helping people like you and your clients. Mainly because of lack of logically thinking skills that math classes would fill.
It's not that people don't like math. People are inherently lazy and acquiring logical skills requires work.
I am failing to see how this is a counterargument. The mast has less to do with the accounting and more to do with how your webpage is getting to your users. You used math in several instances:
* implementing the accounting formulas
* Chrome interpreted your HTML code and calculated the layout for your website
* your ISP knew to attach your URL with your IP address and serves it to your users
* even the development process itself is iterative; building on previous changes
Algorithms were present in all these steps. Once you have users, you will need to keep track of them. Probably you will use an array, tree or other data structure.
As long as you feel comfortable outsourcing the hard stuff, you can put together simple projects like these.
I'm not sure your list consists of good counter examples, with the exception of the first (as the parent opened himself up to that--implementing accounting formulas most definitely requires at least some mathematical ability, but that's a specific case).
The second point isn't mathematics; it's arithmetic.
The third and fourth points are really statements that are as too broad as the statement that "math is not necessary for software development". In particular, were were to employ your use of the word "algorithm" it would apply to literally any activity that can be described as a series of instructional steps. Consequently "how to make a peanut butter and jelly sandwich" becomes an exercise in mathematics, for example.
As a person who comes from an academic field in science that is rich in applied (and some theoretical) mathematics, my observation is that there exists very few cases where a person writing software at almost any level actually needs to have a deep mathematical/theoretical understanding of the data structures and algorithms he employs. And I mean "deep" in the sense that he even has to understand that a mathematically-backed theory is what he's employing. This is as true for computer science graduates having a prolonged bout of anxiety and envy of mathematicians and scientists as it is for the "lowly" CRUD App Developer. At the deepest, one needs to be able to employ arithmetic to compute a rough "Big O" estimate. That's "doing math" I guess, in the strictest sense, but only in the same sense as a child "does number theory" when he writes, e.g. "10" in the blank for "9+1 = ___".
I work in computer graphics software development. Math is an absolute necessity in this field. But only up to a degree, you do not have to be able to do multivariable calculus, but you need to generally understand matrices and vectors.
It's useful to have knowledge of them. They tend to pop up in random places. For instance, even simple recurrence relations like the Fibonacci one can be computed in logarithmic time via matrix exponentiation.
Linear algebra in general is completely critical in machine learning as well.
I use them regularly in all sorts of unexpected places. The most common is probably machine learning, but I also use them in safety critical computations of projected courses, ETAs of various processes, and computing optimal geometries.
Any time you're dealing with linear transformations of vectors (ie functions f such that f(u + v) = f(u) + f(v) and f(a * u) = a * f(u) for any vectors u,v and scalar a), then you're implicitly dealing with matrices.
Nothing is needed in terms of academic training - a good mind can work around lots of things.
If you're a poor communicator, you can still develop software, it's just harder. Same with knowing low level languages, and what goes on in Operating Systems. And math too. We all bring toolsets. The more tools, the better.
Also - logic is very much a part of math. Good geometry classes involve a lot of proving. In the end, the lesson from Geometry is proving things as much as it is the sum of angles of triangles between parallel lines.
The best programmers I've met have consistently had very strong math backgrounds or a deep respect for the clarity of thinking associated with higher math. People need to stop confusing math with arithmetic.
The author seems to confuse "what [he] would call math" with calculus or counting.
As pointed out, logic is a big part of software. But calculation skills (eg understanding that x is actually a number, not a letter) are also mandatory for a full comprehension of the abstraction going on in programming languages. Not to mention arithmetic — modular operations, index of an array...
Finally, if you wish to get a grasp of functional programming, lambda-calculus or curryfication, you will need a basic intuition of set theory.
Also, concerning logic and math: mathematics are built with logic (4 rules of demonstration). You can consider logic as pre-dating math, but not the other way around.
This might be true for the low-hanging fruit of CRUD apps, but ask the engineers working on self-driving cars, or the fringes of aerospace technology how important math is.
As others have said, logic and basic algebra are integral to programming, but I understand the sentiment that "hard math" isn't necessary. And I sort of agree. As a front-end developer, I don't really need to be an expert in algorithm design to do my job competently, and I don't need to know statistical analysis or any other branch of higher math. That being said, learning some higher math on my own has made me a much better programmer, and allows me to write code that is far more efficient than I could otherwise.
As for the article, I don't think literacy and math knowledge are mutually exclusive. It's not a zero sum game. A great programmer should be able to break down problems logically, improvise and expand on algorithms, and explain what he (or she) is doing to non-technical people. All of those are important.
An algebraic solution might have a unique answer, but Math is more than pure Algebra. For instance, Machine Learning problems rarely have a single solution and I would argue that Machine Learning is tightly related to Math.
Very few "real world" math problems reduce to easily computable closed form expression. You're almost always dealing with numeric approximations. So even when your problem has a unique correct answer finding it is either impossible or computationally impractical. A large part of applied math is finding newer, faster and cleverer ways of approximating these solutions. Making the best choice between all the different ways to get the right answer can often be the difference between run times measured in hours vs centuries.
It's actually the case that even in straight up "theorem/proof" math, it's instructive, useful, and informative to have multiple ways to prove a given theorem. This is how you link multiple subfields of mathematics together and create cross-pollination of understanding between areas as advances in one feed into the other via the multiple correspondences (and, yes, that's a very handwavy and not terminology-correct way to put it).
What is with these misleading titles. It seems like the author is more pointing out that computer science, software development and mathematics shouldn't be lumped together in the same category of jobs.
I don't think anybody has argued that a generic developer
needs much mathematical knowledge beyond Algebra I (even basic arithmetic will do) and Boolean/gate logic.
It's when you start diving beyond the matrix of batteries-included frameworks and your development toolkit into topics that begin to touch deeper aspects of computation, that mathematics becomes important and truly shines its beauty.
You still don't need to be an expert pure mathematician (those work on problems of their own), but above-average mathematical competence, particularly in aspects like algorithmic complexity, theory of data structures, automata theory and miscellaneous discrete math, is certainly all essential for a good programmer.
But yes, if your end goal is to simply deliver a product, we've advanced far enough where you can do it safely with minimal cognitive workload. One should not be too pragmatic or too theoretical, but find balance between both and be versed in both.
Reading comprehension and written / verbal communication are essential skills in many professions, not just programming. Any area of applied skill that is producing a result for humans requires strong communication - it's a relationship between humans (some programmers forget this).
I agree with you on that point, but I disagree with you on the point that it is more or less important than mathematics. You may not be applying a lot of higher math to your day to day job because most of it has been taken care of already in the libraries you use but that absolutely does not mean you wouldn't benefit from a deeper understanding of mathematics and how it informs computing.
I once thought like you, until I came across Haskell. Once I got through learning the language (which also requires you learn a few concepts from mathematics) I understood what is so powerful about it: idiomatic (and even non-idiomatic, to a degree) Haskell and the programmers that use Haskell - they go hand-in-hand - harness the ideas behind mathematical abstraction to produce programs that are so elegant. I've taken many of the concepts I learned in Haskell to mundane languages (Python notably) and have made my software in Python cogent, elegant, and easier to understand (note this even comes back to your argument around comprehension and communication). I'm still not a perfect programmer but I feel like the communication of my thought into a program is better because of my appreciation and deeper understanding of math.
Not to mention the foundational role mathematics plays in algorithms and data structures, if you understand the mathematics behind quantifying the time complexity of an algorithm, you're far more likely to pick the right algorithm for the job.
Also, logic could not be greater than Mathematics; Mathematics is more general and describes logic.
Software development is interesting in that it borrows for a vast range of other disciplines depending on what you're building. Very commonly, that's maths. You're not going to get very far manipulating matrices for 3D geometry without a bit of maths understanding. But, similarly, you're not going to get very far into developing a knitting pattern generator without understanding knitting - but that doesn't mean you can't be a developer unless you can knit. That'd be crazy.
If you develop applications that aren't reliant on maths then sure, you don't need to understand maths. On a day to day basis I write web apps that take strings from users, store them in a database, and display them in a different way later. No maths at all. Conversely, I've once wrote an image manipulation library based around convolution filters that used lots of maths.
As with most things, there's no single black and white rule. It's all shades of grey.
You still run into problems that require some math discipline and understanding. If you're writing CRUD apps, you need to know what a Cartesian product is or why big O matters. Or how to calculate disk space requirements and transaction times.
I've written more CRUD apps than I care to remember, and I have no idea what a Cartesian product is.
The fact is we might use things that have formal definitions without knowing what the definition is, or understanding the theory behind it, or being able to derive it from first principles. That's very definition of not knowing maths and still being able to write software.
That's a bit like saying "You can throw a ball in the air and catch it again, so you must have an understanding of celestial mechanics, fluid dynamics and geometry."
Using a database is working with set theory, but that's very, very different to understanding set theory.
> The majority of code for something like Facebook or Twitter probably involves very little math.
This may be a true statement as I've never seen the Facebook or Twitter codebases. However, as others said, logic is a part of math and logic is essential in code design.
Along with that, I'd wager most developers could make a facebook-like or twitter-like system. But their first pass is going to be crude, bloated, non-scalable. Understanding how data flows across the system gets reflected in both the software and hardware. That analysis relies on an understanding of graph and network theory and statistics. Perhaps not deep knowledge, but it's still math.
What I think fails to grasp is that this is correct but only to a point. Sure someone can learn to code without doing math, but as things scale, this becomes really important.
How do you calculate distance between two points? Math. How do you timezone calculations? Math. How do you know what data structure is going to be small and fast enough to not overload a server and still get the job done? Math. How do you determine if two populations are statically different? Math. These are becoming everyday things. We've moved beyond the mid 90s where having a web page and writing some JavaScript was well enough for most companies.
"Rarely in math are you coming up with a new way to solve a problem"
Bullshit. Bullshit, bullshit, bullshit. Entire fields of mathematics (eg Algebraic Number Theory) have arisen due to new approaches to solving problems. Literally millions of peer-reviewed mathematical publications have been written, many of which pave the way for new attack vectors on existing problems.
There is far more to mathematics, dear Horatio, than is dreamt of in the OP's philosophy.
be a primitive pth root of unity (ie a complex number such that s^p == 1). Now, consider all complex numbers of the form
a_0 + a_1 * s + a_2 * s^2 + ... + a_(p-1) s^(p-1)
where the a's (a_0,a_1,...,a_(p-1)) are integers. Note that the fact that s^p == 1 means that we can multiply two things of this form and end up with another thing of this form. Likewise, we can add two things of this form, and get another thing of this form.* For the sake of notation, let's call the set of all such complex numbers Z[s] (where "Z" denotes the set of integers).
In 1847, the French mathematician Gabriel Lamé[1] published an attempted proof of Fermat's Last Theorem (ie the assertion that there are no positive integer solutions of x^n + y^n = z^n for n > 2) that carried the implicit assumption that every element of Z[s] except 0, 1, and -1 break down uniquely into irreducibles (much like factoring positive integers: 12 = 2 * 2 * 3, and that's the only way to break 12 down into primes (up to reordering)).
However, this uniqueness of factorization doesn't hold when p=23, as discovered by the German mathematician Ernst Kummer[2]. The failure of this approach to proving FLT resulted in the discovery of a significant amount of Algebraic Number Theory, in an attempt to "build more machinery" to get around the problems posed by Lamé's proof. Eventually, Andrew Wiles found a proof of FLT in 1995 that relied on Elliptic Curves and Modular Forms (two fields of mathematics of which I know pretty much nothing).
Another, less long-winded example is the Bridges of Königsberg[3]. In 1736, the following problem was posed to Leonhard Euler: is it possible to take a tour of the city of Königsberg in such a way that each bridge is crossed exactly once and you end in the same place where you start?
It turns out that the answer to that question is "No", and in his approach to answering the question, Euler laid the foundation for Graph Theory. Also, the roots of Topology can be tied back to this problem, as well.
The article writer is woefully ignorant. How can you be a career developer and not understand big O notation? Logic isn't just true or false, it's going deeper and learning k-maps and state machines in the bare basics of a programmers education. And it's math turtles all the way down...
I disagree: logic is a tool used in math, in the same way that math is a tool used in physics. You might even say that math is "applied logic", just as physics can be considered "applied math".
78 comments
[ 1.9 ms ] story [ 128 ms ] threadMost business software doesn't require more than basic algebra. As long as you know how to read math formulas and implement them in code, you can just look up most of the stuff on wikipedia.
For example, I worked on a monthly payment calculator for loans. All I needed to do was spend an hour reading http://en.wikipedia.org/wiki/Annuity_(finance_theory)#Proof and playing with the forumla on paper.
Create a function to wrap the algorithm and test the inputs and outputs. Then you spend 2 days writing code and tests for the web interface around the function. In my job most programming is plumbing with infrequent math problems that only need to be solved once in a generic fashion. Heck, if there's complex math, there's an open source library for that. (Or a contractor! Or a web service. Or a contractor writing a custom accounting system that does the heavy lifting.)
Unless you're going to be specializing heavily on a specific problems, you don't need college level math, you just need your basic high school education and access to the internet.\
Note: My high school education included a semester of statistics. I would add my discrete mathematics classes in college have been useful but not strictly necessary.
It's not that people don't like math. People are inherently lazy and acquiring logical skills requires work.
* implementing the accounting formulas
* Chrome interpreted your HTML code and calculated the layout for your website
* your ISP knew to attach your URL with your IP address and serves it to your users
* even the development process itself is iterative; building on previous changes
Algorithms were present in all these steps. Once you have users, you will need to keep track of them. Probably you will use an array, tree or other data structure.
As long as you feel comfortable outsourcing the hard stuff, you can put together simple projects like these.
The second point isn't mathematics; it's arithmetic.
The third and fourth points are really statements that are as too broad as the statement that "math is not necessary for software development". In particular, were were to employ your use of the word "algorithm" it would apply to literally any activity that can be described as a series of instructional steps. Consequently "how to make a peanut butter and jelly sandwich" becomes an exercise in mathematics, for example.
As a person who comes from an academic field in science that is rich in applied (and some theoretical) mathematics, my observation is that there exists very few cases where a person writing software at almost any level actually needs to have a deep mathematical/theoretical understanding of the data structures and algorithms he employs. And I mean "deep" in the sense that he even has to understand that a mathematically-backed theory is what he's employing. This is as true for computer science graduates having a prolonged bout of anxiety and envy of mathematicians and scientists as it is for the "lowly" CRUD App Developer. At the deepest, one needs to be able to employ arithmetic to compute a rough "Big O" estimate. That's "doing math" I guess, in the strictest sense, but only in the same sense as a child "does number theory" when he writes, e.g. "10" in the blank for "9+1 = ___".
This is false.
Linear algebra in general is completely critical in machine learning as well.
If you're a poor communicator, you can still develop software, it's just harder. Same with knowing low level languages, and what goes on in Operating Systems. And math too. We all bring toolsets. The more tools, the better.
Also - logic is very much a part of math. Good geometry classes involve a lot of proving. In the end, the lesson from Geometry is proving things as much as it is the sum of angles of triangles between parallel lines.
As pointed out, logic is a big part of software. But calculation skills (eg understanding that x is actually a number, not a letter) are also mandatory for a full comprehension of the abstraction going on in programming languages. Not to mention arithmetic — modular operations, index of an array...
Finally, if you wish to get a grasp of functional programming, lambda-calculus or curryfication, you will need a basic intuition of set theory.
Also, concerning logic and math: mathematics are built with logic (4 rules of demonstration). You can consider logic as pre-dating math, but not the other way around.
As for the article, I don't think literacy and math knowledge are mutually exclusive. It's not a zero sum game. A great programmer should be able to break down problems logically, improvise and expand on algorithms, and explain what he (or she) is doing to non-technical people. All of those are important.
False. This guy is making a case against a subject in which he clearly lacks experience.
I must remember not to work with/for/over this person.
It's when you start diving beyond the matrix of batteries-included frameworks and your development toolkit into topics that begin to touch deeper aspects of computation, that mathematics becomes important and truly shines its beauty.
You still don't need to be an expert pure mathematician (those work on problems of their own), but above-average mathematical competence, particularly in aspects like algorithmic complexity, theory of data structures, automata theory and miscellaneous discrete math, is certainly all essential for a good programmer.
But yes, if your end goal is to simply deliver a product, we've advanced far enough where you can do it safely with minimal cognitive workload. One should not be too pragmatic or too theoretical, but find balance between both and be versed in both.
I agree with you on that point, but I disagree with you on the point that it is more or less important than mathematics. You may not be applying a lot of higher math to your day to day job because most of it has been taken care of already in the libraries you use but that absolutely does not mean you wouldn't benefit from a deeper understanding of mathematics and how it informs computing.
I once thought like you, until I came across Haskell. Once I got through learning the language (which also requires you learn a few concepts from mathematics) I understood what is so powerful about it: idiomatic (and even non-idiomatic, to a degree) Haskell and the programmers that use Haskell - they go hand-in-hand - harness the ideas behind mathematical abstraction to produce programs that are so elegant. I've taken many of the concepts I learned in Haskell to mundane languages (Python notably) and have made my software in Python cogent, elegant, and easier to understand (note this even comes back to your argument around comprehension and communication). I'm still not a perfect programmer but I feel like the communication of my thought into a program is better because of my appreciation and deeper understanding of math.
Not to mention the foundational role mathematics plays in algorithms and data structures, if you understand the mathematics behind quantifying the time complexity of an algorithm, you're far more likely to pick the right algorithm for the job.
Also, logic could not be greater than Mathematics; Mathematics is more general and describes logic.
If you develop applications that aren't reliant on maths then sure, you don't need to understand maths. On a day to day basis I write web apps that take strings from users, store them in a database, and display them in a different way later. No maths at all. Conversely, I've once wrote an image manipulation library based around convolution filters that used lots of maths.
As with most things, there's no single black and white rule. It's all shades of grey.
You still run into problems that require some math discipline and understanding. If you're writing CRUD apps, you need to know what a Cartesian product is or why big O matters. Or how to calculate disk space requirements and transaction times.
The fact is we might use things that have formal definitions without knowing what the definition is, or understanding the theory behind it, or being able to derive it from first principles. That's very definition of not knowing maths and still being able to write software.
So what are these apps so I can avoid them? Because if you don't understand basic SQL, I don't want to use your apps.
Using a database is working with set theory, but that's very, very different to understanding set theory.
http://knitting.heroku.com/
:)
This may be a true statement as I've never seen the Facebook or Twitter codebases. However, as others said, logic is a part of math and logic is essential in code design.
Along with that, I'd wager most developers could make a facebook-like or twitter-like system. But their first pass is going to be crude, bloated, non-scalable. Understanding how data flows across the system gets reflected in both the software and hardware. That analysis relies on an understanding of graph and network theory and statistics. Perhaps not deep knowledge, but it's still math.
How do you calculate distance between two points? Math. How do you timezone calculations? Math. How do you know what data structure is going to be small and fast enough to not overload a server and still get the job done? Math. How do you determine if two populations are statically different? Math. These are becoming everyday things. We've moved beyond the mid 90s where having a web page and writing some JavaScript was well enough for most companies.
Bullshit. Bullshit, bullshit, bullshit. Entire fields of mathematics (eg Algebraic Number Theory) have arisen due to new approaches to solving problems. Literally millions of peer-reviewed mathematical publications have been written, many of which pave the way for new attack vectors on existing problems.
There is far more to mathematics, dear Horatio, than is dreamt of in the OP's philosophy.
In 1847, the French mathematician Gabriel Lamé[1] published an attempted proof of Fermat's Last Theorem (ie the assertion that there are no positive integer solutions of x^n + y^n = z^n for n > 2) that carried the implicit assumption that every element of Z[s] except 0, 1, and -1 break down uniquely into irreducibles (much like factoring positive integers: 12 = 2 * 2 * 3, and that's the only way to break 12 down into primes (up to reordering)).
However, this uniqueness of factorization doesn't hold when p=23, as discovered by the German mathematician Ernst Kummer[2]. The failure of this approach to proving FLT resulted in the discovery of a significant amount of Algebraic Number Theory, in an attempt to "build more machinery" to get around the problems posed by Lamé's proof. Eventually, Andrew Wiles found a proof of FLT in 1995 that relied on Elliptic Curves and Modular Forms (two fields of mathematics of which I know pretty much nothing).
Another, less long-winded example is the Bridges of Königsberg[3]. In 1736, the following problem was posed to Leonhard Euler: is it possible to take a tour of the city of Königsberg in such a way that each bridge is crossed exactly once and you end in the same place where you start?
It turns out that the answer to that question is "No", and in his approach to answering the question, Euler laid the foundation for Graph Theory. Also, the roots of Topology can be tied back to this problem, as well.
* - In particular, the set of such complex numbers form what's called a ring (http://en.wikipedia.org/wiki/Ring).
[1] http://en.wikipedia.org/wiki/Gabriel_Lam%C3%A9
[2] http://en.wikipedia.org/wiki/Ernst_Kummer
[3] http://en.wikipedia.org/wiki/Euler#Graph_theory
Technically, "Logic ⊂ Math". Your argument is invalid.
(that's the "subset of" operator above, in case the Unicode doesn't make it)