不知不觉2010年都过了半年了,想来我学C语言已经12个年头了(从1998年开始),用VC++也有11年了,最早使用Turbo C2.0 ,也学过汇编,后来使用Borland C++3.0 、Microsoft C++7.0、VC++5.0、VC++6.0、VS2003、VS2005、VS2008,当然这只是个表面的历程,并不能说明其它的什么,只是个光阴的故事。
十多年来,我也被迫用过PowerBuilder、用过Foxpro、甚至用过C#.net,但我始终坚持着VC++不放弃,开始的时候看书学习几乎到了废寝忘食的地步(那时候在大学,除了打游戏就是看书写代码,课程都落下了),在我最艰难的时候,是学习VC++的动力鼓励我继续努力,继续坚持,不放弃生活,最后终于成了一名程序员,当然现在依然只是一名程序员。
其实想来学习VC真正的目的有点很无厘头,我学习VC其实就是为了能开发游戏,呵呵,就是这个真正的目标,让我坚持到了今天。但是,直到今天都没有机会去开发游戏,实为遗憾。
这十多年,怎么学过来的,其实也没什么秘密,就是坚持看书,一本一本的看,一遍一遍的看,一次一次的实践,也就这么过来了。
最近开了博客,写了些东西,很多网友看到了,就问了些问题,而这些问题有些简单,有些复杂,有些问得我都不知道怎么回答了。但总结下来很多其实是一个问题,就是反映出提问者基础太薄弱,当然这是因为有很多提问者是初学者。也有初学者一直建议我为初学者写点什么,让他们能够不迷茫,能够快速的进步。今天写这篇文章,算是写给初学者吧。当然不敢说我说的全对,只是把我学习的经验,学习的方法,学习的目标交代一下,观者就是仁者见仁智者见智了,如果你确实得到些什么,也算是对我莫大的安慰了。
首先、谈谈看书吧,因为这是修炼基础的不二法门。当然看书很简单,看什么书就很重要了,想来这十多年来,我看了很多书,有些都记不得了,也记了不少的笔记,最让我遗憾的一件事情是一本笔记丢掉了,那里面可是我四五年的心血啊,现在都觉得心痛。当然也有很多书都摆在了书架上成了摆设,经常看的现在想来也就那几本,当然这几本书已经是翻得书页发黄了。这里就说说打基础最合适的几本书吧,有些可能已经找不到了,但是写在这里,网络世界之大,我相信大家还是能够找到的。也许这些书,对于有些人来说不是什么经典,但是对我来说,它们才让我真正的感觉到了进步,真正的学到了东西,真正的留在我这十多年的记忆中。是我编程生涯金字塔的基座。
第一本就是《标准C++宝典》,这部书版本有点老,依托的是98年的C++国际标准,但是它的优点就是讲述的全面详实,几乎覆盖了标准C++当时所有的语法点,尤其是模板部分的讲解,我觉得非常之精彩,尤其是STL模板结构的思想更是深入详实。看了这部书,对于掌握牢固的C++基础是至关重要的,也是进一步学习和掌握STL库的基础。
第二本就是《Visual C++语言参考手册》,这个是翻译的MSDN,当然逃不过翻译不好的命运,但是读习惯了翻译者蹩脚的翻译之后(有些词必须先还原成E文单词后才能理解其真实的含义,由此可知翻译者是E文很强,但是C++却懂得不多,翻译者不要找我拍砖哈,实话有时候是很伤人的),还是可以完全看的懂得,只可惜它是基于VC6.0的语法的,也是有十多年的历史了,之后的版本,俺只好到MSDN中看E文了,为此专业E文可是进步了不少。这部书让我真正彻底的明白了什么是C/C++,尤其重要的是看懂了微软扩展的C/C++语法中的很多细节,尤其是那些双下划线开头的关键字,看了之后再也没有恐惧感了,对于那个困扰我很久的#pragma once,更是了解的非常之透彻了,以至于我后来都不用那个#ifdef #define #endif的经典头文件包装了。不看这本书想接着看懂MFC的源代码几乎就是缘木求鱼了。所以这部书一定要看,不但要看,还要留一册在手,随时翻阅。当然看完之后,就用MSDN代替就行了。
第三部书《Windows 核心编程》,Windows编程必看的书,这部书已经是公认的经典了,我也觉得它很经典。我的那本已经快被翻得书皮都要掉了,前两天还翻了几下,所谓温故而知新嘛。这本书尤其适用于对Windows操作系统完整的编程接口的概念性认识,核心了解UNICODE、内核对象、进程、线程、作业、纤程、同步、DLL、内存管理等等吧,但是假如你觉得这是Windows编程的全部,那么就是你错了,看过这部书,你接下来就要读下面两本:
第四部《MICROSOFT WIN32程序员参考大全》1、2册,这套书有5册,找到1、2册就行了,后面的3册都是API的声明啊,结构的定义啊什么的,直接看MSDN就行了,没必要看的。当然这五套书也全部是翻译MSDN的,年代有点久远,也十多年了吧。别急,年代久,不表示东西老,里面是非常实在和全面的Windows编程真正的基础,如果你还不知道Windows中只有三种基本窗口类型或者还认为能写Windows钩子的都是所谓高手的话,老老实实看吧,2008年我开网络培训班的时候这两部书就是教材,有些学员只问我:老师你是怎么找到这两本书的?呵呵,只要你认为学习VC就是要有牢固的基础的话,你也能找到这样的书的。
第五部《Windows网络编程》,此书也已经有第二版了,但是总觉得第二版翻译的没有第一版好,学习网络编程基础,这个书是必看的,此书也被认为是经典,当然你不看它,它也不是什么经典,所以重要的就是去看,看懂,看透,翻烂。
第六部《MFC扩展编程》,大家都知道那本《深入浅出MFC》,却很少有人看这本,而我正好只看了这本,而《深入浅出》只是翻了翻,淡忘了。只有这本留在了记忆中,写的好!是真正的MFC的基础,所以找了看吧,不用MFC的话,不看也行。但是我认为学习MFC的目标不是为用,而是为了了解其架构,借鉴其思路,掌握非编程知识,比如软件架构、软件设计、公用库、公用框架等等知识吧,这些不是你会编写代码就明白的知识。
第七部《代码大全》1、2版,不要被书名误导,这个绝对是经典中的经典,教你怎么做软件,怎么写代码的,你说基础不?重要不?任何关于这部书的赞誉都是多余的,你要做的就是赶紧找到,look!一遍不行、两遍、两遍不行四遍、再不行,写字会吧?做笔记!
第八部《COM原理与应用》潘爱民老师的,掌握COM基础知识,必须看的书,虽然现在漫耳都是.net,但是我认为.net clr是COM的一个升华,而不是取代,只有真正掌握了COM基础,才能接着轻松的玩转你现在可能很感兴趣的DirectX、DireceShow、OLE、OLEDB、
ADO、DCOM、COM+、ActiveDirectory等等一大堆你认为非常强悍的东西,没有基础,这些东西对你来说就是空中楼阁,所以看吧!
第九部《数据结构算法与应用-C++语言描述》,这个干什么的就不多说了吧,搞编程的,甭管你用什么语言,不懂数据结构,就不能说是会编程,就这么夸张,所以赶紧去找吧。
以上这些书,是我看过而且一直留在记忆中的书,当然有些是电子版,有些在我的书架上,时不时总是翻出来看看,因为我相信一切的问题都是基础的问题,基础打牢了,学习别的东西,新的技术才能得心应手,信手拈来。看完了这些,一些辅助的书就是《编译原理及实践》、《高级编译器设计与实现》、《操作系统设计与实现》、《程序员实用算法》等等等书籍了。也许这些不是全部,但是作为打基础的书,是非常非常不错的,如果你真的看了,看明白了,就不会再去问人家一段面试题中程序的输出是什么?为什么我的程序总编译不过,老找不到什么lib之类的问题了,很多问题就不是问题了。反过来或许你也很有可能发现你的问题真的是问题了,甚至找不到答案了,怎么办?创造!
当然这些书是基础,我所列举的也只是所谓绝世武功的目录,或许连目录都算不上,甚至也不是绝世武功。但这之后你还需要看n多的书,当然有了前面这些基础,看其它的书也就不难了,甚至也具备了分辨优虏的基本功,总之看书的目标就是非最好的书不读!
其次、讲完了看书,再来说说看代码,很多时候,你作为一名程序员,最悲惨的事情就是大家说的面对近十多万行几乎没有什么注释的代码,更要命的是,你还必须为了那少得可怜的工资来硬着头皮维护它。呵呵呵,可怕吧?可怕么?不可怕!在你有了前面书籍打得基础之后,它就真的不可怕了,为什么呢?计算机语言、C/C++也是语言,语言的词法、句法、语法都掌握了,甚至整体结构方面、设计方面的n多知识都掌握了,看代码对你来说就像是看小说一样,你还需要什么注释呢?甚至你会觉得注释都是在侮辱你的智商,你想象一下你看金庸先生的武侠小说时,里面插满了各种注释,你还有兴趣看下去吗?你会不骂那些自作多情的注释编写者吗?当然这不是贬低注释,或者说你写代码就不要注释了,这里说的意思就是你看任何代码都将是行云流水,如饮琼浆玉液般酣畅淋漓,注释有没有已经不是问题了。代码长了当小说看,代码短了当诗歌散文看,写的好的代码当经典看,写的不好的当A书看。语言嘛,看不懂还叫你掌握了语言?当然前提就是前面提的那些书你确实找了看了,或许那些还不够。不够就再找再看,直到你明白计算机语言也是语言为止,就像你学了国文、学了E文之后能自由的看书看报为止。
当然看代码不能只停留在看懂的基础上,那是起码的要求,你还要看懂整篇文章的结构,作者的思路,文章的中心思想,划分出段落,甚至能够指出什么地方写的精彩,什么地方写的是糟粕,最后能够续写、改写,就像高鹗续写《红楼梦》一般,你才算修炼小有成就了。
所以不要把看代码,改代码当做负担,要当成一种享受,如果你能写的比原作好,那同样能够证明你的实力与水平,甚至也是你能更进一步与老板讨论你工资待遇问题的资本,呵呵。而这些很可能是你还有机会站在巨人的肩膀上,站得更高才能看的更远。
关于看代码的问题,建议就是多看看国外同行的一些经典的开源库,就如同和高手下棋一样,提高棋艺的根本手段就是找比你更高的高手,当然不是说国内没有这样的高手,只是那些高手要么忙着写代码、要么忙着改代码,开源?饭都快吃不上了,别开玩笑了,呵呵呵。当然也许你看的更多的代码都是如同充满了感叹词、语气词、甚至省略号等的没有情节和欣赏价值的A书一样的代码,没关系,看看吧,YY一下传说中也可以强身健体,但是别看太多,跟臭棋篓子下棋久了,难免你也成了臭棋篓子,关键是要有分辨代码优虏的能力,改之,改进之,超越之。
最后谈谈写代码吧,也有人不喜欢这种说法,更喜欢那个冠冕堂皇的词——软件设计,或者叫软件开发。其实核心还是写代码(很多经院理论家已经把它变成了写文档,国内公司的文档比代码绝对不少,但基本都是没什么营养的,形式却是非常之标准的,而对写代码来说基本没什么价值,国外的见得不多,不敢妄加评论)。姑且叫写代码吧,如果你有一个可以重新来过,重头开始写代码的机会,不要放过,免得你后悔一万年。面对这样的机会,别急着写第一行代码,而是在心中打腹稿,与用户交流,多听,多问,多记,构思框架,如果觉得有东西了,就先写文档,当然这个文档是写给你自己看的。要是写其他用于所谓评审,投标,申请某些东西的文档,你最好还是谷歌、百度然后抄吧,再不行就去天涯,别人绝对比你写的好,写的规范,你依葫芦画瓢就行了,不用动脑。而写给你自己的文档,格式就不用拘泥了,把问题记清楚,把思路记清楚,把框架描述清楚,能帮助你写代码就行了。具体的要求看看《代码大全》吧。
写代码有很多前提,关键的前提就是你跟用户有了良好的沟通,建立了良好的关系,有了完善的沟通渠道。很多时候,程序员给人的感觉都是不善交际的,甚至夸张到连自己的女朋友都对付不了。这不最近还老在劝那些刚失恋的程序员朋友们,不过沟通能力实在不敢恭维。这种情况下,纵使你有浑身的本领也难有所成就,更没法得到别人的帮助。很多时候写代码的功夫不是在于写,而是在于这之外的功夫。所谓胸有成竹,才能一气呵成,才能痛快淋漓,而如何成这个胸中之竹,就不是懂的所谓计算机语言就行了,你必须精通群众的语言,与群众打成一片,与你的客户打成一片,搞懂他们需要通过你让那个低智商的计算机干什么。这就不是前面说的看看书,看看代码就能做到的,需要修炼,怎么修炼?说来不复杂,就是多与充满智慧的人交流,修炼那些代码之外的技能。
说了这么多,不知道对初学者有没有帮助,总结下来,其实无非就是多看看书、多看看代码、多写写代码,多与人沟通交流。而真正最重要的就是多与人沟通交流,其它的都只是基础,或者说是你必须具备的基本技能与素质,也就是常说的先做人、再做事。这也是我这么多年做软件得来的一些教训。而以前我也像很多人一样,不断的抱怨客户怎么又改需求了?要求怎么又变了?甚至抱怨这个傻瓜狗屁不懂的,成天瞎指挥老子干事,而且干得都是无用功,走的都是冤枉路。其实这真正的原因,不是因为客户,而是因为你失去了人类的智慧,而只具备如同计算机一般低级的思维。
写到这里算结束了吧,也许解答了一些初学者的问题,或者说初学者困惑的问题,其实很多功夫都在代码之外的,如同写书写文章的人,都知道写的功夫绝对在书与文章之外。
看的书籍:
Effective C++
Windows 核心编程
算法与数据结构
先看 "C++标准库自修手册" 大砖头 后看 "STL源码剖析" 最后看 "Efficient STL" 看完了神功练就!