转载一篇给入门程序员的忠告。

来源:互联网 发布:mac重启后文件丢失 编辑:程序博客网 时间:2024/05/19 20:45

 转载一篇给入门程序员的忠告。 

编了这么久的程序,一直想找机会总结下其中的心得和方法,但回想我这段编程道路,又很难说清楚,如果按照我走过的所有路来说,显然是不可能的!当 
我看完了云风的-《游戏之旅--编程感悟》和梁肇新的《编程高手箴言》我突然知道我要从何说起,我要怎么说了! 

  接触编程到现在已经至少要6年,虽然时间短,但我几乎每天都在编,而编程上突飞猛进的还是最近一两年,单纯编程上的进步,很简单就是经验,但你要 
理解才可 
以进步的快!这就是说,你的理论课要学好,才能学好编程,操作系统,网络原理,计算机体系结构,数据结构,编译原理,你哪个学的不好,你根本不配成为编 
 
高手,我见过的高手,这些学的都不错!这些都是计算机的支柱,你连它的支柱都不了解,怎么编程,即使你编写的程序好----只有一个原因,你用的是高级语言 
 
脚本语言,因为它们封闭大量低层语言细节,让你不用了解就可以编写,你不了解低层细节你杂成为高手! 

 解释什么叫编程? 

 我觉得现在很多同学,根本不知道什么叫编程!我现在告诉你,单纯的编程,也就是就知道语法知识的编程,根本不叫编程,只会单纯的语法的编程连低级程序 
员都不如! 
 
程不仅仅是你对语法的掌握,你还要把各种技术混合到里面,这样才叫编程,你编程的时候,你应该问问自己,你的程序有算法吗?你的程序写的够简单 
吗?速度足 
够快吗?占用空间足够少吗?代码写的规范吗?语句写的标准吗?你的程序之间的结构合理吗?你类定义的合适吗?方法和属性合理吗?接口合理吗?等等等,包 
 
很多东西!这就是高级程序员为什么赚这么多钱!要付出相当大的脑力劳动! 
 
调试对你也很重要,一个程序高手,也是调试专家,其实调试很多方法,但大多数都是实践中得到的! 

 指正现在人对学计算机误区 

 现在我每天在和汇编,硬件指令 cc++或一些低层API打交道,有些时候编程这个东西很难说清楚,只有你经历了,你才能感受到,你没有经历,就 
永远体验不到! 
 
我现在要更正几个现在学计算机人的误区,我想回答的是,学什么才是学计算机! 
 
学计算机的两个方向:一个是纯搞理论的,一个是搞实践的。搞理论的无可厚非的,大家都承认是学计算机。那么实践呢?我很难给出一个定义,但我会列出那 
些才是真正-学计算机学的: 
 
1 
编程,这里的编程,我要抛出FLASHPHOTOSHOP3DMAX等,它们虽然也有语言,但都是为了给美术人员提供的!也就是几乎封闭了大量的低 
 
细节,对于一个学计算机的人来说,如果你努力学它们,你还是不要学计算机了,去学美术把!网页编程能接触到至少两种类型语言,,HTMLASP 
JSP
PHP),HTML说实话,不应该是计算机人学的,你应该学的是ASPJSP等! 
 
按严格意义上讲(但实际没有这么严格)如果你的主要 
必修语言,不是c c++JAVA,或者硬件指令,都不算是真正学计算机的,之所以这么说,我举个例子,比如你用JSP,它是一个脚本语言,如果你 
 
过这个语言,你认为你用好这门语言需要了解硬件结构知识吗?显然不用,如果你纯是JSP程序员,你需要只是,JSP语法,一些简单的JAVA语言, 
SQL
 
之类的数据库知识,其余的你什么都不需要,至于分析流程,那是系统分析师的事,不要和编程混为一谈,我学JSP学了3个月,现学现买就做出了功能齐全的 
 
上书店(当时是老师布置的作业),如果再努点力,就可以投如使用!所以说,学JSP根本就不需要太多的专业知识,不是学计算机的也很容易就学会! 
 
c++,我都学了好几年了,用它写程序都几十万行,我也不敢说我学的精通!就是因为它太灵活了!不同人,用的效果就是不一样! 
 
所以按严格意义上讲,如果你的主要必修语言,不是c 
c++JAVA,或者硬件指令,都不算是真正学计算机的,也就是说,学那些对计算机专业知识不需要太多了解的语言,就不叫学计算机的! 

 2)从事软件方法实践研究,这个纯是软件工程方面的,如果你没有容入一个大项目中很难体会它的重要性,想一想,一个程序,几十万,几百万行代码,能 
这么好的实-现,并运行,它的功劳不小! 
 
3)从事低层硬件开发,这里可能和搞电子的专业有些重叠,但事实就是这样,他们也是学计算机的! 
 
其余的,装系统了,装电脑了,用人家编好的软件实现些图片音乐等功能的,那都是计算机的门外汉,不要和真正学计算机的混为一谈! 
 
我经常被问到: 
 
你会盗qq不?我晕,学计算机的就要会盗qq 
 
你会装电脑不?虽然我会,但不会并不可耻 
 
你会装系统不?虽然我会,但不会并不可耻 
 '''''''''''''''''''''''
 
 '''''''''''''
 
 
等等把,有好多,通过我上面解释,你应该理解学计算机的应该会什么,不会什么也是应该的! 

 正式入题,怎么学好编程! 

面上好象只有这两本是中国人写的关于编程心得的书,中国编程好的人很多,但写出方法很难!第一本《游戏之旅--编程感悟》前面几章写的是云风的 
编程经历, 
后面几章写的是编程经验!总的来说本书很容易读懂!《编程高手箴言》书很难,尤其写操作系统那章!正如作者所说,真正写一门编程方法学的书很难!本书前 
 
张概括了当前中国软件面临的形式,我强烈建议看一下,写的很经典!以前我不知道程序和软件的区别是什么,现在我知道了!后面几张写的都是编程方法和编程 
 
具备的知识! 

 总结他们两人所说的,我准备按照下面提纲来写编程方法! 

 1。如果你感兴趣,学计算机是一种光荣,如果你不感兴趣,那么它是地狱! 
 2
。理论对你很重要,尤其是你一名搞技术的程序工程师! 
 3
。学会自学,学会思考,学会合作与交流! 
 4
。要想成为高手,一定要从底层学起,底层是什么?CPU,汇编等硬件指令! 
 5
。编程需要经验积累,学会调试对你尤其重要! 
 6
。全局把握整个工程,具体到每个类的属性和方法以及各个类的关系!一定确保你设计的类和类模式和类间关系能够有效,利于修改和升级!概括说就是软件 
工程 

 下面我就分别说一下 

 一。如果你感兴趣,学计算机是一种光荣,如果你不感兴趣,那么它是地狱! 

  经常听很多同学说,开始他对计算机很感兴趣,但随着大学里的学习,越来越感觉无聊甚至厌烦!你之所以这么想,其实一点也不怪你!从高中的应试教育 
到大学里 
的自由学习方式上的转变,我们几乎都不适应,一到大学,突然有一种解放的感觉,没有老师的强硬指示学习,自己根本不知道怎么学,学什么!所以说,教育对 
 
们很不负责任! 
 
如果你在大学以前已经知道编程怎么回事,那到没什么事情!但好象很少有人象云风这样从小就接触了编程教育!所以我们在没有上大学前几乎是零起步! 
 
实,按我的理解,刚上大学开始学编程有些晚了,之所以这么说,不是因为单纯的编程很难,如果你很努力,几年完全可以搞定,其他的你去公司的经验可 
以弥补! 
我这里想说的是,一个真正的程序员不单单要有强硬的编程实力,还要有强大的理论后盾!你只会编程,没有强大的理论做后盾,你也就不会把理论转化成实际的 
 
码,你也不会做出高效,高技能的程序!在计算机理论中,图论,人工智能等等都是很难的理论,但如果你能把它们有效的用在计算机领域,功德无量!国人能做 
 
点的很少,本来厉害的程序员就很少,有高尖端理论技术并把它应用的更是凤毛麟角! 
 
(这里可以推荐大家一本书《游戏编程中的人工智能技术》,这本 
书抛开了传统的自动机,产生式,各种规则的传统的人工智能理论,而是讲的更前沿的计算智能----生物遗传算法,人工神经网络!这本书,不单纯讲理论,还 
 
c++
语言结合理论实现各种游戏程序!有时抽象的理论都是基于数学基础之上,如果没有一定数学基础是很难看懂的,但正因为它有数学证明是正确的,所以它 
 
可行的!能把它用语言实现更是可观!) 
 
所以,如果你热爱计算机,在大学以前,就应该成为一个程序高手,而大学以后,主要专研各种技术的实现,和 
各种技术的学习,如果你把他留在工作里,可能很难,我的同学在参加工作后,很少有继续看技术书籍,因为技术书籍很难,不是一下两下就看懂的,有几个还有 
 
样的耐力和精力去搞!这些怎么在编程上实现,都在等着老外,咱们COPY,这样我们的软件技术能强大吗? 
 
可是在大学以前成为一个编程高手几乎不 
可能,我们没有良好的学习编程的环境,而且面对着中考,高考的各种压力,几乎没有机会去学习编程!其实,小学,初中,高学,那些课程没有必要象我们这样 
 
复的复习,反复的作题,浪费了大量时间,我们要学会什么?学会一种技能,能够应付各种变化的技能,就是自学,学会思考,学会自己解决问题,学会团结合 
作! 
初等教育,打的口号很好,实际上,完全压制了这种学习方式! 
 
所以我们应该以最快的速度,在大学里容入一个热爱计算机的氛围!说到这又很难,当代 
大学生迷茫呀!不知道作什么,有些知道自己该好好编程,但光说不做!有些人,写了几段代码,出现了问题,不会调试,就放弃了!大家都这样,所以以寝室为 
 
位没有人编程,逐渐以整个计算机学院为单位逐渐编程!确实我们的计算机老师,会编程的很少,我们应该知道,中国计算机引进并发展才短短20年,正是这样 
 
一辈的,把这些计算机理论上确立,他们不会编程理所当然,大学的老师主要研究理论,国外的也是,因为理论太难了! 
 
所以大学里学习编程要完全考自己,你要有信心,有意志把它学好才可以,而且这个过程是循序渐进的!以最快方式,找到你编程的爱好和兴趣! 
 
我介绍几个方法,学习方式,希望你能找到兴趣,起码我是这样做的,记住如果跌倒了,你要站起来 
 
  1
。一定要和喜欢编程的,或编程厉害的,或经常编程的人,在一起,经常探讨问题!初学编程会有很多问题出现,你自己很  难解决 
  2
我建议VBc一起学习,这个只是我的建议!我为什么这样说呢?如果你开始只学c,你会厌烦整天在DOS下,没有图象的  程序!如果你直接 
 
WINDOW
编程会很难,所以我建议学VBVB这是个语法简单,很快可以见到你编写程序的画面,这样你就会逐渐喜  欢编程,没有画面很枯燥的,你不 
 
样认为吗?反正我是这样认为的,你编写的好坏,没有画面也很难用眼睛直接看出来!VB是最简  单的语言了!不存在c的复杂语法结构,程序出错概率相 
 
c
来说很少,因为VB封状的很好,帮你解决了复杂的过程!其实象JAVAMFC  c#完全可以作到VB效果,但上手相对困难! 
  c
是我 
们一定要学的,它是一种很接近底层的语言!如果你要成为高手,应该学这个!C是个纯面向过程的语言,它的语法不  是很难,你用它大约一年半多左右,就 
 
全可以掌握它,记住这需要你的实践,多做程序,主要是算法程序,最好把你教科书的后的  的习题都做了。大家几乎学的都是潭浩强的书,这本书我开始认 
 
好,但我看了很多国外的书,和很多国外人所打的代码后,  和国内高级程序员所说的话,我只能说这本书,只能是你的开端,但不能 让你更深层次了解 
 
言。但你要问我初学者用什么  书,我还会介绍这本书。C的精髓在于指针,你能灵活运用指针就几乎等于你掌握了 C语言,这是一种高效的语法支持,快 
 
 你无法想象,我很有感触,在VB下要慢的多。 
 
那么我们学VB究竟做什么,很简单,做WINDOWS程序,控件的使用,数据库的使用等 
等,还有一个很重要的是,你可以练习你   学的数据结构,各种计算机算法,很快就可以用图形的方式显现出来!你现在知道这些就可以,等你以后学了真 
 
WINDOWS
 程,你会对你以前所实现的东西有很深的理解,究竟什么是API,什么是动态连接库,什么是控件,象VBMFC这样的东西,究竟 
 
 了什么让我们用起来这么简单! 
  3
如果你能作到,以上两点,(加上你学的专业,如果你很努力,课大约1年)我想你会对计算机感兴趣的!你 
逐渐容入爱学  计算机的氛围!接下来有两个方向你要去做,一个是努力学好其他计算机专业课,二是在巩固c 语言的基础上,你可以选择学习c++ 
 
WINDWOS编程!这两个先学哪个都无所谓。记住你大学时学的10大专业课,数学,离散数学,数据结构,编译原理,汇编,数据库  ,计算机体系 
 
构,操作系统,计算机网络,软件工程,你要尽力把它们学好,这个是整个计算机系统的精髓,这些都是相互贯穿的  ,相互联系的,你可能学某科没学懂,但 
 
了别的后,可能会懂的!切记,在你学好编程的同时,一定要学好这些理论,以后你会受  益匪浅的。 
  4
。在你觉的c或者VB学的没什么问题,或 
者你学会WINDOWS编程,记住一定要自己有个想法,做个小的可视化程序,小游戏也  好,小应用软件也好,都可以,这个步骤,你一定要做,你会学到 
 
多东西!在这期间,你还会遇到很多问题,你要自己多想,多问  别人,多去网上查资料!但你做的程序,最好不要COPY别人的,如果都是你自己做的,自 
 
想的,你收获最大,哪怕你是模仿别人的 程序,你用你自己的想法实现了,也是厉害的!其次,你可以COPY部分代码,作为自己的。在你对你的想法,知道 
 
么实现后,写代  码只是浪费时间的时候,而且你写的效率没有现成的代码效率高,你就可以完全COPY,但如果你是初学者,你千万不要这么做!否则  
 
对它产生依赖,有一天真正让你自己去写,你会无从下手!所以开始时,你可以试着COPY,逐渐摆脱对它们的依赖,以后摆脱了 ,这个时候,你才可以总依 
它们。 
  5
。大学期间,有很多程序的实验课,你要认真做,做出来收获是自己的,也可以作为自己的一个小项目!大学期间加上实验 
课,基本上自主编程或者团队自主编写的总小软件数目应该不少于78个,如果你做的程序很大,可以少些! 
 
以上,我把如果学习计算机入门 和提起 你兴趣的方法告诉你了!我相信你按照我的去做,应该没有问题的!对于每个细节,我会在接下来详细为你们写出 
的! 

二。理论对你很重要,尤其是你一名搞技术的程序工程师! 

 大学里所有课程几乎都是针对理论的!大学里是你学习理论的最 
好机会,因为我们不明白可以问老师,老师会帮助我们解决的!当然有些老师很垃圾,那就要你自己解决了!我上面提到的10大专业课程,是你以后学习其他理 
 
的基础。你不可能一辈子有老师帮助,以后学习其他理论就要靠自己,所以,在你学习10大专业课程的同时,要学会自己和思考问题!如果你上大学就为了以后 
 
网页,那你没有必要学这写东西,同时,你永远成不了高手! 
 
数学: 
 
数学我们从小就学,它实在太重要,几乎所有的科学都建立在它的基础之上。让我们每个人都成为数学大师是不可能的,我们没有时间也没有精力去搞这么抽象 
的东西,我-们要做的就是,以后遇到和数学相关的东西,能看懂就可以了! 
 
然我很长时间没有看大学课本,但我还很清楚的知道学了什么?极限,导数,微分,积分,空间向量几何,多重微分,多重积分!傅立叶变换,等等把!其 
实这些很 
大程度随着物理学的发展而发展的,现在的仿真技术这么厉害,都建立在物理学上!我希望大家,在能理解这些真正含义,不要单单会做题!题海战术既浪费时 
间, 
也浪费精力!极限:说白了,就是自变量要趋进某个值时的值,我们可以说0.999999,9趋进无限时,它的极限为1,否则说0.999999就是 
1
 
是不对的,如果没有条件9趋进于无限,也是不对的!极限是有条件的!所以说无论学什么,你一定要把概念搞清楚,你要学的东西,都是建立在概念上的,如果 
 
些概念你都没有弄懂,以后你是没有办法学的! 
 
这里我毕竟不是讲数学的,我所要说的就是,你学的东西要扎实,地基要牢,对概念要理解透彻,死记硬背是不行的!如果你不了解它的现实和本身的意义是什 
么,你根本-不知道你在学什么! 
 
离散数学: 
 
这个实际是最难的理论课程,估计能把它讲好的老师也寥寥无几! 
 
合,命题逻辑,谓词逻辑,数论,图,群,环,域!前几部分很简单,图论往后简直难的要命!我在这里不做多说,因为我没有学明白,太难了,群,环, 
域,我连 
它们的现实基础都找不到!它们之所以难,是我们很难容入到那种神秘的思考方式,容入思考方式太难了,只有靠我们的感悟,因为这些真正很强的人真的寥寥 
 
几,能指导我们的更是很少,我本人始终无法理解群的真正含义,我也没有去查什么相关资料,但我知道,再抽象的数学理论,都不是凭空想象的,它一定有它的 
 
实基础,它的出现是有来历的。 
 
数据结构: 
 
数据结构是十分重要的学科,它完全是建立在实践的基础上,也就是说,你要多打代码。它在一定 
程度是依赖语言的。我很清楚的知道,第一遍学习数据结构,也就是几乎很少有实践的,大脑几乎一片空白,也是只有在考试前,反复的复习才知道在讲什么,只 
 
手工的模拟执行过程,把算法转化成程序始终是个迷。但我认为这已经足够了,因为任何理论只有在理解它,你才能凌驾于它,所以接下来一个质的飞跃就靠自 
己, 
靠自己把那些算法变成代码,在自己有想法时,能够把这个想法用适当的数据结构实现,这需要在电脑旁的硬功夫,绝对是。一个高级的程序员,绝对是个硬功 
夫。 
这种把自己的想法变成代码,也是你独立思考的开始,记住思考很重要,他是你在捕捉你的灵感,善于思考的人,灵感来的很快,而且你的灵感会告诉你,对于 
它, 
你能把它做出来,这一切都是思考的结果,我不是个思想家,但我知道,我每天对世界万物的沉思,在指引着我发现那些太多的为什么的答案,这个世界为什么这 
 
样子,它后面究竟隐藏着什么,让我们大胆的假设吧!!多做程序的人,程序会改变你的思维,这绝对错不了。 
 
编译原理: 
 
其实编译原理和汇 
编,操作系统,语言都是紧密相关的,编译器是在操作系统之上,语言之下。在讲编译器时,除了讲编译源程序成目标程序外,还介绍了很多地方都用到的自动机 
 
论,这个也很重要。在人工智能,很多分析语法,文字类的东西都很重要。编译原理和语言是相辅相成的,只学语言不学编译,无法真正的了解语言,而编译器是 
 
语言基础上的,没有语言的了解更学不了编译,现在大多数高校的编译原理讲的语言都是基于面向过程的,但我认为足够了,你真正的理解了编译所讲的东西,自 
 
在深入学习面向对象的语言,你一定会很好的把握面向对象的编译过程,很好的掌握面向对象语言,在语义分析过后的中间代码生成和动态存储空间分配,和汇编 
 
很大的联系,我在学习汇编时,总是先把要求的题目写成C语言,在转化成汇编语言,这就是不知不觉的一种中间代码生成,虽然不完全一样,但让你掌握中间代 
 
生成已经足够了。动态存储空间分配,主要基于指针所指向的动态空间。因为非指针的变量在编译时就已经有内存分配了,这也是编译要做的事。 
 
汇编: 
多数学的都是8086,编译器我推荐用TD,很好的开发环境。作程序调试是最主要的,没有作过程序的人是想不到调试是多么难 ,好的开发环境有助于 
有效的 
开发程序。个人认为,学习汇编要和计算机组成联系起来,主要是指令系统,讲CPU时的知识。汇编是最低级的,最快的语言了,有时为了运行速度不得不用汇 
 
来实现想要的功能,我认为对汇编的掌握程度,只要你能做出个递归函数就可以了,你了解了很多指令用法,寄存器的使用,计算机存储数据和代码的方式,函数 
 
用的方式,栈是怎么实现函数的,你会有很深刻的发展,相信我没错的,一定要上机实现一个递归函数,再加上你对C语言的了解,和一些编程知识,你就可以摆 
 
几乎所有的汇编程序了。 
 
数据库 
我在大学里没有接触过太大的项目,而且平常编程对数据库深入不多,只是达到了做网上书店所要求的基本知 
识,首先是ER图,各种范式,还有数据流图,怎么用语言插入数据,删除,查找等等,实际上,你要不是搞理论的,深到数据的具体存储效率的级别,我想这些 
 
于编程就足够了,但对于高级的数据库程序员这些是不够的。 
计算机组成 
对于学习汇编和C语言这个其实很重要,因为这些语言还没有屏蔽这些硬 
件细节,VB就几乎完全屏蔽了硬件细节,你不需要了解太多的硬件知识。但学习汇编和C语言并不是要你了解到能作出CPU和连接存储器,我们只要知道他们 
 
运行机理,但有一点你不要怀疑,那就是电信号他就是那样有趣,有趣到你无法想象它的速度和高低电平的传递,但是事实就是这样,你不需要怀疑,承认它就 
 
了,因为我们还不能解释规律,只能运用它一样。原理对软件程序员就应该足够了,它会使你更加容易了解操作系统和硬件的工作。 
 
操作系统 
家每个人对操作系统都不陌生,所有的计算机的课程几乎都是息息相关的,他们都有太多的联系,有些你可能迷茫,当所有的学完以后,你应该有个豁然开朗 
的感 
觉,那就是计算机的一切不应该是个迷。操作系统和硬件的接口,就是那些硬件提供的指令,通过这些指令来操作硬件,就象操作系统定义一样,他是管理系统资 
 
的,管理硬件的使用,你在学习操作系统时,把它看成一个管理者就可以了,它是一个有着自己管理方法的管理者,管理这些硬件给每个进程使用,进程说白了就 
 
一个应用程序在内存中或在外存中,有着运行权利的程序。现在的操作系统是多任务的,可以运行多个程序,并发是指单个CPU而言,每个进程在CPU中轮流 
 
行,因为它太快了,你根本感觉不到他们的交替性,就象在同时运行,大多数教材讲并发比较多,我们大多数计算机都是单CPU的,具体怎么交替运行,那就是 
 
作系统管理进程使用硬件的方法,不同的操作系统方法不同,但你的方法不要让其中的一个进程总是得不到想要的硬件使用(活锁或饥饿),但想出个好办法还不 
 
生死锁(这里不说什么是死锁了,我毕竟不是再讲操作系统)也很难,总之,你要学的就是这些方法,这里说的是管理CPU,还有管理内存,外设等等。我在给 
 
进程定义时,还说了外存,其实通常就指硬盘,因为你的内存太小,运行的程序又多,我要为了让其他的程序运行,只能先把它放在外存,也叫挂起。总之,你学 
 
就是管理硬件的方法,怎么管理才能有效率,方便用户使用。如果可以,你也可以设计一套管理方法,那你就作出了一个新的操作系统。 
 
计算机网络 
有和硬件有关的最后一个,说实话计算机网络很杂,你学第一遍后,把网络7层所有管理方法说出个查不多,很难,大多数学生都是晕头转向,网络是个很庞 
大的系 
统,它从硬件到软件,被规定了很正规的完整体系,这样大家都遵照这个规则才能,使每个人开发出的软件和硬件都可以用。记住计算机的交互就象人与人的交 
互, 
它通过01来代替人的语言,表情或所有可以可以传达信息的东西,也可以说是计算机通信的暗号,只有双方都知道了这个暗号的含义,双方才能通信,你和另 
 
个人怎么通信,那么计算机和另一个计算机就怎么通信。例如:我想给你一个礼物(计算机看成我要给你发送数据,A发给B),我要先通知你,看你能不能收 
(这 
符合人的交往)(A发给B一个01组成的编码,事先两台计算机已经规定好了,比如说10010011代表看对方是否能接受),如果这个请求不丢失的 
 
(丢失有很多处理方法,你自己也可以想一个处理方法,比如隔一端时间你没有收到对方是否同意接受,你就重发信息,总之,只要你肯想象,任何都是可能 
的), 
(1)
对方发送一个可以接受的消息(比如说10010012),你收到了,你就可以发送,发送途中又有很多情况,比如说,你怎么发送,作车,还是徒步, 
 
果交通堵了怎么办,是把礼物一起送过去,还是分开送过去,等等,具体到网络里是快速发送,分开发送,我们学的就是这些方法。(2)对方发送个不能接受的 
 
息,你是还要立即发送,还是不发,还是等一会在发,这些方法很活,你要学的就是这些方法,如果你可以处理网络中出现的任何问题,你不学它也可以。我要告 
 
你的是,你要学的就是就是通信协议(就是实现规定好的暗号),通信方法,出现问题怎么处理等,你有好的方法,你可以不学了,很简单,方法就是人发现的, 
 
比它的好,学它的干什么,就用你的。 
 
软件工程 
软件工程是从实践中总结的经验,对于很少做过项目的大学生来说,确实很难理解,只要你作过 
一些项目,比如网上书店之类的系统,你就会有些了解,它说的很对,我很清楚的记得软件工程分这几个过程:(1)可行性研究,也就是你要做的这个系统可 
 
不,是否值得去做,做了能得多大效益。(2)总体分析,这个就是从整体来规划你要作的系统,只是个概况,并没有详细的阶段,把系统大体分成几个模 
块。(3)详细分析,这个阶段就是来详细每个模块,把所有的细节都要写好。(4)程序编码(5)测试(6)售后服务。 
每个过程有分很多规范,因为一个项目很多人做,很多公司做,没有个很好的规范会乱套的,所以最后很容易合在一起。 

 三。学会自学,学会思考,学会合作与交流! 

  学阶段你一定要学会的,这个也是你必须学会!否则你很难进步,对于自学,大家都知道,但确切含义,是你一定要学进去,看一本书,当你看完后,你要 
有你的见 
解,要么接受,要么否定,如果你两个态度,都没有,说明你根本就没有看进去,哪怕你歪曲了作者的意思,本来作者是对的,你否定了他的意见,这也证明你思 
 
了,只不过是错误的,但这比那些光看没有思考的人要强!但我们看书,如果我们错误了,很快就可以改过来的!所以你自学,要学进去,知其然,知其所以然才 
以! 
 
很多人,总说,没有心情学习,说实在是你自己不去培养这个方面的兴趣罢了,说到底都是自己的原因,你不能很好的看书,浪费的是时间,是你的精力,不如 
不看,做些-有意义的事情! 
 
书和思考是同时进行的,学而不思则惘,思而不学则怠,我到大学才真正理解这句话的含义!思考的重要性,超过了一切,思考可以看成两种,一种是有意 
识的,一 
种是无意识的,我们在玩些体育运动时,这种情况想,思考是无意识的,完全靠你的本能,这种本能是靠先天和后天的训练才获得的!但我们遇到的事情,大多数 
 
是有时间去思考的,所以,你遇到事情要冷静的,想想问题的突破口! 
 
说实话,中国的教育是失败的,他过分强调知识的结果,不注重过程和起始,思维 
过程很重要,其实结果并没有它重要,思维的方式决定着一个人,从小就听人家说1+1=2,但为什么?从什么地方来去思考,怎么思考,却很少有人知道。我 
 
能说的有点偏题,但这是重要的,也许是我说数学来把说思维模式引出来。在讲授思维时,这狠难,最根本的是,人们对思维还存在着争议,而且不同人的经历也 
 
少要决定人的思维。我在这里只说学习上的思维。我认为人从一出生,就具有某种特长(这是相对的),也就是说在同等环境下的人学习(我们排除在这种学习以 
 
的经历的影响,比如说学习音乐),一定会分出优劣,在大家都很努力的情况下。如果有音乐天赋的人,他不去努力,可能落后于努力而不具有天赋的人,所以勤 
 
出天才不假,但要用到自己具有天赋的一面,那必然事倍功半。天赋和兴趣不是一会事,但大多数人,能在有天赋中找到兴趣,在兴趣中而找不到天赋。所以在大 
 
阶段,(在中国这种教育,高中阶段几乎不可能),在大多有自己支配的时间里,你要尽快找出自己的天赋,并发现这方面的兴趣。记住,你在这方面有天赋,不 
 
表你在这方面比任何人都前,但你已经比很多人强,如果你很努力,你会走的更高。因为很少有人知道牛顿看苹果落地,为什么会想出万有引力定律,而为什么我 
 
不能。很多人说是牛顿爱思考的结果,这一点不假,但并不是每个爱思考的人能想到,很好问题就在这里,这就是我们跟人家的差别,因为思维的东西很难传授给 
 
人,所以这样的高人很少,光靠他们留下的书是很难解决问题的。 
 
记住,你不是爱迪生,你不是爱因斯坦这样的天才,如果你是,你可以不这样做,你的学习需要交流和合作。哪怕是天才也少不了这些的,一个人学习,掌握知 
识慢,效果-不高,多个人研究会使你进步的很快! 

 四。要想成为高手,一定要从底层学起,底层是什么?CPU,汇编等硬件指令! 

  个方面我可能要多说一点,其实编程这个概念真是有点广义,做FLASHFLASH语言,也能编程,做网页有HTML语言和ASPJSP等也能 
编程,其 
实这些都是低级的编程,不用了解底层结构,就可以书写!当然,你也不可能了解这些语言能封状了什么东西,你也不能了解真正出了问题时,该怎么办?举 
 
MFC
例子,如果你对MFC的内部结构不了解,对WINDWOS编程不了解,一旦出了问题,很难找到!有时,为了挽救,就要从建工程,从新把编写的模块 
 
载到工程下!虽然你解决了问题,但你没有解决导致你从新编写程序的根本问题!语言就一个,高级语言封状了,内部的太多细节! 
 
现在很多语言有万能类型,其实这是个垃圾类型,高手一般都不会用,只有菜鸟,觉的使用方便才用它! 
 
所以你一定要学习汇编,确切的说硬件指令。你学会了汇编,其他硬件指令都是相通的,如果代码详细到汇编的级别,不可能有问题发现不了,一定可以发 
现! 
 
学习汇编,你一定要对计算机的体系结构有深刻的了解,具体说CPU和内存构造!现在的CPU都是逻辑运算器和算术运算器和积存器组成,CPU的发展史 
应该看一看-,对你有很大的帮助,你用汇编编程就是用硬件指令,内存和积存器! 
 
对于汇编,你要了解语言的语法,当然所有的指令,我们不一定要记住,用时会查就可以了!如果你能用汇编语言写个递归函数就符合要求了,其他没有什么难 
的! 
 
编写一个递归函数,要求你会灵活运用各种指令,还要了解函数在内存中究竟是怎么实现的,栈到底是什么东西!我下面举个简单的例子: 

数据在内存的分配 

早的计算机数据段和代码段区分的很严格,现在似乎没有这么严格了!对于全局变量和静态变量它的分配完全在数据段分配,知道运行结束才会收回内存!而 
对于自 
动变量(包括函数参数和函数中定义的变量)则在堆栈中分配!一般的分配情形是这样的:从栈下到栈顶依次是函数参数,函数结束后下一条指令的地址,寄存器 
 
护,然后是函数中定义的变量! 
例如: 
 void main()
 
 {
 
  int m=3,n=4,s=0;
 

  s=f(m,n); 

 } 
 int f(int a,int b)
 
 {
 
  int c=2;
 
  return a+b+c;
 

 } 
我们从s=f(3,4)开始 
它的汇编代码大致是这样: 
push n
 
push m
 
call f
 
push bp
 
mov bp sp
 
push ax //
保护寄存器 
'
 
'
 
'
 
c开辟存储空间 
计算a+b+c 
弹出c的空间 
' //
弹出寄存器值 
'
 
'
 
pop ax
 
pop bp
 
ret 8
 

数据存储栈的示意图 
_________
 
|___c___|<--sp
 
|___'___|
 
|___'___|
 
|___'___|
 
|__ax___|
 
|__bp___|<--bp
 
|IP next|
 
|___m___|
 
|___n___|
 

首先压栈m,n,这个压栈的顺序cc++是从右到左,而PASCAL则是从左到右,其实哪个顺序是无所谓的 
接下来是call f这个是让IP指针指到函数的入口地址,这个入口地址是在连接时候完成的 
下来是把BP压入栈中,这里为什么要把BP值压入,因为函数要使用BP这个寄存器,计算机里的寄存器个数是有限的每个函数都使用,可能造成值的丢 
失,所以 
先把BP的值保存起来,以免丢失,在弹栈时,把这个值在放回BP中!后面的AX等寄存器压入栈都是这个原理,一般BP用做栈基指针,用来使用栈中当前函 
 
的变量值这个很方便mov bp spSP是栈顶指针,这时BP就指向了BP寄存器压入值的位置BP+4(之所以加4因为整形占4个字节)就指 
IP NEXT(函数返回时,IP要接着函数结束的后一条指令执行,这个地方就存储的这条指令地址)BP+8就指向mBP-20就指向c 
函数执行完后要弹栈,按入栈的反方向弹出,然后IP等于IP NEXT的值,ret 8是告诉系统要把m,n也弹出,8是字节数 
这个模型是一个简单的函数调用模型,它是你必须要掌握的模型,其他的和它实质上都是一样的c++的函数调用也是这样,只不过在找函数入口时不一样! 
汇编和现在一些常用的指令集合 
又开始说汇编了,因为它实在太重要了!你不学好它,你是学不好其他高级语言的,但要学好汇编又要了解计算机的体系结构,计算机的CPU和内存和外设 
之间的 
关系,及其它们的构造!现在CPU的寄存器已经达到了64位,算术运算器和逻辑运算器都比以前工作快的多,而且提供专门执行浮点数的各种运算!学汇编是 
 
基础,有时候,你还要联合用MMXSIMDFFD等多种CPU指令 

很多人学过cc++,其实它们最后都要被编译器转化成汇编语言的,现在的编译器已经很好了,完全可以转化高效的汇编代码,机器是机器,始终是不会有人 
做的好的-,有时确实学要我们人来手工编写代码! 
多人始终反对这个观点----成为高手一定要学汇编,有人用JAVAc++c,挺顺手的!JAVA我先不提,对于c,和c++因为保留了指针,你不 
学编译 
原理,你不了解汇编,你能学好这门语言吗?根本就学不好,你用着顺手是顺手,真正讲原因,恐怕你说不出来,如果你是做游戏,做一些需要很高时间和空间效 
 
的程序,c c++有时根本就解决不了问题! 
现在很多人学JAVA,有几个知道JAVA的从JAVA这样语言从源程序----词法分析----语法分析 
----
语意分析----中间代码----中间代码优化----目标代码----目标代码在虚拟机执行,这一系列的整个过程的,几乎没有,我们现在抛开面向对象 对象语言,来 
 
说象JAVA一样支持多线程的面向过程脚本语言(其实JAVA也可以理解为角本语言),因为相对面向对象,和面向过程,唯一不通就是源程序----词法分 
 
----
语法分析----语意分析----中间代码这个阶段不一样,往后都是一样的,有了中间代码,有利于跨平台,有利于移植,对不同平台我们只需要编写中间代  
----
 
中间代码优化----目标代码----目标代码在虚拟机执行这个部分就可以了! 
上面过程,你不了解(精通很难)怎么能学好语言,怎么能说JAVA用的好呢!汇编也是一种中间代码,所有的中间代码几乎都是模仿它的模式来做的! 

 五。编程需要经验积累,学会调试对你尤其重要! 

 学好编程那就是编程,编程再编程!我还是那句话,单纯的编程很容易学,调试也是编程的一部分,程序是调试出来的一点也不假,我要讲的是一些常用的调试 
方法,但这-里更多针对c 
c++相关的,用 MS的编译器! 
 
你要想调试,首先要对你用的编译器有充分了解,我现在经常用visual c++6.0 + sp5 + msdn,这里建议大家用英文版!因为中文 
版的有时有问题! 
 
经常调试的方法,要针对,具体问题! 
 
这里编译没有通过的程序 不说,那是你语法不过关,出了问题,自己仔细看书去! 
 
我大致分了两类,1。能运行的,结果不对,2。根本不能运行! 
 
对于1,有两种可能错误: 
    a
是逻辑错误,你的程序算法就不对。也就是说,你程序从总体框架可能就不对,或者算法根本就是错误的 
           b
是语法你还没有掌握!容易出现这个错误的就是,类型转换!cc++是强语言类型,有时提供隐式类型转 
换,float c=3.06f; int a=c;这里的a=3不是3.06,但你有时不知道发生了转换,所以出错了!还有就是指针类型转换,这里建 
 
要学好指针,这些语法问题,一定要过关! 
 
对于这种问题调试方法就是:跟踪程序,逐渐缩小出错的范围 
,最后发现出错点!这里你必须有个良好的习惯,写一点代码就或一个小模块就要验证它的正确性,如果你把写的程序,一堆不知道对错都放在一起,很难调 
试! 
 
跟踪程序,就是跟踪程序的具体变量值是否正确,用设置段点的方法执行跟踪,发现错误出现在具体哪个模块,然后单步跟踪,visual c+ 
+6.0
 
编译器给了我们很多调试信息,变量变化,栈和寄存器值,函数调用关系,足够我们找出错误! 
 
对于2,很大一部分原因就是指针问题,指针问题,一般都是由于使用者使用不慎造成的,比如访问越界,没有释放了等等把! 
 
里我教大家一个解决方法,在不设置任何断点时,调式运行程序,编译器,执行到出错地方,马上就会停止,你就能找的出错的地方在那里,但出错的地方 
不是出错 
的原因所在,一般能找到是哪个指针有问题(但有时编译器也找不到,这时,你要自己想一下指针在程序流程,逐个分析)你要根据程序的运行流程,观察这个 
 
针,一定就可以发现问题的! 
 
其实基本调试方法也就这些,可能还有很多,具体的都是在这些方法上的操作或演变,其他的经验因人而异! 

 6。全局把握整个工程,具体到每个类的属性和方法以及各个类的关系!一定确保你设计的类和类模式和类间关系能够有效,利于修改和升级!概括说就是软件 
工程 
 
对于这个我不想多说,因为我很清楚,这个很难说明白,没有经过项目的训练很难理解,大学里学软件工程,学完了之后基本空白,不知道怎么用,有什么用, 
说白了,就-是把你的系统做的很合理,很简便,很利于升级!对于这些没有严格的标准!这个还是大家在项目中漫漫体会! 

 长篇大论终于写完了,其实我可能要说的还很多,但作为一个帖子,我主要是把纲写下来,告诉你们怎么做,不再迷茫,做到一个真正程序高手! 
 
作一个优秀的程序员很难,他需要了解太多知识,而知识又不断的更新,你还要不断的学习,你要有这种热情,你要有这种激情,才能把他学好,学通,学 
懂! 

 计算机行业每年需要大量的人才,中国高层人才少的要命,给你黄金你都拿不走,你知道为什么吗?所以你要装备你自己的能力,总是抱怨,不如使自己更 
强! 

 梁肇新有一句话说的好"雄心的二分之一是耐心,我认为应该是三分之二",你做事情 
要有耐心,有忍耐力,才可以,大学每天吃喝玩乐,不去学,说明你根本没有耐心,所以也很难成就事业!