乱想乱写之书籍
提到C++,大家一开始会想到什么呢?
世界上最复杂的程序设计语言,包含四种模式,至今为止,没有一个编译器能完全实现标准定义的特性,社区庞大无比,C++标准委员会高人众多,墨守陈规,被一个一个新型语言超越,Java的鼻祖,学习曲线漫长,很多大型系统使用其进行开发。可上可下,但不上不下。
其优点多,缺点也多。关于C++的书也是数目繁多,而且更让人恐怖的是,居然众多的都是经典的书籍,而且一个个都那么的厚。是的,这就是C++。你来对了,你也来错了。
既然提到书,就先从书讲起,其实推荐书籍的文章已经有很多,而且基本大家都已经认同,这里暂时就不罗列那么多,因为我自己都没有看完,何况推荐给别人呢。
先从C说起,C很简单,一共四本书,就可以用C走天下了。
第一本为K&R的TCPL,K&R是C语言的两个创始人,至于C语言怎么来的,和UNIX有什么关系等等秘辛,大家去查查维基百科就知道了,这里就不扩展了。TCPL的全程为The C Programming Language,简洁明了。
第二本为C Traps and Fails,中文名字翻译为C陷阱与缺陷,从另一方面来阐述C容易犯错的地方,比较易懂,语言也好,可以一看,中文版在网络上可以找到电子书,但是并不是清晰的版本。
第三本为C Expert,也就是传说中的鱼书,这本书有清晰的英文电子版,推荐详读,里面将C中一些高级用法介绍详细,如果你就是用C,可以备在身边,时时查看,不清楚现在是否有再版,如果没有,可以将其打印出来。
第四本为C和指针,不要看名字是中文就以为是国内写的,也是英文书,但是该书已经绝版,找不到对应的英文版(至少本人未找到),而中文翻译是该名字,中文版似乎也已经绝版,电子书有,比较少。
除了书之外,就是标准了,C有C89和C99标准,C89直接查看TCPL即可,C99需要将标准下载下来。
然后还可以去C FAQ看一下。基本上对于C,就是这么多内容,将其搞通,对于C的语法应用就可以了。
然后是C++,这里先说一点,就是C和C++其实是两门语言,尽管他们常常使用同一个编译器来进行编译(VC),GCC和G++/C++是两个不同的编译器。不过既然在语言上面有差别,就是两门语言,就如北京话和普通话,尽管普通话是以北方语系为基础,不过他们不是一个语言。正如一开始做C的链表时候,遇到的问题一样。
C++入门,一般是两本书,C++ Primer和TCPL,呵呵,这里又出现了一个TCPL,不过其全称为The C++ Programming Language,这两本书国内均有中文翻译,而且口碑都不错,C++ Primer我使用的为第三版,是潘爱民老师翻译的(也是翻译VC++技术内幕第四版的大牛),TCPL为裘宗燕老师翻译的,两本书各有所长。当然,最好还是有本原版的一起来进行参考,国内也有TCPL的影印版,也不是很贵,可以一起拿来参考。不过现在要加上一本,C++沉思录,十分推荐,给了一个全新的思路去看待C++,真的很好。
之后,你想了解细节,就可以去学习Effective C++,More Effective C++,这两本书真是让人叹为观止,Exceptional C++以及More Exceptional C++。
如果你想了解C++的实现,可以看Inside C++ Object Model,这本书和C++ Primer的作者是同一个人,lipperman,不过这本Inside的质量不如C++ Primer,里面有不少笔误,所以这里不推荐原版,而是推荐侯捷老师翻译的版本,里面有详细的勘误。
如果你要看C++库的使用,你可以看C++标准库,是一个德国人写的,也是由侯捷老师翻译的。
关于模板,可看的也很多,不过都是做库的同志看看,反正我是不想看得头大。特别是以前编译器对模板支持不好的时候,用模板简直是受罪。
还有一本STL源码剖析,不知道应该如何分类,这里就单独列出。
要看C++的八卦,那就去看C++的设计与演化,这里将C++如何一步步成为C++的过程,由当事人罗列给你。
上面所有的书籍,其原创均为老外,基本为老美,所以,真正要做一个Programmer,英语是多么的重要。
其实,作为developer是一件很累的工作,上面列出来的书籍,少的几百页,多的上千页,但是,看完了他们,你就会编程了吗?答案是NO!!! 你也就能调几个黑乎乎的窗口出来,然后写一些似是而非的代码。比如helloworld,比如animal下面有pardon,然后继承来继承去,倒来倒去。对于了解语法细节是很有帮助的事情,但是对于真正的程序开发,还有其他的东西要去了解,要去看。
首先,你要做什么?
C++作为“万能语言”,简而言之就是什么都能做,上到航天火箭,下到芯片板子,中到服务器系统,if you think C++ can, he can。
不过,做什么,你就要针对他了解相关方面的知识。
OK,那我想做游戏,那了解什么吧。
游戏,是3D的还是2D的,3D的是用OPENGL还是DIRECT-X,用的是什么物理引擎,脚本系统用什么,服务器通讯怎么做,实时性要求怎样,地图显示,服务器用的是什么系统,是否需要负载均衡,而角色AI,移动怎么计算,地图之间怎么跳转,太多太多东西了。
晕,那我想做个播放器,播放器好做吧,人家拖拖拽拽就能出来一个,还能在线听电台啥的呢。
首先,你可以了解一下windows的消息机制,VC的使用,你所说的拖拖拽拽使用的是windows media player的COM接口功能,COM是windows中重要的方面,包括office的复用,包括IE的ActiveX,包括MSXML解析器,都可以通过COM来使用其接口,而DirectX的播放,也是通过COM接口来实现的。而在线听歌,是通过具体的在线流媒体协议来实现的,如果要了解的话,首先必须了解网络知识,TCP/IP相关的东西,然后再具体去了解协议本身,然后再是协议的实现和使用。
再比如XML解析,再比如VOIP,再比如操作系统,再比如手机平台,再比如Photoshop,迅雷,QQ,KMP(实际上KMP是Delphi写的,不过VC也一样能够实现),这些东西并不是你读了上面的书,你就可以做出来的。
那要读什么呢?
如果是windows平台,那就要读VC开发相关和windows消息机制相关的书。比如windows程序设计,VC++技术内幕,深入浅出MFC,windows核心编程,然后了解M$的编程环境,MSDN中各个SDK,对应的windows API。如果是linux,那就需要了解各种图形库编程环境,去看APUE(Advanced Programming in the UNIX Environment,UNIX环境高级编程),去真正使用linux,了解它的管理是怎么做的。当然,有些东西是共通的,那就去看操作系统的原理性书籍,去看源码剖析,windows的源码不太能看到(似乎现在是有一些开放出来?),可以去看linux内核情景分析(到现在为止不多的国内好书哦),以及LDD(Linux Device Driver), LKD(Linux Kernel Development)。然后和内存,线程,进程,进程间通讯,锁机制等死磕。
如果要做和网络相关,那就要看TCP/IP三卷,以及UNP(UNIX网络编程),同时也还是要涉及到算法,涉及到效率,以及网络流量等各种问题,在复杂网络情况下的处理。各种打洞和穿透技术。
如果你还意犹未尽的话,还可以去看算法导论,SICP,龙书,编译原理,还有大名鼎鼎的The art of Computer Science。
这里还没有提到的还有,软件工程,现在最流行的(或者已经流行过了的),敏捷,RUP,UML,重构,设计模式,还有其他语言,Ruby,python,JAVA,.NET,F#。从2000年之后,大家基本上还是使用的以前的思想,包括插件开发,包括企业开发,包括复用,包括OO,包括函数式语言。
扯了这么多,忽然发现离题万里,不过这也带给我们思考,要学多少东西我们才能够独立开发,要了解多少东西,程序员才是一个好的程序员?是否现在的系统已经让越来越多的传统程序员无法自己独立进行程序的开发?是否复用性、模块化带来的是大型组织的活力,同时web的兴起也是由于传统开发的复杂性使得新型快速开发web成为潮流?
本来准备写C++的,结果扯出一堆东西,是自己困惑的,也是要思考的,里面整的比较乱,大家将就看看,写了靠两个小时,累了,懒得整了。