<p>Since Graduating from a very small school in 2006 with a badly shaped &amp; outdated program (I'm a foreigner &amp; didn't know any better school at the time) I've come to realize that I missed a lot of basic concepts from a mathematical &amp; software perspective that are mostly the foundations of other higher concepts.</p>

<p>I.e. I tried to listen/watch the open courseware from MIT on <a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/" rel="nofollow noreferrer">Introduction to Algorithms</a> but quickly realized I was missing several mathematical concepts to better understand the course.</p>

<p>So what are the core mathematical concepts a good software engineer should know? And what are the possible books/sites you will recommend me?</p>

[{'answer_id': 52192, 'author': 'Ben Collins', 'author_id': 3279, 'author_profile': 'https://Stackoverflow.com/users/3279', 'pm_score': 3, 'selected': False, 'text': '<p>Start with what we CS folks call "discrete math".  Calculus and linear algebra can come in quite handy too because they get your foot in the door to a lot of application domains.  Once you\'ve mastered those three, go for probability theory.  Those 4 will get you to competency in 95% (I made that up) of application domains.</p>\n'}, {'answer_id': 52195, 'author': 'Thomas Owens', 'author_id': 572, 'author_profile': 'https://Stackoverflow.com/users/572', 'pm_score': 1, 'selected': False, 'text': '<p>There was a book that was recommended...the title was something like Concrete Mathematics. It was recommended in a few questions.</p>\n'}, {'answer_id': 52197, 'author': 'JasonS', 'author_id': 1865, 'author_profile': 'https://Stackoverflow.com/users/1865', 'pm_score': 0, 'selected': False, 'text': '<p>My math background is really poor (Geologist by training), but I took a <a href="http://en.wikipedia.org/wiki/Discrete_mathematics" rel="nofollow noreferrer">discrete math</a> class in high school and I use the concepts every day as a programmer.  It is probably the most valuable class I took in all of my education as it relates to my current profession.</p>\n'}, {'answer_id': 52202, 'author': 'JosephStyons', 'author_id': 672, 'author_profile': 'https://Stackoverflow.com/users/672', 'pm_score': 2, 'selected': False, 'text': '<p>Basic Algebra and Statistics are good starting points, and the foundation for a lot of other fields.</p>\n'}, {'answer_id': 52205, 'author': 'Baltimark', 'author_id': 1179, 'author_profile': 'https://Stackoverflow.com/users/1179', 'pm_score': 3, 'selected': False, 'text': '<p>"Proof by induction" is a core mathematical concept for programmers to know. </p>\n'}, {'answer_id': 52231, 'author': 'Gulzar Nazim', 'author_id': 4337, 'author_profile': 'https://Stackoverflow.com/users/4337', 'pm_score': 7, 'selected': True, 'text': '<p><a href="http://steve-yegge.blogspot.com/2006/03/math-for-programmers.html" rel="nofollow noreferrer">Math for Programmers</a>. A good read.</p>\n'}, {'answer_id': 52233, 'author': 'Corin Blaikie', 'author_id': 1736, 'author_profile': 'https://Stackoverflow.com/users/1736', 'pm_score': 3, 'selected': False, 'text': '<p><a href="http://en.wikipedia.org/wiki/Big_O_notation" rel="nofollow noreferrer">Big O notation</a> in general algorithm analysis, and in relation to standard collections (sorting, retrieval insertion and deletion)</p>\n'}, {'answer_id': 52260, 'author': 'Jimmy Chandra', 'author_id': 5321, 'author_profile': 'https://Stackoverflow.com/users/5321', 'pm_score': 2, 'selected': False, 'text': '<p>I would say boolean logic.  AND, OR, XOR, NOT.\nI found as programmer we use this more often than the rest of math concepts.</p>\n'}, {'answer_id': 52284, 'author': 'ddowns', 'author_id': 5201, 'author_profile': 'https://Stackoverflow.com/users/5201', 'pm_score': 3, 'selected': False, 'text': "<p>I think it depends on your focus. A few years ago I purchased the set of Art of Computer Programming by Donald Knuth. After looking at the books I realized pretty much everything is calculus proofs. If you're interested in developing your own generic algorithms and proofs for them, then I recommend being able to understand the above books since its what you'd be dealing with in that world. On the other hand if you only want/need to use various sorting/searching/tree/etc... routines then big O notation at a minimum, boolean math, and general algebra will be fine. If you're dealing with 3D then geometry and trig as well.</p>\n\n<p>I tend to be more on the using side than making proofs, and while I'd like to think I've done some clever things over the years I've never sat down and developed a new sorting routine. The best advice I can give is learn what you need for your field, but expose yourself to higher levels so you know it exists and how much more there is to learn, you won't get much growth otherwise.</p>\n"}, {'answer_id': 52338, 'author': 'joel.neely', 'author_id': 3525, 'author_profile': 'https://Stackoverflow.com/users/3525', 'pm_score': 4, 'selected': False, 'text': '<p>Boolean algebra is fundamental to understanding control structures and refactoring. For example, I\'ve seen many bugs caused by programmers who didn\'t know (or couldn\'t use) deMorgan\'s law. As another example, how many programmers immediately recognize that</p>\n\n<pre><code>if (condition-1) {\n    if (condition-2) {\n        action-1\n    } else {\n        action-2\n} else {\n    action-2\n}\n</code></pre>\n\n<p>can be rewritten as</p>\n\n<pre><code>if (condition-1 and condition-2) {\n    action-1\n} else {\n    action-2\n}\n</code></pre>\n\n<p>Discrete mathematics and combinatorics are tremendously helpful in understanding the performance of various algorithms and data structures.</p>\n\n<p>As mentioned by Baltimark, mathematical induction is very useful in reasoning about loops and recursion.</p>\n\n<p>Set theory is the basis of relational databases and SQL.</p>\n\n<p>By way of analogy, let me point out that carpenters routinely use a variety of rule-of-thumb techniques in constructing things like roofs and stairs. However, a knowledge of geometry allows you to solve problems for which you don\'t have a "canned" rule of thumb. It\'s like learning to read via phonetics versus sight-recognition of a basic vocabulary. 90+% of the time there\'s not much difference. But when you run into an unfamiliar situation, it\'s VERY nice to have the tools to work out the solution yourself.</p>\n\n<p>Finally, the rigor/precision required by mathematics is very useful preparation for programming, regardless of specific technique. Again, many of the bugs in programming (or even specifications) that I\'ve seen in my career have sloppy thinking at their root cause.</p>\n'}, {'answer_id': 52349, 'author': 'Landon', 'author_id': 1597, 'author_profile': 'https://Stackoverflow.com/users/1597', 'pm_score': 0, 'selected': False, 'text': '<p>Discrete Math<br>\nLinear Algebra<br>\nCombinatorics<br>\nProbability and Statistics<br>\nGraph Theory  </p>\n'}, {'answer_id': 52363, 'author': 'Corey', 'author_id': 1595, 'author_profile': 'https://Stackoverflow.com/users/1595', 'pm_score': 3, 'selected': False, 'text': '<p>For discrete math, <a href="http://video.google.com/videoplay?docid=-2965569821331370765&amp;ei=Ua3GSODbC5Gk-wH328G6Dg&amp;q=arsdigita+discrete" rel="nofollow noreferrer">here</a> is an awesome set of 20 lectures from Arsdigita University.  Each is about an hour and twenty minutes long.</p>\n'}, {'answer_id': 52367, 'author': 'Ralph M. Rickenbach', 'author_id': 4549416, 'author_profile': 'https://Stackoverflow.com/users/4549416', 'pm_score': 4, 'selected': False, 'text': '<p>I would go with the fields that Landon stated:</p>\n\n<blockquote>\n  <p>Discrete Math, Linear Algebra,\n  Combinatorics, Probability and\n  Statistics, Graph Theory</p>\n</blockquote>\n\n<p>and add mathematical logic.</p>\n\n<p>This would give you a grip on most fields of CS. If you want to go into special fields, you have to dive into some areas especially:</p>\n\n<pre><code>Computer graphics -&gt; Linear Algebra\nGaming -&gt; Linear Algebra, Physics\nComputer Linguistics -&gt; Statistics, Graph Theory\nAI -&gt; Statistics, Stochastics, Logic, Graph Theory\n</code></pre>\n'}, {'answer_id': 52370, 'author': 'Daniel Auger', 'author_id': 1644, 'author_profile': 'https://Stackoverflow.com/users/1644', 'pm_score': 2, 'selected': False, 'text': "<p>Here is a simple one that baffles me when I see developers that don't understand it:<br>\n- Order of Operations</p>\n"}, {'answer_id': 52437, 'author': 'mrbradleyt', 'author_id': 2744, 'author_profile': 'https://Stackoverflow.com/users/2744', 'pm_score': 0, 'selected': False, 'text': '<ul>\n<li>Boolean Algebra</li>\n<li>Set Theory</li>\n<li>Discrete Math</li>\n</ul>\n'}, {'answer_id': 52549, 'author': 'Anders Sandvig', 'author_id': 1709, 'author_profile': 'https://Stackoverflow.com/users/1709', 'pm_score': 3, 'selected': False, 'text': "<p>In order of importance:</p>\n\n<ul>\n<li>Counting (needed for loops)</li>\n<li>Addition, subtraction, multiplication, division.</li>\n<li>Algebra (only really required to understand the use of variables).</li>\n<li>Boolean algebra, boolean logic and binary.</li>\n<li>Exponents and logarithms (i.e. understand O(n) notation).</li>\n</ul>\n\n<p>Anything more advanced than that is usually algorithm-specific or domain-specific. Depending on which areas you are interested in, the following may also be relevant:</p>\n\n<ul>\n<li>Linear algebra and trigonometry (3D visualization)</li>\n<li>Discrete mathematics and set theory (database design, algorithm design, compiler design).</li>\n<li>Statistics (well, for statistical and/or scientific/economic applications. possibly also useful for algorithm design).</li>\n<li>Physics (for simulations).</li>\n</ul>\n\n<p>Understanding functions is also useful (don't remember what the mathematical term is for that area), but if you know how to program you probably already do.</p>\n\n<p>My point being: A ten year old should know enough mathematics to be able to understand programming. There isn't really much math required for the basic understanding of things. It's all about the logic, really.</p>\n"}, {'answer_id': 52751, 'author': 'Bill the Lizard', 'author_id': 1288, 'author_profile': 'https://Stackoverflow.com/users/1288', 'pm_score': 3, 'selected': False, 'text': '<p><a href="http://www-cs-faculty.stanford.edu/~knuth/gkp.html" rel="nofollow noreferrer">Concrete Mathematics</a> covers most of the major topics.  A good book on Discrete Math, like Rosen\'s <a href="https://rads.stackoverflow.com/amzn/click/com/0072899050" rel="nofollow noreferrer" rel="nofollow noreferrer">Discrete Mathematics and Its Applications</a>, will fill in any gaps.</p>\n'}, {'answer_id': 93687, 'author': 'Michael Dorfman', 'author_id': 6741, 'author_profile': 'https://Stackoverflow.com/users/6741', 'pm_score': 2, 'selected': False, 'text': '<p>Chapter 1 of "The Art of Computer Programming" aims to provide exactly this.</p>\n'}, {'answer_id': 215199, 'author': 'Community', 'author_id': -1, 'author_profile': 'https://Stackoverflow.com/users/-1', 'pm_score': 0, 'selected': False, 'text': '<p>Well, that depends on what you goal is. As someone said, Linear Algebra, Combinatorics, Probability and Statistics and Graph Theory are important if you\'re into solving hard problems. Asymptotic growth of functions (bit-Oh notation) is very important. You will also need to master summations and series if you need to work on analyzing some more complex algorithms (see the appendix on Cormen&amp;others Intro to Algorithms).</p>\n\n<p>Even if you\'re into "Java for the enterprise" or "server-side PHP", you will find some Statistics and Algorithm Complexity (hence combinatorics, induction, summations, series, etc) useful when your boss wants you to get the server to work faster, and adding new hardware doesn\'t seem to help. :-)  I\'ve been through that once.</p>\n'}, {'answer_id': 234030, 'author': 'Fortyrunner', 'author_id': 16828, 'author_profile': 'https://Stackoverflow.com/users/16828', 'pm_score': 0, 'selected': False, 'text': '<ul>\n<li>Boolean Algebra </li>\n<li>Set Theory</li>\n</ul>\n'}, {'answer_id': 234137, 'author': 'Federico A. Ramponi', 'author_id': 18770, 'author_profile': 'https://Stackoverflow.com/users/18770', 'pm_score': 0, 'selected': False, 'text': '<p>Why is everybody including probability and statistics in the gold list without mentioning calculus? One cannot understand what probability and statistics are about without at least a working knowledge of limits, derivatives, integrals and series. And all in all, calculus (together with linear algebra) is the workhorse of <em>all</em> mathematics.</p>\n'}, {'answer_id': 235169, 'author': 'Mike Wills', 'author_id': 2535, 'author_profile': 'https://Stackoverflow.com/users/2535', 'pm_score': 1, 'selected': False, 'text': '<p>Back in school, on of my instructors said for business applications, all you need to know know add, subtract, multiply, and divide. All other formulas the requester will know and inform you what is needed. Now realize that this is for financing reporting and application focused school. To this day, this has held true for me. I have never once needed to know more than that.</p>\n'}, {'answer_id': 286431, 'author': 'Scott Wegner', 'author_id': 33791, 'author_profile': 'https://Stackoverflow.com/users/33791', 'pm_score': 0, 'selected': False, 'text': '<p>I think algorithms and theory are of great importance.  Being able to come up with a fast, and <em>correct</em> solution is what differentiates good programmers from the rest.  Also, being able to prove your algorithm (using standard proof techniques-- induction, contradiction, etc) is equally important.</p>\n'}, {'answer_id': 1921329, 'author': 'sateesh', 'author_id': 58220, 'author_profile': 'https://Stackoverflow.com/users/58220', 'pm_score': 1, 'selected': False, 'text': '<p>Check the book <a href="http://infolab.stanford.edu/~ullman/focs.html" rel="nofollow noreferrer">Foundations of Computer Science</a><br>\nThis book is authored by: Al Aho and Jeff Ullman and the entire book is available online.  </p>\n\n<p>This is what the authors say in their Preface about the goal of this book:  </p>\n\n<p>"<i>Foundations of Computer Science</i> covers subjects that are often found split<br>\nbetween a discrete mathematics course and a sophomore-level sequence in computer<br>\nscience in data structures. It has been our intention to select the mathematical<br>\nfoundations with an eye toward what the computer user really needs, rather than<br>\nwhat a mathematician might choose."</p>\n'}, {'answer_id': 2639443, 'author': 'Aaron Mc Adam', 'author_id': 104625, 'author_profile': 'https://Stackoverflow.com/users/104625', 'pm_score': 0, 'selected': False, 'text': '<p>Yeah, I would say a basic understanding of induction helps so that you understand what n represents in algorithms. Also some Logic and Discrete Structures is helpful.</p>\n'}, {'answer_id': 2639491, 'author': 'Jeff Moser', 'author_id': 1869, 'author_profile': 'https://Stackoverflow.com/users/1869', 'pm_score': 0, 'selected': False, 'text': '<p><strong>Probability and Statistics</strong> are very helpful if you ever have to do anything resembling  machine learning. </p>\n\n<p>I cover the basics in my "<a href="http://www.moserware.com/2010/03/computing-your-skill.html" rel="nofollow noreferrer">Computing Your Skill</a>" blog post where I discuss how Xbox Live\'s TrueSkill ranking and matchmaking algorithm works.</p>\n'}, {'answer_id': 2737717, 'author': 'functor', 'author_id': 77609, 'author_profile': 'https://Stackoverflow.com/users/77609', 'pm_score': 1, 'selected': False, 'text': '<p>a site for brushing up on Math:\n<a href="http://www.khanacademy.org/" rel="nofollow noreferrer">http://www.khanacademy.org/</a></p>\n'}]
['https://Stackoverflow.com/questions/52176', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/5413/']