|
一、
这篇文章是应之前在微博上爆过的下个周末某出版社的线下活动而写的。回顾我和C++在这个世纪的第二个春天开始发生过的种种事情,我发现我并不是用一个正常的方法来学会如何正常使用C++的。我的C++学习伴随着很多其他流行或者不流行的语言。现在手中掌握的很多淫荡的技巧正是因为学习了很多编程语言的缘故,不过这并不妨碍我正常地使用C++来在合理的时间内完成我的目标。
学习C++是一个艰难的过程。如果从我第一次看C++的书算起,现在已经过了11年了。一开始的动机也是很不靠谱的。刚开始我很喜欢用VB6来开发游戏,但是我能找到的资料都是用C++来做例子的,文字部分又不丰富,于是我遇到了很多困难。因此我去三联书店买了本C++的书,想着我如果学会了C++,就可以把这些例子翻译成VB6的代码,然后继续用VB6来写游戏。阴差阳错,我买到的是一本语法手册。不过那个时候我还小,不知道什么是MSDN,也不知道MSDN是可以打印出来卖的:
不过因为C++在当时并不是我学习的重点,于是我就没事的时候翻一翻。我们都知道语言参考手册(MSDN里面叫Language Reference)的顺序都是按照类别而不是教学顺序来排列的。于是当我花了很长时间看完了第一遍的时候,就觉得这本书写的云里雾里。刚开始讲什么是表达式的时候,例子就出现了大量的函数和类这种更加复杂的东西。于是我选择重新看一遍,基本的概念就都知道了。当然这个时候完全不能算“学会C++”,编程这种事情就跟下象棋一样,规则都很容易,但是你想要下得好,一定要通过长期的练习才能做到。
当然,在这段时间里面,我依然是一边看C++一边用VB6来学习编程。初二的时候学校发了QBasic的课本,当时看了一个星期就完全学会了,我觉得写代码很好玩,于是从此就养成了我没事逛书店的习惯(就连长大了之后泡MM也有时候会去书店,哈哈哈哈哈)。值得一提的是,我第二次去书店的时候,遇到了下面的这本书《Visual Basic高级图形程序设计教程》:
在这之前我买到的两本VB6的书都是在教你怎么用简单的语法,拖拖界面。然后就做出一个程序来。那个时候我心目中编程的概念就是写写记事本啊、写字板啊、计算器等等这些东西,直到我发现了这本书。我还记得当时的心情。我在书架上随手翻了翻,发现VB竟然也可以写出那么漂亮的图形程序。
这本书包含的知识非常丰富,从如何调用VB内置的绘图命令、如何调用Windows API函数来快速访问图片,讲到了如何做各种图像的特效滤镜、如何做几何图形的变换,一直到如何对各种3D物体做真实感渲染,甚至是操作4维图形,都讲得清清楚楚。这本书比其他大多数编程读物好的地方在于,读者可以仅靠里面的文字,基本不用看他的代码,就可以学会作者想让你学会的所有东西。因此当我发现我怎么着也找不到这本书的光盘(事实上书店就没有给我)的时候,我并没有感到我失去了什么。这本书的文字部分不仅写得很详细,而且作者还很负责任。作者知道像图形这种对数学基础有一定要求的东西,程序员不一定懂——尤其是我那个时候才上初中,就更不可能懂了——所以在书里面看到一些复杂的数学公式的时候,作者都会很耐心的告诉你这些公式的来源,它们的“物理意义”,有些时候甚至还会推导给你看。因此可以想象,这本书包含的内容也特别的丰富。这导致我在读的时候不断地找资料补充自己的数学知识,从而可以亲自把那些程序写(而不是抄)出来。这个过程一直持续到了我终于不用VB转Delphi,到最后上大学改用C++的那个时候,我终于理解了整本书里面讲的所有内容,给我后面的很多事情打下了坚实的基础。
因为数学知识缺乏的关系,学习这些基础知识又不可能那么快,所以我把一部分时间投入在了游戏开发里面,尝试自己弄点什么出来。毕竟当时对编程有兴趣,就是因为“说不定游戏也可以用代码写出来”的想法,于是我得到了下面的这本书:
这本书是我觉得21天惊天阴谋系列里面唯一一本良心的书。它并没有只是简单的罗列知识,而是教你利用VB6内置的功能搭建从简单到复杂的游戏程序。我第一次看到关于链表的知识就是在这里。可惜在我还没学会如何使用VB6的类模块功能之前,我就已经投向了Delphi,因此并没有机会实践这个知识。不过在此之后,我用VB6写的小游戏,已经尝试把游戏本身的模块(这是VB6的一个功能,就跟namespace差不多)分离,积累一些基础代码。
在这段时间里面,我学习语法都学得很慢。循环甚至是在我用人肉展开循环的方法一行一行复制粘贴出了一个井字棋的AI之后才学会的。后来很晚才学会了写函数,全局变量则更晚了。于是在那个时候我写了很多看起来很愚蠢的代码。曾经我以为一个函数的全局变量在退出函数之后是会保留的,然后对着自己写出来的不能运行的代码感到十分的莫名其妙。还有一次做一个记事本,因为不知道“当前文件路径”要存在什么地方,于是在界面上放了一个Label来放文件名。后来有了雄心壮志,想用VB搞定一个长得像Basic的超简陋的脚本。这当然最后是失败了,但是我依稀记得,我当时取得的成就就是把脚本语言的字符串分割成了一个一个的token之后,保存在了一个表格控件里面,以便之后(后来这个“之后”没写出来)读的时候方便一点。之后还尝试写一个读四则运算字符串计算结果的程序,都是先找最里层的括号,把那条不带括号的简单式子计算完之后,把结果也处理成字符串replace回去。直到整个字符串收敛成一个值为止。一直等到我后来买到了一本系统介绍VB6语法和用法的书之后,我的代码才稍微变得不像猴子打出来的。
在刚开始学编程的时候,基本上都没有什么固定的方向,都是在书店里面碰到什么就写什么。于是有一次我在书店里看到了《Visual Basic 网络高级编程》:
这本书是我在学习VB的过程中最后一本我觉得不错的书了。虽然VB本身也提供了很多访问网络资源的控件,但是这本书并没有让你仅仅会用被人的轮子来写代码,而是一步一步的告诉你这些网络协议的内容,然后让你用Socket来跟这些服务器直接交互。我记得我最后成功的做出了一个邮件收发程序,跟联想1+1系列自带程序的功能已经可以媲美了。
二、
当我发现C++实在是太难,根本没办法真的把网上那些C++的程序改成VB之后,我上了高一,接触了NOI。NOI让我得到的一个收获就是,让我在上了大学之后很坚定的不把时间浪费在ACM上,从而有了很多时间可以搞图形、编译器和女同学。参加高中的NOI培训让我知道了什么是数据结构,还有什么是指针。老师在讲Pascal的时候说,要灵活使用指针才可以写出高性能的程序。这让我大开眼界,不仅因为VB没有指针,而且当时用VB写图形的程序感觉怎么样也快不上去(当然这有大半原因是因为我代码写得烂,不能全怪VB)的同时,还让我认识了Delphi。Delphi跟VB一样可以拖控件,而且控件长得还很像。于是我就抱着试一试的心理,开始学习如何用Delphi来写代码。
因为有《Visual Basic 高级图形程序设计教程》的知识作为背景,我很快就掌握了如何用Delphi来开发跟图形相关的程序。那个时候我觉得该做的准备已经准备好了,于是用Delphi写了一遍我在VB的时候总是写不快的一个RPG游戏。这个游戏虽然不大,但是结构很完整。在开发这个游戏的过程中,我第一次体验到了模块化开发的好处,以及积累基础代码对开发的便利性。同时也让我尝到了一个难以维护的程序是多么的可怕。这个游戏前后开发了八个月,有一半的时间都是在写代码。对于当时的我来说,程序的结构已经过于复杂,代码也多到差不多失控的地步了。后来我统计了一下,一共有一万两千行代码。由于那个时候我的调试能力有限,而且也不知道如何把程序写成易于调试的形式。结果我等到了我的核心部分都写完了之后,才能按下F9做第一次的运行(!!!)。当然运行结果是一塌糊涂。我花了很大的努力才把它搞到能跑。
由于程序本身过长,我在开发的过程中觉得已经很难控制了。再加上我发现我的同一个模块里的函数基本上都是下面的形式:
PrefixFunction(var data:DataStructure, other parameters ...)
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。