Press "Enter" to skip to content

学什么编程语言比较好?

我应该学什么语言?这句话被问的很多,但是通常是不会得到答案的。每种语言都有一个相对固定的崇拜者群体,每次在论坛上有人比较一种语言的好坏,就会引发一场持久的战争。之所以发生这种情况,正是因为各种编译语言之间的力量是均衡的,没有哪一种语言是完美的,能够“终结”其它的所有语言。即使像Linux下的几种脚本语言那些看似长的很像的语言,也没有谁被谁完全替代,大家和平共处了许多年,并且在各自的位置发挥着自己的长处。

这里就我所了解的几种语言和自己学习的经历给新人一点建议,如果你有特殊的需求,比如工程或者数学,那可能需要一些特殊的语言来解决,比如Lisp或者Ada,这在该领域内基本上是无可替代的,那你也没有什么好迷惘的了。如果你只是一个刚刚准备进入编程这一行的学生,或者是一个想业余时间搞点自己的小东西的业余开发者,却不知道哪种语言比较适合自己,就接着往下看吧。

首先是C语言。几乎所有的书和计算机专业都把C语言称为语言中基础的基础,在大学里基本上都属于必修课程,而且,现在还是我们国家计算机等级考试和程序员水平与资格考试的标准语言。C语言之所以有这样的地位,是因为它最接近底层,最接近汇编语言和机器语言,最接近机器的思维方式,其它更高级的语言,最终也要按照它的那些基本逻辑来处理问题。所以,学好C语言可以更方便的以机器的模式思考问题。

另外,C语言所涉及到的程序的顺序结构循环结构和分支结构,还有整数字符串数组等变量,这些都是万物之源,所有的编程语言都离不了。而且C语言有着严格的格式规范,不符合规范的写法或者错误的类型定义,都会引起编译错误,还有像if(a=1)这种常见错误,都可以让人在使用C语言的过程中养成良好的编程风格和代码规范。这些习惯在以后使用其它更宽松的语言的时候,会大大提高你的代码质量。

还有,因为C最接近底层,其代码效率只有手工优化的汇编可以匹敌,在许多脚本语言里面(比如Python)可以把一些大运算量的关键代码用C来完成,从而获得更高的执行效率。

综上所述,如果你真的想学好编程语言,C是一定要好好学的。但是新手学C语言通常会出现一个问题,就是除了写个排序算法,似乎根本想不出来C语言有什么用。这是因为我们的教科书讲C语言的时候,只讲这些基本算法,甚至连读写文件都不去讲,更不用说图形界面处理了和网络操作了,没有这些知识,想写一个真正的应用那是不可能的。不过,书上没有不等于学不了,文件操作和网络操作的讲解网络上有着大把的讲解,(现在Windows下用这个人比较少了,但是讲解Linux下C语言编程的书还是相当多的。)只要你随便找几篇文章看看,具备了这些基础知识,写一个自己的WEB服务器并不难。在逐步增加功能完善功能的同时,你的C语言基本上就可以达到相当牛人的水平了。

从0开始学习C的成本是比较高的,如果没有明师(或者一本好书)的指点,某些概念想开窍也有些困难。但是你一旦突破了C语言这个障碍,再学习其它的语言,学习的曲线将会大为平坦。

除了C语言以外的其它流行的高级语言,不管是编译语言还是脚本语言,基本上都是面向对象的语言了,所以你要搞清楚面向对象的概念。真正适合理解面向对象的语言,以前是SmallTalk,它是完全面向对象的,但是这个语言在中国很少见,书也很难买,现在,你可以学Ruby。(Ruby的作者是日本人,因此在许多论坛上提到它的时候会被许多愤青跳出来乱骂,这种做法是极其愚蠢的),近年新出来的Linux发生版里面都自带了Ruby支持,这已经充分说明了它在Linux管理方面的地位。而Ruby On Rails这个名字,更成了Web2.0快速开发的代名词。该语言借鉴了其它许多语言的特点,并且写出了自己的特点。在Ruby里,所有的东西都是对象,包括一个数字,你可以调用-1.abs这样的方法。一切都是对象,才能让你真正的理解面向对象。

一旦你掌握了Ruby的思想和面向对象的设计方法,那么使用Ruby on rails来开发一个网站将变得极其轻松,因为该框架已经包装了WEB开发中用到的前后台的功能,所有的数据库读写都通过你的对象自身来完成,前台HTML的生成有着完整的模板系统,只要把美工给你的HTML代码里面的内容换成你的变量就OK了。

如果你拥有了C语言的根本,和面向对象的思维方式,那么,如果因为工作需要,要去学习Java或者C#,那都是相当简单的事情。至于Perl和Python,本身跟Ruby的语法就比较接近(Perl要复杂一些,稍后再说)。但是目前你所学习的C语言和Ruby,都不适合用来开发Windows桌面程序,如果有这个需求,目前最简单的语言应该就是C#或者VB.Net了。通过简单的拖放控件就可以摆出相当专业的软件界面,而程序本身要实现的功能也无非就是本地的文件处理和数据库处理,只要了解了该功能所在的命名空间和几个基本的函数,再查阅一下MSDN,写程序轻轻松松。(以前使用最广的是VB6,不过现在Windows已经全面迁移到了.Net平台,已经基本没有必要再去学习VB6了。)

当然,如果你不喜欢.Net平台,还可以选择Delphi或者C++。C++通常被认为是更高级的C,但是实际上它们的差别很大。而C++用来写桌面程序,无非也就是调用一些已经被包装好的处理窗体的函数而已。(C也可以调用,只是比较麻烦一些罢了。)Delphi的语法需要一段时间来适应,但是Delphi的开发工具跟Visual Studio一样简单,大部分操作拖放控件就OK。如果是在Linux下面,也有不错的C++的IDE和开发库用来开发桌面程序。

C++入门容易升级很难,没有个三五年的潜心研究,是没有办法精通它的精髓的。但是既然你已经学到了这一步,那你应该已经很明白自己需要学哪些东西了,只要去找书,找好的源代码来研究就行了。

Java语言的崇拜者很多,不得不单独拿出来说。Java语言的爱好者喜欢在语言层面把Java和C++相比,而不屑于跟C#来比较,而在企业开发架构方面(特别是B/S方面),又拿Java和.Net来做比较,因为C++缺乏这方面的应用。Java语言本身是非常干净的,但是被各种各样的包搞的比较混乱,新手进来容易摸不着头脑,而且框架太多,又互不兼容,习惯了Struts开发方式的人员,很可能在换了一家公司的以后,虽然Java很熟练,但是却不得不又要花很长的时间来研究学习和适应另一种开发框架。(.Net也在向这个趋势发展了,而像Ruby on Rails这种框架,则保证了框架的统一性,程序员的学习成本降低,企业的培训成本和维护也更低了。)

Java通常被认为适合用来开发超大型的B/S项目,而一般的脚本语言则被认为只适合小型的项目开发,通常,这种问题都是由于开发工具的限制带来的。.Net平台如果不是因为Visual Studio这样方便而优秀的开发工具,不可能取得今天的成就。而大部分脚本语言则没有这个优势,缺少大型项目的管控能力,使得代码量始终保持在一个比较低的水平。但是像Python这样的代码,可以凭借良好的代码设计,模块间松散耦合,做出极其灵活而且大型的项目(比如YouTube)。

Perl语言在Linux的系统维护方面有着不可动摇的地位,大量的系统维护代码都是Perl语言写的(而且PHP流行之前,WEB的CGI基本上也是以Perl语言为主的)。Perl在文本处理方面有着强大的能力,其正则表达式的处理方式更是成了其它语言必须兼容的标准。正则表达式的学习难度比较高,要想达到灵活运用的水平,需要大量的练习。(但是如果只是要达到基本的通用就行的水平,那还是相当简单的。)

而在WEB开发方面还有一个重要的语言不可不提,那就是PHP。PHP出现的目标就是提供更方便的网站开发的能力,它的语法跟其它的脚本语言比如Perl/Python/Ruby都很接近,而且提供原生的Mysql数据库支持,读写数据库即简单又高效,而且因为Apache的良好支持,才使得LAMP平台能够与Java和.Net平台相抗衡,而且成为了小型项目首选的解决方案。

至于SQL,我并没有拿它当一门语言来算,它只是你在做数据库编程的时候所需要的一种工具罢了,就跟调用其它的系统函数没有什么区别。简单的SQL语法无非就是插入删除选择更新四种操作。处于同样地位的还有HTML/CSS/Javascript,如果做WEB开发,这三种东西是必须要了解的,当然,前两种你可以不必精通,因为有美工来负责,而JavaScript属于完整的编程语言范畴,通常的美工是没有办法熟练掌握的,还是需要程序人员的搞定。但是Javascript的难度,在这个阶段大概只有学习Ruby的十分之一了,想学,很快就可以掌握。(PS:Javascript也是一门易学难精的语言,好的JS框架全世界也就那么几个人能写的出来,比如prototype,jquery,extjs)。

程序语言多种多样,但是编程的思想却是不变的,而像设计模式、程序架构这种东西,都是语言无关的。一个开发项目,前阶段的需求分析,项目分析,直到概要设计阶段都是语言无关的,而项目设计期间使用的UML图也做到了尽量抽象,和具体的实现语言无关。直到详细设计和编码的时候,才需要针对不同的语言的特点做些调整,而它们提供的功能则是完全一致的。作为一个好的程序员,需要的不是编码的能力,而是需求分析和项目设计的能力,用哪种语言来实现则是可以随机应变的,只要掌握了具体语言的学习方法,熟练掌握一门语言并不需要太长的时间。

因此,在经过了最初的语言学习的阶段之后,程序设计人员需要尽快的向下一个阶段演变,对设计模式的学习和理解是一个长期的过程,需要大量经验的积累,并经常的总结经验,从经验中归纳出自己常用的模式。作为程序员,还要有精益求精的态度,在时间允许的情况下,时常反思自己的作品,寻找更好的解决方案,在浏览网站学习的过程中,时刻以自己的项目为思考的对象,当发现更好的方法的时候,使用恰当的工具和方法来重构自己的项目。在这样不断进步的过程中,你就已经不再局限于一个普通的程序员了。

16 Comments

  1. 读书毁我 2007年11月27日

    看了之后不只是长知识了

    问一下,照片是你?

  2. 非鱼 2007年11月27日

    嗯,的确是我。

  3. 匿名 2007年11月27日

    以前那张帅很多哦~哈哈

  4. 非鱼 2007年11月27日

    老冒充别人也不太好啊。

  5. 匿名 2008年03月7日

    相当精彩

  6. naru 2008年03月20日

    你写的这片 文章 非常好 我觉得。。。 有机会的话 我门可以认识认识吗?

  7. 非鱼 2008年03月20日

    你啥信息也不留,我怎么跟你认识认识啊?

  8. yiqike 2008年04月1日

    谢谢,得到不少收益

  9. 迷茫 2008年05月23日

    精彩

  10. 鱼影龙 2008年06月27日

    我想问下,如果自学c的话,算法斯不是也应该学?

  11. 非鱼 2008年06月27日

    当然要学了。

  12. 斯文 2008年08月6日

    生存期有否可能如下:
    10到20年内,智能机器可以自动生成代码,人类只要做你说的最后一步了:需求分析和项目设计的能力。
    再多20年,智能机器连这步也不需要人类操心了吧。

  13. 非鱼 2008年08月6日

    如果云计算保持正常的发展速度,那这一步应该是比较容易实现的。云计算在一定程度上可以达到量子电脑的替代。

  14. ..... 2008年08月9日

    我更想知道怎么学?
    我一个Java都还没搞定….
    Java框架到底是方便还是麻烦. 我真是晕…

  15. 非鱼 2008年08月9日

    首先:你需要一个明师。

  16. Smile 2009年05月3日

    精彩!

Comments are closed.