分类“Web开发杂谈”的存档

共 2 页: [1] 2 » | 下一页»

Web开发杂谈(1) —— 学习开发的三个层次

2009年04月18日 星期六

由于我们现在的内容已经不仅仅在Web设计这个领域上了,所以新开一个新的系列——“Web开发杂谈”,讨论开发相关的话题。

有不少读者和网友经常地留言,问类似这样问题:“我没有相关基础,我应该学习什么课程?”,或者“我没有相关基础,我能学会某某技术吗?”“我不是计算机专业的,我能学会编程吗?”

作为这个系列的第一篇文章,就来谈谈我个人的一些想法,回答这个问题,和读者分享一下。

一、概述

就像刘欢可以算是咱们中国顶尖的男歌手了吧,他可是没上过任何音乐院校。所以上不上大学,以及上什么专业,都不是关键的问题。但是绝不是说,你什么都不学,就可以做技术开发工作

我要说的是:如果打算做开发工作挣钱养活自己,可以什么学都不上,但是该学的东西都得学,一样也不能少,捷径是没有的,想绕过基础课,直接学习所谓“有用”的东西,是不可能的

首先,任何技术工作都是需要一些基础的,获取这些基础知识和能力的最通常的方法,是上大学的相关专业。但是中国的教育现状,使得上大学和寻找自己的兴趣,这两件事往往无法统一,所以出现了很多学非所用,和用非所学的情况,这是很无奈的事情。但是需要指出的一点就是,无论要做什么,都是需要一些必须的基础知识,或者说,更重要的是一些基本的思想方法的。

各个职业之间所需要的思想方法和技能是不同的,因此,如果你希望进入一行,就应该先踏下心来,把这一行所需要的基本知识和思想方法掌握,无论你在大学是不是计算机专业,如果想做这一行,就应该(必须)把一些基本的课程掌握。

现在的一个现实情况是,很多朋友希望学习一两本书,就能作很大的事情,能做很牛的事情,这个是不现实的,任何知识和技能体系的建立都是一个综合、按部就班的过程。你要相信一点,大学四年的课程一定不是在浪费时间。除非对于确实天才的人来说,有可能是浪费时间,比如对于比尔盖茨这样的人,不过我相信如果您是这样的人,一定不会在阅读我写的这篇文章了:)

那么,到底应该学一些什么东西呢?那么从我的理解来说,应该有一个比较长远的学习计划,逐步提高。这个计划应该包括三个层次的内容:

第一个层次:大学计算机专业的基础课

这个层次的主要目标,是真正理解计算机内部是怎样运行的,你应该能在200字内,用自己的语言说清计算机的原理,应该理解什么叫寄存器、运算器、存储器?什么叫队列、栈、堆?什么叫递归、迭代?什么叫算法时间复杂度、空间复杂度?什么叫进程、分时、调度?什么叫文法、正则表达式?什么叫数据库设计的范式?什么叫关系、函数、群?

这些东西都不是直接用在你的开发中,但是没有这些基础,你永远无法真正理解什么叫程序。

在以后的文章里,我可以对大学计算机专业比较重要的一些课程,做一些简单的介绍,讲一讲它们的基本内容和特点。事实上我最近从网上找了几所大学的教学大纲,基本上和我十几年前学的课程没有什么变化,这也说明了,这些基础课的重要性和稳定性。

第二个层次:开发必备的工具

在有了上述基础,真正做开发还需要掌握一些主流的开发工具,实际上一个项目需要涉及很多方面,需要用到很多工具,比如说下面是某个网站项目用到的开发工具栈:

  • 框架平台: Microsoft ASP.NET 3.5 SP1
  • 语言: C#
  • 开发环境: Visual Studio 2008 Team Suite
  • Web框架: ASP.NET MVC
  • 客户端框架: JQuery
  • 数据库:SQL Server 2008
  • 数据访问层框架: LINQ to SQL
  • 源码控制: Subversion
  • 源码控制集成: VisualSVN 1.5

上面的开发工具栈是以.NET平台为例的,目前Web开发的主流“三巨头”(.NET、JAVA、PHP),都各自有一套比较完整的开发工具栈,上表中各个项目也都有个各自的工具,比如上面.NET项目用的是C#语言,对应JAVA平台就是JAVA语言;.NET用Visual Studio作为集成开发环境,JAVA则可以使用Eclipse;上面用的Web框架是ASP.NET MVC,JAVA对应的则是Struts;上面项目用的ORM是 LINQ to SQL,而JAVA则有Hibernate对应,等等。

因此,所有开发人员学习的第一个层次课程都是相同的,而第二个层次的内容,则需要先做一个选择,你打算走哪条路线,实际上“三巨头”(.NET、JAVA、PHP)都可以,至少在几年内,都会是主流技术。但是要注意的两点是:

1:选择某一个路线以后,所有相关的工具就都要选配套的了。这就好像玩单反相机的兄弟,一但选择了尼康还是佳能的机身,那么以后很长时间里,你再配各种镜头、配件,就都得跟着机身走了。而且一旦用习惯了,再换就麻烦了,而且你以前积累的所有镜头都不能用了,很麻烦。当然,要换或者同时拥有多家的也是可以的。

2:在摄影社区里,N(尼康)C(佳能)粉丝之间的“口水战”是永远的话题,同样在开发社区里(.NET、JAVA、PHP)的口水大战也是年复一年、日复一日的。其实这是完全没必要的,如果尼康和佳能之间的质量差异能够让普通人都看出来,那早就有一家倒闭了。实际上在“寡头垄断”的行业里,寡头之间的差异是极小的,否则就不会是一个稳定的状态了。如果你学过物理学就知道,这是热力学第二定律“熵增加原理”早就说明了的道理。我们这些普通人,根本不必为这些事儿操心,你就踏踏实实选一个你喜欢的,看着顺眼的,用着顺手的,走下去就可以了。

第三个层次:提高程序质量的修炼

如果基础的原理你都理解了,上面列的一些工具也都掌握了,基本上也应该是一个职业的开发人员了,那么你的目标应该不是仅仅做一个合格的程序员,而应该是做一名优秀的程序员。评价一个人工作是否优秀,标准就是看他的产品质量如何。对于程序员来说,他的产品就是它写出来的程序代码,因此,就要看他的程序质量如何。

在这方面,就有很多方面要不断地修炼,而这种修炼都是长期的,潜移默化地进行着。从方法来说,无非几个:

  • 加入一个好的团队,跟着学,比自己摸索当然快得多。
  • 勤于动脑,肯与思考,不爱动脑子的人做什么都不可能成功。
  • 平常多留心,经常上网学习,网络时代,不会利用这个工具,就等于放着洋枪洋炮不用,非用大刀长矛。
  • 善于总结,把一些临时突发的心得体会,变成经过思考的原则,以指导实践。
  • 写一些技术博客文章,这个过程既是对自己的总结提高,还可以帮助别人,一举两得。

从具体方面来说,比如如下几点:

  • 设计模式的掌握,对于提高代码结构的质量很重要,这也是能否从小兵成成长为指挥员的很重要一步。
  • 随着承担的程序规模越来越大,对测试等相关方面的要求会越来越高。
  • 对算法的理解,这是个博大精深的方面,值得永远不懈努力。
  • 对于直觉的培养,随着经验的积累,要不断提高自己直觉的能力,因为要做出超越别人的东西,依靠的不是常规的思维,而是灵感和直觉。
  • 培养快速学习能力,一本大学教材,看三天应该能掌握60%的基本思想方法和内容,而且能迅速找出实际工作需要的部分,并深入理解。
  • 总之,既要重视日久天长的长期修炼,也要重视应急的快速反应能力。都是很重要的。

Web开发杂谈(2) ——编程语言的入门科普

2009年04月25日 星期六

“Web开发杂谈”系列的上一篇文章中,简单介绍了一下如果作为初学者,应该具有一个怎样的心态和预期去面对要学习的内容。就像我们新到一个陌生的城市,最需要的是一张地图;同样,进入一个新的技术领域,也应该尽快为自己找到一张地图,使自己有学习的方向和预期,只有这样才可能把学习进行下去。

实际上,我们在上一篇文章里,介绍的是一些很通用的做事方式,仔细想一想,其实做任何事情都是“一样一样”的ho~,无非都是要:1)掌握一定的知识和理论作为基础,2)并且要有实际动手操作的能力。前者即所谓的“认识世界”,后者即所谓的“改造世界”,然后再不断积累经验提升水平。对要做的事情,认识得越深刻,动起手来就越有把握。

不过我在上一篇文章中,把学习的过程分为了三个层次,为了避免读者的误解,这里做一些解释。尽管说,要先把基础掌握好,再去动手实践,但是并不是意味着,只顾着埋头去看那些理论,等全明白了之后再去实践。毕竟,要做的程序开发,是一个实际操作的事情,一定要两条腿走路,一边理解,一边实践,二者是相辅相成的,这样效率也会高很多。

因此,今天就来谈谈开发中最基础的一个话题——编程语言。就像每个人要生活在世界上,就离不开语言一样;要做软件开发工作,也是绝对离不开“编程语言”的,你的一切“改造世界”的行动,都是通过使用“编程语言”来编写程序实现的。

编程语言的基本原理

当今的计算机都是按照“冯.诺依曼”体系设计的,其运行的基本原理,可以简单概括为“程序存储、集中控制”这8个字,最核心的两个部分就是控制器和存储器。无论存储器是什么形态,几十年前的继电器,还是现在的DDR3内存条,程序都必须要装载到存储器中,然后控制器在时钟脉冲信号的控制下,有节奏地依次取出程序代码,执行相应的指令,周而复始。

而在存储器中存放的是两种信息:1)数据,即操作对象;2)程序,即操作指令。

因此无论你使用什么编成语言,你都是在做着同样的两件事:

1)告诉CPU你的数据在哪里;

2)告诉CPU你希望如何处理这些数据。

比如假设某一种计算机,有这样的一条指令: ADD [1000],2000 ,它的意思就是取出存储器中第1000号存储单元中的数值,让后把它增加2000,再存回第1000号存储单元。而每种计算机都有一套完整的指令集,比如Intel的 X86 CPU 和 IBM的 Power-PC CPU就具有完全不同的指令集,因此他们是不兼容的,而我们日常使用的Intel的 CPU和AMD的CPU的指令集则是兼容的。

而我们通常开发软件编写程序,是不会写“ ADD [1000],2000 ”这样的代码的(这种代码称为“汇编语言”代码),而比如说,我们如果用C语言,则会写出这样的一条语句:” X = X+2000 ; ”
,其含义同样实现了在X这个存储单元的数值增加2000这个目的,而写起来就方便多了,用变量名称代替了存储器的编号,我们也不需要知道X这个变量到底在第几号存储单元,只要知道有这么一个位置就可以了。

而C语言代码是如何变成机器可以理解的代码的呢?这就需要中间有个翻译的机制,分为两种:1)编译程序,2)解释程序。

前者把高级语言代码彻底翻译为机器语言代码构成的程序,然后再运行;后者在运行的时候,一边翻译,一边运行。在大学的计算机本科的高年级,都会有一门课程叫《编译原理》,专门讲解这个问题。

编程语言的来历和演变

编程语言经历了从无到有,从低级到高级的演变过程。需要注意这里的高级和低级没有好坏之分,低级表示的更接近于机器的底层硬件,高级表示更接近于要是解决的实际的问题,而不必考虑计算机底层的运行方式。

史前时期

阿兰.图灵

实际上,计算机出现之前,就已经有很多数学家为计算机软件的出现打下了坚实的数学理论基础,比如著名的数学家“阿兰.图灵”和他的导师一起努力,在20世纪三、四十年代年代就创建立了“图灵机”理论,从理论上解决了计算机软件和核心——“计算复杂性”以及“算法表示”问题。前者研究“能不能计算”的问题,后者研究“如何计算”的问题

正是有了这样的数学理论作为基础,加上当时电子技术的突飞猛进,二者相结合,才产生了计算机这样一个划时代的伟大产物。

低级语言

计算机的内部处理的全都是1和0的二进制数字,表示“开”和“关”,而计算机刚刚发明出来的时候,操作人员就必须用很多真正的“开关”来操作计算机,进步一点以后,出现了“机器语言”的概念,使用例如在纸带上打孔的方式,把一些原来需要人手工拨动开关的操作序列,变成按照某种规则在纸带上的一系列孔的序列,这种打着孔的纸带可以被看作是今天的鼠标、键盘、打印机、显示器、磁盘这些东西的总和,这些东西在当年,“打孔纸带”一个人就全包了。

机器语言通常称为“第一代语言”,其后又产生了“汇编语言”,即“第二代语言”,汇编语言实际上就是机器语言,区别就是汇编语言中用一些符号代替0和1的序列,仅仅是便于记忆,此外,有少量的扩展功能,比如可以通过定义的“宏”来产生类似于“子程序”这样的逻辑概念,通过编写汇编语言程序产生机器代码,效率提高了很多,但是它依然是紧密依赖于机器的,和后来被广泛使用的高级语言是完全不同的。

高级语言

接着,历史的车轮继续开动了,所有计算工作都要转化为机器相关的代码,这个事情本身就非常复杂,因此人们就想到,能否设计出一些更接近于人类自然语言的方式,来操作计算机呢?这里要提到的两为大牛,一位叫“约翰.冯.诺依曼”,一位叫“约翰.巴科斯”。

约翰.冯.诺依曼

前者“约翰.冯.诺依曼”,可以称为“计算机之父”,美籍犹太人,数学神童出身,可以说是数学和计算机科学界的“爱因斯坦+爱迪生”,40岁以前搞纯数学研究,40岁以后把纯数学应用到应用数学、量子物理、计算机科学、核武器、经济学等各个研究领域,把数学作为工具,用得是出神入化,所向披靡。如果没有这位神人,说不定大家今天还在打算盘,呵呵(甚至比这还惨,如果没有他,也许还要晚扔那两颗牛X的原子弹)。至今的计算机(除了一些研究性质的),都没有离开“冯.诺依曼”设计的结构,所有大学生学习的计算机知识,都是基于“冯.诺依曼体系”的。

约翰.巴科斯后者”约翰.巴科斯”,当然也是大牛,不过从地位来讲,不能和“冯.诺依曼”相比了。他的主要贡献就是对高级编程语言的开创性工作,他认为,应该建立脱离依赖于计算机结构的程序设计语言。这里有个有流传的说法,说在1950年代,这两位“约翰”对这个问题有所争论,“诺依曼”认为不需要高级语言,而“巴科斯”认为需要高级语言。我查了查网上相关的资料,似乎没有明确的证据说明“诺依曼”认为不需要高级语言,因为“诺依曼”在1957年,年仅53岁就去世了(真是太可惜了),我没有查到他说过“不需要高级语言”这样的话,只是“巴科斯”在图灵奖获奖报告中提出了他的建立高级语言的思想而已。

总之,“约翰.巴科斯”建立了高级语言的思想,并设计出了世界上第一个真正意义上(至今广泛应用)的高级语言——Fortran语言。此后,就不断出现了各种各样,具有各自特点的高级语言了,这样,普通人即使对计算机的内部结构不是非常清楚,也同样可以进行软件开发了。

编程语言的基本构成

通常来说,一个编程语言主要包括下面三个基本组成部分:

1:类型系统 —— 定义了这种编程语言中使用的数据定义方式,也就是解决“操作什么”的问题。通常包括“静态类型”、“动态类型”等不同的类型系统。比如C、C++、C#、Delphi、Java等等都是静态类型语言,而Javascript、PHP、Python、Ruby等则是动态类型语言

2:语法规则 —— 定义了这种编程语言的流程控制方式,或者说解决“如何操作”的问题。对于过程式的语言,比如C语言,一个程序有三种流程控制结构:“顺序结构”、“分支结构”和“循环结构”。

3:标准库 —— 为了解决实际生活中的问题(专业说法叫做“领域问题-Domain Problem”),编程语言通常都会提供一些预备好的核心功能库,供程序员直接使用。比如你需要在程序中计算一个角度的正弦值,那么要通过基本的加减乘除这些基本运算,计算出来是很繁琐的,而这个功能有非常常用,因此,编程语言就会提供一些数学公式的计算函数库,这样程序员就可以方便地调用了。

说明:

1:实际上面的前两条是真正一个编程语言的核心,而标准库是可以扩充的,或者由第三方提供的。以.NET平台为例来说,在.NET平台上可以运行多种语言,比如C#、C++、Basic、甚至ironPHP、ironRuby等语言,每种语言都有自己的类型系统和语法规则,而他们共享同一的标准库,也就是.NET框架提供的大量已经开发好的程序库。

2:所谓核心就是体积比例很小,作用超大的东西。当年TruboPacal ,后来的Delphi,再后来的C# 的设计师Anders Hejlsberg曾提到,在他的团队里,做C#语言设计的人是4个人,写C#编译器的也就几个人而已,而编写.NET框架的人就有上千人了。从中我们就可以知道“核心”的含义了。

Anders Hejlsberg

3:说到Anders Hejlsberg,这里必须要说一说,他也是个天才,应该是程序员做到头的终极榜样了。如果读者朋友,您不喜欢尔虞我诈的人际关系的争斗,而喜欢做单纯一些的技术工作,又没有名牌大学的博士学位,就以Anders为榜样吧,Anders是丹麦人,在丹麦上的大学(但是没有毕业,原因不得而知),到美国以后和伙伴一起开发出了Turbo Pascal,一举成名,后来在Borland公司不得志的情况下,被Bill Gates三顾茅庐,请到了微软。具体故事可以参考台湾技术作家李维的一本书《Borland传奇》,非常有趣。一名纯技术人员,能做到这样,基本上算是到头了。

思考题

1:本文列出了4位大牛,除了他们令人望尘莫及的天赋,你能从他们的经历中寻找到一些什么启示?

2:你能在头脑中想象出一个简单的程序在计算机中是如何运行的吗?

3:你使用哪种编程语言,你为什么选择它?

在下一篇文章中,我们将对目前流行的编程语言做一些介绍,使初学者有一个大致的了解,也可以帮助大家选择自己的学习路线。

Web开发杂谈(3) ——编程语言分类学

2009年04月29日 星期三

在上一篇文章中,我们介绍了一些编程语言最基本的知识,接下来,我们会分几次,介绍一些更实用的内容,重点谈谈比较常见的一些编程语言的情况,使初学者有一个宏观的了解。在你选择语言的时候可以,可以做一个参考。

如果你以为编程语言就是我们经常听说的C、C++、Java、PHP等这么几种,那就错了。目前世界上正在被使用的编程语言数量,有数百种之多:点击这里可以查看按字母排序的语言列表。今天从分类的角度说说着这几百种编程语言,读者不必深究,了解了解即可。

人类在研究任何领域的时候,“分类”都是一个重要的课题,例如生物学,就花了很大的力气把世界上个所有生物分为“界、门、纲、目、科、属、种”若干干个层次的类别,比如我们人类就属于:“动物界 > 哺乳纲 > 灵长目 > 人科”。西方自然科学的基本思想就是“解构”,分类基本上和“解构”是一个意思。一个领域中,“分类”的水平标志着整个领域研究的深入程度。

所以我们在学习一个新的领域时,最好首先对这个领域中的对象的分类情况有个了解,这对于整体认识是很有好处的。就好像我们新到一个城市生活,首先找一份地图,了解一下,这个城市大概分几个区,有几条主干道,是放射状的?还是环形的?有几条地铁线路,大致什么走向,有这样一个基本的大概了解,对你日后了解这个城市就很方便。

下面我们就来对“编程语言”做一点“分类学研究”,再次提醒,了解了解即可。不必深究。

按语言之间的承继关系分类:

除了按名称排序的列表,还可以按照承继关系来进行分类,比如C++语言就是在C语言的基础上,增加以及改造了一些特性以后形成的一个新语言。点击这里查看比较完整的编程语言的承继谱系关系

下图是从中截取了一个分支,各语言名称的缩进表示了承继的关系:

Language family

在庞大的谱系列表中,我们之所以选择上面这一段语言分枝,因为可以看到这个分支可以说是整个“编程语言社会”中,当今最“人丁兴旺”的一个家族了。你想想看,在计算机书店里,看到的编程书,是不是大都是我用红框标示的这几种语言?他们都是这个家族中的,只是辈分不同而已,但是它们都是有共同基因的语言。

按语言产生的时间分类:

如果按照产生的时间来进行归类,点击这里可以查看具体编程语言的年代归类表。随着技术的发展,研究的深入,编程语言也是在飞速进步的,所以晚出来的一些语言,通常会更多吸取一些以前的成功经验,避免掉一些以前的不足。

比如微软的 .NET平台的整体战略,就是针对Java的。.NET框架就对应于Java的虚拟机,C#也是针对着Java语言的。盖茨把Anders请到微软,操刀.NET和C#,如果单纯就语言的角度,C#确实在很多方面是比Java要更好一些,当然不是说Java不好。我对这方面也不是非常有研究,但是C#从1.0,到2.0引入泛型和匿名方法,3.0引入Linq,即将发布4.0将引入动态编称,进步实在是太大了。每一个新引入的特性都可以大大提升生产效率,而且这些改进是核心的改进,不仅仅是类库的改进。

但是语言的进步不像CPU的进步那样立竿见影,你把奔3的电脑换成奔4的电脑,立刻就难感觉到速度提高了。但是语言这个东西,是需要长期使用才会逐渐体会出来其中的韵味的。

按语言的功能特征分类:

上面这几种分类方法其实都不是最重要的,实际上对于程序员来说, 重要的是编程语言的具体行为功能特征,但是如果按照这个标准类分类,就没有非常明确、严格、一致的分类标准了,比如可以有“编译型语言”、“解释型语言”、“命令式语言”、“声明式语言”、“函数式语言”等等很多很多,总之非常复杂了,有兴趣的可以看这里的一个总结表

尽管有这么复杂的分类情况,但是其实写在这里,仅仅是为了展示一下而已了,对于90%以上的开发者,以及100%的初学者,实际上都是在使用这几个非常接近的,“流行度”很高的语言,比如上面红框框里面的语言,此外可能还有一些不在红框框,但是也都是差不多的编程语言,比如Basic、Pascal(Delphi)等等,他们也都是大同小异的。所以初学者,尽可以放心,不用管它有几百上千种语言,你只要先用好这些最常用的语言,就可以啦。

当然,要知道,这些“流行”的语言虽然接近,但毕竟也有差异的,而恰恰是这些差异来决定你选择哪种语言,这个以后的文章再谈。

思考题

1: “分类”是掌握一样东西的指标,你能再举一个例子说明这个道理吗?

2: 你熟悉或者了解过几种编程语言,按照不同的分类标准,你能否间接一下你了解的语言?

Web开发杂谈(4) —— 编程语言的流行度

2009年05月04日 星期一

上一篇文章中,我们从不同类别介绍了编程语言,当我们要选择学习一门编程语言时,有很多因素值得考虑,今天讨论第一个因素“流行度”。

就像我们中国人都说汉语,我们就只能和说汉语的人一起生活工作一样,你使用某种编程语言,就只能和同样使用这种语言的人一起工作了。当然我们也可以多掌握几门外语,那当然是最好的了!所以现在也很提倡“混合编程”,就是针对不同的问题,使用最适当的语言,来进行开发。

说到这里,要提到的一点是,和我们生下来无法选择母语不同,我们是可以自己选择使用的编程语言的。那么我们如何来选择要学习什么编程语言呢?这里我想第一重要的因素就是“流行”了。

尽管现在是强调个性化的时代,否则也不会产生那么多种编程语言了,但是作为一名普通的程序开发人员,你只会一门非常冷僻的“小语种”,你的用武之地可能就非常小了。毕竟开发往往是团队完成的,因此用越流行的语言作为开发语言,相对就更容易招聘到程序员,这样反过来,掌握越流行的语言的程序员也就比较容易找到工作,这样形成正反馈,真正“流行”的语言也就不是很多了,而且这些语言一般都是有着超强支持后盾的,比如微软支持的C#、VB,SUN和IBM等联盟支持的Java等等。这个竞争,可不是一般的公司能玩得起的游戏。

那么我们怎么知道各种语言,哪个更流行呢? 这个调查是相当困难的,可能比人口普查还难得到精确的数字。不过我们了解个大概也就可以了,目前大致有三种方法可以观察各种语言的流行度:

1. TIOBE 指数

TIOBE是一个独立的组织,每个月公布一次各种语言的流行度数据,数据来源于与世界范围内的职业程序员、教学以及第三方机构,此外流行的搜索引擎Google、MSN、Yahoo、Youtube的搜索数据也是数据的来源。他会每月公布前20名最流行的编程语言的份额。

比如下图就是目前(2009年4月)的数据,它显示了最流行的10种语言在近年来8 来被使用率的变化。第一名是Java,有19.34%的开发者使用。接下来使用的最多的语言是C和C++。

Tiobe-2009-04

2. 招聘网站的数据

招聘网站的数据也是一个评价编程语言流行度的指标,什么语言在招聘启事中出现的多,自然也就说明它更流行一些了,我们在前年的一篇文章“学点什么技术好?”中,介绍过一些这方面的情况。

下图是一个美国的网站 indeed.com 中给出的结果,indeed是一个招聘网站的搜索引擎,输入一个职业,就可以搜索到很多其他搜索网站上的招聘信息。同时还会给出一些关键字对应的招聘信息的数量。比如下图就是查“Java developer”和 “.net develpoer”的结果,看来在美国,这两者还真是势均力敌,难分高下。

indeed.com

3. 计算机图书销售的数据

计算机图书被称为“IT技术市场的晴雨表”,也是一个可以反映技术发展情况的指标。只是这个数据我们一般人是无法看到的,只能是凭感觉了。不过专业人士还是可以看到的,比如美国著名的计算机专业图书出版商O’Reilly对这方面有着非常深入的研究,这里查看O’Reilly对这方面的一个报告。下图是把美国图书市场上销售的计算机图书,根据书的内容进行归类,得到的结果,可以看到这个结果和前面Tiobe的结果,还挺接近的。

computer-bool-sale

不过这个图已经是两年半以前的数据了,过去O’Reilly每个季度都发一个非常详细的报告,不过遗憾的是,似乎这两年来O’Reilly已经不太注意力放在图书市场上了,可能因为计算机图书市场的持续萎缩,使他们不太看重这块业务了。

Web开发杂谈(5) ——解读 TIOBE 指数

2009年05月08日 星期五

上一篇文章中,我们谈到了编程语言的流行度,今天继续这个话题,专门说说TIOBE指数。

正如以前在文章中提到过,各种编程语言的粉丝们,经常在会在一些开发技术社区里,关于语言之间的优劣进行口水大战,忙得不亦乐乎。就比如说这几天吧,就有一场关于“C# vs Java”的争论很热闹

当然这种争论不是完全没有意义的,这种争论通常都是拿着一方的某些优势特征,去跟对方叫板:“你看,我用XXX语言,3行搞定这个,你用YYY语言,30行也搞不定吧?”,另一方如果有办法破解,自然会说:“谁说我3行搞不定,这就给你搞一个看看!”。因此在这个过程中,无论是亲自上阵的,还是观战的,都是一个总结和分析的过程,其实对更深入地理解技术,还是有帮助的,所以如果有工夫,也有兴趣,去看看这些争论,对你了解一些语言的某些特性,也挺好,特别是可以帮助你了解一些你不熟悉的语言的特点。

从另一方面来说,也不必太当真。几百上千种语言,最终能成为最流行的几种语言之一,基本上就跟奥运会金牌和银牌之间的差异,真是没多大差别的。但是要指出的是,这种势均力敌,是有时间性的,也许现在势均力敌的竞争对手,几年以后就有明显的差距了。所以,如果你打算掌握一门技术来生存,最好还是能挑一个更为长久的技术和开发工具,否则如果你的工具每况愈下,总是不太好的事情。长江后浪推前浪,小心被拍在沙滩上。就像我们以前还是挺喜欢写一些计算机图书的,但是现在计算机图书市场每况愈下,也不敢太靠这个了,在网上写一些文章,也不错了,出不出书就不去管它了。

下图是 TIOBE 2009年4月发布的数据,最流行的10种编程语言,在近8年中的变化情况。

Tiobe-2009-04

具体几个数字并不关键,我们可以从大的趋势,看看哪些是上升的,哪些是下降的。首先,4个下降的分别是:Java、C、C++、Perl。

declined languages

首先,接下来是前8名中,另外4个,他们都是上升的分别是:PHP、Visual Basic、Python、C#。

rising-languages

前十名中,还有两个:Javascript 和 Ruby,他们的份额都相对低多了,都在2%多一点。Javascript的使用率大幅上升,显然是由于Web 2.0 概念推出以后,Ajax等Web前端开发技术兴起带动的。至于Ruby,在中国的流行程度还很低,在国外经过前两年的火爆增长,这两年也没有进一步的大幅提升了。

js-ruby-languages

从上面的一些图中,我们可以看出一些问题来:

1:Java和C,前两名的位置依然牢固,但是使用率确实下降了很多了,C++第3名的位置岌岌可危。

2:大的趋势可以看出,原来的前三名遥遥领先,现在明显各种语言之间的差距明显减小了。

3:上面这些图不能直接叠在一起比较,因为纵坐标的刻度不一样,C#上升了很多,但是仍然远远低于Java。

4:如果要评选一个“稳定进步奖”,那么是非C#莫属了,8年来稳扎稳打,步步为营。

5:就Web开发领域来说,三巨头应该是“Java 、.NET 和PHP”,.NET 对应在上图中,不仅仅对应于C#,还包括Visual Basic,还包括很多人实际上仍然在使用传统的ASP,没有列在图中,因此,如果把三者加在一起,应该和 Java相差不多。

共 2 页: [1] 2 » | 下一页»