《编程高手箴言》

时间:2022-07-04 03:45:15
高手成长的六个阶段
第一阶段
此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。
第二阶段
此阶段能精通基于某种平台的接口(例如我们现在常用的Win32的API函数)以及对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在初中中做些应用。
第三阶段
此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。
第四阶段
此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。
这时已经不周有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是很多人的思想转变不过来。
第五阶段
此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会出来。
第六阶段
此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。
--------------------------------------------------
第一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地支学习。
要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。
--------------------------------------------------
在Debug的模式下,编译系统被插入很多的代码,例如堆检查、初始化变量等,而在Release下是没有的。所以在Debug环境下的代码就会有依赖性,也就是依赖于编译系统自动生成的一大堆的代码。这样,当转入Release模式后,就没有那些代码。这样就可能导致出错。
--------------------------------------------------
通用软件系统就不能简单地按照软件工程的方法来进行设计,因为完全按照软件工程的方法,可能就会实现不了。
做软件有一条原则最重要,那就是减少问题的累积。
而按照传统软件工程的方法,即一开始就可以把所有的问题都找到,但是,通常像不可能预测到程序在开发过程中会遇到的所有的问题的。退一步说,即使你把所有的框框条条都设计好,也可能当突然遇到问题的时候,一时找不到正确的解决方法,而后你又试图去解决它,这样就可能需要花很长的时间去解决这个问题。当你发现这个问题是很难解决或不能解决时,整个工程都会“流产”。

做接口最好的方法,就是直接用Console程序先实现程序的主体,然后从中提炼出接口来。这样做提炼会简单明了。如果用可视界面先实现了程序的功能后再去提炼,就会比较困难,因为这样就会把界面和实现混在一起,很难区分。
--------------------------------------------------
动态的分配增加了编程量,所以在允许的情况下尽量使用静态内存,注意使用后的释放工作。
先写函数体再写函数头和注释。
如果没有的功能块,就可以以函数在程序中调用的顺序进行排序。
--------------------------------------------------
重载在实际中用处不大,但在教科书介绍地很多。
代码应该分块阅读。
--------------------------------------------------
MS-DOS Stub 128bytes
在非Windows环境中执行,显示“This program cannot be run in DOS mode”
PE Signature 4bytes
\"PE signature found
File Type:EXECUTABLE IMAGE\"
COFF Header 20bytes
文件信息
PE Header 224bytes
第六个字段是程序进入点(entry point),必须加上第九字段的值才是内在地址。
第九个字段是Image Base 的位置,也就是这个文件被加载内存的位置。
第十九字段是subsystem,指示这是Console(文字)模式还是GUI模式。
Section Headers ?
有n个。Name/PhysicalAddress/VirtualSize/SizeOfRawData……
Sections ?
--------------------------------------------------
编程逻辑基础教程
在开发算法的时候,走查就是正式评审,一般是2小时。
嵌套模式比顺序模式效率要高,因为它减少了判断的次数,只要条件中任意一个得到满足,就立即退出,顺序语句往往要对第个条件进行测试。
抽象类?在抽象类中没有定义的方法,子类中必须定义或者定义抽象类中没有的方法。否则,新子类也变成了一个抽象类,从而也就不能它的对象。
关于内部类
当一个类只有在封装类的内部环境中才能发挥作用,或者依赖封装类才能实现相应时,就要使用到内部类。例如,文本光标(跟踪文本当前的编辑位置)只在特定的文件或文本组件中才有意义。
--------------------------------------------------
软件知识!
实际工程计划的事件结点网络应该是无环的,且存在唯一的入度为0的开始和唯一的出度为0的完成结点。事件结点网络的边可以带权,表示完成一项活动需要的时间。
散列法的基本思想是:由结点的关键码值决定结点的存储地址。
shell排序法所需的关键码比较和记录移动个数均为n(1/3)左右,这种排序是不稳定的。
对n个记录的文件进行快速排序,在最坏的情况下执行时间为O(n(2)),与起泡排序相当。然而快速排序的平均执行时间为O(nlog2 n),显然优于起泡排序和前面介绍的直接插入排序、直接选择排序方法。但快速排序需要O(log2 n)的附加存储开销,这是因为快速排序算法的实现过程中需要用到大小为O(log2 n)栈空间。