.
链接:[url=http://developer.51cto.com/art/201012/238798.htm]http://developer.51cto.com/art/201012/238798.htm[/url]
部分文摘:
数学是一切哲学、科学的基础。数学与程序员是永远都分不开的话题,我们曾介绍过《Perl数学函数用法大全》和《并行计算的难点与数学原理解析》,本文是Common Lisp专家Peter Seibel对Google公司首席Java架构师Joshua Bloch的访谈,谈到API对设计流程的影响和Google的Java观,以及数学、散文与程序员的关系。
数学与程序员的关系
Seibel:你认识有什么伟大的程序员不会数学或者没有接受过良好的数学教育的吗?要成为一个程序员,学习微积分、离散数学和其他的数学知识真的那么重要?还是做程序员只需要一种思想方式,即使没有受过这些数字训练,也能拥有?
Bloch:我觉得是思想方式,学不学数学都能拥有这种思想。但是学一下确实有好处。我曾有个同事叫madbot,Mike McCloskey。他很懂数学,但是没有学过数论。他重写了BigInteger的实现。原来的实现是C语言函数包的封装,他发誓用Java重写,要达到基于C语言版本的速度。后来他做到了。为此他学了大量的数论知识。如果他的数学不行,他肯定搞不定这个项目,而如果他本来就精通数论,就无需费力去学习了。
Seibel:但是,这本来就是个数学问题啊。
Bloch:对,这个例子不恰当。但是,我相信即使是跟数学无关的问题,学习数学培养出的思维方式对编程来说也是必不可少的。例如,归纳证明法和递归编程的关系非常紧密,你不理解其中一个,就不可能真正理解另外一个。你可能不知道术语基本情况和归纳假设,但是如果你不能理解这些概念,你就没有办法写出正确的递归程序。所以,即使是在与数学无关的领域内,不理解这些数学概念的程序员也会遇到很多困难。
你刚才提到了微积分,我觉得它不那么重要。可笑的是这么多年来似乎已经成为了一种思维定势了,只要你受过大学教育,那么人们就认为你应该懂微积分。微积分中有很多美妙的思想,可以让人展开无穷的想象。
但是,你可以以连续或者离散这两种不同的方式思维。我觉得对程序员来说,精通离散思维更为重要。例如我刚提到的归纳证明法。你可以证明一种假设对所有整数都成立。证明过程就像施魔法一样。首先证明它对一个整数成立,然后证明针对这个整数成立意味着针对下一个整数也成立,这样就能证明它适用于全部整数。我认为对程序员来说这比理解极限的概念要重要得多。
好在我们无需选择。大学课程里这两样都教得不少。所以即使你用微积分用得没离散数学那么多,学校里还是会教授微积分的。但是我认为离散的东西比连续的东西更重要。
散文与程序的关系
Seibel:前面你提到写程序和写散文有许多相似之处。尽管数学和计算机、编程的联系一直很紧密,但是不是可以认为,写Web框架或者基于Web框架的Web应用程序所需要的技能跟写作的关系更为紧密呢?
Bloch:是啊。前面你提到Java程序员有两个不同的社群。编写库、编译器和底层框架的社群,更需要数学知识。而如果你是在底层框架之上编写Web应用程序,那么必须了解如何进行沟通,言语上的、视觉上的沟通都需要了解。遇到那些令我操作失误的网站我就很恼火。显然有些人完全没有考虑过用户怎么使用他们的产品。所以实质上,编程能力是一系列不同技能的结合。你擅长哪些技能,决定了你擅长编写什么样的程序。但是,即使是库、编译器以及底层框架也需要代码可读、可维护。如果你不擅长写作,你就很难达到你的目标。
链接:[url=http://developer.51cto.com/art/201012/238798.htm]http://developer.51cto.com/art/201012/238798.htm[/url]
部分文摘:
数学是一切哲学、科学的基础。数学与程序员是永远都分不开的话题,我们曾介绍过《Perl数学函数用法大全》和《并行计算的难点与数学原理解析》,本文是Common Lisp专家Peter Seibel对Google公司首席Java架构师Joshua Bloch的访谈,谈到API对设计流程的影响和Google的Java观,以及数学、散文与程序员的关系。
数学与程序员的关系
Seibel:你认识有什么伟大的程序员不会数学或者没有接受过良好的数学教育的吗?要成为一个程序员,学习微积分、离散数学和其他的数学知识真的那么重要?还是做程序员只需要一种思想方式,即使没有受过这些数字训练,也能拥有?
Bloch:我觉得是思想方式,学不学数学都能拥有这种思想。但是学一下确实有好处。我曾有个同事叫madbot,Mike McCloskey。他很懂数学,但是没有学过数论。他重写了BigInteger的实现。原来的实现是C语言函数包的封装,他发誓用Java重写,要达到基于C语言版本的速度。后来他做到了。为此他学了大量的数论知识。如果他的数学不行,他肯定搞不定这个项目,而如果他本来就精通数论,就无需费力去学习了。
Seibel:但是,这本来就是个数学问题啊。
Bloch:对,这个例子不恰当。但是,我相信即使是跟数学无关的问题,学习数学培养出的思维方式对编程来说也是必不可少的。例如,归纳证明法和递归编程的关系非常紧密,你不理解其中一个,就不可能真正理解另外一个。你可能不知道术语基本情况和归纳假设,但是如果你不能理解这些概念,你就没有办法写出正确的递归程序。所以,即使是在与数学无关的领域内,不理解这些数学概念的程序员也会遇到很多困难。
你刚才提到了微积分,我觉得它不那么重要。可笑的是这么多年来似乎已经成为了一种思维定势了,只要你受过大学教育,那么人们就认为你应该懂微积分。微积分中有很多美妙的思想,可以让人展开无穷的想象。
但是,你可以以连续或者离散这两种不同的方式思维。我觉得对程序员来说,精通离散思维更为重要。例如我刚提到的归纳证明法。你可以证明一种假设对所有整数都成立。证明过程就像施魔法一样。首先证明它对一个整数成立,然后证明针对这个整数成立意味着针对下一个整数也成立,这样就能证明它适用于全部整数。我认为对程序员来说这比理解极限的概念要重要得多。
好在我们无需选择。大学课程里这两样都教得不少。所以即使你用微积分用得没离散数学那么多,学校里还是会教授微积分的。但是我认为离散的东西比连续的东西更重要。
散文与程序的关系
Seibel:前面你提到写程序和写散文有许多相似之处。尽管数学和计算机、编程的联系一直很紧密,但是不是可以认为,写Web框架或者基于Web框架的Web应用程序所需要的技能跟写作的关系更为紧密呢?
Bloch:是啊。前面你提到Java程序员有两个不同的社群。编写库、编译器和底层框架的社群,更需要数学知识。而如果你是在底层框架之上编写Web应用程序,那么必须了解如何进行沟通,言语上的、视觉上的沟通都需要了解。遇到那些令我操作失误的网站我就很恼火。显然有些人完全没有考虑过用户怎么使用他们的产品。所以实质上,编程能力是一系列不同技能的结合。你擅长哪些技能,决定了你擅长编写什么样的程序。但是,即使是库、编译器以及底层框架也需要代码可读、可维护。如果你不擅长写作,你就很难达到你的目标。