Programming 版 (精华区)
发信人: zhangyan (生命中不能承受之弱), 信区: Programming
标 题: 个人论:编写程序方法论
发信站: 哈工大紫丁香 (2001年07月07日18:13:39 星期六), 站内信件
主 题:个人论:编写程序方法论(原作者,huangbeyond)
作 者:totodo
所属论坛:C/C++
问题点数:0
回复次数:9
发表时间:2001-7-6 21:49:27
--本文只针对我自己的计算机系软件专业学习而论
一 谁不该读此文
我的文章一向极具针对性,从来不会为我所看不惯的东西而保守了笔墨的犀利。
此文自然也不会例外。以下几类人忌读:凡是想要去考研究生的人别读,此文具备
的
思想意识是你们淤腐脑袋所不能理解,你们应该把这点时间花在死啃教科书上。喜
欢
在计算机领域玩弄图形设计,网页制作以及一切有志投身于计算机的软件应用领域
的
人别读,我会亵渎了你的理想的。平时喜欢把玩CPU和内存条于股掌之上,浑天把
超
频如何如何挂在嘴上的骨灰级电脑硬件DIYer们,也别读此文章,这倒不是你们不
适合
读,而是我根本就认为你们读我这篇文章是对我莫大的侮辱!
开篇结束,理性开始
二 从什么开始?
很多的朋友曾问过我:我应该从什么东西开始学起?我都无一例外地回答说:汇
编!可这样的回答,不能使每一个人都明白的。他们说:我也跟着教材跟着老师学
习
了汇编语言呀。好,我就从对汇编教材的分析,来阐明我对汇编学习的理解。大家
仔
细看看我们的汇编教材,它开宗明义的是IBM-8086宏汇编语言,而教材最致命最能
毒
害学生对汇编的认识之处就在于此!相信每一位学习了汇编的同学,都明白一点,
就
是在编写汇编程序时,最常用最依赖的是INT21H。而这INT21H,根本就不是8086的
中
断服务例程,它是系统提供的,是DOS这个操作系统提供的!谁的汇编程序,能离
得开
INT21H?离开了它,不仅失去了系统那庞大的服务例程,基本丧失了实际意义,而
且
能否在DOS平台上正确运行,正确实现功能,还不能肯定。(高高手除外!)(在这里
,我
引入我自己的一个名词来表述--“系统相关性”。)所以,教材在宣言自己是与系
统无
关的IBM-8086汇编的同时,让学生去学的却是具有“系统相关性”的DOS汇编,这
一重
大的失误,使绝大多数的同学在学习汇编的时候,注意的是对汇编语言本身语法的
理解,
而忽略了与之相关而绝不可少的DOS系统原理,从而在将来运用自己所学到的知识
进行
编写程序时,倍感系统相关的知识的缺乏,感觉除了教材上的例子以外,自己无从
下笔。
各位读者,请认真回答我的提问,有过这种感受吗?而这绝对不能怪学生,只能怪
教材
自己的缺陷和片面。对此,我开出的药方是,仔细阅读和学习我们的DOS书的后半
部分
(那本四川联合大学出的《DOS实用技术大全》),你们在认真学习它之后,一定会
有豁
然开朗的感觉,不会再对DOS系统的底层迷惘了,不会感觉无从下手,这对自己以
后的
编程工作起的是基本性作用的。
读到这里,你们一定问我了,难道学习编写程序就一定要学习DOS系统原理吗?
我
说,是的,虽然现在流行的WINDOWS里,表面已经看不见DOS的痕迹了,可是,对
WINDOWS
系统有大致了解的同学却应该知道,WINDOWS9X使用的是DOS内核。而没有DOS系统
知识,
是很难去了解WINDOWS9X原理的。而且,外面也没有深剖WINDOWS9X原理的书籍买,
所
有对它的介绍,都是立足于DOS的。比如,树型文件管理系统的FAT和FDT,图形显
示接
口的操作,都清晰可见DOS的影子。没有DOS的系统知识,的确是难于理解这几个
WINDOWS
的较核心内容,甚至根本就是无从理解起。在学习了DOS的系统知识后,再谈对
WINDWOS
系统的理解和学习,就是事半功倍了。我自己从高一开始用DOS,大一认真学习了
DOS的
系统原理,所以我今天才能较快地进入WINDWOS世界的,而DOS在其中起的作用,我
简直
是无法用言语来形容。
二 明天是哪方
在DOS系统原理被学习完后,的确应该考虑下一步该如何了。因为没有人天生是
喜欢
用又臭又长的汇编语言来写有实际意义的程序的,包括我。我的建议是C。第一步
是TurboC2.0。
原因有二:其一,深刻理解C的概念,对以后的学习绝对是有前导作用的。其二,
TC提供
了对汇编的编程接口,这为大家去实际使用所学的“系统相关”的汇编知识,提供
了极其
广阔而方便的舞台。究竟学到哪个程度呢?有一本书,叫《C语言高级编程技巧》
,只要
能理解它里面80%以上的内容,你的TC就过关了。
这时候,完全可以开始WINDOWS的程序编写了。
而一旦进入了Windows那五彩缤纷的编程世界,多半会有一种眼花缭乱的感觉的
。我
当时就是如此。所以,Windows编程的第一门语言尤其重要。我的建议是VB。虽然
VB有这
样那样的不足和缺陷,(比如运行缓慢,属于解释性语言,内部完全封闭等等)可
VB作为
Windows编程的入门级语言,它的启蒙作用不可小看。它能勉强让你理解Windows系
统独特的消息驱动模式,理解窗口的基本概念,理解可视化编程的初步,可知这些
概念的感性理
解,对后面的学习不无有利。这个阶段应该不能太长,2--3周就可以了,此时,不
要满足
于自己基本能做出些漂亮的Windows程序,更不要拼命在VB上下功夫,因为最美丽
最有诱
惑力的在下面!
三 一头拜倒在VC脚下
对一个真正的程序员来说,VC是将你同一般编程爱好者划分开来的标志!
而VC的世界里,却存在着MFC和Win32 API那有争议的较量,虽然他们根生同处。
我个
人的建议是:Win32 API是绝对的选择!在Win32 API的知识领域里,全面解释了
Windwos
系统里一个程序的一切。对于这个级别上的程序,只有你暂时不能理解的,没有它
不能解
释的。从前台桌面到后台进程,从图形处理到文件打印,从句柄,内核对象到互斥
量,临
界区,从网络通信到设备驱动设计,Windows系统的里里外外基本都在这里留下编
程接口,
你在日常使用Windows时留下的疑问,你在使用VB时不能实现的技巧和功能,此时
都可以明
白和实现了。不过,你应该有充分的信心和毅力去坚持学习,Win32 API编程号称
Windows
系统下的汇编,所以,对它的广阔和精深,应该有准备。学习的时间不短,1年算
快了。
我当初接触它时,就不信它要如此多的时间和精力,可最后我却学了一年半。
学成它的标志是:从此你在打大部分游戏时,你会发觉你已经不自觉地去考虑别
人的
游戏是如何编写的。因为你的眼里没有游戏,只有程序!而在使用一些别人写的不
是很优
秀的程序时,你会有底气说:“有时间,我也重写一个!”此时,你会发觉自己经
常性地
在心里揣摩别人的程序,比如网络蚂蚁,比如Foxmail3.0,比如Winamp等等。
在这里,我着重讨论一下MFC和Win32 API的优劣区别,这一点,相信很多的同学
是模
糊的。如果用VC编辑器写一个Windows程序,使用MFC的话,MFC的编程向导能提供
一些框架
服务,使得在程序建立的初期,感觉很是方便。而当程序的代码增长后,MFC在初
期提供的
方便,便没有痕迹了。相反,MFC的一大缺陷就会在此时出现了。我概括如下:“
MFC所支
持的功能,使用是方便的,而没有提供的功能,自己通过兼容API函数的模式去实
现,比一
开始就使用Win32 API还要麻烦。”使用过MFC的同学,可以去考虑如何实现比如,
自定义
消息的处理,多线程的实现,托盘区的使用,右键弹出式菜单,物主绘图窗口和菜
单,子
窗口的子类和超类处理,是不是极其麻烦?这样的问题我还可以提出很多,而在
Win32 API
的编程思维和实现里,这些却都是很顺理成章的了。
再一个,从编译的角度来看MFC和Win32 API的区别。MFC中封装的各个类的绝大
部分的
成员函数,其实都是API函数的二次使用。是MFC的LIB库将其打包成了可供调用的
类代码,
否则,为何在生成Release版时,都要将其设置为静态的链接库呢?说透去,MFC的
类库只是
API的一个真子集,对MFC学得再好,理解得再深刻,也只是间接地在理解API,所
以一开始
就应该学习和使用API。
我再用一个比喻来结束我对MFC和API的评论。“MFC为编程人员提供的自生成代
码,是
一个分数的分子,而程序代码的长度是分母。而这个分数的值就是MFC所提供的方
便值。在
程序代码不长的情况下,MFC提供的方便之处就很明显;而随着代码的增长,方便
值的实际
意义就立刻减小而副作用增加了。”
我自己在进行了一年半的Win32 API编程学习后,深感通过它,自己对Windows系
统原理
和Windwos的编程机理比从前有了质的提高,从前不了解和模糊的编程想法和实施
细节,都
得到了很好的满足,自己可以明显感觉编写程序的水平上了一个台阶。
四 广阔地运用已学知识
到这个层次,应该能编写些程序了。比如写局域网上的类似ICQ的聊天程序,写
自己的
FTP上传下载的网络程序,写自己的屏幕保护程序,写......太多了!
我提醒大家,到时候不要怀疑自己的水平,不要迷信课本的片面,认真地去写,
充满信
心和激情地去写,你会发现,自己原来也是可以做出如此好的程序,从前许多自己
想都不敢
想的东西,如今也通过自己的努力而实现了。有时也不要吝于怀疑,可知我们青年
人的有些
想法,有时不知要比教材和权威们高明多少倍啊!
五 一山更有一山高
学了Win32 API,可千万不能以为自己已经掌握技术的精髓,在追求技术的无限
里,没
有最好,只有更好。
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.170.172]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.735毫秒