编写程序方法论
一 谁不该读此文
————
我的文章一向极具针对性,从来不会为我所看不惯的东西而保守了笔墨的犀利。
此文自然也不会例外。以下几类人忌读:凡是想要去考研究生的人别读,此文具备的
思想意识是你们淤腐脑袋所不能理解,你们应该把这点时间花在死啃教科书上。喜欢
在计算机领域玩弄图形设计,网页制作以及一切有志投身于计算机的软件应用领域的
人别读,我会亵渎了你的理想的。平时喜欢把玩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,可千万不能以为自己已经掌握技术的精髓,在追求技术的无限里,没
有最好,只有更好。
我举一二例。VxD会吗?编写基于CPU的Ring0级的系统DLL,会吗?这些属于Windows
系统极其深刻的内容,不但没有出现在市面上可见的书籍上,就连文档资料都是MicroSoft公
司发布的英文版。比如Windwos9x系列的DDK文档。杀毒软件的技术原理就在这个级别上,CIH
病毒的原理也在这个级别。杀毒软件的“实时监控”原理就是基于文件系统的底层中断的提前
截取和处理的技术。
这时,对网络的理解也应该是去更上一层楼了。不要满足于简单地使用网络编程接口,
应该试图去理解TCP/IP协议,去理解FTP,HTTP,POP3,SMTP等等遍布在Internet各处的协议,
去编写自己的各类网络服务程序。OICQ的原理就在这个级别上。
——————————————————————————
六 再看看四周:实践!
————
“乱花渐欲迷人眼”是当前各种编程工具所构成的现状。VB,VC,VFP,C++Builder,Dehil,
MS-C++,SQL等等,实在是太多了。其实,对一个程序员来说,能熟练掌握一门语言,是基本要
求。能用多门语言,是社会上的流行大趋势。我个人的情况是:能基本掌握VC编辑环境下的各类
编程方式,而VB,VFP,C++Builder等语言的代码我能阅读,关键时刻我也可以用它们来开发我
的软件。用多种多语言共同开一个发软件,其实是社会流行的另一个趋势。一个合格的程序员,
应该是对所开发的软件有一个统筹的规划和安排,这样的素质,只有是在学会多种语言的前提
下才能实现的。
上面的学习,归根到底也只是理论知识的学习,而只有在亲自地编写大量的程序后,知识
才能真正的形成网状,才能达到融会和贯通。计算机的学习讲究的是理解,而只有这个层次上
的理解,才是对计算机软件的真正理解。
——————————————————————————
七 再回首:看看教材
————
这个时候,再来看看教材,猛发现教材中原来还是有东西可学的。可是,这个认识,却只
是建立在具备了一些教材外的知识后,才能可悲地发现到。
世界本来就应该没有可以让人一次学到家的书本知识,教材当然也不例外!于是,我这才
真正发现了教材中那可贵的东西,可算是“只是当时已惘然”吧。可,没有学习教材之外的知
识,我能发现它吗?我自己认为不能。因为那样的话,就是“不识庐山真面目,只缘身在此山
中”。不出教材的框架,不见教材的全貌!蓦然间,我发现了自己也庆幸着自己?
分享到:
相关推荐
在软件开发领域,编写高质量的程序是每一位程序员、开发人员,乃至项目经理所...通过遵循上述的编程最佳实践和方法论,我们可以逐步构建出既能够满足当前需求,又能在未来不断变化的环境中持续适应和发展的高质量软件。
2. **规范性引用文件** - 在撰写学术论文时,需参考相关领域的重要文献和规定,以保证论文的质量和合规性。 3. **术语和定义** - 标准中可能包含一些专业术语和定义,如“前置部分”、“正文部分”等,需要理解并...
这意味着它避免了复杂的操作流程和专业术语,使得非专业人士也能迅速掌握使用方法。对于不熟悉电脑操作或者初次接触论文写作的人来说,这样的设计无疑降低了学习曲线,提高了工作效率。 再者,软件的格式化功能强大...
4. **论文部分**:“springboot外卖系统小程序LW.docx”可能包含了项目的理论研究、系统分析、设计思路、实现方法、性能评估等内容。这通常包括需求分析、系统架构设计、数据库设计、技术选型等关键步骤的详细论述。...
6. BIT:定义位地址,便于在程序中引用特定的位。 在进行应用汇编语言程序设计时,需要先确定合适的算法,良好的算法能提高程序效率。此外,画出程序框图有助于理解程序流程。在单片机编程中,定点数运算是一个常见...
当一个组件被创建后,它的引用计数为1,每增加一个对该组件的引用,引用计数加1;每次引用释放时,计数减1。当引用计数降为0时,组件会被自动销毁。 3. 线程安全性:COM允许组件在多线程环境中运行,因此需要处理...
参考文献列出论文引用的所有资料,附录可能包含原始数据、程序代码等补充材料,索引方便读者查找信息,作者简历和科研成果展示学习期间的研究活动。 编写规则要求严格,例如,非涉密论文不得标注密级,论文题目不...
在图像灰度变化程序设计中,主要使用了VC++编写图像处理程序,并调用C++图像处理的部分内部函数进行处理。该程序设计的主要算法包括对比度线性展宽、灰级窗处理和直方图均衡化等。 对比度线性展宽是一种常用的图像...
总的来说,《VB毕业设计——vb人事管理源程序+论文》是一个综合性的学习项目,不仅锻炼了学生的编程技能,也提高了他们的项目管理和文档编写能力。对于计算机专业的学生来说,这样的设计能为他们未来的职业生涯打下...
逆向工程的方法论可以分为几个步骤,首先是信息收集阶段,通过分析软件的二进制文件,搜索字符串、使用binwalk、IDA等工具来提取文件信息,并结合Google和GitHub等资源进行广泛的互联网调查。例如,定位“关键代码”...
开发者使用Java或Kotlin语言编写应用,通过Android Studio集成开发环境进行编码、调试和打包。在本项目中,学生需要掌握Android的基本组件(如Activity、Service、BroadcastReceiver和ContentProvider)、UI布局设计...
4. **IUnknown接口**:这是所有COM对象都必须实现的基本接口,提供了AddRef、Release和QueryInterface三个方法,用于引用计数和接口查询。引用计数确保了对象的生命周期管理,防止内存泄漏。 5. **接口查询...
10. **测试驱动开发(TDD)**:TDD是一种软件开发方法论,强调先写测试后写代码。书中可能介绍如何使用单元测试框架(如Google Test)来实践TDD,以保证代码质量。 11. **性能优化**:针对大规模程序,性能优化至关...
《COM本质论》是侯捷先生的一本经典著作,深入剖析了组件对象模型(Component Object Model,简称COM)的核心概念和技术。这本书通过一系列的实例程序和详细的解释,帮助读者理解COM的工作原理及其在软件开发中的...
- 接口定义了一组方法,这些方法的实现隐藏在组件内部,使得组件可以被其他对象调用而无需知道其实现细节。 - COM组件是二进制兼容的,可以在不同的进程中安全地使用,这得益于其严格的类型系统和引用计数机制。 ...
"Web of Science论文爬虫程序(Python)"是一个使用Python编程语言编写的工具,其主要功能是抓取Web of Science数据库中的论文数据。Web of Science是全球知名的学术文献检索平台,包含大量的科学研究论文和引文信息...