程序员之路 Oldbug 2000年 第38期 “程序员”,提起这个名称便让我们的脑海中闪出一长串名字:一手开创现代软件业恐龙——Microsoft的比尔·盖茨;现在中国民族软件业之代表金山公司的掌门人——求伯君;微软的噩梦、自由软件的代表、Linux之父芬兰小伙Linus Torvalds……这些在IT业内被无数人津津乐道的名字,都是从一个小小的程序员开始做起的。随着他们的软件日益流行,他们的名字也逐渐为人人所推崇和尊敬。很多年轻人也以他们为榜样,梦想着做一名程序员,最后成为新一代的IT英雄。在这里,笔者作为一个职业程序员的角度,想和大家谈谈自己的感受。 #1 为什么要做一个程序员 谈到这个问题似乎会让人觉得太简单、太幼稚。看看现在程序员舒适的工作环境、丰厚的薪水、过着“快乐”的白领生活一切仿佛都不言自明。其实这是只看到了程序员的一面。我们的另一面则不为关注:没日没夜的工作,通宵加班是家常便饭;整天和键盘打交道,把自己的代码改来改去几十甚至上百遍,目的只是为了想抓住一个小小的Bug……这种枯燥的生活又有谁能切身体会?没有对软件事业本身的执著、对源代码近乎朝圣般的痴迷,这一切都是普通人不能忍受的。但是当你的程序完全通过了测试,成为一个合格的产品。这个时候的喜悦,又是如此强烈地激荡在你胸中。也只有真正热爱编程的人,才会感到其中真正的快乐。所以如果有人问你为什么要做一个程序员,那就告诉他你有足够的勇气面对每一次调试失败、有坚定耐心和信心来写好每一行代码。这是我的热爱,编程就是一种乐趣! #1 学编程是先学什么? 对于广大编程初学者来说,存在着这样普遍的认识:学习程序设计选择编程语言很重要,开口闭口就是Visual Basic、Visual C++、Delphi、Power Builder等一些现在一些比较流行的开发工具。经常看见有初学者问:我学C/C++,究竟是学Visual C++好呢,还是学Borland C++ Builder好呢?或者就是要求在Visual Basic和Delphi之间做出选择。学习程序设计和学习程序设计语言究竟是怎么一种关系呢?初学者究竟应该如何取舍呢?就此我们打个简单的比方:学习程序设计就好比学习射击,而程序设计语言就对应射击中的气枪、手枪、步枪等各种枪械。学习射击必须要选择一种枪械,不可能没有枪还能学好射击的,也不可能同时学会使用所有的枪械。但是,如果掌握一种枪械的射击,再学别的枪就触类旁通了。因为在熟悉一种枪械的同时,也学习了射击技术本身。再学其他的,自然事半功倍。学习程序设计也是一样,必然要从学习一门程序设计语言开始入手。同时在学习的过程中,不但要掌握这门语言语法本身,还要学会编程的思想,这是所有程序设计语言的基础。程序设计语言,是“一法通,万法皆通”的。 建议:学习程序设计不必苛求一定要从某一种语言入手,可以在Visual Basic、Delphi、Borland C++ Builder、DOS下的Pascal、Turbo C(或Borland C)等中间选择自己比较容易接受的一种进行学习。从中主要学习的是编程本身的思想,学习的是用程序设计的眼光来看待问题。或许,学习的效果不能马上看到,但是可以学到扎实的基本功,而这对于将来的进一步发展是有很大好处的。这些基本功包括: #1 一、强化逻辑分析和建立数学模型的能力 编程的目的是什么?是要解决现实中的问题。而现实中的问题是用自然语言描述的,目前的计算机对之是无法理解。我们要做的就是必须用计算机能理解的方式将之“告诉”计算机。也就需要我们对现实问题进行逻辑分析,建立合适的数学模型,然后以程序和数据的形式输入计算机,让计算机帮我们来分析解决。一个简单的例子就是计算机对于颜色的处理办法:用R、G、B三色分量来各表示一种颜色,对于颜色的处理被转化为对R、G、B三个整数的处理。我们只要改变这三个整数,就可以改变成为另外一种颜色。对于其他的现实问题,我们也要象这样使之可以被计算机所“理解”。这是编程所要解决的第一步,否则就根本没有程可编。这是建立在"经验"上的,是要在学习过程中逐步积累的。 #1 二、数据结构和算法知识 程序设计发展到现在,已经有了一套比较普遍、完整的数学模型(我们称之为数据结构)和对应这些数学模型的处理方法(也就是算法)。目前的程序就是以之为基础的。在程序员中间流传着一句经验之谈:“好的数据结构是程序的一半。”其重要性可见一斑。作为一个程序员,如果不知道数据结构中堆栈、队列、链表、树,不知道算法中的查找、排序、树的遍历、递归,这简直是不可想象的。我们所说的“编程的思想”也就是具体表现为这两点。所以,一般的数据结构和算法知识是学习程序设计过程中必须掌握的,这样在以后的程序开发过程中就可以觉得得心应手。 #1 三、丰富的实践经验 程序设计本身就是一门实践性很强的学科。一个只存在于纸上的程序如同没有翅膀的鸟永远不能飞翔在现实的天空。任由代码写得再巧妙,风格再优美,也是一张纸上的一连串字符而已。就好比是一份作文练习,或许写得很好,但是不交给老师去批阅,和一张白纸又有什么区别呢?在这里,程序就是作文,而计算机就是老师。只有把“作文”交给“老师”,只有从通过调试的程序中才能印证自己的构想是否正确,或者看到有什么缺陷。当然也少不了要多和同行交流,尤其是随着互联网的普及,在网上我们也可以看到别人编写的例子和源程序,作为现代的程序员,这也是千万不可错过的好机会。 最后,作为一个程序员还有一点小要求:身体素质比较好,能熬夜才行。 #1 有规矩,成方圆 程序开发是一件灵活性很强的工作。例如:变量I增加1,在C语言里面可以有I++、++I、I+=1、I=I+1等多种写法。但是,这并不说明编程就可以顺心所欲,天马行空。良好的编程习惯可以提高工作效率,减少不必要的失误。尤其是对于初学者来说更是要注意的: 第一点:编程的时候,首先要建立好的数据结构。在前面已指出“好的数据结构是程序的一半。”,这句经验之谈自然有其道理所在。编程序的时候,如果在开始的时候设计错数据结构,那么在后来不得不花大代价修改程序。笔者自己就曾有过这样的惨痛教训:一个程序写了2500多行,突然发现基本数据结构不合理,结果全部推翻重写。“磨刀不误砍柴工”绝对不是老生常谈。在开始写代码之前做好数据结构的研究和准备工作往往可以达到事半功倍的效果。 第二点:代码尽可能重用,尽量模块化。无论是面向过程还是面向对象,代码重用都是基本原则之一。例如:如果要画一个青苹果和一个红苹果,就写一个函数来画苹果,把颜色作为参数传进去。这样只要调用同一个函数传不同参数就可以实现画不同的苹果。这样做的好处一是程序比较容易理解,另外修改也方便,只要修改一个地方就可以让两个苹果都发生改变。这点在开发一些短小程序中还感觉不出,但是在以后开发大型程序的时候,工作的效率就明显提高不少。这就是聪明人做聪明事,以最小的代价取得最大的收获。 第三点:良好的编写风格。一个程序,不可能是绝对完美,以后永不用修改的。既然要修改,就必然要重读和理解原来的代码。而良好的编程风格,可以使人更方便和迅速理解程序的结构,从而可以最大限度地提高修改的效率。在这里,笔者举出一些比较好编程的风格要求:1.统一有意义的命名规范:一个变量叫nCount明显比叫iii更容易被理解其真实逻辑含义和数据类型。所以不要怕麻烦,变量和函数名多起几个字母,有意义一点,将来理解起来比较方便。2.代码的逐层缩进格式。这几乎已经成为一种标准,这种格式使得代码之间的层次关系非常明显,对于程序的逻辑理解有很大的帮助。3.代码位置的有条理性。把相关功能的代码集中起来,放在一起,这样在以后阅读代码的时候,可以尽量避免在不同文件模块之间频繁切换。函数内部的逻辑不要太复杂,代码行数不要太长:由于要考虑到以后的理解,所以函数内部的逻辑不要写得很复杂,例如循环嵌套以三层为宜,代码行数以一屏左右为好,太长的代码不利于理解。如果循环的确多、代码的确长,就应该考虑重新再划分为更细的子函数。好的编程风格当然不止这些,这也需要在学习过程中慢慢体会。 第四点:注重程序测试,注意异常处理。这是业余编程爱好者和职业程序员的一个很明显的差别。业余编程爱好者往往只注重程序可以正常运行,而职业程序员除此之外还必须关注程序在异常情况下也必须正常运行,至少可以正常终止。而这是建立在对程序进行充分测试的基础上的。多用不同情况去测试自己的程序,可以发现更多的隐藏的Bug,从而提高自己程序的质量。 千里之行始于足下。做程序员也是这样,这世上不仅没有平坦大道,还有更多的曲折和困难。但是只要真心热爱软件开发,愿意为之而付出,最后胜利的金苹果必将使你体会到个中乐趣。来吧,还犹豫什么,踏上这条程序员之路,昂首向前走吧!