写这篇文章,主要是因为今天有朋友聊到打算从测试转C++开发。一方面帮助朋友梳理看书路径,提供一个看书,应聘的方案;另一方面,也是梳理自己思路,以鸟瞰的方式,帮助自己更全面地检视知识和经验。
受限于自己专业阅读量,加上本身没有达到对编程的狂热痴迷程度,所以,此处我不会列出很多书,只是描绘C++世界中的一个小国度,并提供一些通往这个国家的路径。至于其他C++国家的事情,我只是简单概括一下。
《C++ primer plus》/ 《C++ primer》
这两本书基本内容是一样的,只是有一本是面向初学者,另一本是面向中高级开发人员,即讲的深度略有差别。其实具体选哪一本并不重要。因为作为初学者,两本书中的大部分内容你都用不上,或者至少在读第三遍的时候,才能用上。
初学者应该了解,C++有哪些语言特性,有哪些概念,有哪些特有的工具。比如:C++基本类型,如何定义类,while/for/do…while/if…else/switch/const/指针/引用/左值/逻辑运算/加减法运算,文件操作和流概念等等。这些是开发中经常用的重要概念,因为凡是类C的开发语言,都需要这些。然后,你利用上面这些工具,组装成一台可以处理信息的机器——程序。
所以,初学者在看书的同时,需要不断写程序,熟悉概念,用法。让开发场景对应工具,对应开发套路。
上午朋友问了我一个Vim的问题,从这个问题中,我想之前硕士导师和领导的一直强调的概念:
先能用,再好用
翻译过来就是,先让基本程序的基本功能都跑起来,然后再进行优化,重构。那么学编程我觉着也应该是这个思路:
1 用IDE迅速让程序跑起来,产生成就感,增强信心。
2 梳理程序中的各个部分,进行改进。
3 梳理编译流程、执行流程,更加深入了解整个开发涉及的知识。
这样,学习就变成了一个迭代前进的过程。正反馈也能更好地促进学习,让自己不断进步。
当我们大概知道怎么用C++程序以后,就可以继续前进,看算法相关的书。平时开发,看起来用不上什么算法,其实你时时刻刻都在用算法的思路,分析问题,解决问题。所以我推荐下面这本书:
《算法》Robert Sedgewick著
这本书非常厚,内容也比较少,还特别贵,但是它像讲故事一样,把一些经典算法和数据结构娓娓道来。鉴于这本书性价比较低,我再推荐一本书:
《数据结构》 严蔚敏著
在熟悉书中算法的同时,一定要动手写写代码,实现书里面介绍的算法。一面肯定有一道算法题。
现在我们掌握了基本的算法理论,我们还要进一步对这些知识应用,解决问题。所以我们就需要刷一刷算法题。现在网上有很多在线提交网站,像杭电ACM,leetcode, 牛客网等等。
边看算法边刷题,边刷题边学习新的算法知识。
这时,简单的数据结构,已经无法满足我们对复杂问题的求解,所以我们就可以利用现有封装好的库,使用别人已经实现的基础算法,作为基础工具,实现更高级的算法。推荐学习STL和Boost库。
上面我们已经熟悉了C++的基础知识。那么进一步,我们就要向外扩展,探索更广阔的领域。这时候,我们就要思考,C++能干啥。
C++保证了执行效率、开发效率、开发自由度三者的和谐与统一,所以C++通常应用于性能要求较高的场景,比如图形渲染、底层交互等。
比如,希望进行客户端开发,那可以了解Qt,MFC开发框架。希望进行网络开发,就可以看看Ngix库的实现。希望进行图像处理,可以看看VTK,OpenGL这些。
由于我目前实在做Qt开发,所以推荐下面两本书。当然,其他书也不错,看一本就行,入门以后,直接看文档会更好。
《C++ GUI Qt 4编程(第二版)》 闫锋欣
和霍亚飞的Qt开发。
因为C++不像Java,有一个强大的生态系统,想用什么工具,都有现成的包提供。很多时候,我们需要了解一些计算机专业相关的知识,比如操作系统、计算机组成原理、计算机网络这些。所以,我推荐下面两本书。这两本书描述了C++的外部环境,而这个环境,与我们平时开发息息相关。
《操作系统》 汤小丹
《计算机组成原理》 唐朔飞
同时,如果使用的是Linux开发环境,为了快速入门,我推荐下面这本书。这本书也是又厚、又贵,知识量也比较大。所以,一方面,这本书要多读几遍,还要将不同知识点进行分类,把Linux中的各个组件,和汤小丹的书对应上,达到融汇贯通的效果。这本书比较好的一点,是全书给出比较单一的实现,不会像APUE,把各种实现和不确定都说出来。有时候不知道比知道可能更好。不知道,心绪不会被打乱,知道了,很可能会浪费大量时间,抓不住重点。
《Linux程序设计》 Neil Matthew著
我说下具体的读书策略:
《C++ primer》 -> 《算法》(刷题)《程序员面试指南》 -> 《Qt开发》 -> 《Linux编程》,《操作系统》,《计算机网络》,《计算机组成原理》
上面这几本书虽然大致有先后顺序,但不是非要只有看完第一本,才看第二本。也不是非要看完书中前面的内容,才开始看后面的内容。我们要学会在掌握一些知识的情况下,不断勇敢取探索相关内容。一点一点将知识积累起来,然后再进行整合,形成自己的内在智慧。
另外需要注意,工程类的书籍,从来不是一蹴而就地看完一遍,就可以落灰,等着卖废品。而是需要不断翻阅,强化,精炼知识。