Math is not necessary for software development
mutuallyhuman.com
mutuallyhuman.com
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.
s = cos(2 * pi / p) + i * sin(2 * pi / p)
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.
* - 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
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.
:)
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.
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.
Overall, the blog author is correct that development of good written communication skills is central issue for most software development today: "A very smart person doesn't need to write any comments, the code is obvious to them!" On the other hand, as another several comments here have pointed out, learning more mathematics often allows insight into programming problems that completely escapes people who haven't learned the same mathematics. So it's not a bad idea to practice written communication on the job in part by commenting code so that colleagues see what mathematical approaches were built into the code.
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.
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.
We don't teach every child math because we want them to become mathematicians or anything in the STEM fields, just like we don't teach them PE (physical exercise) because we want them to become professional athletes. We have mandatory PE classes because having a fit and healthy body will serve you (and society at large) extremely well no matter what you end up doing in life. In the same vein, we have mandatory math classes because having an agile and skilled mind will also serve you (and society at large) extremely well no matter what you end up doing in life.
The article claims written communication and reading comprehension are so much more important than math to a developer. This is like saying catching balls and breaking tackles are so much more important than push-ups, pull-ups, or all the weight-lifting you do in the gym. Learning math is a great way to enhance and improve your communication skills! Try explaining some advanced math concept to a kid sometime.
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.
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.
Linear algebra in general is completely critical in machine learning as well.
So it is clear from word choice that the author is just guessing. But Facebook does image recognition, it does ad placement, it does graph networks, it has EdgeRank - Facebook is only possible via math. Sure, perhaps there is more code written to push bits around on the front end and such, but it lives and dies by math. But even screen layout requires math - dealing with resizing screens, different ad and post sizes and so on - there's a lot of admittedly basic algebra there.
With that said, I agree with much of the content of the post. I run into far too many engineers with no real skill at writing or communication, and that is also a large hindrance in the field. Naturally, every job will require a different balance of skills, and no absolute statement is possible.
However, I would say now more than ever math is required to really excel. Write the front end to some CRUD app? Sure, you can do that (where "you" is somebody with no experience). Write a side scroller? Maybe, just maybe you can pull that off. But that awesome new job writing a game that involves game physics. No, you can't do that. Hey, we need some image processing on this app. No, you can't do that. Let's track some objects. No, you can't do that. How about schedule some jobs in the factory? No, you can't do that. Hey, we have this product idea where we will use an arduino to... no, you wouldn't understand PID controls, you can't do that. Sigh. Want to write your 1023rd CRUD app? Slap some javascript together? Sure, you can do that.
This is why when the topic of university (should I go) comes up I am always a proponent. I was taught to write, I was taught to balance books and run a business, I learned calculus, linear algebra, AI, numerical methods, EE, mechanical engineering, thermodynamics, physics, statistics, chemistry. I've used all of that in my career (this week at work I am implementing some Kalman filters, for example), and my only regret is that I didn't take more math courses. The valley is on fire now with jobs requiring math - machine learning, hardware interfaces, augmented reality, and so on.
If I had a friend with no real math and an interest in programming I would not dissuade them, but math is very important in an important subset of programming.
Finally, I have to say I've watched a lot of people struggle to put a program together which has nested if statements or multiple and/or conditions. Generally speaking, the people that struggle to do it don't have any math skills. So even if you are programming something that doesn't require math knowledge, it certainly requires math aptitude.
.... to other mathematicians. And this is often a problem. I've had to fire mathematicians-come-developers who thought that writing their specs like a maths paper was a viable way of communicating their ideas, because they proved totally unable to communicate their ideas in a way that the rest of the team understood.
Lets be clear: I'm not saying all mathematicians do this - one of the brightest and best developers I've ever worked with was also deeply into maths yet is also great at communicating.
I just don't for a second believe that being a mathematician in any way implies that you'll necessarily be skilled at writing for a non-mathematician audience.
* Abstract & Introduction
* Lemmas, Theorems, and Corollaries, each with their own proofs
* Some examples sprinkled throughout
* Maybe a concluding section with further questions or areas of investigation
* Bibliography
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.
I do agree that communication and prose is important to a polyglot professional's resume. However not seeing a connection between linguistics and mathematics is naive. Symbolic transformation and interpretation is the same no matter what the flavor.
Can we please get over the fact that no one writes binary anymore and look at the entire field of "software development" - graphics, ai, information theory, distributed systems, anything involving a graph
Essentially... learn it all. That is unless you want to excel at communication and fast track yourself to project management.
The biggest stumbling block I run into with programming relates to the adage "There are only three numbers in computer science: 0, 1 and n". I can easily deal w/ the '0' and '1' cases, but struggle making my programs work with the 'n' case. I've attributed this to my poor math background, so have begun to pick up where I left off with an aim to learn Pre-calc and then Calculus.
However I'm wondering if this isn't a mistake and rather I should focus more on logic and, perhaps set theory (I'm not even sure I know what that is and whether it requires higher level math)...?
If the above is true - I'm curious to hear from those with more advanced math backgrounds - then it may lend at least some credence to the author's point.
Some useful math topics:
Set theory is related to relational algebra, which forms the foundation for relational databases. You don't need to know the math to use databases. There are methods, rules that you can apply when constructing databases that are, essentially, a distilled version of what others have discovered through the study of the math itself. But having a better understanding of the math side can help you to go beyond just a few memorized rules or querying stackoverflow.
Language hierarchies. This is a mathematical CS theory topic. Think about matching strings, you use a regular expression. Some structures, however, are not matchable with a regex. They're too complicated, that leads to context free grammars. Knowing the different classes and when to use each can be very useful. [1]
Big-O notation. This is an important concept in algorithm analysis. This gives a way to talk about the efficiency of a program and relate the efficiencies of different parts. It uses a moderate amount of calculus, but not much. Really, like with using a DB without knowing relational algebra, you can use the calc required for this sort of analysis without knowing calculus.
[1] This comes with a story. At an old job they needed to write their software design document (SDD) as part of a certification package. Now, ideally this is down concurrent to development (or prior if you're a waterfall/bullshit method organization). They, however, hadn't started on it. In the SDD there were typically flowcharts, pseudocode or some other high level representation of the code. To accomplish this a dev wrote a C->Pseudocode converter that really just used regular expressions and a global search/replace. This lead to some amusing ommissions and extra changes, and a bullshit document. if -> IF, while -> WHILE, { and} were omitted with the intent of replacing the } with ENDIF or ENDWHILE. They ended up just replacing them with END because they didn't know if it matched to an if, a while, a function or what. While I still think the task was bullshit (done at the wrong time and zero-added value, possibly negative for future maintainers), if they wanted to do it right they should have used a proper parser. C parsers are available that would know the difference between a } matching an if, while, for or function block. That would know the difference between `if` in a variable name and `if` the keyword. They could have at least made a more presentable version of their hack.
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.
But it's also very true that if you work with high level languages like C# and python you can perfectly get your job done with just using a clever library that hides the underlaying mathematical problems.
I also totally agree that communication, empathy and writing skills are extremly important for software engineers. Coding is always an act of communication, be it with your client, with the machine or with your fellow co-workers.
The bottom line is you don't need to be a mathematician or even a B-average math student to program, but if you are afraid of the math content in most standard CS curricula (calc, linear algebra, discrete mathematics) you should probably not be a software programmer
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.
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 = ___".
It's very hard to pin down either necessary or sufficient skills for a developer, so we all focus on the things that have been relevant to us.
I'd add the following to the list: problem solving, critical thinking, social skills, egolessness
Logical thinking is required for software development
Math is a great teacher of logical thinking
Technically, "Logic ⊂ Math". Your argument is invalid.
(that's the "subset of" operator above, in case the Unicode doesn't make it)
This is false.