I always thought that being an Engineer assumes you have knowledge of mathematics. The way this word is being used in Software ist kind of strange. "I built a blog in php, I'm a Software Engineer" - this feels kind of awkward to me.
I always thought that being an Engineer assumes you have knowledge of mathematics.
Not really. Mostly just algorithms and procedures of some math concepts(Calculus and Linear Algebra) which roughly corresponds to the first year of North American math major.
This could not be further from the truth. I doubt my CS professors would be able to solve a PDE (or algebraic geometry etc etc). Likewise, few math professors would be able to write a parser generator (or code worth a damn).
In contrast, I know engineers who live and breathe PDEs and tweak compilers to solve them faster.
PDE's are not discrete math. CompSci majors are more interested in topics like Combinatorics, Graph Theory etc. PDE's are more interesting to applied mathematicians and physicists.
I doubt my CS professors would be able to solve a PDE..
Beyond the basics, not even many math professors can do that. Math is too vast and people specialize. Strong algebraic geometers are not necessarily strong analysts or algebraists or logicians.
1) No such thing as universal mathematician in this day and age.
2) Engineer's PDEs(algorithms) are not the same as mathematician's PDEs(theory). Same as comparing a student in China who learned English to communicate with English speakers to English majors from English speaking countries.
It wasn't that long ago that most schools did not have a separate CS degree, but rather it was a math degree w/ a concentration in computer science (or some other verbiage to describe the same thing)
Depends on your school. UW CSE (a top 10 program) would be called rigorous but is not as theoretical (there is math, but nowhere near enough for a math minor).
I went and checked the undergrad curricula back at UMass Amherst where I went. I was incorrect: a generic Comp Sci program there stops three courses short of a math minor. The more theoretical concentrations - such as Theory of Computing, Machine Learning, or Programming Languages - teach enough theoretical content to come within one course of a math/stats minor, or even cross the line.
So yes, if you take a Computer Science major with a focus on Software Engineering, you will not learn enough math to minor in math "for free". If you pick a more mathematical subfield to focus on, you should probably declare a math minor for the one or two additional courses it will take you.
I made a truly stupid choice: I graduated in 7 semesters with a Comp Sci degree concentrated on PL theory without picking up the additional courses for a math minor. As a result, I'm "condemned" to learn that material independently later on. "Luckily", the Technion required me to do extra coursework for my MSc, so I've had to buck up and learn more theory.
Now get off my lawn until I'm done with my highly theoretical machine learning exam ;-)!
Minors are mostly meaningless on your degree; but the knowledge you get from the classes is worthwhile. I took some advanced math classes but kind of burned out on it towards the end of my degree (ironic since I went to grad school immediately after). What I did notice: CS classes are easy compared to advanced math classes...man, I struggled to eek out B's in the courses when CS classes were just easy A's.
If you want to do good at machine learning...electrical engineering is probably a better choice; the maths learned in EE overlap fairly well with what is needed to do ML. PL theory is quite niche, even for PL researchers.
I was actually being cautious. American colleges like to make sure you pay for as many BS courses as possible. Calculus 1, Calculus 2, Calculus 3...
Besides, I never heard of math majors taking cryptography that early. Usually, Intro to Real Analysis, Abstract Algebra and Abstract Linear Algebra come first.
My engineering physics curriculum required three semesters of Calculus, a differential equations course, and a numerical methods course. Notably lacking? A course in Linear Algebra, which was not required (and most in that program did not have time to take it, as the program was more like a double major with additional technical electives).
Most of us (engineers of any kind) learn quite lot of maths during uni, and most of us forget 90% of that as it's not needed in most jobs, which is a shame.
The thing I have needed all the time is statistics and prob. theory, that keeps coming up literally everywhere. Calculus - not so much. If you need something, you can always re-learn it quickly. (For example, I learned quite a lot of linear algebra, but haven't used it for ~10 years, so when I had to write some 3D gfx/shader code, I had to spend like two days on quaternions, etc.)
I find my self surprised just how often Linear Algebra pops up. A few years ago I was doing some work with Splines, trying to smooth some noisy plant data and I had to relearn matrix decomposition (LU factorisation). Every year or so since I've been ambushed by some other "stealth" aplication of linear algebra in something you'd otherwise think would not be applicable. Nowadays my old beat up linear algebra text book from uni sits right beside "C in a nutshell" and the printed GDB manual on my shelf at work.
I obtained my degree in Software Engineering at a university where engineering grade mathematics and physics were mandatory subjects.
It really annoys me that I spent 4 years studying this to find that other people who scrape together snippets of JavaScript & PHP feel entitled to call themselves an "engineer".
I'm employed as a Software Engineer now but my degree is in ECE. The engineering curriculum at my university (Rutgers) was extremely math intensive. I didn't take a whole lot of software classes but I'm glad I did take all that math. I think it's dishonest to call yourself a Software Engineer and not have an engineering degree. Semantics, but I earned the title.
In some countries it's illegal to call yourself an engineer without having an engineering degree. The degree is "protected" by the government and can only be acquired from certified organizations (like universities).
Can't stress this enough- in Canada (Ontario specifically) it is a serious fine for anyone caught using the term without being certified by a professional organization.
This is a perfect example of why the term is protected by PEO. I used to think the PEO overreaching in its attempts to protect the term/designation, but I can see why they have taken issue with the term "Software Engineer" being genericized.
I applaud the effort to learn the topics of "statistics, probability, and linear algebra", but these would have been relatively fundamental courses in most software/computer/electrical engineering curricula that I've known about, and most definitely a prerequisite to calling oneself an engineer.
In some states, which regulate such things. I don't know about fines, but if a gang from the IEEE or the ASME catch you wandering around wearing their colors without being a member,....
All provinces have a comparable professional organization, all of which are members of Engineers Canada. We have the notion of "self-regulated professions", where the government gives a charter to the professional organization to regulate use of their name, their members, etc. For Americans: it's not comparable to the IEEE, it's comparable to the College of Physicians and Surgeons (also a Canada/UK thing the US doesn't really have). So they're given the same power to penalize people "impersonating engineers" as the royal college can penalize people impersonating doctors.
I understand where this feeling comes from. You worked hard to earn what is (or what should be) a title with prestige: engineer. I too worked hard to earn degrees in engineering. I try to live up to that title every day, and I'm sure you do, too.
But my years of engineering experience have shown me that the title "Engineer" is really more about how you approach problems and what you do to solve them and less about degree credentials. Now, the following example is in the context of electrical engineering on airplanes, not computer programming, but I think it holds true.
One of the best people I work with does not have a college degree. But over years of self-study and real world experience, he has taught himself electronics, some computer programming, and enough mathematics to get by. And when there is a technical problem to be solved on one of our airplanes, he will chase after it relentlessly, and smartly, until it is solved. His system designs are clean and well thought through. He has taught me much about designing for real world implementation. Is he not an engineer? He does more than many of my coworkers who are degree holding EEs. I am not afraid to call him an engineer, because he has earned the title in a different way.
Right, I understand your point. I said in an earlier post that an engineer is one who obtains an engineering degree from a certified university. I realize that it's pedantic and elitist, and there's definitely a part of me who thinks it's idiotic. Because it is. It's a title, who cares right? It doesn't lessen the worth of my degree. I've been trying to come up with valid reasons for why it's important for only people who fit my definition to be called an engineer but I can't think of any. So you're right.
However, I still think it's wrong for people who don't exhibit these qualities to call themselves an engineer. If you make sick beats on your macbook, that's great. But don't call yourself a beat mix engineer.
Edit: Thought of some reasons
It's similar to the "doctor" title. You can be the worlds greatest doctor. Self-taught, you can do everything from intubation to surgery. However, you're still not a doctor. You practice medicine. Why? There's things that you can only learn from someone who is more skilled than you, and who is skilled at teaching. That's what a professor is (simple definition). They are an authority on their topic and are the best place to learn from. They teach things that books don't cover. They have experience. They can tell you when you're wrong, and unlike a book can teach you the most current standards and techniques.
Another point is the completeness of education. Your coworker, does he know vector calculus? Linear algebra? The forward-active voltage for a BJT? Maybe. But there's no guarantee he does. A degree from a certified university guarantees that you know the salient points of your field (not always true, but for my argument it is). If you don't have a degree, there's no guarantee. And this knowledge is important.
My coworker knows some calculus. I doubt he knows linear algebra. The forward-active voltage for a BJT? Maybe one other person I work with knows that, I doubt he does. I did not when I graduated, but then I am not a EE. My degrees are in Engineering Physics and Fluid Mechanics. Almost by accident I have become a flight test instrumentation engineer with the official job title of "Senior Electronics Engineer". I have tried hard to remedy my EE related shortcomings through self-study, and will continue to do so. I would never call myself an EE -- just an engineer.
I agree with you, for the purposes of your argument, that degree should serve as a guarantee. It is an important signifier of mastered domain knowledge, and more importantly, a signifier of the ability to master new domains.
To say that a professor is the best person to learn from isn't 100% true. I had a linear algebra professor who simply lectured by reading straight from the book and then occasionally drew the diagrams. Alas, he apparently was a valuable research professor and had tenure, so there's little that could be done. In this case, the professor was hardly the best approach towards learning the subject.
And as for experience, well, in the case of a CS student wishing to enter industry there's a good chance that the majority of your professors never even worked in industry. So if you're looking for people with experience to learn from, well, then you're in quite an unfortunate situation.
This led me to conclude that a degree offers no such guarantee that someone knows something. It offers a guarantee that someone was introduced to a number of concepts and demonstrated an understanding (or knack for cheating, cramming, what have you) good enough to pass and move forward. This is why I shudder at the thought of hiring old classmates who had to be hand-held through their 4 (or more) years of university, I know better despite what their degree might say.
Which is why that people who earned a degree...earned a degree, that's it. As far as I can tell they have no right to call themselves an engineer until they begin to practice engineering and practice it well enough to demonstrate the value of their thinking.
The ideal professor is (a) a world-recognized expert in the appropriate field, and (b) a really good teacher. Frequently, you'll find one or the other, but not both. Far too frequently, you find neither.
But the best professors I've had (and I've had a bunch) were the ones that really did combine both. (And frankly, I can forgive a lot of poor teaching in return for a "well, this is technically true, but no one really does it that way; they use this shortcut...."
As for a university education not providing immediately applicable industrial experience, well, that's kinda not the point of it. Sort of the difference between passing the FE exam and being a PE.
I have found real world experience and self-study vastly underused on a lot of engineering projects. I'm not taliking
about Programming, or CS. You guys can succeed without a degree. I'm talking about the mechanical, and electical engineering projects. I have tried to decipher too many blue
prints form licenced Electricial Engineers--whom I can guarantee didn't spend one day on a construction site. Getting your hand dirty counts for something. Know the theory--essential, but know how to put it together too. I have met mechanical engineers who can't work on their own automobiles--which I
found baffling, because these guys didn't have a lot of extra
money to spend--at least when I knew them. I do still kind
of cringe when people throw around the title of engineer though, if they don't have the math backround and license to
back it up.
Being an engineer is about more than just technical skills, though. Engineers get it beaten into them that their first duty is to protect the public; their employer comes second. That means having the backbone to say "No" to unsafe demands, even if it costs them their job.
If he's as good, and as experienced as you say, he should be able to just do the legal/ethics stuff and get a license. Unfortunately, the professional associations are streamlined for people who take the usual path through university. At least in my jurisdiction, it is technically possible to have the experience counted, rather than the degree, but it's much harder.
The system is clearly not perfect, but when you ask the average engineer whether it's ok to do things like lie about their experience, you will get very different answers than if you asked the general public. The gatekeeper is doing a real job, even if they don't do it perfectly.
There's more to it than that. In most places, the title 'Engineer' is a legal entity. In Australia, signing off on a design as an engineer makes you legally responsible for guaranteeing that it has been correctly designed, and is safe for public use. This includes personal liability in the case that it fails (bridge, software, whatever), and can be shown that it was not designed according to appropriate standards, or what should 'reasonably' have been done.
So basically, don't call yourself an engineer unless you're willing to sign off on something, and be legally bound by it. This implies a strong background in problem solving and structured design processes, to remove as much risk (both personal and to the public) as possible, which is also vital to engineering.
In the US we have the title PE, Professional Engineer, which requires some additional qualifications (exams, supervised apprenticeship, etc), and of course a state license. Most people don't bother any more, which has lead to a much smaller number of PE-Engineers many of whom are relegated to being mere license-holders who sign drawings for others, who do the actual engineering.
>So basically, don't call yourself an engineer unless you're willing to sign off on something, and be legally bound by it.
I'm sorry to say it (not really); but for a number of reasons, some good and some bad, the title has been co-opted, and there is no going back.
>This implies a strong background in problem solving and structured design processes
As far as that goes, I've met a number of pedigreed folks who can't engineer their way out of a wet paper bag.
> Most people don't bother any more, which has lead to a much smaller number of PE-Engineers many of whom are relegated to being mere license-holders who sign drawings for others, who do the actual engineering.
To some extent this happens in Australia as well, although there is a movement both to require things to be signed off by a PE (or CPEng here), and to have those engineers provide documented supervision of the work they sign off on.
> As far as that goes, I've met a number of pedigreed folks who can't engineer their way out of a wet paper bag.
No argument there, certification is never proof positive of competence. I've met very good engineers who aren't Engineers with a capital E, and very bad Engineers who knew enough to fool a test board, but not much more.
The existence of these licensing schemes is far from perfect, but better than nothing IMO. Applying the concept to general purpose software is another discussion entirely!
>I think it's dishonest to call yourself a Software Engineer and not have an engineering degree.
Definitely semantics. For example, I have a BS/MS in applied math from a good engineering school university. I am a software engineer mainly working with ECEs, physics, and other math guys, who are all "software engineers".
I see where you're coming from about being a SW eng without knowing a lot of math - but there are other majors - math/physics/stats etc that will be very math heavy and not "engineering degrees".
Right, an engineering degree is a guarantee that you know the important points of what it means to be an engineer. Ethics, engineering process, math, etc. When you get an engineering degree from a certified university, you are an engineer. It's a guarantee that (at one point, at least), you possessed the set of skills and knowledge determined by a board of professionals to be necessary for a career of engineering. Other degrees may overlap, but they're not held to the same standards.
>When you get an engineering degree from a certified university, you are an engineer.
That's not true. When you get a degree you have an engineering degree. When you get hired and employed as an engineer, you are an engineer. You have an engineering degree and I have a mathematics degree. Our employers hire people for engineer positions and call them such. If I were a professor of math, i could call myself a professor. If I were a mathematician at the NSA, a Mathematician. But my employer calls me an Engineer. The degree does not do that.
Since we're getting pedantic, once you are employed straight out of uni, you are still not an engineer. You are a graduate, or cadet engineer. Typically its not until you've have several years of experience in an engineering capacity, and have passed your government's regulatory body's requirements, that you are actually an engineer. Usually this involves submitting a number of essays on your work, and then passing an oral review board.
@dsuth - that depends on country. Some employers in the US will take a new hire and call them an engineering intern if they require time and testing to reach PE status. That is not required and other employers will grant an Engineer title immediately.
And I'm not merely referring to software. The above is true for my companies 20+ different engineering positions across all disciplines they hire for (Aerospace, mechanical, electrical, materials, software, etc).
I think one thing that's understated is the amount of time we spend in ethics classes. I felt that there was always a semester where I was in some form of ethics or engineering history class.
Feel exactly the same way. Why not just call yourself a software developer? Because software engineer sounds better. Because people expect a better math foundation.
Lived and breathed math for 5 years in college before I could look myself in the mirror and call myself an software engineer.
Originally engineering meant something like applied science for maximal profit, or something like "the accountants of the science world", which requires little if any higher math.
A filter / weedout system was required because of too many students, so its turned into something else entirely and now a engineering degree often means nothing other than having passed the weedout math classes. It really shows in some new grads that don't have any actual engineering skills but are really good at calc problems.
And that assumption is wrong. You don't need any knowledge in advanced mathematics to engineer many types of software, that doesn't make the creator less of a Software Engineer.
Being an engineer means using technology, science, mathematics to solve problems. Well in many cases you don't need math to solve these problems. The word itself as no root in math either, it's based on latin for devise/contrive, sure it was used for builders at first, where math was important, but context changes.
Also Software Engineer is wide and reaching, a 3D GFX Software Engineer will need some heavy mathematics to do his job and do it well, a Web Software Engineer not much, but he'll need to know a wide range of other knowledge GFX guy doesn't know (HTTP, network protocols, various languages, server technology, database technology, browser knowledge,...).
It's not about being good at mathematics, it's about knowing as much as possible about the domain of knowledge your role entails, and surprise, not every one of these requires deep math knowledge and understanding.
I love this answer. I find technologists can often be complete snobs about their particular niche of expertise. Math, computer science, computer engineering and software engineering are each way too big for anyone to be a true expert in any of them. I find once you've spent some time learning multiple disciplines you tend to realize how little you really know and become a bit humble about your own abilities.
>Being an engineer means using technology, science, mathematics to solve problems.
That's called practicing engineering. An engineer is a professional practitioner of engineer. You can practice engineering all you want, but if you're not a professional (having received an engineering degree from a certified university), it's dishonest to call yourself one. Honestly, it is elitist. But those of us who obtained our degrees worked our asses off. And I personally hate when people abuse the term to mean anything that took skill. "Candy cane engineer". "Beats engineer". "Drink mixing engineer". It's linguistic prescription to make yourself sound more important/skilled.
Plus, do you really want to drive across a bridge every day that was designed by someone you don't know, someone who was self-taught in the ways of technology, science, and mathematics?
A great many real, live engineers that I know would object to anyone calling themselves an engineer without a lot of study of the big three: statics, dynamics, and thermodynamics; not just general mathematics. It's one of the reasons I don't call myself an engineer. (But I do get to harsh on them a bit about not being professional programmers---their code isn't pretty.)
The other reason, of course, is that the "software engineer" term comes from a group of people who really wanted the respect that comes with "engineer" but realized that the big three don't get very far, software-wise. (And coincidentally didn't want to do all that icky math stuff. Not to mention much of the icky programming stuff.)
Ironically, EE had by far the most maths and maths-related courses of the other degrees, at my Uni. But we were still required to study those ones, along with the civil and chemical engineers.
Well written, this resonated with me. My day job is a software engineer. At night I have started to build a speech synthesizer. I had some math knowledge before, but I need to constantly improve it. (in the territory of signal processing and everything machine learning related.)
A related "Ask HN" from a couple of months ago: How or where to begin learning mathematics from first principles? [1]
I'm at the very start of what I hope might be a similar journey, and have signed-up for a Coursera "Introduction to Mathematical Thinking" course. I'm hoping it might give me some insight to build on. The course starts in about ten days, so apprehension hasn't kicked-in yet.
I'm taking Discrete Math now and have both books. Epps' has much simpler explanations. I haven't taken algebra in 5 years and find that Rosen's assumes a lot more knowledge, frequently skipping lots of steps in its explanations, which can be very confusing if you are rusty in the basics.
If you don't mind could you list some more books that you think are particularly great? Topic to me is not so important, as I am interested in just books that are the best in their field. Much appreciated!
For information theory, a really recommend: Thomas M. Cover, Joy A. Thomas "Elements of Information Theory" - it starts elementarily, has direct examples, straightforward definitions and readable notation.
Barbara Oakley mentioned in the text teaches the course "Learning How to Learn" on Coursera [1]. It is about the science of learning in general, not just learning math, but it is very accessible. It's only 4 weeks, and the lectures are easy to understand. I knew most of the techniques before (spaced repetition, recall, proper sleep etc), but it was still good with a review.
This guy claims to be a software engineer but then asks this question, "Why spend your spare time learning math, which is challenging and sometimes dry?"
The question invalidates anything he has to say on the subject and makes me question his claim of being a software engineer. No self-respecting person in that position would ever need to ask that question or write an article about it. Nor is it worth wasting anyone's time to read past the first paragraph.
Margaret Hamilton coined the term "software engineer." Anyone not doing landing-humans-on-the-fucking-moon level work can have their claim to the label questioned under any absolute standard.
About 2 years ago, I had an intense urge to learn linear algebra, statistics and probability in depth for much the same reasons as the author - to improve my machine learning and computer vision skills.
Really glad to see I'm not the only one.
I don't have any recommendations for linear algebra, but for stats and probability (which I always found intimidating in the past), Allen Downey's "Think Stats" and "Think Bayes" did the trick.
I'm enrolled in that class. In the introductory lecture Professor Klein shows a flowchart of the course†. This is the best course overview I've ever seen in any math class! I've spent /semesters/ in math sequences thinking "how the #@%! does this all fit together?!?!"
He says: "Don't try to read it all. It's a map... It's there to help you keep track of where you are and where we're going." Every professor should do that for their course. And every department should put up a big poster with something similar: these are the subject areas you will study, how they relate to each other, and the courses that cover those areas; if you choose this specialization these are the areas you'll focus on. Put-out a mind-map of the subject area that relates to the available courses—help students start building Elon Musks' mental-hyperloop / semantic-tree.
I am currently taking a great Coursera course that is meant as a mathematics refresher course. It's called "Mathematical Methods for Quantitative Finance"[1]. As the name implies, it's meant as a foundation for financial calculations like options pricing, but a lot of it is just pure maths, like limits, derivation and integration.
The lectures are quite clear and easy to follow. I did do all this math at university, but that was over 20 years ago, so I had forgotten a lot, so for me this course is perfect. But I think it can be quite useful even if the concepts a re new to you.
Mary L Boas "Mathematical Methods in the Physical Sciences" [1] has absolutely been my favorite and most-used maths text in the 9 years since graduating uni. It's like a reference manual of just about all the non-CS (i.e. continuous/non-discrete) mathematical techniques required in my career. Highly accessible. It's a little too terse in places but I prefer this style of presentation over the insane long-form verbiage in other books I've since discarded which can make even simple topics seem overwhelming: the "Boas" book gets right to the point.
Edit: Calling it a mini-TAOCP of most of the maths needed for physics/EE work might be a bit of a stretch, but I've yet to see another maths text that does better as a highly readable, self-contained and compact reference.
Edit2: I moved house once and thought I'd lost my copy from university. I eventually found it, and yes, I have two copies... It's that important to me for brushing off the things I've forgotten :)
It is a fantastic book. It isn't (only) a reference book though. For me it was the best way of learning the maths used in my physics degree.
The book has many worked examples, and the extensive end-of-section questions have the answers in the back of the book (for every 2nd question). This means you can learn by "reading then doing", and see if you have got the answers right - something many textbooks lack.
When I try to learn from other technical books, I often find myself thinking "I wish they'd written this in the same style as Boas".
I see a lot of complaints in amazon reviews about the lack of answers making self-study difficult.
It got me wondering...suppose there were a website for autodidacts in math and similar topics? Something where people could post and discuss their answers to exercises. It'd solve the whole problem.
I think academics would get pretty annoyed :) Most of my professors just use the exercises from the textbook for homework, usually on the assumption that you can't find the answers online.
I'm sure they would, but I'm more concerned about people in my shoes. University tuition has gotten so expensive these days that I think we need solid alternatives...and that they can use some of that fancy tuition money to write their own exercises, if they don't trust students to do their own work.
Or they could just trust the students. At my university the honor code such a big deal that they let students take closed-book tests at home.
Not a problem - Boas has the answers for every 2nd question - for tutorials, we would be asked to do the ones without answers.
Maybe DennisP's idea could do the same thing - only post answers to the odd-numbered questions. Of course, DennisP's scheme would only work for books that actually have decent end-of-section questions, unless people made up extra questions as well ...
You can use math.stackexchange.com for this today. It's frowned upon to just ask an exercise from a book w/o even trying to solve it, but if you show that you made an effort but got stumped, or if you show your solution and ask if it's correct, people will gladly help you out.
Concrete Mathematics by Graham,Knuth, Patashnik is (explicitly, even) a mini-TAOCP for much* of the mathematical underpinnings of computer science.
* I say much rather than most or all since it's focused on asymptotics, recurrences, number theory. Modern theoretical Computer Science draws on a much wider variety of mathematical methods.
Concrete Mathematics is outstanding, and I'm happy to think I'm getting an overview of TAOCP by (very slowly) working my way through Concrete Mathematics.
There are some numbers for this in David Bellos "Is that a fish in your ear?"[1], chapter 19.
An UNESCO study of translations between Swedish, Chinese, Hindi, Arabic, French, German and English over a decade showed that 104,000 of the 132,000 translations made between all those languages were translations from English.
>Yeah, no. Usually good books get translated, period.
Great books certainly get translated in every direction. But for merely good books, I wouldn't be surprised if readers outside the US consumed more books translated from English than readers in the US consume books translated from other languages.
Considering that the average reader reads more in Europe than in the US and that there is a very dynamic domestic industry in many of these countries, I would say the opposite.
And I didn't even take India and China into account...
I don't think so for the simple reason that academic books in English usually aren't translated because people in countries outside of the US can read English. Even academic books that do not have any native English speaking authors are usually written in English. Books are more likely to be translated to English than from English, because translating to English multiplies the size of the audience many times, whereas the other way around does not.
I own this book and I'll tell you it's not easy learning math from this book. Most of it is just very light overview. There are much better rigorous textbooks that are simpler and more complete.
There are some great textbooks translated from Russian. Analysis by Kolmogorov, (rigorous) Linear Algebra by Shilov, Complex Analysis by Markushevich to name a few.
The book covers too much to be thorough. Each chapter gives good introduction to the subject matter and ends with list of suggested reading.
I always read the relevant parts from this book before going deeper. Not everyone is going to dwell into non-euclidean geometry, functional analysis and topology.
Furthermore, I don't think typical self studying engineer in Hacker News wants to learn math using rigorous introduction to analysis. You can get good working knowledge and intuition without knowing what delta epsilon is.
I agree with you, that book is great for giving an overview of the general areas of mathematics and for providing context before going deeper into an area. I've used it to get some background in the courses I'm taking classes on before the semester starts and have found that really helpful.
This is a good book, although I agree with others that truly learning from it would be difficult. If you like this, another book you might really enjoy is the Princeton Companion to Mathematics.
Has anyone had any experiences learning different mathematical techniques using Mathematica? I was wondering if it might be more enjoyable to learn some areas without the manual arithmetic usually involved in school. Any recommendations on books or courses appreciated, thanks!
There's a pretty good Linear Algebra course currently being offered on edx.org. I just made it past week 1 with relative ease and in the next few weeks we will be using Mathematica. (Every student gets a license for the duration of the class)
As a software developer who also started learning Mathematics for the same purpose (Machine Learning), I just could not do it with books. It is strange to explain, but I need someone with me to study.
I need that person to say: "I don't understand it". Even if I don't understand it myself, as I try explaining it to my study partner, it starts clicking in my brain. I suddenly start to understand these parts as I'm explaining it. Hands down the best way for me to learn: explain to others.
I took Andrew Ng's Machine Learning course on coursera together with a friend. I had the software engineering skills, he had the math skills. Together we strived through all the excercises with a lot of discussions, helping each other and of course we had some disagreements which we learned even more from.
In real life, a software engineer can finish his studies and get a job with only a tiny knowledge of math, in every country, regardless what the curriculum says...
Well, it's a bit of an abuse of the term "engineer". It's really sad to see how software people first abducted it, and then degenerated it to a near obliteration.
I develop software since 1986, never needed such dummy tests to be hired.
Companies choose employees, but employees can also chose companies which can recognize the value someone brings in, besides a few programming exercises on a sheet of paper done in 1 hour interview.
As for Fizz Buzz, never bother coding it. I see no value.
> I develop software since 1986, never needed such dummy tests to be hired.
I've never personally had a FizzBuzz test, but I also have no doubts about my ability to solve it in my sleep.
I'm against trick interviews or algorithms quizzes, but FizzBuzz is again just establishing a ridiculously low baseline that you know the most essential aspects of programming. Someone a few weeks into CS 101 should be able to do it, so any professional developer who can't deserves to be immediately laughed out of the room.
FizzBuzz is only a "dummy test" in the sense that only dummies will fail it.
Many places, including SV, have companies that give that title even to those who haven't studied CS or math formally.
But besides that, I see a deeper motivation in the article. The author says
"My dream is to learn the statistics, probability, and linear algebra needed to really understand machine learning and computer vision...I need a solid foundation so that I can truly understand what's going on: why something works, when it won’t work, and what to do differently if it doesn’t."
I contend that even many who have formally studied CS and math probably don't truly understand these math tools, that is, if they are using them in the first place. Intuition in math takes time to build up, and requires considerable mental effort.
I'll go a different tangent from the other replies, which is there's a whole lot more to math than two years.
By analogy a business school IT degree is two years of cs plus a bunch of biz classes instead of compilers and automata theory (it varies, huge simplification, etc) However, its possible to study CS at higher levels for immensely longer than the two years an IT grad will get.
There's a lot of title inflation in the US, where someone who only knows some HTML, CSS, and a bit of JavaScript, with little formal engineering education of any kind, can be called a software engineer.
This topic comes up every so often. I think my previous comment applies here [1]:
I started a Math degree after 16 years of programming without any Math beyond high school (the highest being high school calculus). Most of my work as a software developer didn't require any "higher" Maths.
Once I began studying math, including Modern Algebra, Analysis, Graph Theory, Category Theory, etc., I realized I understood many topics on an informal level, in a non-rigorous sort of way, through programming. I had a good sense of major algorithms and data structures as well as their running times. Once I did have more math under my belt, things did become easier, and I started to see connections and commonality between problems across different domains, i.e. more than one way to skin a cat.
Part of the reason I began studying math, is that I felt it was my limiting factor. The range of problems I could tackle as a programmer was limited by math. It turns out this was partly true.
The biggest misconception is that in Math there is one "correct" answer. This is almost never the case. Some of the most interesting solutions in Computer Science come directly from Math topics that were once considered "abstract". Likewise, some of the most interesting problems are solved through approximation algorithms of seemingly intractable problems, often requiring a bit of "hacking" and real world experience beyond what you'd get from a formal education in Math or Computer Science.
There's no dependency between learning functional programming, including Haskell, and category theory. I say this as someone who is reading a CT book (Conceptual Mathematics) after being first exposed to the topic by learning Haskell.
I'm in a similar boat as you. I went up through Calculus in school and hated it. Around 5 years ago I developed a strong interest in learning relevant applied math and have been enjoying it since.
Some things I'd add:
1) Math is fun! If you have the aptitude and disposition to enjoy writing software you'll love working out math problems. They're little nuggets of mental stimulation that you can work on with just some paper, a pencil, and maybe a pocket calculator.
2) You're spot on about an experienced programmer already having an intuitive but non-rigorous understanding of many concepts. It's mostly a matter of learning to read and write comfortably using the notation, which is really similar to learning the syntax and semantics of a big computer language with poor reference material.
3) You really have to have basic math down. This means going and re-learning stuff like applying FOIL to a binomial or dividing by a reciprocal.
4) Calculus and Linear Algebra are the father and mother of applied math. You'll save yourself a ton of grief if you learn them first (and I mean really learn them, maybe you took a calculus class in college but can you apply the Chain rule right now?). I'm learning Linear Algebra currently, which is something I should have done years ago. Part of the problem with self-teaching is getting things out of order.
This has been my biggest realization as I started learning more math. What before seemed very arbitrary and unrelated becomes much more interesting and exciting once you have a bit of background. Unfortunately, I don't know of any way to get people to see the fun in math until they already know quite a lot of it... this was my experience at least, and seems to be pretty common among people who didn't gravitate towards math immediately.
> 4) Calculus and Linear Algebra are the father and mother of applied math.
> You'll save yourself a ton of grief if you learn them first
Baby Rudin and Axler are used currently by Harvard Math 55 to teach those subjects. Rudin might not be very didactic (I would be happy to hear about alternatives), but Axler is a fantastic choice.
If you liked Axler, you might check out Abbott's Understanding Analysis, also in the Springer UTM series. I think it covers somewhat less than Rudin (e.g. looking at baby Rudin's contents, I'm pretty sure Abbott doesn't touch Lebesgue integration) but it's a pretty great introductory analysis book IMO.
As a math graduate student, I second the choice for Abbott's "Understanding Calculus". It's a wonderful beginning book for analysis. Walter Rudin's "Principle's of Mathematical Analysis" is an amazing book but it's difficult to start with.
For a quick intro to Lebesgue integration you can read the beginning of Rudin's "Real and Complex Analysis" or Halsey Royden's "Real Analysis".
I haven't read Axler's book. I liked Hoffman and Kunze's "Linear Algebra"
Number theory. Set theory. Category theory. Combinatorics. Graph theory.
Linear algebra certainly has applications in some of the above. But I don't think that calculus & linear algebra can be fairly described as "father & mother" to these areas. (Am I wrong? I could be missing some connections; I'm not a mathematician.)
Not wrong - the poster above you probably means pure math in the analysis sense - real analysis, topology, functional analysis, algebraic topology. All of which are abstractions/generalizations (zoom out, if you will) from the real life world of 2 and 3 dimensional calculus/LA to N or infinitely many dimensions.
I probably should've thrown in combinatorics, which certainly existed before calculus or linear algebra, and certainly plays a role in applied math.
I would say graph theory is part of combinatorics, and set theory is part of logic.
Category theory was born out of trying to abstract the relationships between different objects in abstract algebra, so is kind of the child of abstract algebra and logic. I think it's fair to say the parents of abstract algebra are combinatorics and linear algebra.
Number theory at an elementary level is combinatorics, but at higher levels branches into analytic number theory (Calculus) and algebraic number theory ((Linear) Algebra).
I agree that getting things in the right order is important, but would argue that the order in which math is usually taken in the US is not the optimal one!
I recently took calc-1,2,3 and linear algebra through my local community college, and then started working my way through a wonderful book on mathematical proofs:(http://www.amazon.com/Mathematical-Proofs-Transition-Advance...), as preparation for working on higher level math. I would now argue that being able to understand and write proofs is a (the?) key mathematical skill to understanding what I would call 'real' (higher) math, and could be learnt by most students following high school algebra. My impression of the calculus series and linear algebra courses was an excessive focus on calculation, the math proof book was way more fun, surprising for a subject that is often thought to be too difficult for first year college students.
For those who are intimidated by the idea of a book on proofs (like I used to be), an example from the third chapter:
Theorem: Let x be an integer. Then x^2 is even if and only if x is even
It seems so simple, and I think would be accessible to anyone who had completed high school algebra but I found that even having done those calculus and linear algebra courses, I had now idea how to go about actually PROVING this! The book however, goes through the thought process step by step, and teaching the skills needed to be able to understand the real math books like Rudin.
I wish there were some sort of open-source prerequisite chain of what order to learn any subjects in. That's the hardest part of self-learning. Elon Musk had a reddit AMA recently where he was asked how he knows so much - he responded that he thought everyone had the capability of learning more than they thought, but that the key was to look at knowledge as a semantic tree. If you learn things in the wrong order, they won't have anything to hang off of.
It's fun because its incredibly rewarding! The elation of the "a-ha!" moment in math is second to none.
> 4) Calculus and Linear Algebra ...
Though I wouldn't get too caught up in the rigor of analysis or vector spaces right away. If you are self-studying, just spend enough time to feel confident computing and manipulating integrals, differentiation, and matrix math.
Then find a good intro to discrete math textbook covering a wide range of topics: number theory, graph theory, logic, set theory, etc, and learn how to write a "good" proof. This will open up a number of mathematical doors.
> The biggest misconception is that in Math there is one "correct" answer.
Well written...and I'd argue the same is for both Computer Science and software engineering in general. When teaching beginners, it still astonishes/annoys me how many students tell me, "My program didn't work"...as if there was just one reason why it didn't work, as opposed to hundreds of possible reasons.
Thanks for writing this. Over the last 4 years I switched from studying computer science with applications in mathematics, to studying math and symbolic logic with applications in computation. I did this alone, without interacting with anyone in the field. I thought I was going insane because of how many direct 'abstract' connections there are from computer science to mathematics and back again. I know these abstract connections exist as words in the world, but many times it feels like I have to go hunt for the word when I already have the idea.
I haven't really found any real world applications of the concepts I've learned, aside from having to hold a meticulously constructed symbolic reasoning world inside my head for a really long time without observational reality confirming it's correctness as a model to describe all things. This makes me pretty good at programming things that are incompletely described, I think, but also explains why Tarski said he was the only sane logician.
I never really hear about autodidacts talking about their experience. It can be really rough most of the time. I literally think it's just luck that I stumble across the right words. I also think it's luck when I manage to understand things and make a connection between them. I have managed to connect such disparate symbols together and maintain that connection strongly for long periods of time (with absolute conviction), that it all really seems like magic when it does work. But, giants, shoulders, yada yada.
> meticulously constructed symbolic reasoning world (...) connect such disparate symbols together and maintain that connection strongly for long periods of time
The construction and maintenance of my psychology using mathematics and symbolic logic to model, explain, extrapolate, analyze, and manipulate it.
I use computer science to explain psychology, in a way the makes the person being judged correct, instead of requiring their behavior to be altered based on personal opinion.
Imagine you have two conflicting sets of data from observation in your mind, and you have to process this data quickly. Taking an arbitrary and insufficient amount of data is selective and results in bias. Over time this results in contradiction even though both instances of inference are correct with regards to the logical model they rely on, and the data fed to the model. Now imagine that you received this data because over a short period of time, you have experience such a wide range of life experience that your observations allow you to collect both sets of data simultaneously and with correctness. Both data models model the world correctly, but when separated into distinct models of 'knowing things' instead of 'one confusing mass of data', you get contradiction.
So imagine someone endures trauma in their life, and has their mind molded in a specific way based on the current state of psychology, because over time the thoughts in the patients mind are shortly transformed to the thoughts in the therapists mind. Psychology did not experience the trauma, so how can psychology have an opinion on the consequences of bad things happening?
Making inferences adds to data and alters future data models and inferences. How people are judged while they are being 'helped' affects whether that help harms or helps them. I was in a group therapy for victims of domestic abuse and my "counselor" told me that she hated people like me.
I had a couple of things in mind. One was means. That you can solve a problem by restating another way, in a way that it's almost indistinguishable from the original. e.g. solving a problem in linear algebra that also solves a problem in graph theory. solving a group theoretic problem that gives you an answer in topology. solving a problem using category theory that gives you a combinatorial answer, using quaternion algebra to compute a rotation, etc.
The other thing is that in Math you are often dealing with the same question but with very different objects or variable types. The same question where your numbers could be real or complex, integers or finite fields, vector spaces or topological spaces, etc., change what the "correct" answer to the question might be.
While this is true, I've always found applying mathematical analyses such as algebraic reasoning to computation admits a single, minimal, canonical solution in the end.
> Part of the reason I began studying math, is that I felt it was my limiting factor. The range of problems I could tackle as a programmer was limited by math. It turns out this was partly true.
I started studying math intensely (doing every exercise in books, etc) when I realized the same thing: math was a limiting factor for my programming ability. Michael Abrash hints about this in some article, and I sneered at it until I realized it was true.
I considered going back to do a math degree but the amount of hassle involved, as well as other life changes required, made that impossible.
I would like to know how it worked out for you. Are you glad you did a degree program? Do you feel you met people and made connections that were valuable, that couldn't be made by an autodidact?
It was a big hassle and a big life change. But I've always had in the back of my mind that I wanted to do it and I'm glad I did. I put it off because the money I was making, and the places I was traveling, was too good to pass up at the time. So I saved money with the idea that I would get the chance to go to school.
I did try to learn math as an autodidact before I began the degree. The more abstract the math, the harder it was for me to self-study. It was inefficient at best. At worst, I'd hit a wall and not have anyone to reach out to.
I am guessing you went for a graduate degree in math. How hard was it to get admission? Would you like to recommend some good schools for doing something like you did. I am just a little younger but hungry for math knowledge.
Thanks for the reply. My solutions to the problem of not having anyone to reach out to have been to make friends with mathematicians, and to hire grad students as tutors.
I wish more people would scream this from the rooftops. There's that whole movement trying to get more people into programming like code.org and they all say "If you're good at math you'll love this". I feel like that's scaring away lots of people who would otherwise do just fine.
Examples, there's almost no math running Hacker News. There's no math in programming most blogs. There's no math in most apps. There's no math in most text editors. etc etc etc. Most programs don't need anything more than arithmetic.
I'm not saying math won't help with lots of problems. Like you said you found it limiting at some point. But you managed 16 years as a programmer without much math. I'm in a similar boat. I've shipped 17 commercial games, written 6 game engines, world on Chrome for 5 years. My math sucks. Would I be better if my math was better? Of course! But that I've been productive without much math knowledge shows, at least one data point, that you don't have to be good a math to program
I would have thought game engines would require a strong grounding in maths across a lot of their "moving parts"? Not being dismissive, just curious how you found working in that environment without strong maths skills.
Modern 3D game engines need math in the renderer, physics, maybe the AI but the majority of a game engine doesn't. Loading files, reading inputs, displaying UIs, the object system, scripting languages, most tools, font rendering, localization systems, game save system, networking system. Nowadays teams either buy middleware for the parts that need math or else they have specialists on the team for those things.
On top of that lots of game engines aren't 3D. 2D Mario? No serious math in there, at least not the SNES/NES ones. The 2D Zeldas? Even less. 2D Metroid? Probably less than Mario. Those games didn't use real maths for physics which is about the only place they could possibly use anything more than basic arithmetic.
> I feel like that's scaring away lots of people who would otherwise do just fine.
I am much in agreement with this. I know that the guidance counselor on staff when I was in high school would heavily steer people away from going into computer science/programming if they hadn't completed the entire catalog of math classes available at our school. Her assumption was that you needed to be some sort of math wizard in order to be successful in a CS or programming degree.
originally a die-hard math major and now, hacking and dealing with hackers, I have and to question the foundations of my own subjects. I have come to some tentative conclusions:
computer science is computer program, when you abstract away all context so it is just a bunch of symbols
statistics is mathematics applied to the "real world" data, and the art of turning it into form suitable for computer.
Actually, from Lao Tzu's "Art of War", he put's it this way:
In respect of military method,
firstly, Measurement;
secondly, Estimation of quantity;
thirdly, Calculation;
fourthly, Balancing of chances;
fifthly, Victory.
I don't mean to go off track here, but as someone who's been casually interested in math, I'm wondering which branches of math are the most applicable to software development. I've taken Discrete Mathematics, Stats, and Calc in college, but now I've been working in the field for a few years and want to try learning a bit more. I've been thinking of trying some courses on Cryptography, but it would be a major shift from my current background (web dev).
I feel like there's so many different directions to take, but which ones are the most applicable to practical Software Development? Particularly in the realm of Web Development?
Editing my question to ask what's the most applicable math subjects regarding the _PRACTICAL_ applications of software development, hopefully clears it up a bit.
I feel like that might be the wrong question. If you wanted to really study formal computer science you could learn things like model theory. If you want to study the analysis of algorithm run times you may want to study something like complex asymptotics. Do you want to study math for computer science or do you want to study math that helps in most applications of computer science (graph theory, linear algebra, etc etc).
Thanks for this. Edited the question a little to hopefully clarify things. I'm mostly going back to Coursera just out of pure curiousity, but was hoping I could take something that has some relevance to my career in Web Development (practical side, so more of your latter statement).
Sounds like Linear Algebra would be good to learn.
Computer science is pretty broad. What do you want to do? Just because I use linear algebra all the time for machine learning doesn't mean it will help you (that much) with computational complexity analysis.
Linear Algebra is definitely one you can make use of. When I studied it at uni I did it from a mathematical standpoint and only some years later discovered how useful it is in computing.
Have you done any study of Graph Theory? I've found that a surprisingly large number of problems in computing can be morphed into graphs. I was working on an issue last week (in a web app) that turned out to be a variant of Exact Cover which straight away gave me a large body of literature / algorithms to pull from - and told me I was in a slightly dark place :). Graphs and the algorithms around them feel very close to the work we do with computers, so it will probably be pretty approachable given your background.
My advice would be to not worry too much about how applicable it will be to web development and just pick something to study. Ultimately, it will end up being useful in time. And maths is just beautiful.
Probability, convex and nonlinear optimization, linear algebra, and statistics are clear wins in many problem spaces, especially machine learning, AI, and computer vision. Ordinary and partial differential equations and numerical methods are heavily used in process modeling and HPC for problems in science and engineering. Geometry, curvature, and matrix theory are heavily used in computer graphics to model shape and movement, as well as computer vision. Number and group theory are the basis of crypto, I believe. In general, calculus and its variations are used to represent and describe solution techniques theoretically before mapping them to discrete solutions using numerical methods.
What I understood after studying CS for over 10 years at a few universities regularly ranked highly at ACM ICPC is that math is unnecessarily obfuscated to most people. There is even an excellent book "Concrete Mathematics" from Stanford that tries to bring fun back to math instead of drying people with some formal stuff without explaining how people over the centuries got to that structure.
I honestly believe math language is seriously outdated. It's like using COBOL to express everything. Yes, you can do that, but would you really want to given a choice? The most trivial things are so insanely complicated in math it's unbelievable (try to describe geometrical objects with the current math formal language if you do computer vision), yet there is very little work on developing better formal language of math. It's like with Turing machines and the complexity theory - who is going to move around a tape in the real world besides some specialized biological systems, not mentioning magical 'oracles'? Those abstractions were useful in their day, brought their fruits, but why do we still stick to them and just increase the gulf between more and more closed-unto-itself-theory and reality? Yes, it's great some theory is super cool but what do we do when we find in 20-30 years that the set of objects satisfying this omnipotent theory is empty? And when somebody like Mochizuki invents their own formal language to solve some cool problem like ABC conjecture, we all hate him, refusing to read the proof because it doesn't follow our outdated formal ways...
I agree strongly that math is poorly taught most places and that Concrete Mathematics does an admirable job of teaching math in a way that gets to the beauty of it. Oddly enough, it wasn't until I threw myself into more advanced mathematics that I started to see the fun in it. I absolutely hated learning calculus and linear algebra even though I could do it well. It just seemed so boring. I don't have a good solution to how to make things better, however, the mathematician Paul Lockhart has given this a lot of thought.
All that said, I think there are a number of misconceptions here.
First, mathematicians invent new languages all the time. That's the point of definitions, otherwise we'd be using sets to describe everything. The problem is, you first have to understand the concept well in order to apply suitable definitions. Think probability before Kolmogorov.
Second, Turing machines are a formalism to introduce you to the theory of computation because they are the simplest (or close to it) thing that can compute in the current sense of the word. Once you learn how TMs work, pretty much everyone just accepts them as a given and deals at a higher level.
Third people are trying to read Mochizuki's proof, but it is very hard. He basically invented his own way of doing things and so to understand his proof you first need to understand his methods. It's understandable that professional mathematicians with their own careers and areas of research find it hard to read the ~1000 pages of dense mathematics (proof + prior papers) to understand what is going on. Most people probably haven't read 1000 pages of math in their life, and it takes a while to come to terms with it no matter how smart you are.
This is what drew me to CS over math. I enjoy describing things with code or pseudo code, not difficult to understand equations and math symbols. Also, it is much easier to see the practicality of an equation when presented in code form.
After I read SICP and HtDP I started retaking math I had forgotten but writing out the equations in Scheme to further grasp the language. At first doing Spivaks Calculus in this method took a long time but now I can write formulas and basic proofs just as fast in a programming language as I can with a pencil.
I skimmed SICM (Structural Interpretation Of Classical Mechanics) just to get an idea of how they represented Langrange equations in Scheme and went from there.
This is something I like doing. Something I keep meaning to do is take it further and write my proofs in a proof checking language, or at least write "unit tests" for my proofs with one (interleaved with the natural language proof with org-mode!), but they all seemed pretty unwieldy. Has anyone tried this with any success?
"Computer science" can mean many different things, but theoretical CS is largely considered a branch of mathematics. While there is some 'code', it has all of the same formalisms, equations and proofs. CS papers can be just as inaccessible as other types of math, if not more so.
For your analogy with Turing machines, do you have a better mathematical model of a computer? Nobody works directly with the TM model when they're doing theoretical CS anyway, they just describe the algorithm and everyone understands that if you really really wanted to you could work it down to a TM.
The same is true of mathematics. It might be hard to get everything precise, but that's not the point of mathematics. Nor is the point to be close to reality.
> All you have to do is demonstrate that TMs can be simulated in JavaScript, and that's fairly easy to do since TMs are so bare-bones.
Actually I think this is fairly non-trivial. Sure you could make a "compiler" that compiles a JavaScript interpreter down to a Turing machine, but you would almost certainly not understand the generated states and transitions.
A more elegant model of computation is the lambda calculus. It's also very bare-bones, but it's easy to imagine writing real programs in it. Functional programming languages, at their core, are just lambda calculi with some syntactic sugar.
It's practical, but it's also a good foundational model. It's easy to reason about, due in part to the fact that it models familiar math (partial functions).
There are far simpler models for formal verification than Turing machines, e.g. Smullyan's top-down tableaux method - you make a simple functional snippet and immediately verify it using mostly general induction and easy-to-understand verification steps that can be almost automated. Going all the way to the Turing level would kill you time-wise to get to anything useful (even preparing description of your JavaScript machine in Turing terms) - Turing machine has infinite time available, you don't.
Not to mention there are some issues with formal logic that might cause you problems (hint: why do medical doctors use counter-factuals and not mathematical logic?)
"Beware of bugs in the above code; I have only proved it correct, not tried it" -- Donald E. Knuth
I tried going through "Concrete Mathematics," but I could only do a handful of the problems in the first chapter after trying for a couple weeks. I'm not sure why it seems so hard to me -- I've taken a couple "higher math" courses and am generally considered "pretty good" at math. Perhaps I'm better at bullshit than math...
I didnt really learn math until I had to use it in my work.
For example my thesis worked used a lot of complex analysis and wave equations. I had had those in Physic and math calss, but really didnt obtain full understanding until using it.
I think maths is amazing. It's a useful tool to have in one's arsenal regardless of your profession or walk in life. It's also not the sole domain of the highly educated elite. Anyone can do it.
It's not important to be "correct" all of the time so much as it is to be curious and willing to learn -- and willing to share.
Keep at it! There's so many cool things you can do as you learn more!
"On Numbers and Games" is a great book but it can be tough. "Winning Ways for your Mathematical Plays" by Berlekamp, Conway & Guy is a gentler introduction to surreal number. It's also very fun.
I've been doing project Euler problems and I realise it really really helps to know Number Theory to get to an optimal solution for problems. Can anyone recommend good books on the subject? While learning via problem-solving is fun, most of the time it boils down to me sitting with a naive, brute-force solution that's too slow and then google how to make it fast, discover a new number theory axiom/tool and then changing the algorithm. There's gotta be a better way to learn...
I lost interest in mathematics starting in tenth grade. Looking back into the haze, it wasn't so much mathematics as high school in general and by extension industrialized education. Boredom begat indifference. Chaos reoriented priorities across starts and fits with mathematics in post-secondary education.
I enrolled in Coursera's Discreet Optimization about a year ago. It was way beyond my ability [No SoA], but I learned a hell of a lot about computing and solving hard computational problems. It also suggested that mathematics might be important when grappling interesting problems.
For fun I watched a number of Strang's Open-Courseware videos on matrices. I hit Chapter 1 of TAoCP. I treated it like programming - it was ok to only partially understand. I took an Algorithms MOOC or two. I actually enjoyed following the analysis even formal analysis is not something I would do for pleasure.
The turning point though was when Lamport's "Thinking for Programmers" [Lamport: Thinking] hit HN. It threw down the gauntlet. Specification is a prerequisite for a commitment to getting it right, where the it is computing. And when the it is computing, we are talking about math whether we like it or not.
It's not that the math and specification replaces testing. It's that tests are ad hoc without a mathematical understanding of the computation.
It's not a misuse of vocabulary, it's a misspelling. As my typing speed trends toward my thinking speed, the mechanical action becomes more tied to phonemes. I've found myself increasingly typing "are" for "our" which is fairly classic. "One" for "won" not so much.
226 comments
[ 5.3 ms ] story [ 207 ms ] threadNot really. Mostly just algorithms and procedures of some math concepts(Calculus and Linear Algebra) which roughly corresponds to the first year of North American math major.
In contrast, I know engineers who live and breathe PDEs and tweak compilers to solve them faster.
I doubt my CS professors would be able to solve a PDE..
Beyond the basics, not even many math professors can do that. Math is too vast and people specialize. Strong algebraic geometers are not necessarily strong analysts or algebraists or logicians.
1) No such thing as universal mathematician in this day and age.
2) Engineer's PDEs(algorithms) are not the same as mathematician's PDEs(theory). Same as comparing a student in China who learned English to communicate with English speakers to English majors from English speaking countries.
So yes, if you take a Computer Science major with a focus on Software Engineering, you will not learn enough math to minor in math "for free". If you pick a more mathematical subfield to focus on, you should probably declare a math minor for the one or two additional courses it will take you.
I made a truly stupid choice: I graduated in 7 semesters with a Comp Sci degree concentrated on PL theory without picking up the additional courses for a math minor. As a result, I'm "condemned" to learn that material independently later on. "Luckily", the Technion required me to do extra coursework for my MSc, so I've had to buck up and learn more theory.
Now get off my lawn until I'm done with my highly theoretical machine learning exam ;-)!
If you want to do good at machine learning...electrical engineering is probably a better choice; the maths learned in EE overlap fairly well with what is needed to do ML. PL theory is quite niche, even for PL researchers.
Besides, I never heard of math majors taking cryptography that early. Usually, Intro to Real Analysis, Abstract Algebra and Abstract Linear Algebra come first.
The thing I have needed all the time is statistics and prob. theory, that keeps coming up literally everywhere. Calculus - not so much. If you need something, you can always re-learn it quickly. (For example, I learned quite a lot of linear algebra, but haven't used it for ~10 years, so when I had to write some 3D gfx/shader code, I had to spend like two days on quaternions, etc.)
Done
It really annoys me that I spent 4 years studying this to find that other people who scrape together snippets of JavaScript & PHP feel entitled to call themselves an "engineer".
I applaud the effort to learn the topics of "statistics, probability, and linear algebra", but these would have been relatively fundamental courses in most software/computer/electrical engineering curricula that I've known about, and most definitely a prerequisite to calling oneself an engineer.
Don't go near any dark alleys.
But my years of engineering experience have shown me that the title "Engineer" is really more about how you approach problems and what you do to solve them and less about degree credentials. Now, the following example is in the context of electrical engineering on airplanes, not computer programming, but I think it holds true.
One of the best people I work with does not have a college degree. But over years of self-study and real world experience, he has taught himself electronics, some computer programming, and enough mathematics to get by. And when there is a technical problem to be solved on one of our airplanes, he will chase after it relentlessly, and smartly, until it is solved. His system designs are clean and well thought through. He has taught me much about designing for real world implementation. Is he not an engineer? He does more than many of my coworkers who are degree holding EEs. I am not afraid to call him an engineer, because he has earned the title in a different way.
However, I still think it's wrong for people who don't exhibit these qualities to call themselves an engineer. If you make sick beats on your macbook, that's great. But don't call yourself a beat mix engineer.
Edit: Thought of some reasons It's similar to the "doctor" title. You can be the worlds greatest doctor. Self-taught, you can do everything from intubation to surgery. However, you're still not a doctor. You practice medicine. Why? There's things that you can only learn from someone who is more skilled than you, and who is skilled at teaching. That's what a professor is (simple definition). They are an authority on their topic and are the best place to learn from. They teach things that books don't cover. They have experience. They can tell you when you're wrong, and unlike a book can teach you the most current standards and techniques.
Another point is the completeness of education. Your coworker, does he know vector calculus? Linear algebra? The forward-active voltage for a BJT? Maybe. But there's no guarantee he does. A degree from a certified university guarantees that you know the salient points of your field (not always true, but for my argument it is). If you don't have a degree, there's no guarantee. And this knowledge is important.
I agree with you, for the purposes of your argument, that degree should serve as a guarantee. It is an important signifier of mastered domain knowledge, and more importantly, a signifier of the ability to master new domains.
EDIT: That last sentence was a run-on, fixed it.
And as for experience, well, in the case of a CS student wishing to enter industry there's a good chance that the majority of your professors never even worked in industry. So if you're looking for people with experience to learn from, well, then you're in quite an unfortunate situation.
This led me to conclude that a degree offers no such guarantee that someone knows something. It offers a guarantee that someone was introduced to a number of concepts and demonstrated an understanding (or knack for cheating, cramming, what have you) good enough to pass and move forward. This is why I shudder at the thought of hiring old classmates who had to be hand-held through their 4 (or more) years of university, I know better despite what their degree might say.
Which is why that people who earned a degree...earned a degree, that's it. As far as I can tell they have no right to call themselves an engineer until they begin to practice engineering and practice it well enough to demonstrate the value of their thinking.
But the best professors I've had (and I've had a bunch) were the ones that really did combine both. (And frankly, I can forgive a lot of poor teaching in return for a "well, this is technically true, but no one really does it that way; they use this shortcut...."
As for a university education not providing immediately applicable industrial experience, well, that's kinda not the point of it. Sort of the difference between passing the FE exam and being a PE.
If he's as good, and as experienced as you say, he should be able to just do the legal/ethics stuff and get a license. Unfortunately, the professional associations are streamlined for people who take the usual path through university. At least in my jurisdiction, it is technically possible to have the experience counted, rather than the degree, but it's much harder.
The system is clearly not perfect, but when you ask the average engineer whether it's ok to do things like lie about their experience, you will get very different answers than if you asked the general public. The gatekeeper is doing a real job, even if they don't do it perfectly.
So basically, don't call yourself an engineer unless you're willing to sign off on something, and be legally bound by it. This implies a strong background in problem solving and structured design processes, to remove as much risk (both personal and to the public) as possible, which is also vital to engineering.
>So basically, don't call yourself an engineer unless you're willing to sign off on something, and be legally bound by it.
I'm sorry to say it (not really); but for a number of reasons, some good and some bad, the title has been co-opted, and there is no going back.
>This implies a strong background in problem solving and structured design processes
As far as that goes, I've met a number of pedigreed folks who can't engineer their way out of a wet paper bag.
To some extent this happens in Australia as well, although there is a movement both to require things to be signed off by a PE (or CPEng here), and to have those engineers provide documented supervision of the work they sign off on.
> As far as that goes, I've met a number of pedigreed folks who can't engineer their way out of a wet paper bag.
No argument there, certification is never proof positive of competence. I've met very good engineers who aren't Engineers with a capital E, and very bad Engineers who knew enough to fool a test board, but not much more.
The existence of these licensing schemes is far from perfect, but better than nothing IMO. Applying the concept to general purpose software is another discussion entirely!
Definitely semantics. For example, I have a BS/MS in applied math from a good engineering school university. I am a software engineer mainly working with ECEs, physics, and other math guys, who are all "software engineers".
I see where you're coming from about being a SW eng without knowing a lot of math - but there are other majors - math/physics/stats etc that will be very math heavy and not "engineering degrees".
>When you get an engineering degree from a certified university, you are an engineer.
That's not true. When you get a degree you have an engineering degree. When you get hired and employed as an engineer, you are an engineer. You have an engineering degree and I have a mathematics degree. Our employers hire people for engineer positions and call them such. If I were a professor of math, i could call myself a professor. If I were a mathematician at the NSA, a Mathematician. But my employer calls me an Engineer. The degree does not do that.
And I'm not merely referring to software. The above is true for my companies 20+ different engineering positions across all disciplines they hire for (Aerospace, mechanical, electrical, materials, software, etc).
Lived and breathed math for 5 years in college before I could look myself in the mirror and call myself an software engineer.
A filter / weedout system was required because of too many students, so its turned into something else entirely and now a engineering degree often means nothing other than having passed the weedout math classes. It really shows in some new grads that don't have any actual engineering skills but are really good at calc problems.
Being an engineer means using technology, science, mathematics to solve problems. Well in many cases you don't need math to solve these problems. The word itself as no root in math either, it's based on latin for devise/contrive, sure it was used for builders at first, where math was important, but context changes.
Also Software Engineer is wide and reaching, a 3D GFX Software Engineer will need some heavy mathematics to do his job and do it well, a Web Software Engineer not much, but he'll need to know a wide range of other knowledge GFX guy doesn't know (HTTP, network protocols, various languages, server technology, database technology, browser knowledge,...).
It's not about being good at mathematics, it's about knowing as much as possible about the domain of knowledge your role entails, and surprise, not every one of these requires deep math knowledge and understanding.
Your attitude is pure and simple elitism.
That's called practicing engineering. An engineer is a professional practitioner of engineer. You can practice engineering all you want, but if you're not a professional (having received an engineering degree from a certified university), it's dishonest to call yourself one. Honestly, it is elitist. But those of us who obtained our degrees worked our asses off. And I personally hate when people abuse the term to mean anything that took skill. "Candy cane engineer". "Beats engineer". "Drink mixing engineer". It's linguistic prescription to make yourself sound more important/skilled.
The other reason, of course, is that the "software engineer" term comes from a group of people who really wanted the respect that comes with "engineer" but realized that the big three don't get very far, software-wise. (And coincidentally didn't want to do all that icky math stuff. Not to mention much of the icky programming stuff.)
I'm at the very start of what I hope might be a similar journey, and have signed-up for a Coursera "Introduction to Mathematical Thinking" course. I'm hoping it might give me some insight to build on. The course starts in about ten days, so apprehension hasn't kicked-in yet.
[1] https://news.ycombinator.com/item?id=8697772
[2] https://www.coursera.org/course/maththink
Mathematical Proofs: A Transition to Advanced Mathematics by Chartrand and others.
How to Prove It: A Structured Approach by Velleman.
Learning to Reason: An Introduction to Logic, Sets, and Relations by Nancy Rodgers.
Elementary Discrete Math books make for great intro to proofs and math thought:
Discrete Mathematics with Applications by Epp.
Mathematics: A Discrete Introduction by Scheinerman.
There are tons of terrific introductory books on other subjects in math if anyone's interested.
(And first recommendation by Cosma Shalizi: http://vserver1.cscs.lsa.umich.edu/~crshalizi/notabene/infor...)
[1] https://class.coursera.org/learning-003
The question invalidates anything he has to say on the subject and makes me question his claim of being a software engineer. No self-respecting person in that position would ever need to ask that question or write an article about it. Nor is it worth wasting anyone's time to read past the first paragraph.
Really glad to see I'm not the only one.
I don't have any recommendations for linear algebra, but for stats and probability (which I always found intimidating in the past), Allen Downey's "Think Stats" and "Think Bayes" did the trick.
For programmers with less math experience it serves as a perfect transition with which to then go into more theoretical aspects of LA.
He says: "Don't try to read it all. It's a map... It's there to help you keep track of where you are and where we're going." Every professor should do that for their course. And every department should put up a big poster with something similar: these are the subject areas you will study, how they relate to each other, and the courses that cover those areas; if you choose this specialization these are the areas you'll focus on. Put-out a mind-map of the subject area that relates to the available courses—help students start building Elon Musks' mental-hyperloop / semantic-tree.
†: http://picpaste.com/Screen_Shot_2015-02-05_at_1.58.47_AM-AnX... available on the course website: http://cs.brown.edu/courses/cs053/current/graphical-outline.... ††: https://www.reddit.com/r/IAmA/comments/2rgsan/i_am_elon_musk...
The lectures are quite clear and easy to follow. I did do all this math at university, but that was over 20 years ago, so I had forgotten a lot, so for me this course is perfect. But I think it can be quite useful even if the concepts a re new to you.
[1] https://www.coursera.org/course/mathematicalmethods
Edit: Calling it a mini-TAOCP of most of the maths needed for physics/EE work might be a bit of a stretch, but I've yet to see another maths text that does better as a highly readable, self-contained and compact reference.
Edit2: I moved house once and thought I'd lost my copy from university. I eventually found it, and yes, I have two copies... It's that important to me for brushing off the things I've forgotten :)
[1] http://www.amazon.com/Mathematical-Methods-Physical-Sciences...
The book has many worked examples, and the extensive end-of-section questions have the answers in the back of the book (for every 2nd question). This means you can learn by "reading then doing", and see if you have got the answers right - something many textbooks lack.
When I try to learn from other technical books, I often find myself thinking "I wish they'd written this in the same style as Boas".
It got me wondering...suppose there were a website for autodidacts in math and similar topics? Something where people could post and discuss their answers to exercises. It'd solve the whole problem.
Would textbook publishers sue?
Or they could just trust the students. At my university the honor code such a big deal that they let students take closed-book tests at home.
Maybe DennisP's idea could do the same thing - only post answers to the odd-numbered questions. Of course, DennisP's scheme would only work for books that actually have decent end-of-section questions, unless people made up extra questions as well ...
* I say much rather than most or all since it's focused on asymptotics, recurrences, number theory. Modern theoretical Computer Science draws on a much wider variety of mathematical methods.
One of the masterpieces that has gone the opposite direction is:
Mathematics: Its Content, Methods and Meaning (three volumes bound as one) by A. D. Aleksandrov, A. N. Kolmogorov, M. A. Lavrent'ev (18 authors total) http://www.amazon.com/Mathematics-Content-Methods-Meaning-Do...
This book is really good companion for autodidacts. It's basically overview of mathematics.
How do you know that?
An UNESCO study of translations between Swedish, Chinese, Hindi, Arabic, French, German and English over a decade showed that 104,000 of the 132,000 translations made between all those languages were translations from English.
[1] http://www.amazon.com/That-Fish-Your-Ear-Translation/dp/0865...
Yeah, no. Usually good books get translated, period.
From Homer and the Bible to Pascal, Leibiz, Dostoyevsky, Godel and Einstein, good books fly the other way around all the time.
Great books certainly get translated in every direction. But for merely good books, I wouldn't be surprised if readers outside the US consumed more books translated from English than readers in the US consume books translated from other languages.
Considering that the average reader reads more in Europe than in the US and that there is a very dynamic domestic industry in many of these countries, I would say the opposite.
And I didn't even take India and China into account...
source: http://www.prnewswire.com/news-releases/nop-world-culture-sc...
I don't think so for the simple reason that academic books in English usually aren't translated because people in countries outside of the US can read English. Even academic books that do not have any native English speaking authors are usually written in English. Books are more likely to be translated to English than from English, because translating to English multiplies the size of the audience many times, whereas the other way around does not.
There are some great textbooks translated from Russian. Analysis by Kolmogorov, (rigorous) Linear Algebra by Shilov, Complex Analysis by Markushevich to name a few.
The book covers too much to be thorough. Each chapter gives good introduction to the subject matter and ends with list of suggested reading.
I always read the relevant parts from this book before going deeper. Not everyone is going to dwell into non-euclidean geometry, functional analysis and topology.
Furthermore, I don't think typical self studying engineer in Hacker News wants to learn math using rigorous introduction to analysis. You can get good working knowledge and intuition without knowing what delta epsilon is.
How to Think About Analysis by Lara Alcock.
Understanding Analysis by Stephen Abbot.
Mathematical Analysis and Proof by David Stirling.
Numbers and Functions: Steps into Analysis by Burn.
Analysis: With an Introduction to Proof by Steven Lay.
A First Course in Mathematical Analysis by David Brannan.
I need that person to say: "I don't understand it". Even if I don't understand it myself, as I try explaining it to my study partner, it starts clicking in my brain. I suddenly start to understand these parts as I'm explaining it. Hands down the best way for me to learn: explain to others.
http://en.wikipedia.org/wiki/Rubber_duck_debugging
At least on my home country, a Software Engineer job title implies a CS degree with at least two years full of math.
And, "validated university degress" or not, I doubt a fizz buzz interview would have much different results in your country as opposed to the US:
http://blog.codinghorror.com/why-cant-programmers-program/
If you required prior knowledge of Fizz Buzz to solve it successfully, you should absolutely never be hired to program anything.
Companies choose employees, but employees can also chose companies which can recognize the value someone brings in, besides a few programming exercises on a sheet of paper done in 1 hour interview.
As for Fizz Buzz, never bother coding it. I see no value.
I've never personally had a FizzBuzz test, but I also have no doubts about my ability to solve it in my sleep.
I'm against trick interviews or algorithms quizzes, but FizzBuzz is again just establishing a ridiculously low baseline that you know the most essential aspects of programming. Someone a few weeks into CS 101 should be able to do it, so any professional developer who can't deserves to be immediately laughed out of the room.
FizzBuzz is only a "dummy test" in the sense that only dummies will fail it.
But besides that, I see a deeper motivation in the article. The author says
"My dream is to learn the statistics, probability, and linear algebra needed to really understand machine learning and computer vision...I need a solid foundation so that I can truly understand what's going on: why something works, when it won’t work, and what to do differently if it doesn’t."
I contend that even many who have formally studied CS and math probably don't truly understand these math tools, that is, if they are using them in the first place. Intuition in math takes time to build up, and requires considerable mental effort.
By analogy a business school IT degree is two years of cs plus a bunch of biz classes instead of compilers and automata theory (it varies, huge simplification, etc) However, its possible to study CS at higher levels for immensely longer than the two years an IT grad will get.
Now with Bologna reducing the degrees to 3 years, the title requires 3 years Bologna + 2 years master as workaround to keep the old 5 years.
[1] https://news.ycombinator.com/item?id=8980546
I started a Math degree after 16 years of programming without any Math beyond high school (the highest being high school calculus). Most of my work as a software developer didn't require any "higher" Maths.
Once I began studying math, including Modern Algebra, Analysis, Graph Theory, Category Theory, etc., I realized I understood many topics on an informal level, in a non-rigorous sort of way, through programming. I had a good sense of major algorithms and data structures as well as their running times. Once I did have more math under my belt, things did become easier, and I started to see connections and commonality between problems across different domains, i.e. more than one way to skin a cat.
Part of the reason I began studying math, is that I felt it was my limiting factor. The range of problems I could tackle as a programmer was limited by math. It turns out this was partly true.
The biggest misconception is that in Math there is one "correct" answer. This is almost never the case. Some of the most interesting solutions in Computer Science come directly from Math topics that were once considered "abstract". Likewise, some of the most interesting problems are solved through approximation algorithms of seemingly intractable problems, often requiring a bit of "hacking" and real world experience beyond what you'd get from a formal education in Math or Computer Science.
[1] https://news.ycombinator.com/item?id=7104566
Would you mind expanding on this? I've often thought about going back to school for a math degree, or at least for the core degree courses.
Did functional programming, particularly in a pure language like Haskell, become easier to reason about once you had studied Category Theory in depth?
Some things I'd add:
1) Math is fun! If you have the aptitude and disposition to enjoy writing software you'll love working out math problems. They're little nuggets of mental stimulation that you can work on with just some paper, a pencil, and maybe a pocket calculator.
2) You're spot on about an experienced programmer already having an intuitive but non-rigorous understanding of many concepts. It's mostly a matter of learning to read and write comfortably using the notation, which is really similar to learning the syntax and semantics of a big computer language with poor reference material.
3) You really have to have basic math down. This means going and re-learning stuff like applying FOIL to a binomial or dividing by a reciprocal.
4) Calculus and Linear Algebra are the father and mother of applied math. You'll save yourself a ton of grief if you learn them first (and I mean really learn them, maybe you took a calculus class in college but can you apply the Chain rule right now?). I'm learning Linear Algebra currently, which is something I should have done years ago. Part of the problem with self-teaching is getting things out of order.
This has been my biggest realization as I started learning more math. What before seemed very arbitrary and unrelated becomes much more interesting and exciting once you have a bit of background. Unfortunately, I don't know of any way to get people to see the fun in math until they already know quite a lot of it... this was my experience at least, and seems to be pretty common among people who didn't gravitate towards math immediately.
> You'll save yourself a ton of grief if you learn them first
Baby Rudin and Axler are used currently by Harvard Math 55 to teach those subjects. Rudin might not be very didactic (I would be happy to hear about alternatives), but Axler is a fantastic choice.
For a quick intro to Lebesgue integration you can read the beginning of Rudin's "Real and Complex Analysis" or Halsey Royden's "Real Analysis".
I haven't read Axler's book. I liked Hoffman and Kunze's "Linear Algebra"
Even more than the chain rule, Taylor series approximations are what I constantly see applied in computer science and applied math.
Linear algebra certainly has applications in some of the above. But I don't think that calculus & linear algebra can be fairly described as "father & mother" to these areas. (Am I wrong? I could be missing some connections; I'm not a mathematician.)
I would say graph theory is part of combinatorics, and set theory is part of logic.
Category theory was born out of trying to abstract the relationships between different objects in abstract algebra, so is kind of the child of abstract algebra and logic. I think it's fair to say the parents of abstract algebra are combinatorics and linear algebra.
Number theory at an elementary level is combinatorics, but at higher levels branches into analytic number theory (Calculus) and algebraic number theory ((Linear) Algebra).
Theorem: Let x be an integer. Then x^2 is even if and only if x is even
It seems so simple, and I think would be accessible to anyone who had completed high school algebra but I found that even having done those calculus and linear algebra courses, I had now idea how to go about actually PROVING this! The book however, goes through the thought process step by step, and teaching the skills needed to be able to understand the real math books like Rudin.
It's fun because its incredibly rewarding! The elation of the "a-ha!" moment in math is second to none.
> 4) Calculus and Linear Algebra ...
Though I wouldn't get too caught up in the rigor of analysis or vector spaces right away. If you are self-studying, just spend enough time to feel confident computing and manipulating integrals, differentiation, and matrix math.
Then find a good intro to discrete math textbook covering a wide range of topics: number theory, graph theory, logic, set theory, etc, and learn how to write a "good" proof. This will open up a number of mathematical doors.
Well written...and I'd argue the same is for both Computer Science and software engineering in general. When teaching beginners, it still astonishes/annoys me how many students tell me, "My program didn't work"...as if there was just one reason why it didn't work, as opposed to hundreds of possible reasons.
I haven't really found any real world applications of the concepts I've learned, aside from having to hold a meticulously constructed symbolic reasoning world inside my head for a really long time without observational reality confirming it's correctness as a model to describe all things. This makes me pretty good at programming things that are incompletely described, I think, but also explains why Tarski said he was the only sane logician.
I never really hear about autodidacts talking about their experience. It can be really rough most of the time. I literally think it's just luck that I stumble across the right words. I also think it's luck when I manage to understand things and make a connection between them. I have managed to connect such disparate symbols together and maintain that connection strongly for long periods of time (with absolute conviction), that it all really seems like magic when it does work. But, giants, shoulders, yada yada.
Out of curiosity, could you give an example?
I use computer science to explain psychology, in a way the makes the person being judged correct, instead of requiring their behavior to be altered based on personal opinion.
Imagine you have two conflicting sets of data from observation in your mind, and you have to process this data quickly. Taking an arbitrary and insufficient amount of data is selective and results in bias. Over time this results in contradiction even though both instances of inference are correct with regards to the logical model they rely on, and the data fed to the model. Now imagine that you received this data because over a short period of time, you have experience such a wide range of life experience that your observations allow you to collect both sets of data simultaneously and with correctness. Both data models model the world correctly, but when separated into distinct models of 'knowing things' instead of 'one confusing mass of data', you get contradiction.
So imagine someone endures trauma in their life, and has their mind molded in a specific way based on the current state of psychology, because over time the thoughts in the patients mind are shortly transformed to the thoughts in the therapists mind. Psychology did not experience the trauma, so how can psychology have an opinion on the consequences of bad things happening?
Making inferences adds to data and alters future data models and inferences. How people are judged while they are being 'helped' affects whether that help harms or helps them. I was in a group therapy for victims of domestic abuse and my "counselor" told me that she hated people like me.
The other thing is that in Math you are often dealing with the same question but with very different objects or variable types. The same question where your numbers could be real or complex, integers or finite fields, vector spaces or topological spaces, etc., change what the "correct" answer to the question might be.
While this is true, I've always found applying mathematical analyses such as algebraic reasoning to computation admits a single, minimal, canonical solution in the end.
I started studying math intensely (doing every exercise in books, etc) when I realized the same thing: math was a limiting factor for my programming ability. Michael Abrash hints about this in some article, and I sneered at it until I realized it was true.
I considered going back to do a math degree but the amount of hassle involved, as well as other life changes required, made that impossible.
I would like to know how it worked out for you. Are you glad you did a degree program? Do you feel you met people and made connections that were valuable, that couldn't be made by an autodidact?
I did try to learn math as an autodidact before I began the degree. The more abstract the math, the harder it was for me to self-study. It was inefficient at best. At worst, I'd hit a wall and not have anyone to reach out to.
Examples, there's almost no math running Hacker News. There's no math in programming most blogs. There's no math in most apps. There's no math in most text editors. etc etc etc. Most programs don't need anything more than arithmetic.
I'm not saying math won't help with lots of problems. Like you said you found it limiting at some point. But you managed 16 years as a programmer without much math. I'm in a similar boat. I've shipped 17 commercial games, written 6 game engines, world on Chrome for 5 years. My math sucks. Would I be better if my math was better? Of course! But that I've been productive without much math knowledge shows, at least one data point, that you don't have to be good a math to program
On top of that lots of game engines aren't 3D. 2D Mario? No serious math in there, at least not the SNES/NES ones. The 2D Zeldas? Even less. 2D Metroid? Probably less than Mario. Those games didn't use real maths for physics which is about the only place they could possibly use anything more than basic arithmetic.
I am much in agreement with this. I know that the guidance counselor on staff when I was in high school would heavily steer people away from going into computer science/programming if they hadn't completed the entire catalog of math classes available at our school. Her assumption was that you needed to be some sort of math wizard in order to be successful in a CS or programming degree.
computer science is computer program, when you abstract away all context so it is just a bunch of symbols
statistics is mathematics applied to the "real world" data, and the art of turning it into form suitable for computer.
Actually, from Lao Tzu's "Art of War", he put's it this way:
a solid 2000 years before the computer.I feel like there's so many different directions to take, but which ones are the most applicable to practical Software Development? Particularly in the realm of Web Development?
Editing my question to ask what's the most applicable math subjects regarding the _PRACTICAL_ applications of software development, hopefully clears it up a bit.
Sounds like Linear Algebra would be good to learn.
Have you done any study of Graph Theory? I've found that a surprisingly large number of problems in computing can be morphed into graphs. I was working on an issue last week (in a web app) that turned out to be a variant of Exact Cover which straight away gave me a large body of literature / algorithms to pull from - and told me I was in a slightly dark place :). Graphs and the algorithms around them feel very close to the work we do with computers, so it will probably be pretty approachable given your background.
My advice would be to not worry too much about how applicable it will be to web development and just pick something to study. Ultimately, it will end up being useful in time. And maths is just beautiful.
You might get something interesting out of learning category theory and Haskell.
I honestly believe math language is seriously outdated. It's like using COBOL to express everything. Yes, you can do that, but would you really want to given a choice? The most trivial things are so insanely complicated in math it's unbelievable (try to describe geometrical objects with the current math formal language if you do computer vision), yet there is very little work on developing better formal language of math. It's like with Turing machines and the complexity theory - who is going to move around a tape in the real world besides some specialized biological systems, not mentioning magical 'oracles'? Those abstractions were useful in their day, brought their fruits, but why do we still stick to them and just increase the gulf between more and more closed-unto-itself-theory and reality? Yes, it's great some theory is super cool but what do we do when we find in 20-30 years that the set of objects satisfying this omnipotent theory is empty? And when somebody like Mochizuki invents their own formal language to solve some cool problem like ABC conjecture, we all hate him, refusing to read the proof because it doesn't follow our outdated formal ways...
All that said, I think there are a number of misconceptions here.
First, mathematicians invent new languages all the time. That's the point of definitions, otherwise we'd be using sets to describe everything. The problem is, you first have to understand the concept well in order to apply suitable definitions. Think probability before Kolmogorov.
Second, Turing machines are a formalism to introduce you to the theory of computation because they are the simplest (or close to it) thing that can compute in the current sense of the word. Once you learn how TMs work, pretty much everyone just accepts them as a given and deals at a higher level.
Third people are trying to read Mochizuki's proof, but it is very hard. He basically invented his own way of doing things and so to understand his proof you first need to understand his methods. It's understandable that professional mathematicians with their own careers and areas of research find it hard to read the ~1000 pages of dense mathematics (proof + prior papers) to understand what is going on. Most people probably haven't read 1000 pages of math in their life, and it takes a while to come to terms with it no matter how smart you are.
I skimmed SICM (Structural Interpretation Of Classical Mechanics) just to get an idea of how they represented Langrange equations in Scheme and went from there.
The same is true of mathematics. It might be hard to get everything precise, but that's not the point of mathematics. Nor is the point to be close to reality.
I thought it was just an advertisement for Computer Concrete Roman (Knuth's other font family) and the Zapf(?) Euler math fonts.
^ Yes, that Ron Graham.
^^ Yes, that Don Knuth.
^^^ I don't recognize Patashnik. Sorry.
[1] http://www.amazon.com/Concrete-Mathematics-Foundation-Comput...
Actually I think this is fairly non-trivial. Sure you could make a "compiler" that compiles a JavaScript interpreter down to a Turing machine, but you would almost certainly not understand the generated states and transitions.
A more elegant model of computation is the lambda calculus. It's also very bare-bones, but it's easy to imagine writing real programs in it. Functional programming languages, at their core, are just lambda calculi with some syntactic sugar.
It's practical, but it's also a good foundational model. It's easy to reason about, due in part to the fact that it models familiar math (partial functions).
There are far simpler models for formal verification than Turing machines, e.g. Smullyan's top-down tableaux method - you make a simple functional snippet and immediately verify it using mostly general induction and easy-to-understand verification steps that can be almost automated. Going all the way to the Turing level would kill you time-wise to get to anything useful (even preparing description of your JavaScript machine in Turing terms) - Turing machine has infinite time available, you don't.
Not to mention there are some issues with formal logic that might cause you problems (hint: why do medical doctors use counter-factuals and not mathematical logic?)
"Beware of bugs in the above code; I have only proved it correct, not tried it" -- Donald E. Knuth
I'd add a few of books to your list:
Graph Theory by W. T. Tufte: http://www.chapters.indigo.ca/en-ca/books/product/9780521794...
On Numbers and Games by John H. Conway: http://www.amazon.com/On-Numbers-Games-John-Conway/dp/156881...
And for good re-introduction to geometry and it's practical application to computer graphics: http://www.amazon.com/Primer-Graphics-Development-Wordware-L...
I think maths is amazing. It's a useful tool to have in one's arsenal regardless of your profession or walk in life. It's also not the sole domain of the highly educated elite. Anyone can do it.
It's not important to be "correct" all of the time so much as it is to be curious and willing to learn -- and willing to share.
Keep at it! There's so many cool things you can do as you learn more!
The author for Graph Theory is W. T. Tutte, not Tufte, and much appreciate the link which helped clear up my initial confusion.
http://ocw.mit.edu/courses/mathematics/18-781-theory-of-numb...
I enrolled in Coursera's Discreet Optimization about a year ago. It was way beyond my ability [No SoA], but I learned a hell of a lot about computing and solving hard computational problems. It also suggested that mathematics might be important when grappling interesting problems.
For fun I watched a number of Strang's Open-Courseware videos on matrices. I hit Chapter 1 of TAoCP. I treated it like programming - it was ok to only partially understand. I took an Algorithms MOOC or two. I actually enjoyed following the analysis even formal analysis is not something I would do for pleasure.
The turning point though was when Lamport's "Thinking for Programmers" [Lamport: Thinking] hit HN. It threw down the gauntlet. Specification is a prerequisite for a commitment to getting it right, where the it is computing. And when the it is computing, we are talking about math whether we like it or not.
It's not that the math and specification replaces testing. It's that tests are ad hoc without a mathematical understanding of the computation.
[Lamport: Thinking] http://channel9.msdn.com/Events/Build/2014/3-642