什么叫工程一切险:你喜欢什么编程语言? – 不周山

来源:百度文库 编辑:偶看新闻 时间:2024/05/02 06:49:11

你喜欢什么编程语言?

OpenParty回来,重看了一下自己的讲稿,觉得还是挺乱的,想传递的东西很多,仓促之间也没有把内容组织好,对周六冒着桑拿天赶到现场,还在一间没有空调的挤了一百多号人的房间里听我唠叨了近一个小时的同学们深感有愧。这里摘要一下,也许能同时弥补一下因为我口音不纯带来的表意不清。

其实主要是两部分的内容,一是我认为R能极大提高算法与数据工作人员的快乐程度及工作效率;二是R的发展历史中呈现出来的六张面孔。至于向量化、CRAN及PackageRank、面向对象的S3和S4、用R实现的推荐引擎等等本来不该糅在一起的内容,在我博客的历史文章里都分别有叙述,这里就不再和面了。

我不是个星座性格学的信徒,但我相信你所使用的编程语言会对你的性格产生重大影响。最初你可能会因为某些或性格或随机的因素而选择了某种语言,接下来你也许会坚守下去,又或者会叛变。只要你在这个环境,用这种语言所提倡的哲学思维一定的时间,你最初的性格倾向就会被放大,最初没有的性格因素也会慢慢的出现在你身上,到最后你会完全认同它所提倡的价值观,你会成为它的卫道者,事实上你在这条路上走的越远这个特点表现得就越明显。所以,语言之争并不单纯是计算机领域的战争,也不是工具之争,而是哲学、价值观上的战争,所以最终的结果通常是谁也不可能说服谁。

从这样的观念出发,如果你了解某个人所忠诚的编程语言,你通常也能大致猜到他是个什么样的人。勾搭一个MM,你可能需要从谈论天气(或者更潮流一点,谈论星座)开始,而勾搭一个程序员,你只需要直截了当的问他喜欢什么语言。如果答案是C,那他可能是个极其追求效率与细节的人,对自己从事的工作要求达到内存级的了解;如果答案是Java,你应该能浮现出J2EE这些高楼大厦,以及Sun公司的广告牌,他可能是习惯于在一个大团队里与人协同工作的;如果答案是C#,oh my god,哥们你这辈子只做过MS的系统编程吗;如果答案是Python,这表明他崇尚简单直接的思维方式与解决方案;如果不幸他的答案是锤子,你还是赶紧闪吧,这说明在他眼里满世界都是钉子。

所以也许是你选择了语言,但你选择的语言塑造了你。

然后这里我很无聊的来了个插叙,介绍我最近看过《你一生的故事》里也有类似的观点。用一个科幻故事来佐证,除了满足自己觉得有趣的心理外,我实在也找不到别的理由。不过这本书的作者还在《Nature》上发表过文章,至少说明他的思想还是有严肃的引用价值的。

在此基础上,我认为用R可以让你把机械的键盘敲击动作,转变为艺术性的思维锻炼。因为R的程序足够短,拥有的工具包又足够多,所以你不需要花太多的时间去实现一个优美的设计。接下来你还不需要太多的成本去维护它,因为代码的维护成本是跟它的长度成正比的,只要有可能,有时间,我们都应该写出更短的代码来。用R,你不再需要为代码的编写和维护而费心,你也不需要为了实现某个demo的功能而写出大量的预备代码,你更不需要大量的人员围绕在你身边却只是为了试验某个算法的效果,你只要按照先进的科学计算思想把你的程序设计好,这不是件容易的事,但这是件充满乐趣的事。

R是一个适用与科学计算与数据分析领域的工具,它无意取代你已经熟练的项目开发语言(如Python、Java),事实上,如下文所述,R的接口特性使得它在与别的语言结合时才能发挥出最大的威力来。同时,随着数据挖掘工作在公司内部受关注程度越高,它的作用就越大。

我不是个语言卫道者,我一直认为,不同的应用场景里不同的需求环境下,语言的表现会有差异。我也一直认为,一个有自信的黑客应当熟练掌握至少两门的编程语言,这有助于你开拓胸怀,容纳更多的价值观与思维方式。

下面谈谈R的六张面孔,实际上是对R发展历史的回顾。主要内容来自S语言的创始人(也是R的核心开发人员)John Chambers的一篇文章《Facets of R》,老爷子在文中按照R的时间发展顺序列出了先后加入其中的六个特性,分别是:

     各种类型的计算过程的接口(interface)
     交互式的(interactive)
     函数式编程(functional)
     面向对象(object-oriented)
     模块化(modular)
     协作(collaborative)

1975年,贝尔实验室开始研发S语言,目标是通过接口的形式把一些常用的Fortran写的计算程序包整合起来,而给终端用户提供一个方便的交互式的语言环境。当时像C和Fortran那样的过程式语言是很流行的,而交互式的语言接口虽然现在已经很普遍,但在当时这股风潮才刚刚兴起。所以最终这种语言的样子是:以S语言的语法来交互式的描述计算任务,但实际的计算则是由底层的Fortran程序包完成的。随着S的发展,各种各样的接口被逐渐加了进来,如数据库、电子表格及各种各样的软件包。后来S成为世界三大统计软件之一。

时间进入到80年代到90年代中期,那仍然是一个属于S的时代,R仍未有踪影。那时面向对象的编程思想正风起云涌,C++、Java等日后红透半边天的代表者也开始出现。受这股风潮的影响,S也开始加入面向对象的因素。同时,函数式的思想也开始加入,S的语言语法描述被转换为函数调用,而函数本身就是对象。过程计算的接口仍然存在,但已经被函数封装起来。后来的R同时受Lisp的两种主要方言之一的scheme的影响,在函数式编程的路子上走得更远,连赋值和循环本质上都是函数的调用。在一种语言中同时深度支持面向对象和函数式编程是有点困难的,从我的R使用体验来说,我觉得这种结合还是以函数式的实现为主,面向对象的样子则有点不伦不类的,也有可能是我对现有面向对象的形式的认识太过根深蒂固的缘故。如C++与Java之类只是面向对象而非函数式的语言,它们的方法是跟类绑定的,而不是像S和R那样,跟函数绑定。通过S3和S4的方式实现方法的函数式绑定略显晦涩,但对于丰富函数这个角色的深层次的使用是必须的。

1996年,携带着S的贵族血统的R终于出现了。它的出生几乎就是伴随着模块化和协作的特性而来的。因为R从S继承了丰富的接口形式,所以利用这些接口实现一个新的模块、新的工具包就变成一件自然而然的事,现在世界上已经有千千万万的人在为R编写着函数级别或包级别的模块。R是开源的,它鼓励世界上每一个用它工作的人写出自己的工具包,甚至贡献给别人,给更多的人带来方便。于是,就有了CRAN,一个现在为止已经有两千多个并且还在不断增长的第三方开发的开源包列表。原则上,R能做什么、渗透到那个领域,主要取决于什么专业的人在用它,用它来做什么。

从小老师就教育我们,写文章要前后照应,为了使该文不至于变成实际上可以拆成两篇的文章,我必须给两个话题找找关联。那么,从这六张面孔中,我们能归纳出R对它的追随者的性格产生什么样的影响呢?首先,它会让你产生一种包容与谦卑的心态,因为这个工具对科学计算各个领域的涉及面是何其的广泛,你基本可以想象,有一千个R用户,就有一千个领域专家,并且还是乐于分享与贡献的领域专家。然后,这个工具已经有太多为你准备好的东西,它们都在促使你去尝试它们,有一种探险与学习的心态,这样做的成本并不会太高。再三,它让你觉得自己可以在程序设计的过程中找到乐趣,因为R程序很容易写,但好的R程序需要锤炼,如《黑客与画家》的作者Paul Graham所说,一个优秀的黑客,不应当是一个泥水匠,按照既定的工序一块板砖一块板砖地把墙砌好,而应该像个画家,不断地往你的作品上添加东西,使它臻于完美。