我上大学学的第一门编程语言便是C++,靠着那本饱受诟病的谭浩强版的教材度过了大一上学期。学的内容现在看来相当之浅,如果没记错的话只学了个基本的语法,考试的时候考一些冒泡,快排之类的东西就结束了。感觉那些有计算机教育背景的学生学过的第一门语言大多数应该也都是C/C++。因为C++真的太适合入门了,这句话我相信当你学完C++第一次去碰其他编程语言的时候最能体会其中含义。
之后两年靠着数据结构,离散数学的一些小作业也算是一直练习着C++,但是这种练习真的只是练习,单纯拿起工具办事的那种,没有任何技术上的提高。后来又学习了Java和python,C++就渐渐被放在了一边,毕竟,工具也分好用和不好用。
工作之后,其实算是有点被迫,又开始捡起放在角落里的C++。靠着《C++ primer Plus》的前六章复习了一遍基本语法之后,发现还是看不懂项目代码。那段时间真的很焦虑。看到不懂的就查,看到不懂的就问,发现几乎还是无济于事。学校里学的那点东西实在是难以解决工作上遇到的困难。后来靠着师傅的帮助,硬着头皮顶上去才勉勉强强完成第一个开发任务。但是说实话,即便是当时完成了任务,很多东西很多语法我其实还是不懂。
项目完成之后有一小段空档期,我便到github上去找C++相关的资料(对,github有时候不仅仅是代码仓库),然后查到了侯捷老师的C++面向对象系列的视频,只能说这个课程真的非常适合当时的我:了解一些基本语法,但是不知道项目代码怎么写。看完之后收货颇多,可以说几乎解决了我百分之八十的问题,以至于我对侯捷老师的印象一直非常好。
再后来就继续啃那本《C++ Primer Plus》。也尝试过通过B站看视频学习,但是总是看完一个系列课程的前一两个课程就不想看了,因为觉得太啰嗦,属实浪费时间。B站这方面的视频有很多,但是几乎一大半都是面向新手的,所谓的零基础入门,我几乎再也没遇见过像侯捷那种质量的课程。这让我后来再去学习一些东西的时候开始偏向通过文字去学习,而不是视频。文字的话你可以迅速筛选你需要的内容,但是视频就不行,时间成本太高,没那个精力去快进着看。
这里推荐一些我个人觉得如果你想要学习C++,比较有价值阅读的一些书:
- 《C++ Primer Plus》: 这本可以说是最适合入门的一本书了,其含金量不必多说,系统,全面。如果是刚入门的话,不建议死扣,感觉别扭的地方先跳过去就行。我在第二次读的时候发现这本书里有多处错误,且这些错误多是由于翻译造成的,也有的是原书明明没有这些内容,译者夹带私货,结果搞出来个四不像,弄得读者一头雾水。
都是第六版,原版书籍明明没有右边红色选框中的内容,中文版却硬生生多了这么一段明显错误的内容。
2.《C++ Primer》: 这里有个误区,别看这两本书的名字这么像,实际上二者几乎没有任何联系,且它们的定位都是基础入门类的书,与上面那本书不同的是,这本书的阅读门槛明显高于Primer Plus,适合有一定基础的人阅读而非零基础上来就啃,不妨看完上面那本再来读这本。
3.《C++ 标准库》&& 《STL 源码剖析》: 其实读完前面三本,你对C++应该已经有一个比较全面的认识了,正如《Effective C++》的第一个条款所言,视C++为一个语言联邦,标准模板库应该是你想要深入学习C++的一段必经之路,前人的智慧不可小觑,有时候你想要实现的功能可能已经在标准库里实现了,而你需要做的仅仅是拿来就用,而非自己再动手写一个辅助你编程的工具库,不但浪费时间,而且效率大概率比不上标准库中的实现。
如果你想继续在基础部分深耕的话,还有很多比较系统的剖析C++某些领域的书,比如讲泛型编程的《C++ Template》,讲内存模型的《深度探索C++对象模型》,讲并发编程的《C++并发编程实践》,还有一本很有意思的关于模板元编程的书,书名我忘了,(不过应该容易找到,因为我记得当时专门找剖析模板元编程的书时,只找到了那一本),这些书都是比较系统全面介绍某个C++编程领域的专业书籍,有余力的话可以深入了解。
读完上面那些,基础语法部分应该已经非常扎实了,剩下的就是走出新手村,探索世界了。
- 《Effective C++》: 经典书籍,可读性高,真真切切能够帮助你提升编码水平的书。
《More Effective C++》:这本书我个人感觉质量没有上一本书那么高,很多条款写的有点啰嗦,但是瑕不掩瑜,仍旧值得一看。
- 《Effective Modern C++》: 跟前面两本一样,同一个系列的书,很不错。
6.《现代C++语言核心特性解析》&&《C++ Core Guidelines 解析》: 书名很像,区别是前面那本是国人写的(写的还不错,很详细,读起来也不费力),后面那本则是一本非常优秀的现代C++教程。
C++11这个版本相较于C++98可以说是巨变,也可以说是现代C++的里程碑。之后出了更为成熟的C++14,再之后每三年出一个版本,时至今日,最新版的已是C++23,C++26的时间表也已经发布。版本出了这么多,一方面说明其背后的开发者数量不容小觑,一方面也展现出了C++旺盛的生命力,作为一名专业的C++程序员,你也可以时刻关注C++的最新动态。
以上便是我个人学习C++的路线。其实本来我对C++是没有任何喜欢可言的,作为一门编程语言,它对使用者的个人素养要求颇高,大把大把的时间精力砸进去可能也溅不起一点浪花,但是不知从什么时候开始,突然觉得没那么难了。不过难是不难了,坑还是有很多没有填,技术债还是欠下不少。
如果你是刚入门的一名程序员,刚开始的时候一定纠结过怎么去点你的技能树,究竟是深度优先还是广度优先?因为点开这个技能,很有可能需要花费掉你不少的“天赋点”,甚至你用这些“天赋点”再去点开几个新技能都绰绰有余,所以,学习C++,三思而后行。
任何一门编程语言说白了都只是一种工具,是我们与计算机交流的一种方式,而并不是编程本身。不要过高的注重编程语言本身。如果非要选择一个的话,我觉得职业生涯前期,广度优先收益更大。
编程是一门技艺。简单地说,就是让计算机做你想让它做的事情。作为一名程序员,你既在倾听,又在献策;既是传译,又行独裁;
编程是一项艰难的工作。想帮你的人可不少——工具供应商在吹嘘他们家产品所创造出的奇迹,方法论大师承诺他们的技术可以为结果做出保证,每个人都声称他们用的编程语言是最好的,每个操作系统都自诩包治百病。当然,没有最好的解决方案,无论是工具、语言还是操作系统;只在特定的环境下才有所谓更合适的系统。
调整方法去适应当前的情况和环境。对所有影响项目因素的相对重要性做出判断,并通过经验找到适当的解决方案。随着工作的进展,你要不断地这样做。
你不应该拘泥于任何特定的技术,而应该拥有足够广泛的背景和经验基础,以便在特定的情况下选择合适的解决方案。你的背景来自对计算机科学基本原理的理解,而你的经验来自广泛的实际项目。理论结合实践会让你变得强大。