我的编程之路
我的编程之路很短,只有7年左右,我现在已经对编程完全没有了兴趣,已经停止继续走下去了。
我大概在初二的时候开始我的编程之路,我终于通过歪曲电脑学习机的意思而让我妈给我买了一台带有软盘驱动器的电脑学习机。那时正是玩游戏的一个休息阶段(之前疯狂地我自己都无法想象),我开始有点腻FC上的游戏了,不过每天依旧会去玩街机。买电脑学习机的唯一目的就是想要编游戏,当时买的电脑学习机号称很厉害,还提供了汇编语言以进行一些相当高级的编程,不过对当时的我来说,找杂志翻报纸以了解汇编语言是什么东西(那个学习机厂商竟然针对其学习机的功能发行了报纸),不过最后是了解nothing。所以开始学习其提供的其他语言——G-BASIC、LOGO和另一个支持浮点计算的语言(名字记不到了:)),开始了我在学习机上编写类FC的8位可以认为不是游戏的游戏。
当时真的很兴奋,初二那学年真的是全身心投入,重点学习G-BASIC(Game-BASIC),还邮购了《G-BASIC程序100例》以及那个公司出的报纸,上面总有一些新的样例。但后来发现那本书以及报纸上的样例都好弱,什么一元二次方程求解,或者实现用手柄控制卡通人物动作(实际很简单,G-BASIC针对此功能提供了特定的语法)。结果就导致想寄程序去投稿,但最终还是没有结果,不过并没有打击我的热情。当时编了好多现在想起都好笑的东西,比如利用学习机已经提供的图案拼出一个好像导弹但又很大的家伙随机地从屏幕两侧穿出,而自己就控制玛利奥跳跃躲闪;或者在屏幕中间画一个藤条,两个手柄各自控制藤条两边的两个飞机,并射出子弹,飞机碰到藤条就会爆炸,双方互相射击直至一方爆炸(现在想想真是好笑,其实当时要是让那个藤条还会左右移动将更有意思)。不过最厉害的还是要属编了一个强手棋的游戏。强手棋当时在我们那里很流行,就是现在的大富翁游戏的简化版,只不过钞票、地图等都做出来了,一群人围着玩。当时我利用学习机中仅有的图案拼凑了一个大致的强手棋的地图,并都已经编好掷股子及一些相关功能,当进一步编下去的时候,学习机罢工了,说内存不足,倒啊~~~。原来那个学习机的G-BASIC的程序最多只能编4096字节的长度,我当时没语言了。
后来我妈的单位开始使用电脑,一个4MHz且4M内存的386电脑,200M的硬盘,当时我什么都没管,只要求我妈能用那显示器显示一幅图片,最后终于利用希望公司的什么软件让我在那14寸的显示器上看到了由很多点组成的一幅比电视清楚多了的图片,其实只是想确认是否能够用电脑来编游戏,现在想来真是好笑。有了高级的东西,当然屏弃那个只能4096字节且不能自己画图片的学习机了。当时得知DOS自带了一个翻译器——QBASIC,其实当时根本不知道什么翻译器,只知道有个QBASIC在DOS下,可以调用来编程序。让我妈托关系,让我进了她单位的图书馆,找QBASIC的书,了解了如何画线及画点后就开始我的宏图大业了。
我当时就想怎么用三维来表现东西,然后就靠自己的空间想象,借助平面几何,竟然让我推出了给出视点位置及方向,空间中一点的位置投影到二维屏幕上的公式,还一再化简以求能够快速显示(现在利用硬件提供的矩阵计算功能即可实现这一点)。然后就利用QBASIC的画线函数编出了线框形式的长方体、球体及圆台体的三维运动效果,即视点位置不断变化以表现出长方体好像在转动。不过当然的,线框是没有消隐的。当时那个成就感,现在已经记不到了,又由于当时就只能在我妈单位的机子上运行,没法给别人看以炫耀一下,不过我妈是很高兴的,只不过还是叫我学习为重。
之后还帮我妈学习FoxBase,一晚上借着那本FoxBase的书就给我妈编了一个超简单的FoxBase程序以进行最简单的数据库操作(具体是什么早忘了),后来我妈的单位升级,用FoxPro2.6了,结果我又被老妈要求,看一本厚厚的FoxPro2.6教程,学会了好教她。呵,不过我学软件倒是挺快的。
后来我妈听人说现在编程序都使用C语言编程序,当时就叫我妈去找了一本C语言的书,名字是记不到了,就记着好薄,当天晚上就看完了,然后就让我妈去找C语言的程序(其实就是C编译器,不过那时我还不知道何谓编译器)装在她单位的机子上,我妈打听了很久最后得知单位的机子差了不能装(必须是Win98系统,单位的机子是DOS,且好象是由于硬盘不够连Win95都装不上,只有一个Win3.1),结果就那么不了了之了。
高一,我终于买了我的一台电脑,我自己DIY了多久是不记得了,花了7400RMB,64M内存的赛扬300A,RIVA128ZX显卡(比TNT2低一个档次的显卡),反正当时能玩极品飞车4,800×600的16bit是很正常的。当时还真是热血高涨,买了电脑的第二天就叫老妈陪着逛书店找C语言的书,结果真搞笑,找了半天都没有C语言的书,最后东翻西翻看着一本很像是讲C语言的书,书名是《VC6.0高级进阶》,并从中知道要去买叫VC的软件。现在想起来真是狂笑,我那时连C++都没听说过竟然就买了《VC6.0高级进阶》。然后买了我的第一张倒版软件(至今还未买过正版软件,不过以后应该回了,换环境了)——Visual Studio 6.0。那时急冲冲地找到老板就问有没有VC,接着就立刻装了VC。
看书,疯了,“类是什么?什么重载?序列化??”那本书的第一章讲CObject,说明其四大特点。我就等同于看天书,一时气坏了,把它丢在一边,开始正常使用电脑了——买了一合集,里面带了极品飞车4。不知玩了多久,反正将极品飞车4中的所有赛道及隐藏车都打出来了(那时已经不知玩了多少游戏了,至少已经装了半抽屉的碟子),相当于一个冷静阶段。爽啊,极品飞车,这样我又有了编游戏的想法了。这次终于知道C++是个语言,和C不一样,于是又叫我妈去找了一本C++的书,结果是本很厚(大概两个指节高)的,是讲Microsoft C/C++(应该是一个编译器,不过当时是不知道的了)。然后我用了几天看,再看原来那本,总算舒服一些了。当时我实际还是没有真正理解,不过自认为理解了,并知道了在视类的OnDraw成员函数中写画画的代码。于是与之前一样,看了如何画线和画点,并把那个画三维线框的BASIC版给改成了C版本,并全部放到OnDraw中,即视点运动的循环也放到了其中,结果编出的程序的确可以画运动的三维线框,但在视点运动完成之前,那个窗口都不能拖动,就好像死机一样。当时是不知道,也不在意,那实际是因为线程资源被强行束缚在了OnDraw中,程序的消息循环无法得到线程资源导致不能处理消息而不能更新窗口,不过已经不重要了。那以后就开始比较正常地学习VC了,说准确点应该是学习MFC,但我当时根本连MFC都不能理解,应该说不能理解类,那时只是简单的将类理解为带了函数的结构而已,因此也根本不能理解MFC的界面包装类的含义(连窗口都不知道还如何知道包装类的含义)。
就这么实际什么都不了解但又会做一些简单的界面,照着那本高级进阶的书上的样例学习,一步一步将一个能够画矩形、椭圆等形状的不能称为软件的软件做出来了,也照着加了撤消等功能。直到某天,我突然间了解到窗口的真正意思,进而一下编出了那本书上没有的界面,还花哨、很怪异的界面。实际就是了解了消息的意思,并且知道了消息循环而已,实际还是不清楚消息循环的真正含义。由于我的主要目的是做游戏,很正常地我也学习了3D Stuido MAX、Photoshop,甚至包括Cakewalk,并大致会用它们的一半功能(现在已经能熟练操作Photoshop了,不过其他的则还是原样),结果当时立刻诳语——原来3DMAX也不过如此,我也能编3DMAX这样的软件。其实当时的准确意思是指能编3DMAX那样的界面,但我由于这个原因开始了我的第一个游戏编写(因为已经可以用3DMAX渲染出一些还凑和的图片)。
在编写游戏时,在纸上写下了大概的流程,并且开始写游戏的主循环并写完(真的异常荒谬,那个时候我连DirectDraw都没听说过,竟然想着借助GDI的绘图功能进行绘画,不过当时连GDI也不知道)。然后突然发现,我还需要一个地图编辑软件,或者是游戏数据编辑软件,用于创建游戏中的人物的性格、各项数据等。因此立刻开始了编写这个游戏数据编辑软件,还真地挺快,几下就编了一半了,然后我朋友来了。他看着我的半成品,一句话——“好像很厉害,但为什么就是觉得没有专业的感觉,这个字体太大了”。说实话,我那时连字体怎么改都不清楚,但由于已经会用MSDN了,所以根本不在乎。后来找了很久,发现使用宋体9号字感觉最好,比较有专业味道。由于这么一闹,停了一下,觉得界面比原来专业多了,结果突然想到一个不好的东西。
当时突然想到,如果每编一个游戏都要多编这么一个编辑软件,岂不是效率很低下?当时就想:那些游戏公司是怎么做游戏的呢?并假想应该有那么一个表,某个职员想到了一个不错的点子,就填那个表,提交给上面,上面则审查通过后就给某个开发小组,由开发小组来做。那么为什么不编一个相当于开发小组的软件,只用将那个表的内容输入电脑,它就可以自动生成两个程序,一个是游戏的主程序,一个是游戏数据的编辑软件。
当时之高兴,之兴奋,认为自己说不定可以利用这个而开家公司。也由于一天到晚玩游戏、想这些乱七八糟的东西,结果高考填志愿前最后一次摸底考试,我考了392。我妈之伤心,担心地不得了,不过我依旧没想法,第一志愿还是那个重点本科大学,然后开始复习,最后548,舒服了。但由于分低了,并不是我希望的电子工程系,而是机械系。当时还有点后悔,现在则完全不了,认为是老天知道机械更有意义得多而带我走到正路上。当时本来约了四个人,说大家到了大学就做游戏,都考那个大学,并申请住在同一寝室,结果阴差阳错,四个人分散到三个学校,且同校的也不同寝室。
我认生,开始不熟,不喜欢讲话,开学前几天就买了《Windows核心编程》,并且用了两天将它看完了。说是看完了,实际最多只是了解了进程线程等概念,知道了DLL的意思,并已经大致了解多线程罢了。然后很有成就感——两天就看“完”一本——并且继续又买书,如《Effective C++》等,一般都是两三天就看完,但结果却VC方面编程的书买得少(现在也只有7、8本,且其中4本还是COM的),而美工方面的书却远远多于其他书籍(至少有15本以上),最后就是一些什么奔腾处理器的汇编语言、计算机图形学、网络、数字图象处理等理论方面的书。结果别人来向我借VC的书,找不出一本合适的。
大一下学期把电脑搬到宿舍,打算继续开始那个造游戏的软件。结果老妈不时的要编一些小软件,如什么档案管理系统(其实就是一个界面加上对Access数据库的访问),重点是界面要漂亮,结果整个界面没有任何Windows的标准元素,全部使用自绘形式,就好像现在的播放器一样;什么统计信息软件,用于临时统计当时的一个什么调查结果。后来一老师也知道了我会编程序,先只是帮忙查看错误,VB编的,但一去就无语了,决定第二天重新用VC编一个,是按照某些要求随机地从数据库中选试题出卷子的程序。接着零碎地偶尔用VBA编些脚本小程序帮那些老师方便在Excel中的计算。
平时大部分时间还是玩游戏,但当静下来时,就又会想起那未完的事业,并意图奋斗。在前面那样零碎地编写小程序时,不断地积累经验(包括软件设计经验),但最重要的是程序设计经验,并进而发现原来的那个造游戏的程序的设计是多么的愚蠢兼荒谬,并随着自己设计思想的完善,对其功能及程序结构改版一次又一次,还没开始编就已经是5.0版了,并起名为GameFactory,用于大幅度降低游戏开发程序员的编程强度,自认为能够使强度降低到原来的30%到40%,且还能大大降低BUG的出现,而最重要的就是不用再编写游戏数据编辑软件了,其具有这个功能。
终于,我了解到了要绘图,就应该要使用DirectDraw,如果希望得到三维效果,就应该使用Direct3D或OpenGL(玩了那么久的电脑游戏,再怎么也都知道了)。在GameFactory还是5.0版的时候我开始学习DirectDraw及Direct3D。说实话,那时都还未真正理解包装类的含义,对DLL的意义并不了解,然而我听到了一个词——COM。
简直莫名其妙,什么COM?还有那些奇怪的语法(指用C语言调用COM组件暴露的接口方法的语法),以及使用CoCreateInstance或CreateDirect3D创建Direct3D对象。创建对象?那时已经了解面向对象的含义,但完全不能理解它这里的创建对象。后面虽然照着书,并就先不理解COM的接口的含义,只是简单的将那个接口当作一个指针,然后使用指针调用相应的函数,编出了那个5.0的雏形,并且用Direct3D实现了其中的某些资源的编辑。不过后来终于不能忍受那些莫名的东西(为了编得更有效率),去买了《COM精髓》回来看。
说实话,当时根本没看懂,就放在一边,但却让我领悟到了DLL的另一个重大意义——提供接口以提高软件的可扩展性,并进而导致我立刻废掉了5.0,全新设计了6.0,还是基于可扩展性来设计的,且连软件的原来用法都全部改变,软件使用的设计就好像Photoshop中的滤镜使用的设计一样,反正又一次大变革。但我又由于一个新的大作的问世而废寝忘食了不知多久,结果就又搁置一段时间,期间买了一两本COM的书,并且不时地翻翻,结果发生大事了。
大三下学期,一个老师接到一个项目,为一公司开发一信息管理系统,并且还有模有样地跑到别人公司去做了调研,了解需求。不过说实话,我当时根本不知道什么需求分析等乱七八糟的东西,只是认为:他需要什么,我就给他实现什么。后来了解了大致需要,我给出了程序的框架,是Microsoft提倡的3层分布式应用,并且给出了各接口的设计,即各模块之间的衔接接口(不过当时对于接口的设计还很生疏,所以现在看那时的设计,只能用可笑来形容)。当时那个小组里面我和另一个已有两年工作经验的人是主要编程人员,他使用Delphi(我那时竟然没听说过这个软件),很明显地对我不屑一顾。在第一次见面时,他给出了他的程序结构框图,当时设计出的效果等同于电话线,即使用打电话就可以实现他设计的功能。我当时就表示不好,这编来毫无意义,并且那个设计更没有可扩展性可言。我接着又提到一些细节问题,他竟然全部回答现在先不慌考虑这些!如果一开始的架构就不考虑下面可能出现的问题,那么以后编程时又倒过来重复修改。后来在老外的一篇讲游戏设计策划书书写的文章中了解到这是必要的,即由于项目的过于复杂而导致细节的疏漏,但他的设计连一些很浅显的问题都没处理。
后来我开始编写基本框架,即实现前面定的接口,并编写一基本组件以实现权限功能。不得不承认,我当时由于新出的游戏及漫画而拖了一个星期,但当我编完基本框架后(连安装程序都一并制作了以实现在不同的机子上注册不同的组件信息),那个老师说暂时缓一缓,说那个公司嫌太贵了,大家还要再商议一下,并且从我这里把所有的相关资料拿走。很明显,我意识到是那个老师在后来几次的聚会中从我和那位程序员的争论中选择了后者,认为我完全是一不懂的外行而将我一脚踢出,至今再未联系过我。
那次,真的可说是让我的编程水平与设计水平大幅度升高,对MFC及ATL了解地相当透彻(至少我以为),而COM的设计理念一下就领悟到了,那是那些书上没有提过的,并且熟悉了多线程编程,不过对于COM的线程模型当时还不是很清醒,而且,我开始厌倦编程了。
由于那次的领悟,我了解到COM的设计理念,所以又将6.0的设计给删了,再次重新设计GameFactory的使用方式及实现架构,并改名为GameProducer,为一基于DCOM的分布式应用程序。因此很正常地,我开始看COM+的书以学习如何设计大型分布式软件,结果发现要理解COM+,应该且必须先理解MTS,我本人认为COM+是借MTS的壳封装了更多的东西(不止MSMQ,不过个人认为MSMQ的意义不大)。所以我拿着金山词霸把MSDN中的MTS的帮助文档看完了,并且了解到MTS的设计理念,又和COM的理念不同,且当时还想写一篇文章以帮助自己加深一下印象,不过后来由于兴致问题还是算了。同样为了实现基于操作系统的安全机制,也看了Windows提供的关于安全方面的MSDN中的信息,即安全描述符那一类东西。并且看完了MSDN中COM的开发文档。上面都是从MSDN中看的,结果后来,我不再找书,而是直接看MSDN,发觉它说得要比那些书上讲的深入得多,而且许多内容都无书可寻,结果关于MIDL的深入运用我也是由MSDN了解的。
后来又另一老师要我给他编个类似Flash加PowerPoint的软件,只不过是三维的资源,而且也不需要像flash那样提供需要复杂算法的变形动画,只要能够按位置、角度给出关键帧,自动插入其他帧就行了。给了20天,结果我用10天去玩(那些游戏和漫画是很难拒绝的),结果虽然没拖,也做出能自动插入其他帧,但只是线性插值,而且也没有提供友好的界面(还没来得及编),只是使用数字式的操作。那个老师当然性地不满意,而那时,我也就已经彻底讨厌编程了。
后来就大四了,已经没编什么程了。由于对编程的彻底讨厌,我把VC也删了,只是还留着个MSDN,无聊时可以回答下别人的问题,但如果由于硬盘空间问题我就会毫不客气地把MSDN也一同删掉。现在,我已经毕业了,找到了一家小型制造工厂的工作,打算干两年学些经验然后跳槽到造汽车的公司去。至此,我的编程之路走完了,即使留下那个未完的GameProducer,但我已严重讨厌编程了,也许自己50岁的时候又会想起,到时候也许就不会那么讨厌编程而又开始未完的年轻梦想。