[转载]编写程序方法论

转载 2006年05月20日 14:23:00
这编程序员之家的butterfly写的文章非常经典,建议大家看看。以下是原文:
编写程序方法论
--本文只针对我自己的计算机系软件专业学习而论
——————————————————————————
一 谁不该读此文
————
我的文章一向极具针对性,从来不会为我所看不惯的东西而保守了笔墨的犀利。
此文自然也不会例外。以下几类人忌读:凡是想要去考研究生的人别读,此文具备的
思想意识是你们淤腐脑袋所不能理解,你们应该把这点时间花在死啃教科书上。喜欢
在计算机领域玩弄图形设计,网页制作以及一切有志投身于计算机的软件应用领域的
人别读,我会亵渎了你的理想的。平时喜欢把玩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等语言的代码我能阅读,关键时刻我也可以用它们来开发我
的软件。用多种多语言共同开一个发软件,其实是社会流行的另一个趋势。一个合格的程序员,
应该是对所开发的软件有一个统筹的规划和安排,这样的素质,只有是在学会多种语言的前提
下才能实现的。
上面的学习,归根到底也只是理论知识的学习,而只有在亲自地编写大量的程序后,知识
才能真正的形成网状,才能达到融会和贯通。计算机的学习讲究的是理解,而只有这个层次上
的理解,才是对计算机软件的真正理解。
——————————————————————————
七 再回首:看看教材
————
这个时候,再来看看教材,猛发现教材中原来还是有东西可学的。可是,这个认识,却只
是建立在具备了一些教材外的知识后,才能可悲地发现到。
世界本来就应该没有可以让人一次学到家的书本知识,教材当然也不例外!于是,我这才
真正发现了教材中那可贵的东西,可算是“只是当时已惘然”吧。可,没有学习教材之外的知
识,我能发现它吗?我自己认为不能。因为那样的话,就是“不识庐山真面目,只缘身在此山
中”。不出教材的框架,不见教材的全貌!蓦然间,我发现了自己也庆幸着自己?

相关文章推荐

转载:多核环境下编写程序需注意cache

转载来自:http://blog.chinaunix.net/uid-14617649-id-3058621.html 前阵子接触到一道关于数组内部链表(多用于内存池技术)的数据结构的题, 这种...

JAVA JNI 0基础学会简单编写程序

本文前一章为网络摘抄,其余为原创,
  • hjgzj
  • hjgzj
  • 2014-08-06 16:35
  • 671

用Java语言编写程序最容易犯的21种错误

[导读]    1.Duplicated Code   代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应O...

在扑克牌游戏中,每次游戏开始都要求把54张牌重新排列一下,称为洗牌。试编写程序将一副扑克牌(用54个整数1~54表示)随机洗好后,顺序输出54张牌的情况。

问题及代码: /* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作 者:李磊涛 *完成时间:2016...

3.1 该如何编写程序界面

3.1 该如何编写程序界面  Android中有好几种编写程序界面的方式可供你选择。比如使用DroidDraw,这是一种 可视化的界面编辑工具,允许使用拖拽控件的方式来编写布局。Eclip...

编写程序将C / C++代码中的注释去掉

今天看到一道题,觉得可以拿来锻炼一下。就自己做了一遍。原题链接:关于程序员面试宝典中5.8节面试例题:编写一个函数,实现把C/C++程序代码中的注释去掉/***********************...

Python编程入门-第三章 编写程序 -学习笔记

第三章 编写程序1、编辑源程序、运行程序 可通过IDLE中File>New File新建一个文本以编辑源程序,编辑完成可通过Run>Run Module(或者F5快捷键)来运行程序。Python源文...

建议在编写程序时

保持你的计划简单的开始。常新的程序员,他们想要的所有东西他们的程序有一个宏大的。“我想写的图形和声音和随机怪物和地牢的角色扮演游戏,与城镇可以访问出售的物品,你发现在地牢里,“如果你想写的东西太复杂的...

编写程序,拷贝一个带内容的文件夹

package com.heima.question8; import static org.junit.Assert.assertEquals; import java.io.File; imp...

利用C/C++编写程序以获取文件夹内所有子文件名,windows和Linux两个版本都有

利用C/C++编写程序以获取文件夹内所有子文件名,windows和Linux两个版本都有
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)