也许现在新一代的程序员一开始涉足的就是c++,C#,Java这类面向对象的语言,如果这样,这篇文章可能得不到他们的认同。 这里,我只想写写我从面向过程到面向对象开发成长中的一些感想而已。
我最初学习的语言是basic,但是入门太早,早的都没有电脑可以给我用,所以对于basic其实没有多少感觉,只是觉得很简单。等后来用的语言多了,怎么都觉得basic,尤其是vb,实在是个小孩玩的玩具,根本无法发挥编程的效力。因此我在此就跳过basic语言了。
刚入大学,我学的是pascal语言。它主要是一门教学用语言,可以说是高级语言入门的典范。我至今仍然很感谢这门语言对我的指导作用。虽然这门语言在语句表达上有些繁琐(相对c语言而言,但是对于初学者而言,以简单单词作为语法单元却是一种好处),但它在语言规范上非常严谨,不容许存在丝毫的模棱两可。这在C语言里面是做不到的。我在这门语言里面学习了数据结构,图形学和简单的窗口编程,并且编写了大量小型的课程设计程序(那个时候管自己的代码叫软件,现在想想真是汗颜),初步体验了面向过程编程思想。那个时候我也自学了c语言,觉得它的语句太难记忆,一直啃不下来,因此主要还是用pascal写程序。后来到大四临毕业,就开始转向到object pascal 和delphi编程,但是由于时间很短暂,虽然使用了对象,但是仍然不得OO的要领,学的像个傻子似的。
此外在大四的时候,我也尝试着去学VC,用的是那本著名的《VC++ 从入门到精通》,有一块半砖头那么厚。 我啃了很久都啃不下来, 感觉vc和我所学到的c++完全不是一回事。也没人告诉我vc里面哪些奇怪的类型到底是怎么回事。后来的放弃其实不是我的错,而是vc逼的。现在回想起来vc从一个学习者的角度而言,实在太不友好,当然我们国内的计算机教育也实在和国外的差距太大,连讲操作系统课的老师自己都不知道真正的操作系统里面是什么一个样子。能找到的语言方面的书,最多的就是谭皓强的一套。我相对我的同学已经很不错,毕业的时候已经有近5、6千行代码的经验了,大多数学计算机的写的代码加起来的不过几百行。也许现在看起来很可笑,但是当时的情况的确如此。
真正让我接触面向对象的是Java语言。 大四最后一个课程设计要求java做,因此对java有了真切的感觉。java用下来虽然自己不会写对象,但是和对象相处了一段时间之后,至少知道应该怎么去用对象了。由于java那个时候已经有很丰富的库函数可以使用,让我这个小毛孩觉得这个语言太可爱了。 它比c和c++的语法友善和简单很多,没有多少晦涩的东西,又可以画出很漂亮的界面,实在太吸引人了。唯一的缺点就是太慢了, 用jbuilder看一下界面就把我p3 500M的机器拖死过去了。当然那个时候的java还是很简单的,到了后来j2ee ejb 以及在mobile上的应用使得java变得像一只极其庞大的恐龙,让我再也没兴趣去理会它了。几次还想重新把它拾起,但是一问当时跑jbuilder的机器要什么配置的时候(记得那个时候就要512以上内存了),我就退缩了--没钱买这么好的机器。
记得大四的时候刚刚微软推出了dotnet,还和国内大学合作举办培训推广。我也争取到了学校团队的资格去上海微软参加了培训。然后就是一段时间用dotnet开发作品去比赛。 反正那个时候看dotnet觉得是非常恶心和丑陋的东西。为什么这么说? 其一,语法和内容几乎和java没任何差别,简直就是一个盗版货;其二、那个时候msdn里面查函数,30%的函数解释写着:目前该条目还没有内容,我们只能自己猜某些函数可能是怎么怎么用的;其三,装了dotnet的机器都不长命,没一台能跑7天不死的。 至今我都没有再碰过dotnet,听说现在这个东西还在玩程序员,庆幸当年没有入这个行,不如惨死了。
我的本科毕业设计要求在Linux平台上做的,于是开始了我的C语言生涯。至今4年多了,我仍然主要用C语言在写代码。C语言教会了我很多,特别是对于系统、硬件,程序模型这些概念。我很感激它。现在还有很多人经常问我这些概念,他们很奇怪为什么我对进程,线程,信号,中断这些概念这么清楚。这些其实都来自C语言,C语言是一门系统语言,它很好的囊括了目前所有与操作系统相关的概念,因此无论今后用什么样子的新的高级语言,系统api必将仍然用C语言来给出--除非计算机体系结构出现颠覆性的革命。
至于c++语言,我不是不愿意用,而是我的工作和程序性能很相关,C++语言的某些机制的效率很底下,实在不合适用在这样的场合。 其次C++对于进程线程和信号这类的概念的表达能力一直不够尽如人意。所以我觉得不合适用以系统编程。
但是不是说离开了C++,C语言就缺少了面向对象功能。其实C成熟的编程风格早已涵盖了面向对象的思想。有人说C++是C的超集,这是事实。然而从另一个角度而言,C孕函了C++。C++表达的东西,C完全可以表达。这个观点我无法展开去表述,但是一个简单的例子就可以简单的说明一些问题,在Linux内核的代码中,以及socket协议栈代码中,文件系统中, 各种对象概念,文件对象,套接字对象都以struct结合函数的方法来表达。我虽然目前还在用c写程序,但是我写的程序越来越趋向对象化。回顾我的编程学习和实践经历,我经历了用面向过程的语言写面向过程的程序,用面向对象的语言写面向过程的程序,用面向过程的语言写面向对象的程序, 很快我就可能会转到用面向对象的语言去写面向对象的程序了。 呵呵。