后端C++学习路线(转载总结)
后端 C++ ⾃学路线(转载总结)
序⾔
2020年6⽉某末流985本科毕业,现在⾛了学校项⽬去早稻⽥,准备从苦逼机电跳到后端开发了。⼤学四年没做好规划,深知其重要性。如今读研,希望能改邪归正,这篇博客也是作为学习的记录的初始与鞭策。
作为学习的开始,搜集资料制定路线,并且对所要学习的内容有个⼤致的了解值得花费⼏天的时间。这是在国外被称为Metalearing,意为元学习(学习如何学习)的⼀部分(from Utralearing-Scott Young,闲着没事可以看看,挺概括,没实际经验很难深⼊理解)。
同时如果有本科⼀年级同学能看到的话,我想说,放弃学校的课,⾃学⾃⼰制定的路线吧(数学除外,不过也建议看国外教材教程⾃学)。学校的课最后1-2个⽉突击即可,题⽬都很套路,问题不⼤,千万不要被本科课程牵着⿐⼦⾛。然后⼤⼆实习,就直接起飞了。。。
摘要
“⼯欲善其事,必先利其器”,本⽂主要介绍了C++技术栈后端开发的岗位,学习⽅法,主要学习内容,线路以及企业部署的技术点以从宏观层⾯对其进⾏掌握。
参考
岗位分析
了解⼀下岗位,知道以后能做什么,这个也有利于⾃⼰树⽴学习⽬标。
C语⾔和C++属于“造轮⼦”语⾔,⼏乎什么都能做。不过⼀般来说,C语⾔和C++主要还是做后台(服务端)开发⽐较多,包括:
通信公司后台开发
互联⽹公司后台开发
游戏公司后台开发
……
当然这个后台开发具体职责⼜有很多细分,⽐如:
有做数据处理和分析的
有做基础协议和通信的
有做服务端底层应⽤优化的
甚⾄还有做后台系统驱动和内核的
……
后端技术栈
写得⾮常好,必看
学习建议
如果当初还是⼩⽩的时候,就能确定⼀个⽐较合理的学习路线,对知识由浅⼊深的进⾏学习,学习的过程肯定会顺利⼀些,效率⾃然也会更⾼。
⾄于后端学习我们可以从如下下考虑:
编程基础:
C++基础
数据结构与算法
操作系统宁波学编程推荐老师
计算机⽹络
数据库
设计模式
对于技术岗,软件基础知识可以说是个⼈的硬实⼒,是你能通过⾯试的⼀个⼤前提。即使后⾯的东西都没学,基础部分是肯定需要完成的,这也是后⾯所有应⽤框架学习的基⽯;反之,在应⽤框架的学习时如果感觉吃⼒,可能⾮常有必要回过头来再巩固对应的基础知识。然⽽基础的确不是⼀蹴⽽就的,确实需要⼀定的反复和回炉。⾯试也主要是这些基础,公司校招⼀般看基础咋样,可塑性如何,这才是重点。之后才是项⽬和⼀些花⾥胡哨的。
有些很有意思的⽅向,可以作为进阶学习,对于⼤部分岗位的⾯试⽽⾔,只是加分项,⽽⾮必选项:
分布式系统(感兴趣可以学习,分布式存储、计算等,加分项)
编译原理(很⼤的魅⼒,感兴趣可以学,耗时间,加分项)
Functional Programming(同上)
云原⽣、容器、服务编排等(Docker、Kubernetes什么的,加分项)
我们需要有牢固的基础理论知识,⼀定的代码量积累、实践。主要的学习⽅式有:
看书(买书不要吝啬)
名校课程(MIT、CMU有很多不错的courses)
刷题(LeetCode)
做笔记,写博客(不仅有助于记忆,还能体现你的技术态度)
开源项⽬,阅读源码,⾃⼰实现(熟练运⽤google、github)
知乎等平台(参与讨论,会发现很多⾃⼰没有思考到的东西)
⾸先,对于软件基础知识的学习,建议看经典的英⽂书籍(上进的青年还是啃⽣⾁吧,毕竟原汁原味)
,看第⼀遍的时候可以不⽤太过细致,快速地看,重在了解这本书的知识框架,在把握了整体的逻辑框架之后,第⼆遍就可以详细学习各章节的细节,这个时候也能根据⾃⼰的情况,选择性地去看⼀些相对重要的章节,效率会更⾼。对于⼀些经典技术书籍,只看⼀两遍很难完全理解其中的精髓,之后可能还要多次地回顾,也可能在实际应⽤中再来回顾书中的理论知识,也能更深⼊地进⾏理解。例如深⼊理解计算机系统这本书,内容⾮常经典,很多地⽅当你再看⼀遍⼜会有不⼀样的理解和体会。总是学习是螺旋上升的复杂过程。
先学习语⾔和数据结构基础,然后并⾏学习⽹络、操作系统和刷题。
准备时间⽐较短的话,不⽤将每个知识板块的所有书籍看完,可以先看完基础书籍,例如C++看Primer,数据结构看⼤话数据结构,⽹络看谢希仁的计算机⽹络,操作系统看CSAPP,数据库对于C++岗考察不多,优先级放到最低,可以先暂时不看。看完基础书籍之后,会形成基本的知识,但是深度不够,这个时候再考虑在各个知识板块看⼀些进阶书籍,建议你⾄少有⼀⽅⾯学习深⼊(语⾔基础或者操作系统)
每看完每本书,都要学会去做笔记,写博客,对⾃⼰所学的知识进⾏总结消化,笔记中的内容才是⾃⼰的东西,⽽且在我们学习的过程中难免会对⼀些知识点的理解有所偏差和不⾜,笔记能够很好地帮助我们发现这些问题,然后加以纠正并很好地记录下来。
勤于做笔记、善于写博客,做好技术输出⾮常重要,这样后⾯复习、回顾、⾃查都有章可循了。
本⽂只是介绍了主要的学习道路,还有⼀些⽐较杂的东西(⽐如git怎么⽤),可以⾃⾏搜索,反正遇事不决就Google。
推荐⽤Linux或者MacOS来进⾏学习,或者Windows上装WSL(WSL+VS Code 直接起飞)也可以。但是,经济允许的条件下,最推荐MacBook Pro,因为写代码屏幕看起来最舒服,⽽且像艺术品⼀样,看见就爱不释⼿,学习了起来(仅为原作者观点)。
factory下载地址⼯具⽅⾯,⽐如编辑器推荐VS Code(加上插件也算是IDE了),IDE推荐JetBrain全家桶(学⽣可以买免费申请License)。笔记⽅⾯CSDN, Typora(markdown 编辑器 .md后置的那种⽂件)写在博客⾥⾯,主要记录:备忘录,笔记,基础理解,踩坑记录。
教程资源可以去看电⼦版。啥都能在这⾥弄到电⼦版 & F R E E!(需要科学上⽹):
学习路线
软件基础
这⾥的学习不完全顺序进⾏,有时同时进⾏。同⼀段时间交叉学习不同内容会极⼤增强效率。
1. C++基础结束程序进程快捷键
C++ Primer 第5版
Effective C++ ,Effective Modern C++(EMC没时间不看)
STL源码剖析(侯捷 著)
STL 源码剖析 Inside the C++ Object Model (侯捷 译)
软件学习中,语⾔肯定是最基础的。学习C++前最好先学C语⾔,他是C++的⼀个⼦集。推荐:C Primer Plus。这个先导课程学完后可以学习它的进阶课程:数据结构与算法分析(C语⾔描述) 没时间也可以⼤话数据结构。在学习数据结构与算法的同时,建议同步学习C++语法知识
由于C++较低层,语法⾮常灵活(⽐较适合写算法),就导致语法规则⽐较繁杂,⽽且涵盖了C语⾔的内容,学习C++语法相对python、java等其他⾼级语⾔时间成本更⾼⼀些。但是利⽤学⽣的空余时间学习⾼难度有利于以后迅速学习其他语⾔!
C++ Primer 第5版,C++语法学习的最权威书籍,以C++11来讲解,⾮常全⾯地讲解了C++的语法以及C++11的各种新特性,看完帮助很⼤,如果有时间建议⾄少看两遍,时间有限的话,建议⾄少通读⼀遍,把握这本书的⼤体框架,然后结合个⼈情况选择性地去看⼀些重点章节。
(另外,学习⼀下脚本语⾔也有⼀些⽤处,推荐Python,书籍《Python基础教程》,了解下基本语法就好。学习Python之后,可以尝试去做⼀些⽐较有意思的项⽬,例如写个爬⾍,这样可以培养⾃⼰的编程兴趣,也挺有成就感,写爬⾍可以在⽹上搜⼀些教程,在学习的过程中,也可以对html、http协议等有⼀些了解。另外还有)(时间不够的话就算了)
Effective C++ 这本书主要讲解了编写C++程序的过程中需要注意的⼀些条款,有助于梳理在编写C++程序时的⼀些常见错误和注意事项,培养好的C++编程习惯, 也是⾯试常考的。如果认真读过了C++ Primer,这本书看起来会⾮常快,其中的很多内容都包含在C++ Primer中了。Effective Modern C++并不是要替代Effective C++。在EC++中还有⼀些在EMC++中完全没有涉及的信息。EMC++主要⽤于覆盖c++ 11和c++ 14中的新特性。在编写它时,作者认为你应该已经很好地掌握了EC++中涵盖的所有c++ 98内容。当然,如果你正在使⽤c++ 11或c++ 14, EC++中的⼀些内容可能有点过时,不再直接应⽤,但这并不意味着这本书过时了。
STL 源码剖析这本书讲解了C++底层实现,内容包括C++底层内存管理、各种容器的数据结构实现、常见算法的实现等,建议列为必读,可以帮助深⼊理解C++底层,同时也是对数据结构的复习和巩固。其中也有很多⾯试常考的知识点,如内存池的机制、traits技法、⼀些常⽤容器的底层数据结构等。读⼀读《STL源码剖析》和SGI STL源码来看看STL是如何实现的(例如ST-L的内存分配器、很常⽤的vector容器),不过前提是对模板有⼀点认知,推荐看《C++ template》的部分内容,C++的模板
是⼀个深坑,了解到偏特化的程度就⾏了。)。写代码的时候,就常备吧。
深度探索C++对象模型这本书讲解了C++⾯向对象特性的底层实现机制,由于是翻译版本,读起来内容会相对晦涩⼀些,但是内容⾮常重要,尤其是虚函数底层的实现机制,建议多看⼏遍加深理解,这个基本是C++必问的知识点。看完这本书,对C++⾯向对象的理解帮助极⼤,建议必读。
总之,如果你认真的学习了以上4本书,你会对C++有⼀个新的认识!相信我,等你学好C++,再学习其他⾼级语⾔会觉得轻松许多!2.数据结构与算法
数据结构
⼤话数据结构
null医学上是什么病浙⼤数据结构⽹上课程:
数据结构可以说是软件设计的精髓,建议将基础打扎实。⼤话数据结构这本书对于新⼿,很适合作为⼊门,⽤于建⽴数据结构的知识体系,另外浙⼤数据结构⽹上课程也⾮常不错,B站上直接可以搜到,讲解简明易懂,弥补了⼤话数据结构中⼀些讲解不清楚的地⽅。
算法
算法 第4版(是以java来讲解)
算法导论
在学习了数据结构的基础后,可以开始学习算法4这本书,可以帮助你梳理⼀些常⽤算法的原理和应⽤。后者因为有很多算法复杂度分析,会让⼈觉得读起来很困难。
建议:算法4需要通读,并且⽤C++来实现上⾯的算法(书上都是⽤Java实现的),然后算法导论看完前⾯17章即可(到贪⼼那章),算法复杂度分析的部分可以尝试去看看,如果实在讨厌公式推导也可以跳过,但是要能够掌握推导⼀些常见算法的复杂度。在学习数据结构与算法的同时,建议同步学习C++语法知识,两者基础都学习完之后,就可以刷题了。
刷题(⼀直持续到⼯作)
剑指offer 第2版(建议⾄少刷两遍)
程序员代码⾯试指南(左程云 著)
为了应付公司⾯试时的算法题,同时也是为了积累⾃⼰的代码量,就需要开始刷题,主要就是LeetCode。这个刷题要⼀直持续到⼯作,所以尽量安排好⾃⼰的刷题节奏。可以按照题⽬的tag来
刷,这样更容易增强⾃⼰的解题能⼒,最好写三百道以上吧。此外,LeetCode中有⼀个数据结构的探索专栏,根据难度,分为初级、中级和⾼级,基本覆盖了各个知识板块的⾯试⾼频题,可以帮助新⼿循序渐进地刷题,培养写代码的感觉。⾃⼰选择喜欢的⽅式吧。
刷题可以和前后⾯的学习同步进⾏。在刷题的过程中,可以同步学习STL 源码剖析,有助于你更游刃有余的去使⽤STL,提⾼代码效率。
另外的话,剑指offer这本书中也涵盖了很多⾯试⾼频题,可以到⽜客⽹的剑指offer专栏中刷题,由于题⽬难度划分层次不太明确,新⼿刷起来效率会偏低,建议在刷完LeetCode探索专栏中的初级、中级之后,再去刷剑指offer的题⽬,其中的题⽬在⾯试中出现的⾮常⾼频,建议最好刷两遍,熟练掌握每道题的思路和优化⽅法。最后,作为进阶,可以看左神写的程序员代码⾯试指南,⾮常好的⼀本书,其中讲解的编程题都⾮常经典,不仅仅限于国内的IT公司,⽽是⾯向全球,包含了国外知名IT公司的⼀些⾯试⾼频题,可以帮助开阔视野。
在刷题的过程中,要⾮常注意⽅法,⼀般将刷题⽅法分为龟系和兔系。
龟系刷法的精髓就是每个题⽬要注意质量,不要满⾜于⼀种解法,各种解法都尝试写⼀写,并对⽐它们的时间空间复杂度。但龟系不是说在⼀道题上耗死。越是龟系越要注意时间上要掌握好分⼨,能解出来最好,解不出来也不要倔强。我觉得⽐较好的⼀个平衡点差不多是⼀个⼩时。如果⼀个⼩时还是
linux操作系统书籍解决不了,可以看看提⽰,如果还是解决不了,可以看看讨论区的答案或者⽹上搜索答案。
兔系刷法精髓就是要暴⼒,天马流星拳,⼤⼒出奇迹。作为兔系选⼿,讲求的就是要疯,⼀上来就看答案,照着答案写。这个做法看起来不靠谱,其实它有内在的合理性:⼤部分算法都不是我们发明的,如动态规划,⼆叉树,线段树,并查集,贪⼼算法等等,到后来所谓的不看答案⾃⼰做出来,其实都是在⽤固定套路。另外编程题的知识点很多很杂,LeetCode中将题⽬分为各种标签,建议对标签按照⼴度优先的顺序去刷题,刷题尽量覆盖每个标签。我个⼈更倾向于龟系,这种⽅法能够更好地理解每道题的⽅法套路,也能训练⾃⼰的思维,毕竟刷题不是题海战术,刷题质量更重要,每刷完⼀道题,最好将其中的思路⽅法记录下来,然后定期做总结,对⼀些常⽤⽅法进⾏总结分类,慢慢的会发现刷来刷去就是那些套路,你会对它们了然如胸。
此时具备了编码的基本能⼒,可以尝试去做⼀些项⽬,例如JSON库、正则引擎,这些都可以在⽹上到教程。
3. 操作系统
操作系统&编译原理
深⼊理解计算机系统 第3版(CSAPP)
操作系统 精髓与设计原理 第8版
程序员的⾃我修养
Linux
鸟哥的Linux私房菜 第4版(⽤于了解Linux基本命令)
UNIX环境⾼级编程 第3版(APUE)
Linux/UNIX系统编程⼿册(上下册)
内核
Linux内核设计与实现(LKD)
深⼊理解Linux内核
在语⾔基础和数据结构之外,操作系统可以说是⾯试考查最多的内容了,在⾯试中很可能会问的⽐较深,毕竟操作系统是很深奥的!
学习操作系统知识,可以先看深⼊理解计算机系统,操作系统⽅⾯的神书,内容⾮常经典,⽽且⽐较通俗易懂,适合⼊门。初学者会有很多概念都难以理解,建议是尝试检索相关内容去理解,实在学不会就先跳过,继续后⾯的内容。读书过程中,也不需要⼀定按照其安排的章节顺序,可以先挑⾃⼰喜欢的读,例如为了理解计算机中的cache,就去读第六章。这本书是的配套书籍,该课程相关的资源也可以⽤来辅助学习,另外,最精髓的就在于配套的Lab了,难度不低,这个⼀定要做,如果做的很困难,也要坚持去做,完成后会发现⾃⼰的能⼒有很⼤的提升。这本书也不⽤⼀⼝⽓读完,有些章节不太感兴趣,或者读不下去的话,可以留着,等后⾯知识更加丰富了再回头来看(例如⽹络那章,我看的是很难理解⼀些概念,后来学习了计算机⽹络和⽹络编程后,就发现读起来⽐较简单了)。建议先学习第⼆部分和第三部分,再根据个⼈情况学习第⼀部分。然后再学习操作系统 精髓与设计原理,(或推荐OSTEP(⽹上有免费pdf),中⽂版是《操作系统导论》,建议通读。额,我暂时选第⼀个)这本书通俗易懂,可以结合CSAPP⼀起看,两本书的知识点相互有所弥补。
看完前⾯两本书,如果想对编译链接的原理进⾏深⼊学习,可以参考程序员的⾃我修养,这本书⾮常详细的讲解了程序编译过程中的具体细节。
另外,针对Linux进⾏学习,可以先看鸟哥的Linux私房菜,快速看,主要是了解Linux基本命令。进⼀步学习系统编程,可以学习APUE,其中讲解了Linux/UNIX常⽤系统编程接⼝的使⽤⽅法和对应的应⽤实例,由于这本书有些理论知识讲解地⽐较简略,⽽Linux/UNIX系统编程⼿册讲解更为详细,建议
两本书结合着看。
在学习完前⾯所说的操作系统书籍之后,如果还想对Linux内核原理进⾏学习,可以看Linux内核设计与实现和深⼊理解Linux内核,由于后者更加偏重理论细节的讲解,看起来⽐较晦涩难懂,容易陷⼊细节。⽽ LKD这本书以实践为主,没有赘述很多细节,主要是结合各个模块,以宏观的视⾓来讲解,能帮助你快速建⽴⽐较完整的的知识框架。建议先学习后者,再学习前者,这样可以更好地去理解各个知识板块的逻辑关系和细节实现。
如果有同学对操作系统底层知识感兴趣,可以看博客,总结的⾮常不错,看完会⾮常有帮助!
4. 计算机⽹络
计算机⽹络 第7版(谢希仁 著) / 计算机⽹络:⾃顶向下 Computer Networking:A Top-Down Approach,Sixth Edition TCP/IP详解 原书第2版(卷1)
UNIX⽹络编程 第3版(卷1)
学习⽹络,可以先看计算机⽹络这本书,讲解通俗易懂,前⾯的物理层和链路层可以快速看,了解基本原理即可,重点学习⽹络层、传输层和应⽤层,其中传输层的TCP和UDP是⾯试最常考的,⾮常重要。⽹络的知识⽐较容易理解,但是知识点⽐较繁杂,⼀段时间不看就很容易忘记,建议学习之后将
各个知识点整理成⽂档或者笔记,有助于⼯作前复习。或者英⽂版计算机⽹络:⾃顶向下 Computer Networking:A Top-Down Approach,Sixth Edition,可以只看前⾯三章,即应⽤层和传输层,做下每章后⾯的lab。
学完计算机⽹络,可以基本建⽴计算机⽹络的知识体系,但是这本书深度不够,建议继续学习TCP/IP详解 卷1,作为对TCP/IP协议的深⼊,这本书讲解⾮常细致,看的过程中很容易陷⼊细节,对整本书系统学习的话⽐较花时间,如果时间有限的话,可以先选择性地学习⼀些章节,建议先将传输层的内容看完,有助于对TCP和UDP的深⼊理解,其他层的内容可以根据个⼈情况选择性的学习。也是为了节省时间,可以只看TCP相关的章节。这本书英⽂版是第⼀版,中⽂版是第⼆版学习的时候,建议⽤wireshark来抓包,感受⼀下这些协议是怎么⼯作在这互联世界的⽹络中的,会很有趣的。
学习完前⾯两本书的基础知识,就基本掌握了计算机⽹络的理论知识,建议将这两本书列为必读。另外,如果想要对⽹络编程进⾏实践,可以继续学习UNIX⽹络编程 卷1。
5.系统编程和⽹络编程
前⾯学习了操作系统和⽹络是怎么⼯作的,然后就需要学习怎么通过编程来调⽤操作系统的接⼝,来进⾏系统编程和⽹络编程。这⽅⾯⽐较经典的是Unix环境⾼级编程和Unix⽹络编程,这两本书都⽐较古⽼,⽐如现在⽹络模型中常⽤的epoll就没有介绍,因为成书早,那个时候Linux内核还没有实现epoll,
可惜书的作者早逝,不能更新了。但是也很经典,需要搭配Linux/Unix编程⼿册。当然,这⽅⾯的书籍也不是要通读,只需要精读部分章节就好了。
eclipse快捷键返回值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论