Linux下C++程序员学习资料指南

举报
飞翔的大象 发表于 2021/12/13 16:57:17 2021/12/13
【摘要】 本文循序渐进梳理了从小白进阶到C++专业程序员涉及的相关学习资料,以期帮助刚入门或者正在升级打怪的程序员能够少走弯路,多读经典,以更快更陡峭的曲线爬升到专业程序员级别。

开篇:

    选择在Linux下做开发,熟练掌握各种命令操作是必须的,然后就应该学会shell编程,通过组合各种命令完成更加复杂的一些工作,这期间相信你会深刻体会到Linux的乐趣。
    做开发首先要一套趁手的工具,编辑代码在Linux选择有Vi和Emacs,编译器有gcc和clang,构建工具目前CMake应用比较广泛,裸写makefile比较少见了,谷歌的Bazel和SCons应用也比较广,单元测试选择有Cppunit和gtest,内存检测有valgrind和gcc4.8以上版本带的地址消毒,调试一般首选gdb,现在代码管理都用git,这也是Linux之父的杰作(经常感慨牛人怎么就这么牛,像Richard Stallman、Linus Torvalds等都神一般的存在)。
    环境准备好了就可以开始探索C++了,C++语法庞杂,最好先来本薄一点的打点基础,再看大部头,否则挫折感会比较强,很难坚持。
    语法掌握的过程中也需要不断实践,验证是否真正理解了相关内容,有了这些基础就可以看些专家经验,有哪些最佳实践。
    语言的火候差不多了,可以开始写一些软件,这时候对算法和数据结构的补充是必不可少的,同一个问题选择不一样的算法和数据结构,性能和成本可能差别巨大。
    在Linux平台实战不可避免的会用到相关的系统调用,对Linux相关编程接口的学习也是必不可少。
随着不断的实战,肯定会碰到各种问题,通过学习测试相关理论,以及调试的相关技巧可以让自己的打怪之路顺畅一些。
出了问题去调试并搞定它终究是下策,更理想的情况是尽量不出问题,在对写代码已经有些心得以后,这时候就可以学习一些软件开发指导方面的知识,让自己少写bug,并且赏心悦目,同时前辈提炼出来的设计模式也是必修的一课。
    要让自己代码保持旺盛的生命力重构是必不可少的,同时在维护别人代码的时候,重构会变成你日常的冲动,掌握常见的重构手法事半功倍。
    随着在C++的道路上越走越远了,对软件方面的掌握臻于成熟,但软件终究是要靠硬件去执行,硬件怎么工作的?怎么压榨硬件的性能?这也是必修的一课。
最后你终于软硬兼施,两手都很硬,可以打败90%以上的程序员。

开发环境:

    本人学习shell编程看的是一本上古时期的书《Linux与Unix shell编程指南》,现在的话推荐《Linux命令行与shell脚本》,一本在手,shell你有。
    在阿里漫长的码农生涯里,在Linux下开发大家基本都是选择Vi或者emacs,本人是先用的Vi,后来因为身边同事的影响转入Emacs,倒不一定就是Emacs就比Vi强多少,好多同事用Vi也快的起飞,但个人用Emacs感觉非常不错,Emacs和Gcc、Gdb结合的太赞(三个工具都同一个作者Richard Stallman),能大幅提升开发效率,详情可以参考《学习GNU Emacs》。来华为后发现好多同学(貌似腾讯很多同学也是这样)都在Windows下用IDE编辑代码,然后同步到Linux编译,我个人倒不排斥,管他黑猫白猫,能抓到耗子的就是好猫。不过说实话如果Linus Torvalds知道的话,以他喷子的性格估计要发表一番“高论”。
编译器这块从一些已有开源项目大概看一下用法,等到有更高要求的时候参考用户手册就可以了。
    构建工具的书籍较少,CMake方向这里有一本陈晓伟个人翻译版的《CMake Cookbook》,感谢译者的无私奉献,关于Bazel和SCons可以在网上查找相关教程。
代码管理早期用过CVS,后来迁移到SVN,现在的话基本以Git为主,《精通Git》基本就可以了。

语法基础:

    C++语法这块在我看来最好的是Lippaman的《C++ Primer》(注意不是Primer plus),没有之一,C++之父的《C++程序设计语言》权威性毋庸置疑,但可读性远不如前者。注意千万不要被这个Primer骗了,如果你是个新手,又是个实在人,一上来就啃,学习C++还是会很痛苦的,最好之前看一本相对简单一点的书,比如《Essential C++》,国内的教材也行,先对C++有个大概认识,再来啃这个大部头。C++语法这块有一本Primer就够了,多看几遍,每一遍都会有不同的感觉。

语言进阶:

    要想了解C++的最佳实践,Scott Meyers的《Effective C++》《More Effective C++》《Effective Modern C++》《Effective Stl》系列是必读的。Lippaman的《深入探索C++对象模型》对C++早期的底层机制讲的比较透彻。《C++ Templates第2版》基本是介绍模板编程里最好的,但学习模板还是要有心理准备,模板简直是打开了另一扇门。《C++ Concurrency in Action》是讲解C++多线程编程的权威,中文版翻译的太差,本人已经开始在知乎上连载翻译。《C++标准库第2版》对标准库做了梳理,基本是案头必备,由于标准库实在过于庞大,一本书难以驾驭C++标准库的所有细节,因此还得配合cppreference网站。

算法与数据结构

    本人学习数据结构看的是《数据结构C++语言描述-应用标准模板库》,这本书感觉讲的不错,比较好懂,不过里面很多示例代码不是很高效,但这是小问题。现在很多人推荐《算法第4版》,虽然这本书前面在教你java,但语言影响不大,关键在于算法讲解透彻。《算法导论》以及高纳德的《计算机程序设计艺术》这个可以根据个人情况,我觉得不适合一般人。知乎的这个帖子的回答我感觉也挺不错《程序员必须掌握哪些算法》可以作为学习的一个补充。

Linux系统编程:

    《UNIX环境高级编程第3版》看着是UNIX,但完全适用Linux,经典的系统编程教材,就这一本就够了。另外作者的《UNIX网络编程》卷1和卷2也非常经典,做进程间通信和网络编程必看。

测试与调试:

     很多同学写代码都没有单元测试,对普通人来讲,这种模式写的产品肯定bug漫天飞,系统上线后天天加班到半夜填坑。单元测试测试好处在于帮你在一个很小的局部发现问题,问题在小范围内解决总比嵌在一个大系统中好解决,并且后续有人修改代码,单元测试可以避免被随意修改,逻辑不对测试是通不过的。单元测试没问题后,还要做集成测试,把各个单元拼在一起是否能正常工作,最后还要做系统级别测试,看系统是否符合相关的规格。有了这些措施做保障肯定比裸奔出来的代码更靠谱。
    《软件测试》讲的比较全面,但深度有限,可以作为入门,后续根据需要深入到各个点。前同事翻译的《Google软件测试之道》可以了解下顶级公司是怎么对待测试的。
     调试这块推荐一本绝版的《调试九法—软硬件错误的排查之道》,调试需要一套方法论,但更多的是要有技术底蕴做支撑,并且需要经验积累。Linux下调试法宝主要是Gdb和打日志,首选是Gdb,打印日志效率太低,而且经常容易忘记删掉调试的打印语句。Gdb不仅可以用来调试,笔者也经常用来跟踪看代码。相关的入门教程网上很多,必要的时候可以参考Gdb的用户手册,《软件调试的艺术》主要讲解的Gdb。Gdb功能非常强大,用好了对定位问题非常有帮助。

软件开发指导:

《代码大全第2版》经典中的经典,也是一部大部头,做软件开发必看。
《程序员修炼之道》也是本经典,雅俗共赏。
《代码整洁之道》据说能有醍醐灌顶的效果。
早年的一本《高质量程序设计指南》对笔者帮助也不小。

建模与设计模式:

    软件建模《大象:Thinking in UML第2版》,在互联网公司的经历对软件建模这块不像传统软件那么依赖,笔者也只是简单了解。
    设计模式最经典的是《设计模式—可复用面向对象软件的基础》,不可不看,但入门可以先选择《大话设计模式》,简单易懂。学习设计模式的一个注意点是千万不要学会了设计模式到处都用,做设计一定要把握分寸。

重构:

《重构—改善既有代码的设计》虽然作者用的是JavaScript做示例,但完全不影响对内容的理解,重构这本就够了。

计算机原理:

《深入理解计算机系统第3版》系统的对计算机系统做了解读,非常实用,强烈推荐尽早阅读。
《计算机体系结构:量化研究方法第6版》市面是第5版,中文版第6版马上要出来,计算机体系结构的经典书籍。
《程序员的自我修养》这本主要集中在编译和链接原理上,对C++程序员是本不可多得的好书。

后记:

    纸上得来终觉浅,看再多的书如果没有实践,很容易就忘记。在学习过程中一定注意实践,不懂的地方写成代码,敲进去看看是什么反应,尤其在不太懂一个算法的时候,可以尝试用gdb跟踪各个变量状态,来帮助理解算法。
    上面的介绍都属于程序员的基础能力,我们最终是要选定一个安身立命的方向,比如是搞搜索引擎?数据库?大数据?系统调度?算法?具体选择可以根据自己特点进行,这个选择最好在大学期间就做好,在学校有大把连续时间,可以尝试各种方向,最后挑一个自己喜欢的。相关方向上需要的知识技能在网上有很多介绍的,在github上也有很多开源代码,学习一定要挑经典。不管选择什么方向,最重要的是专注,持之以恒,总能成为该领域的专家。
最后祝看过本文的都能成功。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。