最近已经开始渐渐改变自己的生活习惯了,现在是凌晨1点12分。已经有一个星期没有熬夜到这个点了。突发奇想,写一篇关于编程语言的BLOG。
允许我装装逼
我们应该选择什么编程语言? 相信业界的人很多都听说过PHP是最好的语言这个段子。它到底是不是最好的语言呢?我觉得这个东西很难找到一个标准。举些例子来看看?
C语言
如今世界大部分软件都是由C编写。操作系统也是由C语言编写。但是我们能够说C语言是最好的语言吗?他的强制类型约束,以及虽然本身很简单,但是要写好C语言需要付出可能比其他语言更多的时间,特别是相对于动态语言如javascript和python这些语言来说更是如此。这使得许多人对C语言可以说是望而却步。从编程易用性来说它就不是一个很好的选择。
JavaScript
我们来看看JavaScript,我个人并没有资格来评价这门语言。因为我对他的接触并不是很多, 只是平时有用JQuery写一下前端代码。现在看看JavaScript它的覆盖面积已经不是我们这些写后端代码的人能够想象。各种不同场合的框架Node.js, Vue.js甚至连桌面端都出来了,更坑爹的是它居然以后还能用来玩转VR。这。。。。。。有人统计在GITHUB上代码量覆盖率最大的是JavaScript。它作为ECMASCRIPT的一种实现,似乎现在也就只有它这一种实现,几乎所有新的前端语言,最后都会转换成javascript再被浏览器解析。这已经不是一般的垄断了。-.- ES6感觉会吸引更多的人到这个阵营来。这看起来这门语言正在引领我们世界的潮流。但是说起脚本语言,那些看不起脚本语言的人总是拿它的性能说事。。。。。这个。。。我们后面再聊。
Python
看看Python,这是我大学快毕业的时候选择它作为我工作的语言。很幸运的,能够靠掌握它找到工作一份可以养活自己的工作。并且已经用它开发了一年了。(T_T终于不用写Java了)Python这个东西确实是很简单(当然说的是入门了)。而且很容易就可以用它编写出Web程序,它有各式各样的web框架,tornado, django, flask?我一直都很喜欢这门语言,它的库简直像社区说形容的。像电池那样,要用的时候很方便就能够加入到代码里面去。现在说说它比较奇怪的地方,据说它的作者为了整合一些规范的东西,Python搞了两条分支,一条2.7.X 一条3.5.X,当初毫不犹豫地选择了2.7,因为我发现个人比较喜欢2.7的语法,起码打印不需要加括号吧。比较简练。如果写Python需要考虑到兼容性,不得不写上不少额外的代码,还好这方面还不算太复杂。Python有很多工具包都为你提供的工具来让你可以更加轻松地写出兼容的代码。还有就是Python有很多优秀项目可以供我们学习,由于太多了,所有有选择困难症的我,一直也没找到自己想要投入的方向。(可能也跟本人的浮躁有很大关系吧)。另外要提一下的就是Python的元编程能力。我不知道Python3怎样。Python2的元编程能力我只想加个….。并不是说它不能进行元编程。只是相对于Ruby这些语言来看,Python的元编程的语法实在是不那么优雅,如果想玩玩元编程的话,而且又是个比较喜欢优雅语法的人。Ruby或许是更好的选择。
Ruby
Ruby这门语言一直是在业界比较受好评的语言。我个人也很喜欢,我曾经一度想转到Ruby阵营去,以后有时间可以作为兴趣来继续研究。上面说了Ruby的元编程。它的元编程能力确实很不错。可能这一点继承了Lisp那边的思想吧?它的猴子补丁这个特性让人又爱又恨。你可以在任何地方重写一个类的任何方法。比如String类。这样可能会修改原有类的行为。这个比较危险,但是对于喜欢捣鼓东西的黑客而言,这种特性可能更加符合一个黑客的性格吧。如果时间允许真的是极力推荐这门语言。我现在也只是看过它的两本书。只能说是略知一二吧。不得不说的就是它的ROR框架(Ruby On Rails),用来搭建网站真的是一流,特别是你不想写太多代码的情况下。它能够帮你生成很多东西。比起Python阵营里面比较流行的Django开发框架。ROR搭建起网站来更有效率,更简单。另外,他十分重视代码生成这方面的东西。一个个人感觉它比Django要出色的地方是,在URL设计方面它会比较关注RESTful风格,当你用ROR定义一个模型它可以生成对应的RESTful风格的url(一般都是增删查改),也让一些初学者能够方便地体验一下RESTful的风格吧。另外测试方面,当生成一些models,或者views框架本身会顺带地生成对应的测试脚手架。能够方便开发者编写对应功能的单元测试。这方面Django做得相对没那么完善吧,看起来似乎也没那么重视测试方面的东西。这门语言,我还是比较推崇,只是它的能力太强了,你可能不小心就会修改到一些会让你感到意外的东西。所以选择也要三思。
Elisp
这门语言可能大家都很少听过吧。像Javascript是ECMAScript标准的一种实现,Elisp也是lisp方言的一种实现。lisp方言有很多,这里不一一举例。国外的程序员十分推崇lisp。它的函数式编程风格让很多程序员无法自拔。更重要的是它的思想,能够编写出灵活性,品质都很高的软件。(伟大的Emacs编辑器已经很能说明问题了,它跟C语言就是Emacs的主要开发语言。[估计也没有第三种语言了吧]),而我个人也在用Emacs编辑器,顺带地也学习了一些Elisp。不过学得并不是很……(好吧,真的很菜)。只是勉强还是能够看懂一些代码的。我的一些Emacs配置是在参考别人的Emacs配置的基础上把看得懂的摘抄了一些下来。勉强能应付现在这种强度的配置插件开发吧。不过生产环境上几乎没什么用,也没有什么公司会拿它来搞。(当然指的是国内的公司),国外的公司就不好说了。看过《黑客与画家》的朋友应该知道本书的作者工作的时候就是用Lisp来进行开发的。而且开发出了灵活性很高的系统。国内现在貌似有个用的挺多的Erlang,也是函数式风格的编程语言。(T_T这个没有深入了解过,不好说。)
还有啥?Java, C#这些语言我没什么好感这里就不详细说了吧?可能因为第一印象就不好吧? (原谅我,当初在学校的时候被逼着学,现在已经不想搞了T_T)所以可能我没办法很客观地做出判断,惹怒他们的粉丝就不好了吧?
哦,忘了这里不能不提一下Go, 这是一门Google大大研发的语言。C语言的其中一个发明者也有参加它的研发。
GO
接触这门语言,是因为之前业务上需要,看了一下Etcd文档,还有公司一直在推Docker,而且经理也时常提起,说以后估计有些服务需要拿Go来写,这让我看到了升职的希望了(当然这是开玩笑),我当初只是抱着试一试的心态来玩了一个星期。从表面上看这门语言要比静态语言要弱类型一点,它可以a := 5
来直接赋值,而不强制需要赋值之前声明变量类型。直接通过命令行go {filename}
就可以编译并且运行这个程序。没有C语言的那种繁琐的编译->链接->运行。然后它没有面向对象类这种说法。它只是定义一种类型,但是不会一定要实现对应的方法。它可以通过额外编写方法,通过打补丁的方式加到这个类型的实例中。其实这种感觉就有点像Ruby的单例类的做法。初始化一个类型的实例,然后把需要的方法绑定到实例中,而不需要调整原有的类结构实例也能运行这个方法,只有目标实例能够调用绑定的方法。(好吧又扯到Ruby去了。T_T),如果要说这门语言有什么不好,我实在想不出来,因为我只接触了一周,不了解。况且我个人不喜欢它的语法。像C又不是C,有些奇奇怪怪的机制真让人有点琢磨不透。
如何选择
上面说了那么多,只是自己对一些固定语言的看法而已,是不是看起来很吊的样子。其实一点都不吊,只是一个技术摇摆人的一些经历而已。搞了那么多其实也没找到自己的路,或许真正属于自己的路,是最原始那一条,只是浮躁的心态影响了自己的判断罢了。(当然我指的是编程语言)。不一定所有人都看得下去,但是哪怕有那么一个读者看到了,而它又在我的Blog里面看到语言的介绍,可能有助于他找到合适自己的语言吧。如果是这样,这个长篇大段就有点儿意义了。
现在我真不觉得这个世界真的有最好的语言。如果世界真的有最好的语言那估计就是那一门最适合你的语言了。世界的东西都是入门容易,精深困难。我对编程语言失去兴趣,很多时候是用它的高级特性的时候觉得复杂,如果这个时候重新去学一门语言的话,入门会很简单,有成就感,这就会让人认为这门能让自己找到兴趣点。但是我敢保证很多时候这只是浮躁心理而已。就我自己来说就算换了一门语言,也不能解决根本的问题,因为这门语言也会有难点,也会让你觉得疲惫的,这些是需要自身努力克服吧。(如果真打算走程序路线的话)。多学几门语言是没错,但是不要让学习新的编程语言成为自己逃避现实的接口。
拿性能来说事?
有人说编译型语言快(C, Java, C++),解释型语言慢(Python, Ruby, Javascript),我这里不得不说的是,我们真的已经到了因为语言影响到软件性能的地步了吗?相信很多人都还没到这个程度了吧。我这里不得不引入一个带我进Python这条水沟的一个大牛说的话(好吧我也不知道他是不是真的大牛,反正我就觉得他很牛) “我们只要满足那百分之80的功能就够了,剩下那百分之20的性能问题。在很大的情况下其实关注的人群并不多,况且用脚本语言写出来的页面,很多情况下跟编译型语言性能差距在当今计算机已经看不出来了。”,意思大概就这样。就这样我果断入坑了。我觉得吧,不要让性能成为我们不学习脚本语言的借口,这世界上不是只有Java(我觉得如果大学的教授能看到这些就好了T_T),多了解一下脚本语言其实有助于培养我们的抽象思维。因为不用在思考的过程中过多地考虑数字类型取值范围而分散了注意力,还可以更快地构建原型。所以无论业界的人同不同意我都得说一句别总拿性能说事,不是任何时候都要从语言层面上去考虑性能问题的。学点脚本语言对于一直用编译型语言的人来说绝对有好处。
程序员鄙视链
很多人选择编程语言,可能会有这样一个情况? “哇,你用Python?很cool!!”, “你们还在用Java?然后一脸的嫌弃….”。我们选择编程语言可能也会在意别人的世俗的眼光,总是希望自己能选择更好更酷的语言。我也承认我当初选Vim Emacs作为我开发工具时候也是觉得这个东西很酷。起码别人看起来也会很酷。现在我不是站在鄙视链的最高层,也不是站在鄙视链的最底层。我觉得对于语言的选择我觉得真的要合适才好。其实我在语言的探索上花了整整一年的时间寻找更好的语言,更适合自己的语言。所以才有了今天这篇文章。我承认作为一个传统的中国人我一直很在意外界的看法。只是后来我发现选择编程语言这方面已经渐渐地变得不纯粹了,除了想成为高手之外,还有就是想得到Cool这样的感慨。说实在的,作为程序员这种想法要不得。程序员是个很神奇的岗位,它应该是更纯粹的。一切都应该随着我们的内心而走。而不是外界给你的,或者自己觉得外界会XXX来影响你的判断。我们都有自己的性格爱好,以及偏爱。这也算是给自己一个交代吧。语言不用别人看起来很酷,合适就好。我现在也没有觉得Java有多酷炫。但是有人用它写出很多了不得的东西MySQL, Hadoop, 我前段时间搞的Zookeeper。站在鄙视链哪个地方并不重要,重要的是这个地方是否合适自己。你高级你就鄙视我吧,哈哈即使有很多工作赚得会比程序员多,而我现在做程序员也做的并不出色,但是我觉得这个岗位就挺适合现在的我。所以我还是会坚持写程序,即使我现在不是一个合格的程序员。但是经过这一年的摇摆期,我觉得我还是会坚持下去。即使摇摆一年但我至始至终都没有想过要脱离程序员这个职位。它就适合我啊。
文章读者
很少这么长篇大论地说,这篇文章与其说是发给广大程序员看的,倒不如说初衷是给自己还有自己的好朋友看的。这一年来我们两个跌跌撞撞,也搞了一些小东西,但是最终就没有坚持下去。开始为了一起搞东西,还学了同一门语言。不过最后还是没有搞下去。结果在语言层面上最后分道扬镳(只是语言层面上)。我选回了我的Python,他就准备借着Ruby的势头奔向更好的明天。我又何曾不想拿起Ruby这把剑走康庄大道呢?但是我觉得这只是我懦弱的表现而已。如果我学一门东西都没能够坚持下去,就算换一门语言其实结果还是一样的,这只是逃避的做法。我花了一年的时间才意识到这点。所以我决定坚持走的Python之路。其实这看似失败的经历,又真的毫无收获吗?这一年来深受打击,即使我们都不是出色的程序员,但是起码我们还有勇气在程序员这行干下去,因为我觉得我们真的适合继续这样干。以后会不会很出色,谁知道呢?有的时候就是想太多才会焦虑吧。为什么不活在当下呢?专心搞自己想搞的东西就好了。(这里有点鸡汤了-.-)
其实语言这条路看似很窄其实很广,有的时候需要在幽暗的小径继续走下去才能够柳暗花明啊!!。工作的主管也看出了我的软肋,所以也是建议我能花多点时间在一个领域稍微精深一些,或许会有不一样的收获。而不是朝三暮四,了解新技术固然是好,但是总是吃着碗里看着锅里其实对于自己的成长别无好处。这篇博文有点啰嗦,不过都是自己这段时间的一些想法。还有为自己的沉淀拉开序幕吧。语言这个东西没有什么判断标准,还是那句,选择适合你的。然后那就是最好的语言了!!!。