语言的标签——语言的生态系统

8 篇文章 0 订阅
   经常在论坛里看到讨论各种语言的孰优孰劣的帖子,比如c/c++比所有其它语言都快,比如ruby是最纯粹的面向对象语言等等。比如最近的帖子《好的工程师受语言局限很小》。这些帖子往往都能引来关注,就像CSDN的月经贴《TIOBE语言排行榜》或者浏览器份额排行榜一样,挖坑上分区或者上十大的利器。
   这些关注者大致可分为两类:某种语言的拥趸;无明显偏好的“自由主义者”。比如发表《好的工程师受语言局限很小》的作者应该就是后者。当然第一类人肯定更多,毕竟由于工作的原因和时间的限制,大部分人都对一种语言用的毕竟多,比较熟悉。
   从语言的多样性来说,后者可能一般水平较高,一般是“层次”较高的老工程师——他们工作时间较长,接触过的语言和平台比较多;要么他们可能做得东西相对不那么工程化,比如做科研的,编程语言只是一种工具,用什么语言来解决一个矩阵求逆差别不大(当然事实上也是有差别的,matlab上一句话可以解决可能c语言要写几百行代码,这其实就是后面我们要讨论的生态系统)。


   当然这只是可能性,不能说持第二种观点的就比第一种高明。其实很多“统计规律”都是有倾向性的,或者说统计这些规律的人有意无意的忽略了一些因素(而这些因素其实往往很关键)。比如这样一个观点:手动挡的司机比自动挡的司机技术好。从统计数量的角度来说确实如此,他们的统计数据没有问题。但是他们(有意或者无意的)忽略了一个事实:自动挡的汽车的历史很短,自动挡汽车流行更短。这样就没有考虑这样的事实:开手动挡的司机的驾龄平均来说肯定比自动挡的长。因此他们的统计数据或许只能说明:驾龄长的比驾龄短的技术好。这个结论是显而易见的。同样用这种方法可以“统计”出女人的驾驶技术不如男人等等。


   那你也许要问“你写这么多废话目的想说明什么呢?”
   上面的例子只是想说明:争论语言的优劣往往是有失偏颇的。就像很多人发论文比较自己的算法和别人的算法时花了两天实现了别人的算法(可能还有bug),而自己的算法光预处理数据就花了一周,然后得出自己的算法比别人好一样。很多人在争论语言的优劣时也是这样。他们可能在五年前尝试用过某种语言半天,然后就能像专家一样说这个语言怎么怎么难用(当然也有说怎么怎么好用的,可能是他用某个框架完成了一个其它语言也能完成的任务)。这些争论大部分没有价值。


   那么是不是我们就该认为用什么语言没有关系呢?当然不是。这就是下面我们要讨论的语言的生态系统了。


   我们在谈论某种语言时首先要考虑它所处的年代(用tg的理论来说就是历史唯物观)。
   比较早期的语言,比如c/c++,处于软件系统发展的早期,语言包含的概念可能就是纯粹的语法(可能加上少得可怜的标准库,还要看各种编译器厂商的脸色,看他们高兴不高兴支持),他们的生态系统就是各种操作系统和之上的流行库。
   到了java的时代,由于它是一家大公司的主导,再加上跨平台的目标,java语言不仅仅是语法层面的东西,还包括一个虚拟机的抽象,可以说java虚拟机就是java的基础生态系统。
   到了现在,几乎每种语言都有自己的生态系统,也在不断努力扩大自己的生态圈。当然某些语言可能更加适合某些生态圈,不管是历史的原因还是语言本身的能力。
   下面就我有限的所知(加上搜索引擎的帮助),来讨论一下各种语言的生态系统。欢迎大家纠错和补充。


   1. c语言
   它的诞生和发展最重要的环境当然是PC机,主战场的UNIX和后来扩展的WINDOWS,由于c语言本身紧密依赖操作系统,它的使用者需要了解操作系统的细节。而且它最早是用来实现操作系统的,因此它的用户一般对系统比较了解,比如你要做驱动开发或者嵌入式开发,你需要知道和了解硬件系统平台的特性,而这些应用对性能要求相对苛刻,所以开发c语言的工程师可能会比较注重细节。另外就开发者本身使用的工具来说,由于在UNIX是主战场,所以他们一般使用VIM或者Emacs这样的工具开发和调试代码,整天面对黑屏,给后来那些习惯IDE的人或者非IT人士高深莫测的感觉,或许人们心中hacker的形象就是这样?
   因此c语言开发者的标签有:底层;性能;hacker
   c语言的生态系统:操作系统,各种c开发的流行软件。


   2. c++语言
   面向对象版本的c语言?在语法上虽然兼容(或者大部分兼容)历史c代码是它的优势也是劣势。可能在那个年代对语法本身比较看重,所有的问题都想通过复杂的语法来解决。结果把语法搞得过于复杂,学习成本太大。而由于群雄逐鹿,很难统一标准,这就导致系统迁移成本极大。但不管怎么说,c++是面向对象迈向工业界的重要语言(虽然比不上smalltalk这么早),它的主要年代当然是八九十年代。那个时代是PC的天下,所以c++在图形库方面占据主导地位。与此相关的包括PC游戏领域。当然保持和c一样的性能也是c++的一个重要目标。所以c++依赖的也是操作系统
   c++语言的标签:复杂;性能;UI


   3. java语言
   我对这门语言比较熟悉一点,所以可能说得多一点。
   跨平台这当然是java最大的卖点(虽然现在很多语言都能跨平台,但至少当年是sun最早让它广为人接受的),另外和c/c++相比,它提供了丰富的“标准库”,这一点后来被多少新的语言接受。新的语言一般也就是一两个人或者机构搞起来的,所以不用像c/c++那么多历史包袱,也没那么多编译器厂商的扯皮。学习java不仅仅是学习它的语法,也包括它的“标准库”(甚至开源的主流库),比如java的学习者很少会考虑自己实现string或者list,自己考虑字符编码和国际化,包括网络编程和文件系统,正则表达式,数据库等等。但是学习c++很多书都会用实现string来讲解各种c++语法,比如模板,运算符重载,内存管理等等。当然c++后来也有很多开源库来实现通用的功能,但是由于都是“第三方的非标准库”,所以迁移成本极大。当然,想apache FSF这样的“权威”第三方机构对java也帮助很大,很多apache的库都成为“事实”的标准,比如log4j,另外包括java的开发工具,比如ant和maven,junit,hudson都是几乎“事实”的标准。这可能跟sun比较支持开源有关,当然也有一些其它原因,比如java后来的主战场是Web开发。Web开发本来个PC开发的盈利模式不同,PC靠买软件,当然不能把源代码随便给人;Web是卖服务,很多公司都鼓励开源自己的系统(其实也是免费找人测试,O(∩_∩)O~)
   Java的年代当然是互联网发展的年代,所以早期的Applet和后来的Web开发成为其主战场。Applet本来挺有前途的,可惜各种原因败下阵来。现在Oracle重整旗鼓想搞javaFX,我认为时代不同了,环境也不同了,希望甚是渺茫。
   后来Java的主要领域就变成了Web开发,在加上各种Web框架的流行,让开发者的大部分工作变成了写配置文件,当然这不是什么坏事情,就像微软让很多开发者变成拖放控件者一样。这样降低了门槛,当然就导致大量从业者涌入,中国本来就最不缺人(现在貌似渐渐有点缺的趋势了),结果当然是大家觉得java开发者水平相对c++较低。对于Java语言来说当然不是坏事,就像Windows用户的平均水平肯定比Linux的低一样(当然这里的水平高低是指计算机的水平,如果按照薪水来比可能还是做excel或者ppt的高,呵呵)。但是我们很多人由此认为所有的Java开发者都比C++的低,就像马龙一听到用windows,就鄙视一样。
   随着移动互联网的发展和Android使用了Java之后,未来Java除了被打上Web开发的标签外,移动开发可能也是一个显著的标签。
   此外,Java提供了一个JVM,相当于一个虚拟机和操作系统,因此之上衍生出很多语言比如Scala,Groovy,Clojure等等,它们想利用java的生态系统来彰显自己的优点。此外还有jython,jruby这样的互相利用的语言。
   Java开发者的标签:Web开发,体力马龙,非科班(培训班),android开发


   4. Perl
   提到Perl,我个人最先想到的就是正则表达式,后来很多语言的正则,包括Java,都声称模仿perl的,包括流行的pcre,翻译过来就是perl兼容的正则表达式。由于UNIX的设计其实就是文本的接口方式,主要是shell,系统配置都是纯文本文件,处理文本文件就成了这个环境下开放必备的知识。vi,emacs,seed和awk等都是用来编辑或者处理文本文件的。很多人学习shell或者bash这样的脚本语言时会觉得它们处理数值太弱了,做个整数加法都有$(),而变量只有字符串(文本)类型,这里可以看出文本文件在UNIX世界的地位。
   在UNIX世界,事情是由一个个功能简单但好用的小命令拼接起来的,光靠管道的帮助很难完成复杂的系统运维,这个时候Perl的文本处理能力就体现出来了,所以提到Perl,除了处理文本(正则)的能力外,我们更多的会相对系统管理员这样的角色,他们用天书一般(至少对我来说是这样)Perl优雅的完成了这些枯燥而乏味的系统管理工作。当然现在它的这个角色又被Python取代的趋势。当然在互联网的早期,CGI也是比较重要的角色,但随着PHP,JSP和ASP的崛起,Perl也慢慢退出了这个领域。当然Perl还有一个不错的就是CPAN,当然现在很多语言比如Python,Ruby,Java甚至包括各种Linux发行版都有提供集中的库(对于Linux发行版来说是包管理器)管理平台,这样方便大家安装。更不用说苹果的App Store或者各种手机助手了。c++在这方面相对就比较弱一点,主要原因当然就是山头太多,没有权威标准和“事实”的标准。
   Perl开发者标签:UNIX系统管理员,op,文本处理


   5. PHP
   一提起PHP,那肯定是用来做网页的,当然也会有人闲得x疼用来干点别的。PHP的流行得益于互联网的发展,尤其是个人网站,论坛和博客。其中托管服务器功不可没。在互联网的早期,个人网站(甚至一些小公司)拥有自己的域名和服务器是件很奢侈的事情,那么大家共享某些公司提供的Web服务器就是不错的主意了(现在的云计算和这些比也没有特别创意的东西,可能技术上更成熟而已)。那个服务器的标配基本上就是LAMP——Linux+Apache+Mysql+PHP,现在这个P也可能变成了Python或者Perl,但是更多的人是用PHP。其实这4个哥们也是互相促进的,如果没有那么多小网站的需求,Mysql也不可能如此流行(他们对性能和业务的要求并不高,所以即使早期的mysql的ISAM不支持事务也不影响)。国内很多网站的CMS和论坛都是PHP的开源工具做的,比如Discuz!,真是风靡一时。其实很多PHP的开发者都不是科班马龙出身,只是想做个网站或者运维一个论坛,所以PHP的很多系统基本不需要写什么代码。它们大致的思路是用mysql存储网页内容和格式,然后通过模板这样的东西来配置显示样式,然后生成静态的网页。当然随着网络的发展,也有一些系统引入了动态的特征,比如可以让用户写点简单的sql和javascript等等。
    用水木的话来说,PHP就是“糙快猛”,事实也确实如此,很多PHP开发者或许没听说过sql注入,直接拼个sql当然很快很爽,直接在一个PHP文件里写上几百行代码也是很常见的事情。JSP在早期可能也和PHP一样,但是随着各种框架的流行,JSP马龙也逐渐变成写配置文件的了。国内甚至很多培训PHP的直接教人使用Discuz!和一些CMS的使用,所以会给人以低调和业余的感觉
    PHP开发者标签:糙快猛,CMS配置,业余


    6. VB/VFP/VC++
    或许很多人可能不知道或者先不起来VFP是什么,是的,除了遗留的系统,估计很少人会去使用它了。VB/VC++可能也会如此。
    也许很多人会争论VB和VC++是否能算一种语言,他们会说Basic和C++才是语言,VB和VC++只是IDE。这么说也没错,但是很多VC++的人估计根本分不清这些概念(也不需要区分,他们不会去Linux上开发c++代码,也不会使用Borland C++ Builder,甚至他们固定的使用VC++6而不是别的版本,新的版本对他们来说和新的语言没有太大区别)
    我最早学习的语言就是VB,那个年代编程序主要就是做个图形界面,要是能做个俄罗斯方块游戏那就是大牛了。通过托放点击就能完成UI的设计,这是微软的目标,也是微软的标签了。那个时候很多开发就是做一个MIS,后台是个数据库服务器(一般当然也是微软的SQL Server,当然也有用Access的),然后前面是个UI,可以对数据库进行增删改查,当然会select的都是高手了,更不用说能区分inner join和outer join的了。不过一般也不会那么复杂,一般直接select * from就ok了,所以微软封装的sql都不用写,用它的各种“控件”就行了。当然要完成复杂的逻辑还得会一点点sql。
    当然除了UI,计算机也得真正干点有用的活,这是解释执行的VB就有点慢了。于是VC++就来填补这个空白了。当然这时不能不说说MFC,当年将近一百RMB买的深入浅出MFC(这辈子不会看明白了)。 这个复杂无比的UI库(主要是UI相关,但是也有其它很多系统调用的封装)让无数初学者望而生畏。怎么让一个按钮显示个自定义图片,怎么截获这个事件,PostMessage和SendMessage有啥区别,怎么弄个圆角控件,IDE生成的代码千万别乱删,删完都不知道怎么恢复,只能重新建个工程,调试的烫烫烫。。。 欧卖糕的。
    VB的标签:托放控件,菜鸟
    VFP的标签:想不出来了
    VC++的标签:MFC,DECLARE_XXX宏


    7.C#/VB.NET/ASP.NET/VC++.NET
    说实在话,c#挺好用的(用得不多,只是试用Infer.NET是学过一点点),对于一个熟悉java的人来说怎么感觉这么面熟呢,是的,微软的山寨和微创新还是挺强大的,据说当年还搞过一个VJ++。延续了客户端代码的风格,不过这次把战场开辟到了Web开发。所以很多人一提起.NET那就是拖控件的。本来JSP做前端的就被做后端(可能做后台的认为自己是后台老板,哈哈。有人会声明说我不是做前台的,前台MM才做前台!)的鄙视,托控件连javascript都不写的那自然更要被鄙视了。
    c#/VB.NET/ASP.NET标签:拖控件的
    VC++.NET:尴尬的语言,如果纯粹托管的代码,那不如用c#,老人们估计还在坚守vc6吧




    8.Python
    提到Python,自然会在后面加个脚本,比如我在写Python脚本。因此Python有逐渐提到其它脚本的“粘合剂”的作用。毕竟shell和Perl太难学了,Python替代它们还是不错的选择。除此之外,随着NumPy,SciPy,Matplotlib这些库的兴起,Python逐渐有取代Matlab/Octave在数学上地位的趋势(参考http://java.dzone.com/articles/how-python-became-language  How Python Became the Language of Choice for Data Science),好像原因之一就是matlab收费越来越狠,很多人开始用octave和python了
    Python的标签:科研人员


    9.Ruby
    提到Ruby,估计更多人会想到ROR框架。如果没有Ruby On Rails,估计很多人不会知道Ruby。所以这也印证了本文的观点:语言的生态系统很重要。但是光靠一个ROR估计很难让Ruby发扬光大。(当然我没用过ROR,看过一点点Ruby,好像meta programming和DSL可能是其亮点),我不是很了解,就不多评论了,欢迎补充。
    Ruby标签:ROR,追求新鲜的小众


    10.Javascript
    一提到Javascript,很多人都可能深恶痛绝。随意的语法和各种浏览器兼容性问题(其实ECMAscript本身相当规范,但是javascript的生态环境就不规范了,IE6和IE8差别不亚于IE和Firefox)。但是不管怎么样,这么一个不完美的语言经过各个派系的糅合(从最早的Netscape和IE之争,IE和Firefox之争,到现在Chrome的加入)变成了Web前端开发的标准语言,不管你喜欢不喜欢,你都没法回避它。当然随着各种js库的流行和各种调试开发工具的流行,开发javascript可能会稍微轻松一点了。但一说起开发javascript,可能想到的就是苦b活,能躲多远算多远。事实上javascript开发也有很多高深的活,除了要摆平各种浏览器的不兼容性,性能上也有很多可做的事情,比如随着ajax的推广,前端的性能也开始受到关注,甚至需要根据浏览器优化。在加上google发布的V8引擎和微软IE的发力,javascript的性能也有显著提升(其实我个人的观点:语言本身在性能上差异是不大的,关键是优化做的怎么样,优化当然包括编译器的优化和语言的使用者的优化),javascript甚至挟Node.js这样的环境,竟然有前端想抢后端饭碗的不轨意图!(O(∩_∩)O~)
     Javascript开发者的标签:苦逼


    最后来说一下公司(主要国内)对各种语言发展的影响吧。
    现在最大的三家互联网公司BAT当然对国内IT业有这影响深远。很多中小公司都是从大公司挖人,当然也包括他们使用的技术和开发语言。
    百度是做搜索引擎的,最核心的引擎是c++实现的,这样就导致很多做搜索的公司可能会使用c++,包括360和搜狗。但是c++有个缺点,就是没有强大的标准库,所以你即使从百度挖了几个人过去,也不可能把他的代码带过去。要么重新开发一套,要么使用开源的,如果让他们选择,估计是sphinx的居多。虽然Java的Lucene和Solr用户可能更多,但是他们肯定会选择c++版的。当然除了搜索引擎,百度还有一些强项,比如广告系统,因此现在很多公司想做自己的广告系统估计会优先考虑c++。
    阿里是靠淘宝这样的电商起家的,所以选择java是比较自然的选择(好像最早是php?),这样就让人觉得java适合做电商,所以像京东这样的也从.NET切换到了java,比较从淘宝挖了的人肯定不愿意写.NET,而且互联网行业节约成本,老用盗版windows也不好。
    腾讯qq起家,当然做GUI,尤其是Windows下的GUI至关重要,所以肯定是Windows下的c++开发。不过随着微信的崛起,可能Android和IOS讲更加重要了。


    google除了c++,python似乎也用得比较多,所以很多人学习python似乎为了是去google找工作。不过怎么样,google对python的发展还是作用不小,包括google力推的Google App Engine都是支持python,另一个是java。
    
    doug cutting,这不是个公司,你或许没听说过他,但很可能听说过hadoop或者lucene。他给java扩充了云计算的生态系统,我觉得oracle应该感谢他。国内很多公司,包括百度腾讯中移动等都在用它(或者它的修改版)。当然很多人觉得java太慢(相当于c++),经常会有一些云计算的创业公司声称自己实现了比hadoop快xx倍的map-reduce框架来忽悠风投。我在这里不想讨论他们的速度是否如他们说的那样。其实对于一个应用来说,生态系统真的很关键,大家都熟悉了mysql,你说postgreSQL比它好没用,除非一个场景mysql解决不了而postgreSQL能解决。更不用说那么多基于hadoop活与之相关的项目了——hive/hbase/pig/Cassandra/Mahout...。包括Amazon的AWS都能跑hadoop,微软的Azure据说也要支持hadoop


    Apache ASF 很多java“事实”标准库的资助者,其重要性不可以类别GNU对Linux的作用。不用把这个基金会和Apache Http Server搞混了,后者只是ASF的一个项目。
    
    Facebook,似乎很多php开发的,比如HipHop for PHP,自己优化的PHP虚拟机。也有一些java的,比如他们贡献或使用的Cassandra,Hive等


    Twitter也使用了hadoop相关的系统,比如Cassandra, Hadoop, Lucence, Pig,他们也贡献了Apache Mesos给Apache。


    所以我要是oracle,我一定会加大对像hadoop这样的生态系统的支持的,不过oracle比较是卖oracle数据库和服务器挣钱的,自然不能指望他了。


    当然说了这么多,都是我个人的看法,肯定是有偏好的。
    不过不管怎么样,如果有时间的话,还是有必要多学几门语言的。多学习一些人类语言,你就能多了解更多的文化;多了解一些编程语言,你就能享受更多人的智慧,尤其在这个开源文化流行的年代。
    但是学习语言毕竟是花费时间的,千万不要为了学习语言而学习,而是要看你需要什么而学习。你需要了解这门语言的生态系统,你是否需要在这个生态系统里做的事情。而不是从谁那里听说这个语言的语法多么优雅而学习,这是我的看法。
    总结一下就是:尽可能多学习不同语言;挑选语言的时候更多的考虑它的生态系统。
    
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值