程序员怎样学数学

http://kb.cnblogs.com/page/90166/html

 

 

英文原文:Math For Programmers程序员

I've been working for the past 15 months on repairing my rusty math skills, ever since I read a biography of Johnny von Neumann. I've read a huge stack of math books, and I have an even bigger stack of unread math books. And it's starting to come together. 算法

自从我读了Johnny von Neumann的传记,我已经为弥补我糟糕的数学技能花了15个月了。读了大量的数学书籍,不过呢,彷佛我还有更多没有读,固然我会接着作的。编程

Let me tell you about it. 
如今我就来告诉你这些。
Conventional Wisdom Doesn't Add Up 
告别传统观念
First: programmers don't think they need to know math. I hear that so often; I hardly know anyone who disagrees. Even programmers who were math majors tell me they don't really use math all that much! They say it's better to know about design patterns, object-oriented methodologies, software tools, interface design, stuff like that. 设计模式

首先: 程序员不认为他们须要了解数学。我经常听到这样的话。我不知道还有没有不一样意的,甚至于之前是主修数学的程序员也告诉我,他们真的不是经常使用到数学!他们说更重要的是要去了解设计模式,面向对象原理,软件工具,界面设计,以及一些其余相似的东西。api

And you know what? They're absolutely right. You can be a good, solid, professional programmer without knowing much math. 
你了解吗?他们彻底正确。你不须要了解不少数学,你就能作个很棒,很专业的程序员。
But hey, you don't really need to know how to program, either. Let's face it: there are a lot of professional programmers out there who realize they're not very good at it, and they still find ways to contribute. 
可是呢,同时你也不是真的须要知道如何来编程。咱们要面对的是:有不少专业的程序员,他们认识到他们不是很是擅长数学,但他们仍是寻找方法去提高。
If you're suddenly feeling out of your depth, and everyone appears to be running circles around you, what are your options? Well, you might discover you're good at project management, or people management, or UI design, or technical writing, or system administration, any number of other important things that "programmers" aren't necessarily any good at. You'll start filling those niches (because there's always more work to do), and as soon as you find something you're good at, you'll probably migrate towards doing it full-time. 网络

若是你忽然以为本身好烂,周围的人都远远的超过你,你会怎么想呢?好,你可能会发现本身善于项目管理,或人事管理,或界面设计,或技术写做,或系统管理,还有许多其余程序员没必要去精通的。你会开始堆积那些想法(由于工做永远干不完),当你发现一些你能掌握的东西时,你极可能会转移去全职的作这个工做。
In fact, I don't think you need to know anything, as long as you can stay alive somehow. 
实际上,我认为有些东西你不须要了解,当前你还可以赖以生存的话。
So they're right: you don't need to know math, and you can get by for your entire life just fine without it. 
因此他们是对的:你不须要了解数学,而且没有数学你也能过的很好。
But a few things I've learned recently might surprise you: 
可是最近我学到的一些东西可能会让你感到惊讶:
Math is a lot easier to pick up after you know how to program. In fact, if you're a halfway decent programmer, you'll find it's almost a snap. 
在你知道如何编程以后,数学更容易学会。实际上,若是你先学数学,而后半路出家作程序员的话,你会发现编程简直就是小菜一碟。
They teach math all wrong in school. Way, WAY wrong. If you teach yourself math the right way, you'll learn faster, remember it longer, and it'll be much more valuable to you as a programmer. 
学校里教数学的方式都错了。仅仅是教学的方法错了,不是教数学自己错了。若是你以正确的方式学习数学的话,你会学的更快,记住这点,对你,做为一个程序员来讲颇有价值。
Knowing even a little of the right kinds of math can enable you do write some pretty interesting programs that would otherwise be too hard. In other words, math is something you can pick up a little at a time, whenever you have free time. 
哪怕了解一点点相关的数学知识,就能让你写出可爱有趣的程序,不然会有些小难度。换句话讲,数学是能够慢慢学的,只要你有时间。
Nobody knows all of math, not even the best mathematicians. The field is constantly expanding, as people invent new formalisms to solve their own problems. And with any given math problem, just like in programming, there's more than one way to do it. You can pick the one you like best. 
没人能了解全部的数学,就是最棒的数学家也不能。当人们发明新的形式去解决本身的问题时,数学领域就不断的扩展。和编程同样,一些给出的数学问题,不止一种方法能够去解决它。你能够挑个你最喜欢的方式。
Math is... ummm, please don't tell anyone I said this; I'll never get invited to another party as long as I live. But math, well... I'd better whisper this, so listen up: (it's actually kinda fun.) 
数学是......嗯,请别告诉别人我说过这个哈;固然我也不期望谁能邀请我参加这样的派对,在我还活着的时候。可是,数学其实就是......我仍是小声的说吧,听好了:(她其实就是一种乐趣啦!)
The Math You Learned (And Forgot) 
你学到的数学(和你忘了的数学) 。
Here's the math I learned in school, as far as I can remember: 
这儿是我能记得的在学校学到的数学: 
Grade School: Numbers, Counting, Arithmetic, Pre-Algebra ("story problems") 
初中:数,数数,算术知识,初级代数("带问题的小故事") 。
High School: Algebra, Geometry, Advanced Algebra, Trigonometry, Pre-Calculus (conics and limits) 
高中:代数,几何,高等代数,三角学,微积分先修课 (二次曲线论和极限)。
College: Differential and Integral Calculus, Differential Equations, Linear Algebra, Probability and Statistics, Discrete Math 
大学:微积分,微分公式,线性代数,几率和统计,离散数学。
How'd they come up with that particular list for high school, anyway? It's more or less the same courses in most U.S. high schools. I think it's very similar in other countries, too, except that their students have finished the list by the time they're nine years old. (Americans really kick butt at monster-truck competitions, though, so it's not a total loss.) 
上面那个关于高中数学课程单子上所列的,怎么来着?美国高中几乎都是这样的课程设置。我认为其余国家也会很类似的,除了那些在9岁以前就掌握了这些课程的学生。(美国小孩同时却在热衷于玩魔鬼卡车竞赛,虽然如此,整个来讲也算不上什么大损失。) 
Algebra? Sure. No question. You need that. And a basic understanding of Cartesian geometry, too. Those are useful, and you can learn everything you need to know in a few months, give or take. But the rest of them? I think an introduction to the basics might be useful, but spending a whole semester or year on them seems ridiculous. 
代数?是的,没问题。你须要代数,和一些理解解析几何的知识。那些颇有用,而且在之后几个月里,你能学到一切你想要的,十拿九稳的。剩下的呢?我认为一个基本的介绍可能会有用,可是在这上面花整个学期或一年就显得很荒谬了。数据结构

I'm guessing the list was designed to prepare students for science and engineering professions. The math courses they teach in and high school don't help ready you for a career in programming, and the simple fact is that the number of programming jobs is rapidly outpacing the demand for all other engineering roles. 闭包

我如今意识到那个书单列表是设计给那些之后要当科学家和工程师的学生的。他们在高中里所教的数学课程并非为你的编程生涯作准备的,简单的事实是,多数的编程工做所须要的数学知识,相比其余工程师角色增加的更快。
And even if you're planning on being a scientist or an engineer, I've found it's much easier to learn and appreciate geometry and trig after you understand what exactly math is — where it came from, where it's going, what it's for. No need to dive right into memorizing geometric proofs and trigonometric identities. But that's exactly what high schools have you do. 
即便你打算当一名科学家或者一名工程师,在你理解了什么是数学以后——数学从何而来,走向哪里,为什么而生,你会发现学习和欣赏几何学和三角学变得更容易了。没必要去记住几何上的证实和三角恒等式,虽然那确实是高中学校要求你必须去作的。
So the list's no good anymore. Schools are teaching us the wrong math, and they're teaching it the wrong way. It's no wonder programmers think they don't need any math: most of the math we learned isn't helping us. 
因此,这样的书单列表再也不有什么用了。学校教给咱们的不是最合适的数学,而且方式也不对,难怪程序员认为他们再也不须要数学:咱们学的大部分数学知识对咱们的工做没什么大的帮助。
The Math They Didn't Teach You 
他们没有教给你的那部分数学。
The math computer scientists use regularly, in real life, has very little overlap with the list above. For one thing, most of the math you learn in grade school and high school is continuous: that is, math on the real numbers. For computer scientists, 95% or more of the interesting math is discrete: i.e., math on the integers. app

在现实中,计算机科学家常用的数学,跟上面所列的数学仅有很小的重叠。举个例子,你在中学里学的大部分数学是连续性的,也就是说,那是做为实数的数学。而对于计算机科学家来讲,他们所感兴趣的95%也许更多的是离散性的,好比,关于整数的数学。
I'm going to talk in a future blog about some key differences between computer science, software engineering, programming, hacking, and other oft-confused disciplines. I got the basic framework for these (upcoming) insights in no small part from Richard Gabriel's Patterns Of Software, so if you absolutely can't wait, go read that. It's a good book. 

我打算在之后的博客中再谈一些有关计算机科学,软件工程,编程,搞些有趣的东东,和其余经常使人犯晕的训练。我已经从Richard Gabriel的《软件的模式》这本书中洞察到一个无关巨细的基本框架。若是你明显的等不下去的话,去读吧,是本不错的书。
For now, though, don't let the term "computer scientist" worry you. It sounds intimidating, but math isn't the exclusive purview of computer scientists; you can learn it all by yourself as a closet hacker, and be just as good (or better) at it than they are. Your background as a programmer will help keep you focused on the practical side of things. 
从如今开始,不要再让"计算机科学家"这个词困扰到你。它听上去很可怕,其实数学不是计算机科学家所独有的领域。你也能做为一个黑客自学它,而且能作的和他们同样棒。你做为一个程序员的背景,将会帮助你保持只关注那些有实践性的部分。
The math we use for modeling computational problems is, by and large, math on discrete integers. This is a generalization. If you're with me on today's blog, you'll be studying a little more math from now on than you were planning to before today, and you'll discover places where the generalization isn't true. But by then, a short time from now, you'll be confident enough to ignore all this and teach yourself math the way you want to learn it. 
咱们用来创建计算模型的,大致上是离散数学,这是广泛的作法。若是正好今天你在看这篇博客,从如今起你正了解到更多的数学,而且你会认识到那样的广泛作法是不对的;从如今开始,你将有信心认为能够忽略这些,并以你想要的方式自学。
For programmers, the most useful branch of discrete math is probability theory. It's the first thing they should teach you after arithmetic, in grade school. What's probability theory, you ask? Why, it's counting. How many ways are there to make a Full House in poker? Or a Royal Flush? Whenever you think of a question that starts with "how many ways..." or "what are the odds...", it's a probability question. And as it happens (what are the odds?), it all just turns out to be "simple" counting. It starts with flipping a coin and goes from there. It's definitely the first thing they should teach you in grade school after you learn Basic Calculator Usage. 
对程序员来讲,最有效的离散数学的分支是几率理论。这是你在学校学完基本算术后紧接着的课。你会问,什么是几率理论呢?你就数啊,看有多少次出现满堂彩?或者有多少次是同花顺。无论你思考什么问题,若是是以"多少种途径..."或"有多大概率的...",那就是离散问题。当它发生时,都转化成"简单"的计数,抛个硬币看看...? 毫无疑问,在他们教你基本的计算用法后,他们会教你几率理论。
I still have my discrete math textbook from college. It's a bit heavyweight for a third-grader (maybe), but it does cover a lot of the math we use in "everyday" computer science and computer engineering. 
我还保存着大学里的离散数学课本,可能它只占了三分之一的课程,可是它却涵盖了咱们几乎天天计算机编程工做大部分所用到的数学。
Oddly enough, my professor didn't tell me what it was for. Or I didn't hear. Or something. So I didn't pay very close attention: just enough to pass the course and forget this hateful topic forever, because I didn't think it had anything to do with programming. That happened in quite a few of my comp sci courses in college, maybe as many as 25% of them. Poor me! I had to figure out what was important on my own, later, the hard way. 
也真是够奇怪的,个人教授从没告诉我数学是用来干嘛的,或者我也历来没有据说过,种种缘由吧。因此我也从没有给以足够的注意,只是考试及格,而后把他们都忘光,由于我不认为它还和编程有啥关系。事情变化是我在大学学完一些计算机科学的课程以后,也许是25%的课程,可怜啊!我必须弄明白什么对于本身来讲是最重要的,而后再是向深度发展。
I think it would be nice if every math course spent a full week just introducing you to the subject, in the most fun way possible, so you know why the heck you're learning it. Heck, that's probably true for every course. 
我想,若是每门数学课都花上整整一周的时间,而只是介绍让你如何入门的话,那将很是不错。这是最有意思的一种假设,那么你知道了你正学习的对象是哪一种怪物了。怪物,大概对每一门课都合适。
Aside from probability and discrete math, there are a few other branches of mathematics that are potentially quite useful to programmers, and they usually don't teach them in school, unless you're a math minor. This list includes: 
除了几率和离散数学外,还有很多其余的数学分支,可能对程序员至关的有用。学校一般不会教你的,除非你的辅修科目是数学,这些数目列表包括:

Statistics, some of which is covered in my discrete math book, but it's really a discipline of its own. A pretty important one, too, but hopefully it needs no introduction. 
统计学,其中一些包括在个人离散数学课里,它的某些训练只限于它自身,天然也是至关重要的,但想学的话不须要什么特别的入门。
Algebra and Linear Algebra (i.e., matrices). They should teach Linear Algebra immediately after algebra. It's pretty easy, and it's amazingly useful in all sorts of domains, including machine learning. 
代数和线性代数(好比:矩阵),他们会在教完代数后当即教线性代数。这也简单,但这在至关多的领域很是有用,包括机器学习。
Mathematical Logic. I have a really cool totally unreadable book on the subject by Stephen Kleene, the inventor of the Kleene closure and, as far as I know, Kleenex. Don't read that one. I swear I've tried 20 times, and never made it past chapter 2. If anyone has a recommendation for a better introduction to this field, please post a comment. It's obviously important stuff, though. 
数理逻辑,我有至关完整的关于这门学科的书没有读,是Stephen Kleene写的,克林闭包的发明者。我所知道的还有就是Kleenex, 这个就不要读了,我发誓我已经尝试了不下20次,却从没有读完第二章。若是哪位牛掰有什么更好的入门建议的话,能够给我推荐。显然,这门学科明显是很是重要的一部分。
Information Theory and Kolmogorov Complexity. Weird, eh? I bet none of your high schools taught either of those. They're both pretty new. Information theory is (veeery roughly) about data compression, and Kolmogorov Complexity is (also roughly) about algorithmic complexity. I.e., how small you can you make it, how long will it take, how elegant can the program or data structure be, things like that. They're both fun, interesting and useful. 
信息理论和柯尔莫戈洛夫复杂性理论,真难以想象,不是么?我敢打赌没哪一个高中会教你其中任何一门课程。它们都是新兴的学科。信息理论(至关至关至关至关难懂)是关于数据压缩,柯尔莫戈洛夫复杂性理论(一样很是难懂)是关于算法复杂度的。也就是说,你要把它压缩的尽可能小,你所要花费的时间也就变的越长;一样的,程序或数据结构要变得多优雅,也有一样的代价。它们都颇有趣,也颇有用。
There are others, of course, and some of the fields overlap. But it just goes to show: the math that you'll find useful is pretty different from the math your school thought would be useful. 
固然,也有其余的一些因素,某些领域是重复的。也拿来讲说吧,你所发现有用的那部分数学,不一样于那些你在学校里认为有用的数学。
What about calculus? Everyone teaches it, so it must be important, right? 
那微积分呢?每一个人都学它,因此它也必定是重要的,对吗? 
Well, calculus is actually pretty easy. Before I learned it, it sounded like one of the hardest things in the universe, right up there with quantum mechanics. Quantum mechanics is still beyond me, but calculus is nothing. After I realized programmers can learn math quickly, I picked up my Calculus textbook and got through the entire thing in about a month, reading for an hour an evening. 

好吧,微积分其实是至关容易的。在我学习它以前,它听上去好像是世界上最难的一件事,好像和量子力学差很少。量子力学对我来讲真的不是那么容易理解,可是微积分却不是。在我意识到程序员可以快速的学习数学时,我拿起一些微积分课本用一个月通读了整本书,一个晚上读一小时。
Calculus is all about continuums — rates of change, areas under curves, volumes of solids. Useful stuff, but the exact details involve a lot of memorization and a lot of tedium that you don't normally need as a programmer. It's better to know the overall concepts and techniques, and go look up the details when you need them. 

微积分都是关于连续统的 -- 变化的比率,曲线的面积,立体的体积,是些有用的东西,可是实际细节却包含大量的记忆量而且枯燥,做为一个程序员来讲根本不须要这些。更好的方法是从总体上了解那些概念和技术,在必要的时候再去查询那些细节。
Geometry, trigonometry, differentiation, integration, conic sections, differential equations, and their multidimensional and multivariate versions — these all have important applications. It's just that you don't need to know them right this second. So it probably wasn't a great idea to make you spend years and years doing proofs and exercises with them, was it? If you're going to spend that much time studying math, it ought to be on topics that will remain relevant to you for life. 
几何,三角,微分,积分,圆锥曲线,微分方程,和他们的多维和多元 -- 这些都有重要的应用。不过这时候不须要你去了解它们,这大概不是个好注意,让你年复一年的去作证实和它们的练习题,不是吗?若是你打算花大量的时间去学习数学,那也是和你生活相关的部分。
The Right Way To Learn Math 
学习数学的正确方法 。
The right way to learn math is breadth-first, not depth-first. You need to survey the space, learn the names of things, figure out what's what. 
正确学习数学的方法是广度优先,而非深度优先。你要考察的是整个数学世界,学习每一个概念的名字,区分出什么是什么。
To put this in perspective, think about long division. Raise your hand if you can do long division on paper, right now. Hands? Anyone? I didn't think so. 
具体来看,考虑用长除法?若是你能在纸上作长整除,如今就举起你的手。会有人举手吗?至少我不这么认为。
I went back and looked at the long-division algorithm they teach in grade school, and damn if it isn't annoyingly complicated. It's deterministic, sure, but you never have to do it by hand, because it's easier to find a calculator, even if you're stuck on a desert island without electricity. You'll still have a calculator in your watch, or your dental filling, or something, 

回头看看在学校里学过的长除法,要是不让你以为烦恼和愤怒才怪。固然,这是显然的,但你不必定要本身亲自去作,由于很容易用计算器来作。即便你不幸在一座没有电力的荒无人烟的小岛上,你起码还有个计算器,在你的手表上,补牙的什么东东,或其余什么上面。 
Why do they even teach it to you? Why do we feel vaguely guilty if we can't remember how to do it? It's not as if we need to know it anymore. And besides, if your life were on the line, you know you could perform long division of any arbitrarily large numbers. Imagine you're imprisoned in some slimy 3rd-world dungeon, and the dictator there won't let you out until you've computed 219308862/103503391. How would you do it? Well, easy. You'd start subtracting the denominator from the numerator, keeping a counter, until you couldn't subtract it anymore, and that'd be the remainder. If pressed, you could figure out a way to continue using repeated subtraction to estimate the remainder as decimal number (in this case, 0.1185678219, or so my Emacs M-x calc tells me. Close enough!) 

为何他们还教你这些呢?若是咱们不能记住怎样去作,为何会感到含糊心虚呢?好像咱们不须要再次知道它。除此之外,若是你命悬一线,你能够运用任意大的数来作长除法。想象你被囚禁在第三世界的地牢里,那儿的独裁者是不会放你出来的,除非你计算出219308862/103503391。你会怎么作呢?好吧,很容易,你开始从分子减去分,,直到不能再减只剩余数为止。若实在有压力,你能够想个办法,继续使用反复减,估算做为十进制的余数(这种状况下,0.1185678219, Emacs M-x calc 告诉个人,够精确了! ) 

You could figure it out because you know that division is just repeated subtraction. The intuitive notion of division is deeply ingrained now. 
你或许明白,除法就是反复的减,这样从直觉上对除法概念的理解就根深蒂固啦! 

The right way to learn math is to ignore the actual algorithms and proofs, for the most part, and to start by learning a little bit about all the techniques: their names, what they're useful for, approximately how they're computed, how long they've been around, (sometimes) who invented them, what their limitations are, and what they're related to. Think of it as a Liberal Arts degree in mathematics. 

学习数学的正确方法是忽略实际的算法和证实,对于大部分状况来讲,他们的名字,他们的做用,他们计算的大体步骤,(有时是)谁发明了他们,发明了多久了,他们的缺陷是什么,和他们相关的有什么,把数学当文科来学。
Why? Because the first step to applying mathematics is problem identification. If you have a problem to solve, and you have no idea where to start, it could take you a long time to figure it out. But if you know it's a differentiation problem, or a convex optimization problem, or a boolean logic problem, then you at least know where to start looking for the solution. 
为何呢?由于第一步反应在数学上的是问题的肯定。若是你有一个问题去解决,而且假设你没有头绪如何开始,这将花费你很长的时间来弄明白。但若是你知道这是个变异的问题,或者是一个凸优化问题,或者一个布尔的逻辑问题,而后你起码能知道从哪着手开始寻找解决方案。

There are lots and lots of mathematical techniques and entire sub-disciplines out there now. If you don't know what combinatorics is, not even the first clue, then you're not very likely to be able to recognize problems for which the solution is found in combinatorics, are you? 
如今有许许多多的数学技术和整个的学科分支。若是你不知道组合逻辑是什么,甚至连听都没据说过,那么你是不可能意识到在组合逻辑中能够找到的答案解决的是什么问题,难道不是么? 
But that's actually great news, because it's easier to read about the field and learn the names of everything than it is to learn the actual algorithms and methods for modeling and computing the results. In school they teach you the Chain Rule, and you can memorize the formula and apply it on exams, but how many students really know what it "means"? So they're not going to be able to know to apply the formula when they run across a chain-rule problem in the wild. Ironically, it's easier to know what it is than to memorize and apply the formula. The chain rule is just how to take the derivative of "chained" functions — meaning, function x() calls function g(), and you want the derivative of x(g()). Well, programmers know all about functions; we use them every day, so it's much easier to imagine the problem now than it was back in school. 
但那实在是个大新闻,由于阅读这些领域,学习实际算法,建模和计算结果的方法,记住这些名字都是容易的。在学校里他们教你链式法则。你也能回忆起他们并能运用在考试题上,但有多少学生能真正的了解他们到底意味着什么呢? 因此当他们遇到变种的链式问题时,他们就不懂得如何运用公式了。让人感到讽刺的是,了解这是什么比记住如何运用公式更为容易。链式法则仅仅是如何对链式函数求导的意思,函数 x() 引用函数 g() , 你要求导 x(g()) 。好了,程序员知道全部这些函数相关的,咱们天天都使用它们,因此如今比过去在学校更容易想象到问题所在。
Which is why I think they're teaching math wrong. They're doing it wrong in several ways. They're focusing on specializations that aren't proving empirically to be useful to most high-school graduates, and they're teaching those specializations backwards. You should learn how to count, and how to program, before you learn how to take derivatives and perform integration. 

这就是为何我认为他们以错误的方式在教数学。老师们向大多数高中毕业生专门教授的内容,不是靠经验来证实数学是如何如何有用的,而偏偏是相反。在你学习如何求导和作积分以前,你应该学习如何计数,怎样编程。
I think the best way to start learning math is to spend 15 to 30 minutes a day surfing in Wikipedia. It's filled with articles about thousands of little branches of mathematics. You start with pretty much any article that seems interesting (e.g. String theory, say, or the Fourier transform, or Tensors, anything that strikes your fancy.) Start reading. If there's something you don't understand, click the link and read about it. Do this recursively until you get bored or tired. 
我认为学习数学最好的方法是天天花15到30分钟逛维基百科,那上面有数千数学分支的相关文章,能够从一些你感兴趣的文章着手(好比弦理论,或者傅立叶变换,或者张量理论,就是能冲击你想象力的东西) 阅读。若是有什么你不理解的,就去了解那些连接,如此这般直到你累到不行为止。
Doing this will give you amazing perspective on mathematics, after a few months. You'll start seeing patterns — for instance, it seems that just about every branch of mathematics that involves a single variable has a more complicated multivariate version, and the multivariate version is almost always represented by matrices of linear equations. At least for applied math. So Linear Algebra will gradually bump its way up your list, until you feel compelled to learn how it actually works, and you'll download a PDF or buy a book, and you'll figure out enough to make you happy for a while. 
几个月后,这么作会纵向扩展你的数学知识面。你会发现一些模式,比如数学的每一个分支看上去都包括了一个有着复杂的多元的变量,而后线性代数将会慢慢爬满你的书单列表,直到你强迫本身学会它其实是怎样工做的,你要下载个电子书或买本书,直到你能从中找到乐趣。 
With the Wikipedia approach, you'll also quickly find your way to the Foundations of Mathematics, the Rome to which all math roads lead. Math is almost always about formalizing our "common sense" about some domain, so that we can deduce and/or prove new things about that domain. Metamathematics is the fascinating study of what the limits are on math itself: the intrinsic capabilities of our formal models, proofs, axiomatic systems, and representations of rules, information, and computation. 
凭借着维基百科,你也能快速的找到一条了解数学基本原理的途径,条条大道通罗马。在某些领域,数学几乎老是形式化咱们的"常识",因此咱们能减小或证实那些领域里的新事物。对数学自己的研究就是无止境并且使人着迷的,构造形式模型本质的能力,证实,自明的系统,规则表示,信息和计算。
One great thing that soon falls by the wayside is notation. Mathematical notation is the biggest turn-off to outsiders. Even if you're familiar with summations, integrals, polynomials, exponents, etc., if you see a thick nest of them your inclination is probably to skip right over that sucker as one atomic operation. 
数学符号很重要,但却容易让人放弃。对于门外汉来讲,数据符号是巨大的障碍。即便你熟悉累加,积分,多项式,指数等等,若是你看到堆彻的异常复杂的符号时,你就把它实现的功能当成一个原子操做好了,不要深究太多。
However, by surveying math, trying to figure out what problems people have been trying to solve (and which of these might actually prove useful to you someday), you'll start seeing patterns in the notation, and it'll stop being so alien-looking. For instance, a summation sign (capital-sigma) or product sign (capital-pi) will look scary at first, even if you know the basics. But if you're a programmer, you'll soon realize it's just a loop: one that sums values, one that multiplies them. Integration is just a summation over a continuous section of a curve, so that won't stay scary for very long, either. 
无论怎样,认真去了解数学,尝试着理解人们正在试图解决的问题(那些已被证实了的问题某天也许会对你有实际用途),你会在符号中看到模式,你也再也不排斥它们。好比,累加符号(大写符号-西格马)或者π(大写符号-pi,连乘符号)起初看上去让人内心没底,即便你了解了它们的基本原理。但若是你是个程序员,你会认识到他仅仅是个循环:一个累加值,一个累乘,积分是一段连续曲线的相加,因此那不会让你郁闷过久。
Once you're comfortable with the many branches of math, and the many different forms of notation, you're well on your way to knowing a lot of useful math. Because it won't be scary anymore, and next time you see a math problem, it'll jump right out at you. "Hey," you'll think, "I recognize that. That's a multiplication sign!" 

一旦你习惯了数学的许多分支,和许多不一样格式的符号,你就走在了知道不少有用数学知识的路上。由于你再也不惧怕,你将会发现问题,其实它们会自动跳到你面前。“嗨,”你会思索,“我了解这个,这是乘法符号!”
And then you should pull out the calculator. It might be a very fancy calculator such as R, Matlab, Mathematica, or a even C library for support vector machines. But almost all useful math is heavily automatable, so you might as well get some automated servants to help you with it. 
这样你就能扔掉计算器了。有一个充满想象的计算器好比R, Matlab, Mathematica, 甚或是支持向量机的C语言库,但几乎全部有用的数学都是重型自动机,因此你可以让一切都变的自动化。
When Are Exercises Useful? 
练习有啥用处呢? 
After a year of doing part-time hobbyist catch-up math, you're going to be able to do a lot more math in your head, even if you never touch a pencil to a paper. For instance, you'll see polynomials all the time, so eventually you'll pick up on the arithmetic of polynomials by osmosis. Same with logarithms, roots, transcendentals, and other fundamental mathematical representations that appear nearly everywhere. 

在作了几年的业余数学爱好者以后,你能够在脑海里作不少数学题,即便你从没碰过笔和纸。好比,你会一直看到多项式,因此你会耳濡目染的作起多项式的运算。一样的,对数,根,超越数,和其余处处出现的基本数学原理。

I'm still getting a feel for how many exercises I want to work through by hand. I'm finding that I like to be able to follow explanations (proofs) using a kind of "plausibility test" — for instance, if I see someone dividing two polynomials, I kinda know what form the result should take, and if their result looks more or less right, then I'll take their word for it. But if I see the explanation doing something that I've never heard of, or that seems wrong or impossible, then I'll dig in some more. 
对于我要亲手作多少练习题,我有一种直觉。我用一种“真实性测试”跟随证实步骤。好比,我看到有人除以两个多项式,我大概知道结果是什么,若是它们的结果看上去差很少是对的,我就相信他们了。但若是我看到的那个证实我听都没据说过,亦或看上去是错的或者不可能的,我就要挖掘更多的东西了。
That's a lot like reading programming-language source code, isn't it? You don't need to hand-simulate the entire program state as you read someone's code; if you know what approximate shape the computation will take, you can simply check that their result makes sense. E.g. if the result should be a list, and they're returning a scalar, maybe you should dig in a little more. But normally you can scan source code almost at the speed you'd read English text (sometimes just as fast), and you'll feel confident that you understand the overall shape and that you'll probably spot any truly egregious errors. 
这很像读程序源代码,不是么?当你读某人的代码,你不须要手动模拟整个程序状态;若是你知道计算过程大体会发生什么情形,你就能推断出结果。举个例子,若是结果应该是个列表,但返回的是一个标量,可能你就会更深刻地研究。但正常状况下,你几乎是以你阅读英文文本的速度(有时仅仅是速度上)扫描源代码,而且你确信理解了整个结构,但与此同时,你也许会发现令你震惊的错误。 
I think that's how mathematically-inclined people (mathematicians and hobbyists) read math papers, or any old papers containing a lot of math. They do the same sort of sanity checks you'd do when reading code, but no more, unless they're intent on shooting the author down. 

我认为数学爱好者(数学家和真正的数学迷)也是这样阅读数学论文的。和你读代码时同样,他们也会作一样的检查,除非他们不想把做者的观点驳倒。
With that said, I still occasionally do math exercises. If something comes up again and again (like algebra and linear algebra), then I'll start doing some exercises to make sure I really understand it. 
照那样说,我会偶尔作作数学练习。若是某些问题(好比代数和线性代数)一次又一次的出现,我就作些练习去确认我是否真正的理解它了。
But I'd stress this: don't let exercises put you off the math. If an exercise (or even a particular article or chapter) is starting to bore you, move on. Jump around as much as you need to. Let your intuition guide you. You'll learn much, much faster doing it that way, and your confidence will grow almost every day.
但我要强调这点:不要让练习使你分心。若是一个练习(甚或是一篇特别的文章或章节)开始让你烦恼,那就暂时丢一边继续前进,该奔跑就坚定奔跑。让你的直觉引导你。你会学到更多,更快,你的信心也会随之增加。
How Will This Help Me? 
这些怎样才能帮到我? 
Well, it might not — not right away. Certainly it will improve your logical reasoning ability; it's a bit like doing exercise at the gym, and your overall mental fitness will get better if you're pushing yourself a little every day. 
也许不能--不能马上奏效。但确实能帮助提升你的逻辑推理能力;比如是在健身房进行锻炼,若是你天天都作一点的话,你的身体素质确定会获得提升。
For me, I've noticed that a few domains I've always been interested in (including artificial intelligence, machine learning, natural language processing, and pattern recognition) use a lot of math. And as I've dug in more deeply, I've found that the math they use is no more difficult than the sum total of the math I learned in high school; it's just different math, for the most part. It's not harder. And learning it is enabling me to code (or use in my own code) neural networks, genetic algorithms, bayesian classifiers, clustering algorithms, image matching, and other nifty things that will result in cool applications I can show off to my friends. 
对我来讲,我已经注意到一些我感兴趣的领域(包括人工智能,机器学习,天然语言处理和模式识别)大量用到数学。对于我研究的更深的领域,我发现它们所用的数学并不比我在中学学到的更难;多半是不一样的数学,而不是更难了。而且学习数学使我能写(或者是在我本身的代码里使用)神经网络,基因算法,贝页斯分类器,集群算法,图像识别,和其余时髦的东西,能产生很酷的应用,我能够向个人朋友炫耀。
And I've gradually gotten to the point where I no longer break out in a cold sweat when someone presents me with an article containing math notation: n-choose-k, differentials, matrices, determinants, infinite series, etc. The notation is actually there to make it easier, but (like programming-language syntax) notation is always a bit tricky and daunting on first contact. Nowadays I can follow it better, and it no longer makes me feel like a plebian when I don't know it. Because I know I can figure it out. 
我逐渐意识到这点,当别人给我看一篇包含数学公式的文章时,我再也不忽然冒出一身冷汗:组合,微分,真值表,定列式,无限系列等等。那些数学公式如今变得容易相处了,但(像编程语言的语法)刚开始接触的时候多少仍是让人以为复杂。如今我能更好的理解了,即便遇到不懂的地方,也再也不感到本身是个不懂数学的人了。由于我知道本身是可以弄明白的。
And that's a good thing. 
那很好。
And I'll keep getting better at this. I have lots of years left, and lots of books, and articles. Sometimes I'll spend a whole weekend reading a math book, and sometimes I'll go for weeks without thinking about it even once. But like any hobby, if you simply trust that it will be interesting, and that it'll get easier with time, you can apply it as often or as little as you like and still get value out of it. 
我会继续加油作的更好滴。我还有很多活头,有好多书和文章要读。有时我会花整个周末来读数学书,有时会数周都再也不思考它。和其余兴趣同样,若是你相信它是有趣的,能经过它更容易的消磨时光,你就会时不时地去作,并从中获益。
Math every day. What a great idea that turned out to be! 
好好学习,每天数学!

原文标题:Math For Programmers

原文来源:http://steve-yegge.blogspot.com/2006/03/math-for-programmers.html

相关文章
相关标签/搜索