C++ 后台开发学习路线(已多人拿下腾讯后台开发)
个人介绍
首先介绍下自己吧,本人系统架构师,曾供职著名创业公司系统架构师,微软亚洲研究院、创维集团。著有多个软件专利,参与多个开源软件维护。ntytcp,ntyco 的 founder,github follow 人数 1.4k。
学习建议
对于技术岗位来说,软件基础知识可以说是个人的硬实力,是你通过面试的一大前提。说到基础软件的学习,对于很多没有基础知识的同学来说,可能有点力不从心。这么多软件基础知识,这么多技术书籍,应该从哪里入手呢?别慌,我当初也有和你一样的困惑。之后我一步一步挖坑,构建了一个比较完整的知识体系。回头想想自己,如果我是个小白,早就能确定一个合理的学习路线,由浅入深的学习知识。学习过程肯定会更顺畅,效率自然会更高。所以我会根据自己的学习经验,结合《软件基础》几大板块的知识,制定出一条适合自己的学习路线,希望正在学习的同学们少走弯路!
首先,对于软件基础知识的学习,建议尽量多看一些经典书籍。第一遍读的时候,没必要看得太仔细太快。理解这本书的知识框架很重要。在掌握了整体的逻辑框架后,第二遍就可以详细学习每一章的细节了。这时候你也可以根据自己的情况有选择的看一些相对重要的章节,这样效率会更高。对于一些经典的技术书籍,只看一两遍,很难完全理解其中的精髓。之后可能需要多次复习,也可能需要在实际应用中复习书本上的理论知识,以便更深入的理解。比如《深入理解计算机系统》就是一本经典的书,很多地方再读一遍就会有不同的理解和体会。
每读完一本书,都要学会做笔记,对所学内容进行总结消化。笔记里的内容都是我们自己的,在学习的过程中,难免会对一些知识点的理解有一些偏差和不足。笔记可以帮助我们很好的发现这些问题,然后改正,做好记录。
软件基础主要分为这几大板块:C++基础、数据结构与算法、操作系统、计算机网络、数据库、设计模式和一些常用工具。
C++基础:
C++ Primer 第 5 版
STL 源码剖析(侯捷 著)
深度探索 C++对象模型(侯捷 译)
Effective C++(侯捷 译)
软件学习中,语言肯定是最基础的,由于 C++较低层,语法非常灵活(比较适合写算法),就导致语法规则比较繁杂,而且涵盖了 C 语言的内容,学习 C++语法相对 python、java 等其他高级语言时间成本更高一些。
学习 C++语法,第一版 C++入门,最权威的 C++语法学习书籍。它非常全面地解释了 C++语法和 C++11 的各种新特性。看完之后,很有帮助。如果有时间,建议至少看两遍。如果时间有限,建议至少通读一遍,把握这本书的大致框架,然后根据个人情况有选择地阅读。
STL 源码分析这本书讲解了 C++底层的实现,包括 C++底层内存的管理,各种容器的数据结构的实现,常用算法的实现等。建议把它列为必读,可以帮助我们深入理解 C++底层,也可以复习巩固数据结构。面试中也有很多经常考的知识点,比如内存池的机制,traits 技巧,一些常用容器的底层数据结构。
探索 C++的深层对象模型这本书解释了 C++面向对象特性的底层实现机制。由于是翻译版,读起来会相对晦涩,但内容很重要,尤其是虚函数的底层实现机制。建议多看几遍,加深理解。这基本上是 C++的必修知识点。看完这本书,对 C++面向对象的理解有很大的帮助。建议你一定要看。
《有效 C++》这本书主要讲解了一些 C++程序编写过程中需要注意的子句,帮助整理了一些 C++程序编写中常见的错误和注意事项,也是面试中经常考到的。如果你认真看过《C++初级读本》,这本书看起来会很快,它的很多内容都包含在《C++初级读本》里。
总之,C++由于它自身的特点,学习起来不会很轻松,需要一定的时间成本,但是如果你认真的学习了以上 4 本书,你会对 C++有一个新的认识!相信我,等你学好 C++,再学习其他高级语言会觉得轻松许多!
数据结构与算法:
数据结构
大话数据结构
浙大数据结构
算法
算法 第 4 版
刷题
LeetCode 中文网站
剑指 offer 第 2 版(建议至少刷两遍)
程序员代码面试指南(左程云 著)
数据结构可以说是软件设计的精髓。建议夯实基础。《大词数据结构》这本书非常适合初学者建立数据结构的知识体系。另外浙大的数据结构在线课程也很不错,在哔哩哔哩上可以直接找到。解释简洁易懂,弥补了大词数据结构中一些解释不清的地方。学完数据结构基础,就可以开始学习算法了。建议学习算法。这本书可以帮助你梳理一些常用算法的原理和应用。
在学习数据结构和算法的同时,建议同步学习 C++语法知识。学完这两个基础,就可以刷题了。在刷题的过程中,可以同步学习 STL 源代码分析,有助于更轻松地使用 STL,提高代码效率。如果想刷题,建议先刷 LeetCode。如果英语不好,可以去 LeetCode 中文网。LeetCode 里有一个数据结构的探索栏目。按照难度分为初级、中级、高级面试题,基本涵盖了所有知识板块的高频题。可以帮助新手一步步刷题,培养写代码的感觉。此外,《剑指 offer》这本书还涵盖了很多高频面试问题。你可以在 Niuke.com 的剑指报价栏刷一下。因为题的难度级别不明确,新手刷题效率会低。建议在 LeetCode 探索专栏做完初级和中级后再刷剑指 offer 题。其中,问题在面试中出现的频率非常高。建议刷两遍,掌握每道题的思路和优化方法。最后,作为进阶者,可以看看左申写的《程序员代码面试指南》,非常好的一本书。里面讲解的编程题非常经典,不仅局限于国内 it 公司,还面向全球。里面收录了一些国外知名 It 公司的高频面试问题,有助于开拓视野。
在刷题的过程中,要非常注重方法。一般刷题可以分为龟兔赛跑。龟刷法的本质是注重每道题目的质量,不满足于一个解,而是尝试写出各种解,比较它们的时空复杂度。但是海龟制度并不意味着死在一个问题上。越是绑乌龟,越要注意时机。最好能解决,不能就不要固执。我觉得一个比较好的平衡点是一个小时左右。如果一个小时还是解决不了,可以看看小技巧。如果还是解决不了,可以看看讨论区的答案或者网上搜索答案。兔子刷法的精髓就是要暴力,要有力有力,要创造奇迹。作为一个兔子玩家,你要的是疯狂。上来就看答案,照着写。这种做法看似不靠谱,其实有内在的合理性:大部分算法都不是我们发明的,比如动态规划、二叉树、线段树、并集、贪婪算法等。后来所谓的不看答案自制算法,其实就是在用固定套路。另外,编程题的知识点非常复杂。LeetCode 把问题分成各种标签。建议先按幅面顺序刷标签,每个标签尽量盖住。我个人比较喜欢海龟系统。这种方法可以更好的理解每道题的方法和套路,也可以训练自己的思维。毕竟刷题不是题海战术,刷题质量更重要。刷完一个题,最好把思路和方法记录下来,然后定期做一个总结,把一些常用的方法总结归类。慢慢的,你会发现,刷牙也不过是那些套路,你会很懂的。
操作系统:
操作通用知识
深入理解计算机系统 第 3 版(CSAPP)
操作系统 精髓与设计原理 第 8 版
程序员的自我修养
Linux
鸟哥的 Linux 私房菜 第 4 版(用于了解 Linux 基本命令)
UNIX 环境高级编程 第 3 版(APUE)
Linux/UNIX 系统编程手册(上下册)
内核
Linux 内核设计与实现(LKD)
深入理解 Linux 内核
在语言基础和数据结构之外,操作系统可以说是面试考查最多的内容了,在面试中很可能会问的比较深,毕竟操作系统是很深奥的!
学习操作系统的知识,可以先看一下关于深入了解计算机系统和操作系统的神书。内容非常经典,通俗易懂,适合入门。对于软件,建议先学习第二、三部分,再根据个人情况学习第一部分。然后学习操作系统的本质和设计原理。这本书比现代操作系统更容易理解,可以和 CSAPP 一起看。两本书的知识点相辅相成。看了前面两本书,如果想深入研究编译链接的原理,可以参考《程序员修养》。这本书非常详细地解释了程序编译过程的具体细节。
另外,针对 Linux 进行学习,可以先看鸟哥的 Linux 私房菜,快速看,主要是了解 Linux 基本命令。进一步学习系统编程,可以学习 APUE,其中讲解了 Linux/UNIX 常用系统编程接口的使用方法和对应的应用实例,由于这本书有些理论知识讲解地比较简略,而 Linux/UNIX 系统编程手册讲解更为详细,建议两本书结合着看。
学习了上面提到的操作系统书籍,如果还想学习 Linux 内核的原理,可以看看 Linux 内核的设计与实现,深入了解 Linux 内核。因为后者更注重理论细节的解释,看起来晦涩难懂,容易陷入细节。《LKD》这本书侧重于实践,没有涉及太多细节。主要是将各个模块结合起来,从宏观的角度进行讲解,可以帮助你快速建立一个相对完整的知识框架。建议先学后者,再学前者,这样可以更好的理解每个知识板块的逻辑关系和细节实现。
计算机网络:
计算机网络 第 7 版(谢希仁 著)
TCP/IP 详解 原书第 2 版(卷 1)
UNIX 网络编程 第 3 版(卷 1)
学习网络,可以先看《计算机网络》这本书,讲解通俗易懂。你可以快速看完眼前的物理层和链路层,只需了解基本原理。重点学习网络层、传输层和应用层,其中传输层的 TCP 和 UDP 是面试中最常考的,非常重要。网络知识很容易理解,但是知识点比较复杂,一段时间不看很容易忘记。建议学习后将所有知识点整理成文档或笔记,有助于找工作前的复习。
学完计算机网络,就可以基本建立计算机网络的知识体系。但是,这本书不够深入。建议你继续学习 TCP/IP 详细卷 1。作为对 TCP/IP 协议的深入研究,这本书非常详细,阅读过程中很容易陷入细节。系统地学习整本书需要时间。如果时间有限,可以有选择地先学习一些章节。建议你先看传输层的内容,对理解 TCP 和 UDP 有帮助。
学习完前面两本书的基础知识,就基本掌握了计算机网络的理论知识,建议将这两本书列为必读。另外,如果想要对网络编程进行实践,可以继续学习 UNIX 网络编程 卷 1。
数据库:
数据库系统概念 第 6 版
mysql 必知必会
数据库的知识面试问的不多,但是数据库对于以后工作是肯定会用到的,如果有时间建议将基础打好,可以先看数据库系统概念,了解数据库的基础知识,然后阅读 mysql 必知必会这本书,可以帮助你快速学习 mysql 的基本语法。
设计模式:
大话设计模式
对于设计模式,如果没有大型软件的项目经验,这方面的能力很难体现出来,所以可以作为知识点的扩展学习,对其进行了解即可,面试常考的有单例模式、工厂模式等常见的设计模式。
以上知识的学习路线和相关 电子书籍 是我结合自己的学习经历总结的,不一定适合所有同学,但我相信大的方向还是具备通用性的,在学习过程中可以作为参考,也可以根据自己情况灵活调整自己的学习路线,找到自己认为最有效率的学习计划。附上我的学习路线总结图。另外小编还整理了一些 C/C++后台开发教学视频,相关面试题,需要的朋友可以点击:C/C++ Linux后台开发相关视频,文档代码资料包,学习路线思维导图免费领取
面试技巧
在具备了技术上硬实力的基础上,面试技巧也是非常重要的,它决定了你能否充分展现自己的实力。
从以下几点,来谈谈我对面试的看法:
简历:简历一般包括个人信息、项目经历、专业技能、个人荣誉四个方面,其中项目和技能是核心。对于一个项目,描述的逻辑一般是:简要介绍项目的需求和目标->你主要负责什么->分几点详细描述你的工作->最终的进展和相关的成果。你要对自己的工作非常清楚,同时要善于挖掘项目中的技术点。你要把每一个技术点都烂熟于心,要问自己为什么,为什么要用这个技术,这个技术的优缺点是什么,为什么适合现在的项目,用后得到。。。然后有条不紊的写在自己的作品里。对于专业技能,首先要真正了解自己的精通程度,准确描述自己的精通程度。一般这个词是理解->熟悉->掌握。如果只是学习基础理论知识,而没有深入,建议用理解;如果理论知识比较深入,并且你有相关实践经验,建议用熟悉度;但如果某项技能可以说是大牛甚至是专家级别,建议用熟练度。所以很多时候,建议用知识和熟悉程度来描述专业技能,熟练程度尽量不用。
面试前的准备:面试前首先要调整好自己的心态,有一个良好的心理素质,防止自己在面试过程中过于紧张,显得非常慌张。然后是自我介绍的准备,一般需要 3-5 分钟,简单介绍一下自己的信息,项目经历和一些获奖经历等。自我介绍时可以突出自己的一些亮点,可能会引起面试官的兴趣。可以提前把内容写在纸上,在家里或者宿舍对着镜子练习几次,直到可以清晰、流畅、自然的表达出来。然后就是面试问题的准备。在这方面,首先我对相关知识进行了系统的学习,并对知识点进行了总结或笔记,然后在网上收集了一些高频的面试问题来测试自己。之后可以在网上找一些面经,通过模拟面试的方式尝试回答面经中的问题。面试不多的同学都会有这种感觉。面试官问的这个问题你其实是知道的,但是突然问你,你可能就不能很有条理很有逻辑的回答了。这个模拟训练可以很好的提高你这方面的能力。面对每一个问题,尽量回答清楚,描述流畅,分析透彻。最好能横向和纵向做一些。
面试官:首先在衣着方面,面熟的同学应该穿着干净得体,不必特意穿正装。如果你穿正装去面试,你很可能会发现只有你一个人穿。。。如果是现场面试,最好自己打印几份简历。面试的时候,一定要保持自信的状态,面带微笑,说话礼貌谦虚,给面试官第一印象。在面试中,你通常先介绍自己。在这个过程中,面试官了解你的基本信息,然后开始提问。如果你对你的项目感兴趣,你通常会问更多关于项目的问题。你可能会针对项目中的每一个技术点提出非常详细和深入的问题,也可能会针对项目提出一些开放性和可拓展性的问题,比如这个项目或者技术点。你认为有可以优化的地方吗?应该如何优化它们?所以你要对自己的项目了如指掌,对每个技术点的细节都要了解清楚,并且要广泛思考,对一些技术点要有所期待和拓展。除了提问,重点是问基础知识。在回答问题的过程中,注意控制好自己的节奏,尽量把面试官引向自己擅长的知识,遇到自己熟悉的知识不要太着急,语速太快。有条理、全面地提问。如果不熟悉或者不记得知识,可以先解释一下问题中的一些概念,在这个过程中也可以给自己一些思考的时间。如果真的不清楚或者不记得了,可以老老实实说不熟悉。如果强行随机回答,效果会更差,给面试官留下不好的印象。另外,互联网厂商一般要求现场写代码,把核心处理代码写在纸上。所以在平时刷题的过程中,尽量一个字母一个字母的打,不要用代码来完成。当然,刷题很重要。面试结束的时候,面试官一般会问你想问什么问题。这时候就问一些自己感兴趣的话题,比如部门的研究方向,使用了哪些技术等等。
面试后:每次面试结束后,不要太在意面试结果。下去后,及时记录面试问题,尤其是自己没有答好的问题。你一定要花时间去研究解决这些问题,下次面试你也能解决同样的问题。每次面试后,你都能发现你的项目或者基础知识的一些不足。如果你继续下去,你必须适当地修改和完成你的项目。也可以在基础方面找到自己的弱点。你要多看书,多研究,你也会发现自己表达上的一些不足。你要及时调整,争取在接下来的面试中做得更好。
简而言之,找工作是一场战斗,在这场战斗中,你会不断跌倒,不断爬起来。在这个过程中,你一定要调整好自己的心态,做好长期坚持的准备。不要因为一次面试的失败而否定自己,变得抑郁。如果你真的很沮丧,对你的心情会有很大的影响。你可以和你的朋友和家人谈谈,这将有助于缓解你的不愉快。下次面试前,一定要调整好自己的心情,以饱满的精神状态去。
另外,我前面主要提到了一些技术技巧。在这里,我想补充一下人力资源方面。一般你的技术表现和性格都还可以,HR 方面问题不大,但是也要注意。毕竟是导致要约的最后一关。一般来说,HR 与专业知识无关。主要看个人性格和工作匹配。你会问一些个人信息,比如家庭情况,有没有女朋友,想去哪个城市工作等等。对于常见的 HR 问题,可以上网搜索一些常见的答题技巧,在面试中稍微注意一下。在这个基础上,最重要的是保持诚实谦虚的态度,做好自己!
期待你的关注!
评论