给学习编程的朋友几点建议
偷猫,2002-1-26
本文的观点,主要是针对初学者容易犯的错、容易走的误区和针对编程老手容易犯的旧错误而谈的,也许对你来说本文是多余的。另外,本文不止是讲教条,同时也讲了我自己在编程中的实际应用以及实际思路。如果对你有所帮助,我就没有白写了。
一、学编程要学算法
大概是因为Visual系列程序设计工具太完美了的缘故,许多人学习编程后发现,原来编程这么好玩,从此就喜欢上了。也同样因为Visual系列程序设计工具太完美了,导致有相当一部分人以为画界面就是编程。
前两天,我在办公室里有几位同事闲谈,谈到编程时,我笑道:“你到网上去看看,自称是程序员的人不下一亿。”当然这是个过分的夸张了,但是你不得不承认,也许有不止几亿的人亲自用鼠标在Visual Basic中画过界面,现在的小学生、初高中生都开设了Visual Basic程序设计课程。经过了短短的几节课的学习(一学期只有三四十节信息技术课,还不止学VB一个内容),许多学生会说:“我也会编程序了。”——真的吗?
我不由得想起了多年前的微机学科。那时的微机课不外乎几个内容:DOS、WPS和Basic。那时的Basic语言,除了input和print两个语句可以看到运行结果外,其它的都看不到。全凭脑子想象、组合,去领会什么叫If-Then-Else,什么叫Fore-Next,什么叫Do-loop。由此学到了各种算法。那才叫编程啊。
前几天居然在《编程空间》看到有一帖,跟人家讨论怎么编程,问的问题是诸如“怎样利用随机函数Rnd( )生成20个在1-100之间的各不相同的正整数”之类的问题,还指明要用VB编。由此可见算法被忽略到什么程度了。现在叫我把这样的程序编出来,无论是用Basic,还是用C,还是用Pascal,甚至用JavaScript,VBScript我都会随手编来,最多去查几个多年不用的单词是怎么拼的。为什么?就因为这些语言的算法是一样的。语法本身只是一个外壳,算法才是其中的灵魂。
学会了算法之后,你再学几十个单词,就会了一门编程语言。你会发现,Basic、C、ASP、Java……都是一样的。
二、要明确什么是面向对象
几年前,编程从来不用提对象。那时候在Basic和C中的输入输出是这样编的:
◆Basic:◆C:
那年头学过编程的朋友一定还记得这样的语句(至少我觉得这是终生难忘的),那时至所以不提对象,一是因为没这个必要,输入设备只有键盘,输出设置只有显示器。二是因为那时的程序也差,比如上面这样的程序,设计者先问你姓名后问你年龄,使用者就必须先输入姓名后输入年龄,现在呢?给你几个输入框,随你先填哪个,填好后按个按钮就行了。功能的复杂,导到了对象必然要出现。
现在的编程一直在喊着“面向对象”,但是许多最近才学习程序设计的人,他们一起步使用的就是面向对象的语言,却反而不知道什么是面向对象。
我给别人讲Visual Basic第一课时,跟本不就提什么编程,我只这样举生活中的例子:
这样做是不是一定比直接讲Visual Basic好我还不知道,但是这样至少可以让别人先感觉一下将要进行的编程中的一些思路。
我不建议谁还去学面象过程的编程,我从八年前(1993)开始学习Basic,到97年学习结构化的True Basic,到98年开始转向面象对象的Visual Basic。这两次转折的时候,我都遇上了很大的困难:旧的思维方式一直在顽固地抵制着新的东西的进入。其中98年那一次,我花了半年时间才把思维方式转过来了。最近才学习编程的朋友,你们真的很幸运。
三、程序中要有详细的注释
我有的时候看到人家编的程序,我简直受不了:他的程序里面几乎从来没有一个注释。如果你这样做了,你能保证过一年半载的还看得懂吗?——什么?你看得懂?有两个可能:这么长时间里,你一共才编了这么一个程序,而且只有几十行百来行。或者编了几个程序,都只有七八行。如果你编了几个大程序,每个几千行,你再回来看看半年前的那个,你试试。
我记得98年我刚学Visual Basic时,我把小时候玩过的游戏《华容道》和在其它电子玩具上的游戏《黑白棋》移植到了计算机里,过了没多久,我再看我的《华容道》时,我已经看不懂了。——注意,我是有注释的,但还是看不懂。所谓看不懂,并不是看不懂其中的语句,而是看不懂某一个语句在整个程序段里起的是什么作用。
后来,我就继续把注释做得更详细些。比如
◆说明每个过程的功能,参数,返回值
◆说每一个程序分支的情况
四、要用结构化
也许有人要问:现在的语言都是结构化的,我想不用还难呢,你这不是白说了?
在这里我要说的结构化,是两个方面的内容:一是同一级语句尽量对齐,不同级语句要有缩进;二是尽量多用子程序(即过程)。
比如下面的程序段(这次以ASP为例)
以上这个ASP程序段是我写这篇文章时随手写的,没有什么功能。从这段程序中,我们可以看出其中的缩进,给日后修改时减少了许多麻烦。
再来看下面一个程序,下面的程序的功能是在打印机上打印两行文字:
以上这段程序非但可读性差,语句量大,而且日后修改起来麻烦,如果改用下面这种方法就好多了:
'----------打印程序例二----------
五、不要用GOTO
这是多年前的问题了,如今却实大多数人已经不用GOTO语句了,但是,不可否认还有些人在死守着那些老古董不肯放。用了GOTO语句的程序就像面条一样,日后是很难把它理清楚的。
我97年开始从GW Basic向True Basic转时碰到了很大的难度,因为我已经非常习惯于GOTO语句了,但是,我一直坚持一个也不用。现在,我已经习惯了没有GOTO的程序。前两天,一位朋友把他编的程序给我看,程序本身很好,功能也很强,就是里面用了几个If...Then Goto语句,让我很受不了。都这么多年过去了,这些东西应该丢掉了。
最近才着手学习程序设计的朋友应该不会滥用GOTO,因为现在的任何一本材料中都不介绍GOTO的使用。也许你们都没听说过还有这样的语句,这样更好了。
不过,有一个例外:On Error Goto语句不用丢弃它。但是我不喜欢用数字做行号,我的朋友在他的程序里除了几个“Goto 100”,“Goto 200”之类的语句,还有“On Error Goto 1000”。如果用“On Error Goto KillErr”,采用字符串做行标记,日后看程序时总比看到数字舒服。万一你还没看到“On Error Goto”而先看到行号呢?用数字不就麻烦了些?
六、在应用中学习
许多人学程序设计只是照着书本的例子做,一本书啃完了,再买一本继续,这样做永远没有主动。要想学得深一些,学一些有用的东西,可以先拿一本书学学其中的例子,大体有点会后就放开书本自己编。
自己编的时候,不要只想着程序语言能实现的功能,而要想其它应用软件能实现的功能,甚至其它应用软件还没有实现的功能,然后想办法用程序去完成它。
自己编的时候,要么不编,要编就编一个完整的程序。这样的话,接触到的问题会多一些。编什么呢?不用想:小时候玩过七巧板吗?玩过飞行棋吗?现在你需要一个好的通讯录吗?都可以编啊。把这些都编出来就行了。
也许你要说,这些程序网上都有,还要我编干什么?错!网上是有,而且网上的比你即将编出来的更好。但是,我们并不是要一个程序,而是要学习。
我现今用Visual Basic编程序时从来不翻书,碰到不会的怎么办?用F1就行了。MSDN里讲得比任何一本书都完整,当然,MSDN里并不介绍算法,并不介绍模块的组合。但那是你早该解决的问题。
本文地址:http://com.8s8s.com/it/it7857.htm