标签 Haskell 下的文章

关于编程语言学习的一些体会

Learn at least one new language every year.
                                              — Andy Hunt and Dave Thomas

自己一直是“每年学习一门新语言”的忠实拥趸,曾先后认真地学习了HaskellCommon LispPythonGo等语言,对PrologScalaErlangLuaPHP也有一定了解。但几年下来,只有Python一门语言算 是真正被留在我的大脑里,用在了工作中。其他那几门语言留下来的只是一些思想了。这似乎符合了Andy Hunt和Dave Thomas在《程序员修炼之道》中对于这一实践目的的阐述:“学会用多种方式解决问题,扩展我们的视野,避免思路僵化和停滞不前”^_^。

即便是残存的思想,其实也并不深刻。要真正会运用新思维并非那么简单。一门编程语言从入门到精通,至少要经历学语法、做实践、用idioms(写出地道的代码)三个阶段。这让我深刻的感悟到:不以使用为目的的语言学习,都是在浪费生命

有精力多学习些语言自然很好,我迫切期待能拥有一个像“七龙珠”中孙悟空那样的“精神时光屋”呢。但现实中,人的精力是有限的,而我们要面对的计算机科学领域中的知识、技能以及问题却似乎是无限的。因此在“每年至少学习一门新语言”这一实践上,建议不要过于教条。 从编程语言自身来看,范型(Paradigm)是影响语言思维差异的主要因素,而编程语言的范型有限,主流的也就那么几种:命令式(过程式)、函数式、逻 辑式、面向对象等。每种范型的背后都有几种、十几种甚至几十种语言,我们其实没有必要都去学。从拓展视野的角度去说,从每种主流范式中找到一两门典型的语 言去学习就可以了。比如命令式的,我们可以选择C;函数式我们选择Haskell;逻辑式的选择Prolog;面向对象的选择Java等。

即便是从每个范型中挑出一门,你要付出的精力依旧不少,我们还要考虑其实用性:要以使用为目的。如果能将其用在工作中,天天与你相伴,被他人接受,自然最 好;退而求其次,你能找到一两个开源项目,并参与其中也是可以的,至少可以让你保持手热;如果这两点都无法做到,仅仅是凭借个人的热情与坚持,那是不会持 久的,若干时间后,你就会对其生疏,可能连基本的"Hello World"语法都记不得了。不过这个年头,思想也不能不要。在有剩余精力的前提下,挑选些牛人们极力“鼓吹”的语言,吸收一下其思想精华,说不定哪天就 能用得上,让自己和大家都感觉你很NB,抬高一下自己的身价^_^。记住:编程语言也是要拼爹的系出名门的语言(诸如Go、Dart等)自然得到更多的青睐、使用和推广,出位的几率也就高出许多,尤其是在目前新编程语言百花齐放的阶段。因此在选择有思想的新语言时,最好在这些名门之后中做优选。

这个时代喜欢“专家”,因此我们在一两门语言上务必要做到“精专”,这是会给你带来黄油和面包的语言。要专到什么程度呢?我有一个同事,什么问题都用C解决。他甚至为此写了个不小的基础框架,所有业务问题的Code放在框架中被回调即可,即便是这个问题用Python实现只需几行代码。

计算机科学的研究核心是什么?我想肯定不是编程语言,就好比社会科学研究的核心不是人类语言一样。我比较欣赏这样的观点:作为程序员而言,最重要的是去创造,而不是研究。我们应更多的利用已经掌握的语言解决现实中的问题。做 编程语言研究的人可能要了解各种语言的特点与实现方式,但对于大多数的程序员来说,其实我们只需要关注问题域:做底层平台开发的,关注机器模型、通信原理 以及OS原理和实现细节;做算法的,很荣幸,那才是正统的程序设计的核心;前端攻城师则更多关注用户的体验。而在这些解决实际问题的过程中,我们更多采用 的是“制式”的编程语言。即做平台开发的,一般用C,C++等系统编程语言,更多的考虑的是性能;做前端开发的,PHP/JavaScript不可或缺。 我们要考虑的是如何利用这些制式的编程语言去解决问题,而在这些制式语言上,我们要做到精通。

从新兴语言中借鉴新思想,然后在旧语言中实现新语言的特性,其实更多是在旧语言中实现了某 种语法糖,你爱吃,不代表其他人也理解也爱吃,还容易被人误认为是“炫技”。如果你是技术负责人,且经过评估,新语言十分适合这个问题域,那莫不入直接引 入这门语言,让大家都能使用到这门语言的新思想、新特性。

辩证的说,任何一种编程语言都有其利与弊,比如Haskell,纯函数式语言,变量不能改变,无状态,对并行处理具有天然的适应性,但在处理基本IO时却要编写难于理解的monad;而在命令式语言中,这种IO处理简直简单的不得了。

关于函数式语言,个人感觉未来若干年内仍难以大行其道,建议还是跟上命令式语言的演化主线吧。

跨越问题域学习语言,通常收获不大。一个做平台服务端,用惯了C的资深程序员,让他去学PHP写前端代码,估计是无法迸发出任何火花的。

以上是自己这些年关于编程语言学习的一些体会,比较零散,但希望能有帮助。

编程语言进入“拼爹”时代

近期看到一则新闻,说是Microsoft推出了一门开源的编程语言叫TypeScript,该Project的主要负责人是大名鼎鼎的Anders Hejlsberg,就是那个Turbo Pascal Delphi以及C#之父。结合近几年来出现的颇受关注的其他几门编程语言,如GoRustDart等,让我感觉到编程语言似乎进入了"拼爹"时代。

我们来列举一下这几门新兴语言的“老爹”(设计者):

* Go语言 – Robert Griesemer、Rob PikeKen Thompson
这里最著名也最NB的当属Ken Thompson,Unix之父,并与Dennis Ritchie一起创造了最伟大的工业编程语言C图灵奖得主。Rob Pike也是Bell Labs元老,Unix和Plan 9计划的参与者,Limbo语言的设计者之一。至于Robert Griesemer名气似乎小一些,我也不甚熟悉。不过有了前两位,想必Golang就会有足够的号召力了。

* Rust语言 – 来自著名的Mozilla Lab,其主要设计者包括Brendan Eich,Dave Herman以及Graydon Hoare。其中Brendan Eich是JavaScript语言之父。

* Dart语言 – 这门语言的最初两个设计者Lars Bak和Kasper Lund似乎并不著名,但这门语言背后有一个更大的后台,那就是在互联网搜索时代叱诧风云的Google公司。凭借着Google的号召力,围绕在这门语 言周围的Fans也应该为数不少。再考虑这门语言旨在替代JavaScript成为新Html5标准下主力Web开发语言的目标,Dart受到的关注一定 不少。

这里再顺便回顾一下编程语言发展的几个历史时期(个人的一点拙见)。

* 结构化时代
20世纪六七十年代,以C、Fortran、Pascal、Basic为代表的结构化程序设计语言的诞生,标志着编程语言进入了结构化时代。人们逐渐脱离 生产效率低下的汇编,而转移到中级/高级语言行列。最终C以其Unix平台语言的身份胜出,并以其简洁高效的生成代码在二十世纪末期在嵌入式领域独占鳌 头。

* OO时代
随着人们的关注点逐渐向问题域转移,人们迫切需要一门能对现实问题进行更好抽象的语言。面向对象语言逐渐进入人们的视野。代表语言包括C++、Ada、 Delphi、Java以及C#等。C++和Delphi因其卓越的性能以及不熟的IDE支持,在桌面程序设计领域(包括PC游戏领域)成为主角。 Java则在企业应用兴起后逐渐发展壮大,最终成为OO时代的No.1。

* Web时代
随着全球互联网时代的到来,诸多Web语言走到了前台,代表语言包括PHP、JavaScript、ASP等,另外一些轻巧且生产高效的脚本语言也开始被 大家所青睐,它们既能轻松完成系统管理的任务又支持Web开发,这其中的代表语言包括:Perl、Python、Ruby、Lua等。

* 新时代
这里暂且叫作新时代,这个时代有几个特点:
1) 传统语言不断翻新,融入新特性
C和C++于今年发布了C11标准;Java也给出了JDK8规范的发布时间表。在新标准中,这些传统语言也加入了一些适宜这个时代开发的新特性,比如函数范式以及对多核并行程序的支持。

2) 终端开发语言迅速崛起
随着iPhone和Android的迅速发展,终端开发语言逐渐壮大,最典型的代表则是Objective-C,依靠苹果公司这棵大树,与C++同时期的Objective-C仿佛坐着火箭一般迅速串升到编程语言排行榜前3甲的位置。

3) 函数式语言的回归
以Common Lisp、Haskell、Erlang等为代表的函数式程序设计语言重装归来,誓与传统命令式语言一绝高下。函数式范型语言的回归意义似乎不在于占领更 大的市场,而是在于其对后续新兴编程语言的设计决策的影响,甚至像C++这样的老牌OO语言在新规范中也加入了函数式范型的支持。

4) "拼爹"的新兴语言
就如上面所讲的,一些传统语言的设计大师汲取之前语言的设计经验和教训后,二次出手,设计出了以Go、Rust、TypeScript等为代表的新兴语 言,并且他们的号召力对这些新兴语言有着很大的影响。这些语言站在巨人的肩膀上,获得了重新的设计,使得语言能满足未来市场对应用程序以及硬件设备的要 求。这些语言将会是未来10年乃至20年间编程领域的主力。

目前的确是编程语言的一个新时代,更是一个百花齐放,百家争鸣的时代。作为这个时代的程序员是幸运的,因为有这么多优秀语言可供学习和选择;同时也是"不幸的",有这么多语言要去学习(当然也可以不学^_^)。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats