你喜欢什么编程语言?

标签: Life & Thinking 交流 | 发表时间:2011-07-24 20:31 | 作者:wentrue Sean
出处:http://www.wentrue.net/blog

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所说,一个优秀的黑客,不应当是一个泥水匠,按照既定的工序一块板砖一块板砖地把墙砌好,而应该像个画家,不断地往你的作品上添加东西,使它臻于完美。

关于作者
阿稳, 豆瓣, 算法工程师
推荐系统;数据挖掘;算法架构及实现的可扩展性;R环境编程 如果你的问题已经能从我的博客中得到解答,就最好不过了:http://www.wentrue.net/blog/
您可能也喜欢:
BejingOpenParty溪窗听雨见闻2009-08-29
重返OpenParty
BeijingOpenparty秋色连波2009-10-31
2009年北京Python用户组聚会BPUG@douban
无觅

相关 [编程语言] 推荐:

[转][转]Clojure 编程语言

- - heiyeluren的blog(黑夜路人的开源世界)
简介: Lisp 是一种编程语言,以表达性和功能强大著称,但人们通常认为它不太适合应用于一般情况. Clojure 是一种运行在 Java™ 平台上的 Lisp 方言,它的出现彻底改变了这一现状. 如今,在任何具备 Java 虚拟机的地方,您都可以利用 Lisp 的强大功能. 在本文中,了解如何开始使用 Clojure,学习它的一些语法,同时利用 Eclipse 的 Clojure 插件提供帮助.

如果编程语言是汽车……

- 康爷 - Wow! Ubuntu
原文: If programming languages were cars... http://www.cs.caltech.edu/~mvanier/hacking/rants/cars.html,有筛减. 本文是一系列把编程语言和汽车对比的老笑话合集,添加了几种最近流行的语言. 注:似乎 Digg/Reddit/StumbleUpon 对本文进行了挖掘/阅读/踩,结果我收到了一大坨儿的新建议.

如果编程语言是一条船…

- will - cnBeta.COM
Turing绝对是一个双人皮划艇.

杂谈现代高级编程语言

- 卡飞菲 - Yi Wang's Tech Notes
几个月之前,Slashdot转载了Robert Harper教授的一篇博客,说卡内基梅隆大学计算机系把”面向对象编程“从大一新生的必修课中删掉了,其原因是. 这两个原因(anti-modular和anti-parallel)都是很重的指责了;尤其是anti-modular,因为OO的基本思想通常被理解成“封装”,从而实现模块化.

你喜欢什么编程语言?

- Sean - 不周山
OpenParty回来,重看了一下自己的讲稿,觉得还是挺乱的,想传递的东西很多,仓促之间也没有把内容组织好,对周六冒着桑拿天赶到现场,还在一间没有空调的挤了一百多号人的房间里听我唠叨了近一个小时的同学们深感有愧. 这里摘要一下,也许能同时弥补一下因为我口音不纯带来的表意不清. 其实主要是两部分的内容,一是我认为R能极大提高算法与数据工作人员的快乐程度及工作效率;二是R的发展历史中呈现出来的六张面孔.

年度编程语言锁定Objective-C

- ndv - 《程序员》杂志官网
虽然2011年才刚过半,但随着iPhone和iPad平台市场领导地位的确立和Apple各系统不断推陈出新,从市场占有的趋势来看,Objective-C成为年度编程语言无疑. TIOBE编程语言排行榜每年初都将统计评出上年度的最佳编程语言大奖,获奖的编程语言被认为在该年度市场份额增长及用户认可度方面获得了最为突出的成绩.

Google将宣布新编程语言Dart

- 李龑 - Solidot
Google的两位工程师将在下个月举行的Goto软件开发会议上宣布一门全新的编程语言Dart. 这门新语言是为结构化的Web编程设计的,适用于开发基于浏览器的Web应用. Google还没有透露Dart的任何技术细节. Google在2009年曾发布了主要针对服务器端的Go语言.

编程语言之间的界限

- - ITeye资讯频道
Cory House是一个软件开发者,笃信清洁代码和务实开发. 最近他总结了不同的编程语言之间存在的界限规则,他还认为不了解编程语言之间存在的界限无异于选择错误的开发工具,要想简化、加快软件开发过程,了解语言之间的异同是必不可少的. 如今开发者有很多种途径去解决编程问题,不管是利用大量的类库还是各种各样的技术工具.

异步编程语言的常见坑

- - idea's blog
天生支持异步编程的语言如 NodeJS, Golang 等, 创建一个异步 routine 的成本非常小, 这确实是一个非常方便的功能. 比如用在网络爬虫程序的开发, 对于每一个要抓取的 URL 就启动一个 routine, 类似启动一个线程, 既能充分利用 CPU 多核, 代码也很简洁.. 正因为太方便, 所以常常被滥用, 并引发许多严重坑.

Peter Norvig:编程语言的选择并不重要

- jeff - python.cn(jobs, news)
Lisp被许多资深程序员视为编程语言中的圣杯,因为学起来很难. 著名程序员、最热门的技术问答网站StackOverflow创始人Joel Spolsky曾经在“Java语言学校的危险性”一文中说,自己当年在大. 学里学习用Lisp的导论课程也是苦不堪言,而Lisp这样的函数式语言实际开发中并不常用,但是一旦到了体现优势的时候,你如果不懂,将失之千里.