故事就这么开始吧,那天晚上,我们几个在同学甲的家中聚会,他那刚考上大学的小弟突然向我提起了这样一件事:他需要经常使用的一个xx软件总提示说过期了,重装了也不好用。不知道是什么原因。我说既然如此那就看一眼吧,打开电脑,一运行这个软件,立刻跳出个对话框,英文大意是:这个共享软件的试用期已过,如果想继续使用,请向某地址汇款25美元便可取得一个注册码,然后就可以继续使用。既然找到了问题的根源那就好解决了,我告诉小弟:目前你有两种选择,第一:汇款25美元去美国;第二:给我搞一个Soft-ICE软件来。要说现在的年轻人脑子反应多快,小弟毫不迟疑地选择了第二种方案。
 
Soft-ICE很容易地安装好了,我的手指便开始在F10,F8,F11之间不停地跳跃起来。20分钟后,小弟的英文名字便堂而皇之地出现在xx软件的版权页上,当然,“合法”的注册码就写在名字的下面,小弟再也不用为了这个软件而挠头了。事情搞定了,大家都很高兴,频频向我举杯,我也微微有些得意起来,小弟更是兴致勃勃,非要拜我为师,向我学编程。我哑然失笑,如果这也叫水平的话,世界上的高手那也太多了!望着这个比我年少将近十岁的年轻人,想起这些年来学习电脑的经历和感受,我情不自禁地回忆起当年的一段段往事,这些岁月的故事如果能给初学电脑的人,尤其是初学编程的人哪怕是一点点地启发,我也就非常高兴了。
 
其实编程对我来说只是一种个人爱好。
 
我上高一的那一年,学校刚刚开始有了微机课,当时的设备是十台LASER310.BASIC语言也就成了我的入门教材,虽然只学会了十几条基本语句,但循环,选择,分支等基本的程序结构都已掌握,这些编程的基本功是很重要的,无论是何种语言,这些东西都是差不多的。
 
终于考上了大学,本想学一些“深层次”的知识,不想课堂上教的还是BASIC语言,我们上机用的都是gwbasic,这个解释型的东西我用起来很不习惯,写出来的源程序如果想在别人的机器上运行,还需要先进入解释环境load一下,然后再run.感觉很不爽。最让我百思不得其解的是:如果使用作图语句,就会得到一个“非法函数调用”的提示,管机房的老师也不知道原因,害的我辛辛苦苦敲了一下午的程序成了摆设。直到今天我才了解,当时的 286机器上用的是“大力神”显卡,这种单色显卡如果想能够进入图形模式,显卡上的跳线必须改动。
 
客观地说,basic 语言是初学者的首选,它简单易学,可以使一个完全不懂编程的人迅速入门。在最短的时间内学会编写计算机程序的各种要素。但在这里我有一个小小的建议:如果你要学 basic的话,不要用VB,找一个Qbasic用就可以了,而且没有必要学的太深入,能熟练使用基本语句,掌握各种分支结构就行了。关键是你理解了程序的运作形式和实现方法。虽然该语言的功能也很强大,一样可以布置陷阱,调用中断,文件处理,高级作图。但在目前的 Windows时代,学习这些应用是否还有价值很值得怀疑。但如果你实在对这些技术有兴趣,也可以研究研究,我在整个的大学一年级里净搞这些东西了,别的语言都没见过。
 
二年级,不少同学开始学c语言,第一眼看他们学起来很费劲,进Turbo C 之后,每一行程序小心翼翼,敲错一个字母编译时立刻报错,编一个程序需要用很长时间,但也有一个好处,那就是可以生成一个可执行文件,这个文件可以拷贝到其他的电脑上执行。我这才懂得,原来C语言是“编译型”的,其步骤为:源程序-〉编译-〉连接-〉可执行文件。比解释型的basic效率高多了。找本书看了一下,发现 c语言不是很好学。有个新术语“指针”一时间无法理解。另一方面,我发现他们用c做出来的东西我用basic一样可以做出来,执行起来效果几乎一样。在这种情况下,学习 c语言是否合适呢?我左右为难,索性先放一放,还是先去学一下最“高深”的语言——汇编语言吧。
 
电脑系统由硬件和软件组成,软件通过BIOS和硬件打交道。比如说我们要读软盘上的一个文件,操作系统首先找到这个文件,然后把有关的信息传送给BIOS,后者使用中断指令“唤醒”软驱上的控制芯片upd765A,这个芯片就开始作驱动马达,移动磁头等工作,最终从软盘上读取我们需要的资料。可以看到,在操作系统-〉基本输入输出系统(bios)-〉硬件控制器这三个不同的层次上,我们“层次越低”,就越能了解电脑系统的运作方式,对编程的理解就越丰富。精通操作系统可以成为系统工程师,但熟悉软盘控制器编程就可能破解kv300(违法行为,决不提倡)。
 
在汇编语言看来,所谓的各种不同的文档其实都是一样的事物,都是由0和1组成的序列而已,汇编语言做的工作只是处理寄存器里和内存里面的数据,我首先买了一本某大学的汇编语言教材,看了两个星期,虽然学会了一些东西,但心里老有一种“知其然而不知其所以然”的感觉,这么做可以得到结果,但为什么这么做书上没说,时间长了对语言的理解免不了就会大打折扣,将来面对具体问题如何解决?我又到书店逛了一圈,发现一本港台出版的汇编语言入门教材(价格真TMD贵),内容深入浅出,仿佛对一个连电脑都没见过的人讲编程,非常适合我这种初学者。就是在这本书中,我第一次学到了MSDOS里面的最有用的命令“Debug”,我的几百个汇编语言小程序都是用这个命令一下一下单布执行的,相信这将是每一位学习汇编语言的人必修的课程之一。
 
内存以地址来划分,访问特定地址里面的数据称之为“寻址”,这是很灵活的应用方式,可以分为许多种,但如果加以区分理解起来就不困难。汇编语言上百条指令,具体编程时,实现一种功能的方法可以有许多种,我们应该拥有正确的程序风格,用比较正统的实现方法编写各种模块,从大方向上把握程序的执行顺序。千万不要卖弄小聪明,搞一些特别的技巧,虽然当时认为自己看得明白,但时间一长恐怕就记不住了,那时候如果再要维护这段代码会非常费劲,所以请学习编程的人首先要记住:一定程度的创造性是必要的,但太专业或充满技巧的代码则是各种 bug的发源地,同时也是若干个不眠之夜的前奏。
 
汇编语言学到一定程度就想做点什么,但如果用它来搞具体的应用又好象不太适合,当时我唯一搞得比较多的,也是比较适合用汇编语言做的就是各种内存驻留程序了,修改各种中断也挺有意思的。其实这些比较深入的功能调用在微软公司发布的正式文档里很不常见,我都是从其它的书本里学到的。那时我就想:如果大家都用MASM来编程,微软公司的程序员一定比其它公司的程序员占据优势。直到今天,据说在Windows 98中也存在大量未公开的函数,也许这些调用真的是不完善的,但我相信微软公司这么做一定有自己的道理。
 
95年我拥有了自己的电脑,486dx2/50,4M 内存,210M硬盘.现在可以放开手脚,好好学学C语言了。我安装了Turbo C 2.0这个据说在全世界被用得最多的C语言编译环境。手持一本《库函数大全》,开始了我的C语言旅程。
 
C语言博大精深,有许许多多的新术语出现在我面前。第一个就是指针,好在有汇编作基础,有关内存存储方面的东西不会使我困惑。还有各种不同的变量类型:数组,结构,联合等。我逐渐感到,这是一种非常灵活的语言。既有高级语言的可读性,也有汇编语言的效率。记得当时和几个同学联合搞了几个小软件。如今这些东西已成了昨日黄花,但那时在学校里“三更读书五更鸡,正是发奋编程时”的情景仿佛还在眼前。
 
C语言是一种短小精悍的语言,如果用于开发比较大的系统就比较显得力不从心,主要原因在于代码过于庞大,维护起来很困难。如何让程序的维护变得容易起来,维护人员既可以很好地继承源代码,又能在不破坏源代码的条件下自由地扩充新的系统功能呢?最好的解决方案终于出现了,那就是把我们要处理的数据和处理这些数据需要的函数放在一起,形成一个新的数据结构——类。把数据和函数封装在类里面。程序员对类操作,并不用关心类的具体实现,通过派生新类来增加新的功能,代码的维护工作就会简单的多。就这样,“带类的C语言”诞生了。起名为“C++”.由于类封装了数据和函数,往往被当作一个实体来操作,我们完全可以把类比作一个现实生活中的具体对象,所以就有了面向对象的程序开发语言之说.当然,这是一种很浅显的理解方式。
 
C++程序是由一组类组成的,而C程序则是由一组函数组成的,当设计C程序时,我们主要是开发出完成特定功能的函数,而在设计C++程序时,我们的任务则是设计完成特定功能的类。有关类的新概念有:类的成员,构造函数和析构函数,类的继承,存储管理,this指针,类的友元,类的作用域等等。我学这些知识的时候付出了非常多的时间和精力,课堂上不讲,同学们绝大多数只懂得C,没有一个人告诉我这些概念应如何理解,许多书本上说的杂乱无章,许多书上还相互矛盾。我头脑很苯,对于新事物接受能力很差,有的时候即使例子程序成功运行了我也不明白这一切是如何发生的。这个时期是我学编程最累的时期,大约持续了一年多。直到今天,我对于一些C++语言中比较高深的理论的理解仍然似是而非,但已经不太妨碍我的编程了。
 
C++里有许多先进技术,如强制类型转换机制,可以很大程度地提高程序在数据类型转换方面的安全性;动态内存分配,可以使程序在运行时根据需要随时创建和销毁堆对象;流机制,可以用运算符重载来非常容易地实现各种对象的输入输出;函数重载,同一个名字的函数可以处理不同类型的数据;模版,为函数和类设计蓝图的工具,在新的高度上生成我们需要的函数和类;名字空间可以允许程序员定义和使用自己的作用域....这些相当高级的东西值得每一个喜爱编程的人认真学习。
 
Borland C++ 3.1我在电脑上安装了许多遍。许多程序就是用它编写调试的,在一个程序运行的时候竟然可以同时运行另外一个程序,我不知道BC31是如何做到的,难道有两份内存同时存在?很不理解。但这时windows3.1出现了,这个图形化的操作环境吸引了我。它也可以实现多任务功能!到底原因在哪里呢?我非常想了解,好在BC31在Windows3.1下面也有个编译环境,试着写了几个程序都不能运行,看来Windows的运行方式和DOS有所不同。我逐渐感到可能要迎接一个新的挑战了。
 
Fortran77是适合工程计算用的语言,其特点是相当精确,对于数值的处理能力很强,虽然当时课堂上学得很好,但由于很不常用,如今恐怕都忘记了,只记得好像是说当年美国“挑战者”号宇航飞船失事就是有一行Fortran77的语句缺少了一个空格而造成的。我不知道这种说法是否正确,但对编译型的语言来说一个字母,一个空格都是很重要的,一定要注意留神不要搞错了。这一点PASCAL语言就做得很好,我是为了学习数据结构才和PASCAL打交道的,其结构化程度之高让我措手不及,在C和C++中散漫惯了的我差一点打了退堂鼓,好在循环,选择之类的东西都差不多,记住语法形式就照猫画虎了,我的大部分时间还是用在研究队列,栈,链表,矩阵,二叉树等等高级的数据结构上了,实在很烦人,二个月下来,我的脑袋都快变成一锅粥了。后来发现在BorladnC++40里竟然已经提供了一套包容类库,都是编写好了的模版,完全可以实现上述数据结构,再也不用手工实现了。
 
96年我升级到了多媒体,有时也玩玩游戏,许多数据量很大的游戏都用一个名为“DOS/4GW.EXE”的软件装载。据说这个东西与Wastcom C有关,而后者很适合处理数据量很大的C语言程序,我好不容易找到了这个编译器。(那时的盗版光盘50元一张),从此进入了“保护模式”,我可以随意申请一个大于64K的数组,处理图片可以一次读入一张,解码速度非常快。由于市面上没找到有关资料,我花了二百元在打字社打印了一份好几百页的Wastcom C库函数的在线帮助文档。回想当时兴奋的心情,仿佛得到了一件宝贝一样。如今这本手册已经不知道身在何方,花掉的二百元钱却让我至今耿耿于怀。
 
越来越多的程序都转向Windows平台了,硬件的发展也促进了软件的进步,我们以前用的DOS运行在CPU的实模式状态下,当CPU运行在保护模式的时候就可以提供比物理内存更多的资源来供应用程序使用,甚至可以让多个程序同时运行,操作系统“保护”着各个任务自己的内存空间以保证它们之间可以互不干扰,。而多个任务之间必要的时候还可以通信!这是多么高级的系统平台!在这上面搞软件肯定更有意思!看来有必要学习Windows了。
 
我先学的是Visual BASIC 1.0,据说它有许多优点,但学了二个月我就决定放弃了,第一个原因是结构简单,一些复杂的数据比较难以实现,虽然简单易学,可以调用绝大多数的Windows API,甚至可以调用未公开函数,但我自己总觉得:如果不是要搞数据库,VB的作用只能是给初学者树立一种“Windows编程并不难”的信心而已。我们可以一行代码不写就在屏幕上显示一幅图像,但在这个过程中,有许许多多的东西被隐藏了,你不知道这一切是如何发生的。如果想做一些深层次的,涉及系统内部的事情,你可能不会知道从那里入手。我在这里的的意思不是说BASIC的功能不强,但Windows的本身毕竟不是用BASIC语言做的,(绝大部分是C,核心代码是汇编)。第二个原因是速度问题,VB的速度太慢了,虽然可以生成一个可执行文件,但当时却是一种“伪编译”,生成的是一种“伪代码”,运行时需要一个翻译时间,速度比用Borland C++等真正的编译器开发出来的软件要慢的多,并且开发的程序在没有VB运行库的机器上还不能运行。第三个原因就不好说了:用面向对象的VB来编程,我竟然不知道如何使用类。实在不好意思,在这里让大家见笑了,但当时的我在那种条件下就是这个样子。如今的VB60已经今非昔比,可以在最短的时间内开发出功能强大的各种数据库管理软件,如果你对编程要求效率的话,首要考虑的平台就是VB。
 
如果想在Windows里用C++的话,我们必须对Windows的运行机制做一个基本了解,必须知道事件驱动机制是如何实现的,简单地说,操作系统等待各种事件的发生,把相应的信息传送给应用程序,程序对于不同的消息作出不同的处理。我们的程序就是编写各种处理消息的函数。编程平台的大哥大Visual C++为了简化编程提供了一套基本类库(mfc),封装了大量的类,内容包含了Windows编程的各个方面。如果说某人使用VC相当厉害,那意思一般就是说这家伙对mfc十分精通。在这里建议初学者不要一开始就学mfc,还是搞一点API编程,对Windows系统了解多了再学mfc不迟。
 
97年,没人再玩DOS了,我把内存扩到16M,勉强装了Windows 95,在我的机器上,编译一个用OWL类库开发的小程序足足需要五分钟。简直让人无法接受,软件淘汰了硬件,硬件淘汰了我。那年的冬天特别冷,我一个人龟缩在没有暖气的小屋内,一遍一遍地输入书本上的例子程序,许多程序我一个字都没错,但就是不好使,我不明白原因何在,一套五本的《Windows程序员使用指南》不知道被我翻了多少遍,每次按下F5键的时候,我总是敲着冻的发木的脑袋,望着窗外飘逝的雪花,愈发感觉到一个人的孤立无助。
 
Win95是一个独立的操作系统,在保护模式方面的应用上了一个新的台阶有许多激动人心的新特性:具有优先权的多任务处理,线程的独立输入队列,平面式32位的内存编址模式,基于线索的多任务.....这些都是一个Windows程序员必须了解的基本概念。我感到一个新的时代到来了,而我以前在大学里刻苦钻研的种种有关编程的知识仿佛在一夜之间变得一钱不值了!到处都是win95,我的那些东西恐怕是真的没用了。但我仍然没有因此而放弃我的学习历程,98年秋,我升级了电脑,一台K6-233,32M/2.1G摆到了我的面前,这回终于可以自由地调试Windows程序了,25岁的我高兴得象个孩子一样。
 
我在DELPHI上用的时间大约在半年左右,曾经在程序开发语言领域一枝独秀的Borland公司终于不敌微软的攻势而败下阵来,但它出品的DELPHI语言仍然有许多人在用。原因在于DELPHI语言既拥有VB一样简单易学容易上手的优点,同时也借鉴了VC的效率和速度。DELPHI语言以VCL类库为核心,封装了包罗万象的控件,使用起来非常方便快捷,学习起来也不象VC那样耗费大量的时间和精力。是业余编程爱好者的最佳选择了。如果用于应用,DELPHI在开发数据库方面的能力同样十分了得,可以在这方面我没有进一步学习。
 
我本人对数据库不感兴趣,虽然开发数据库是一项很有“钱”途的职业,但我从来没在这方面下过一点功夫。到是在用Direct X编写电脑游戏方面有了一定的心得,计算机编程,毕竟只是我的一种业余爱好。我现在手头常翻的书有两本,《Visual C++ 6.0类库大全》和《.参考大全》。
 
许多年过去了,我逐渐意识到:如果单独的某个人想在软件编程方面取得一定的成就,仅仅靠自己学是绝对不行的,那种单枪匹马的个人时代已经一去不复返了。互联网时代的到来,将完全打破旧有的软件生产方式,我们面对的将是有史以来最大的挑战和机遇。我的电脑自学了十年,软件编程方面一事无成。希望现在要学编程的朋友能从我的经历中汲取有用的东西,何去何从,做出正确的选择。十年的岁月不会重来,一个人真正的激情又能持续多少个十年?
 
今年“五一”,在同学甲的婚礼上,我戏问他:父类已经定义了,到了晚上就能实现。不知道子类何时派生出来呀?同学甲大笑着回答:很快,很快,派生类很快就能出现,不过我这可是私有继承啊。
全文完
声明:本文写于1999年,想不到又是一个10年过去了,文中有关技术性论述现在看来当然是很幼稚,比如对数据库的认识,对C++相关概念理解等等,诸君一笑而过吧。
 
2009新年快乐!