干货 | 腾讯大神C++后台开发经验

论坛 期权论坛 期权     
校招薪水   2019-7-13 07:41   3894   0
[/url]
点击上图,立即进群!

经授权转载自  玩铁的搬砖工
原文:https://www.nowcoder.com/discuss/164781
“找完工作后一直想找时间写点东西,由于在忙各种事情,一直拖到现在。作为一个19届的老油条,趁在毕业之前,将我的学习总结分享给大家,希望对正在找实习或者找工作的同学有所帮助。
”个人介绍
首先介绍下自己吧,我是一名非科班硕士,本科专业机械,期间参加过一些学科竞赛(智能车竞赛、机创等),研究方向主要是自动化,软件方面的基础基本为零。
我真正开始学习软件基础知识是从研一开始,实验室主要是C++开发,而由于我科专硕只有两年,在秋招之前学习的时间不到一年,由于实验室管理制度严格,导师项目催得比较紧,我学习的时间都是在做项目之余一点点挤出来的。
因此,如果觉得自己学习时间不够或者非科班的同学不必太担心,时间是靠自己争取的,只要你想进互联网的目标坚定,肯拼肯努力,能够静下心来学习积累,最后的结果肯定不会太差。
No pain,No gain!

个人offer情况
  • 腾讯后台开发sp

  • 华为海思大数据开发(实习转正)
  • 小米云平台软件开发
  • 虎牙直播C++服务端开发
  • 深信服C++软件开发sp(云计算方向)
  • 海康威视C++软件开发
由于实习结束后,9月份准备了一段时间基础,错过了很多公司的笔试或者面试,真正面试的公司只有十家左右,而有些大厂面试的比较早,在自己基础准备不足的情况下去面试,也是很自然地的GG了。
比如百度当时面的比较早,我基础还没复习完,一面就挂了。阿里更是7月份就开始面试,到九月初的时候基本没有岗位了,正式笔试也是走个形式。九月中下旬的时候,基础知识基本复习完了,之后面试的公司,通过率还是比较高的。不过也有一些玄学面试或者是没有HC的,比如京东一直到面完HR感觉都很不错,结果来了一封感谢信,直接凉凉……360面完所有面试后,进入资源池然后就没消息了。
腾讯是在9月底面完,幸运的是10月中旬确定了offer,而自己的目标一直都是鹅厂,这个结果也算是给了自己一个交代。
学习建议
“对于技术岗,软件基础知识可以说是个人的硬实力,是你能通过面试的一个大前提。
而说到软件基础的学习,对于很多还没有基础的同学可能会有点懵逼,软件基础知识这么杂,技术书籍这么多,该从何看起呢?
先不用慌,当初的我也和你们有一样的困惑,之后一步步挖坑填坑,才构建了比较完整的知识体系。
自己回头想想,如果当初还是小白的时候,就能确定一个比较合理的学习路线,对知识由浅入深的进行学习,学习的过程肯定会顺利一些,效率自然也会更高。
因此,我会根据自己的学习经历,结合软件基础的几大板块知识,制定一个合适的学习路线,希望能让正在学习的同学们少走一些冤枉路!
”首先,对于软件基础知识的学习……
首先,对于软件基础知识的学习,建议尽可能地去看一些经典的书籍,看第一遍的时候可以不用太过细致,快速地看,重在了解这本书的知识框架,在把握了整体的逻辑框架之后,第二遍就可以详细学习各章节的细节,这个时候也能根据自己的情况,选择性地去看一些相对重要的章节,效率会更高。
对于一些经典的技术书籍,只看一两遍很难完全理解其中的精髓,之后可能还要多次地回顾,也可能在实际应用中再来回顾书中的理论知识,也能更深入地进行理解。例如深入理解计算机系统这本书,内容非常经典,很多地方当你再看一遍又会有不一样的理解和体会。
每看完每本书,都要学会去做笔记,对自己所学的知识进行总结消化,笔记中的内容才是自己的东西,而且在我们学习的过程中难免会对一些知识点的理解有所偏差和不足,笔记能够很好地帮助我们发现这些问题,然后加以纠正并很好地记录下来。
软件基础主要分为这几大板块:C++基础、数据结构与算法、操作系统、计算机网络、数据库、设计模式和一些常用工具。
C++基础
  • 《C++ Primer 第5版》
  • 《STL源码剖析(侯捷 著)》
  • 《深度探索C++对象模型(侯捷 译)》
  • 《Effective C++(侯捷 译)》

软件学习中,语言肯定是最基础的,由于C++较低层,语法非常灵活(比较适合写算法),就导致语法规则比较繁杂,而且涵盖了C语言的内容,学习C++语法相对python、java等其他高级语言时间成本更高一些。
学习C++语法,首推《C++ Primer 第5版》,C++语法学习的最权威书籍,以C++11来讲解,非常全面地讲解了C++的语法以及C++11的各种新特性,看完帮助很大,如果有时间建议至少看两遍,时间有限的话,建议至少通读一遍,把握这本书的大体框架,然后结合个人情况选择性地去看一些重点章节。
《STL 源码剖析》这本书讲解了C++底层实现,内容包括C++底层内存管理、各种容器的数据结构实现、常见算法的实现等,建议列为必读,可以帮助深入理解C++底层,同时也是对数据结构的复习和巩固。其中也有很多面试常考的知识点,如内存池的机制、traits技法、一些常用容器的底层数据结构等。
《深度探索C++对象模型》这本书讲解了C++面向对象特性的底层实现机制,由于是翻译版本,读起来内容会相对晦涩一些,但是内容非常重要,尤其是虚函数底层的实现机制,建议多看几遍加深理解,这个基本是C++必问的知识点。看完这本书,对C++面向对象的理解帮助极大,建议必读。
《Effective C++》这本书主要讲解了编写C++程序的过程中需要注意的一些条款,有助于梳理在编写C++程序时的一些常见错误和注意事项,也是面试常考的。如果认真读过了C++ Primer,这本书看起来会非常快,其中的很多内容都包含在C++ Primer中了。
总之,C++由于它自身的特点,学习起来不会很轻松,需要一定的时间成本,但是如果你认真的学习了以上4本书,你会对C++有一个新的认识!相信我,等你学好C++,再学习其他高级语言会觉得轻松许多!
数据结构与算法
  • 数据结构

《大话数据结构》
《浙大数据结构网上课程》
  • 算法
《算法 第4版》(是以java来讲解)
  • 刷题
  LeetCode中文网站
《剑指offer 第2版》(建议至少刷两遍)
《程序员代码面试指南(左程云 著)》
“数据结构可以说是软件设计的精髓,建议将基础打扎实。
”《大话数据结构》这本书对于新手,很适合作为入门,用于建立数据结构的知识体系。
另外《浙大数据结构网上课程》也非常不错,B站上直接可以搜到,讲解简明易懂,弥补了大话数据结构中一些讲解不清楚的地方。在学习了数据结构的基础后,可以开始学习算法,建议学习算法这本书,可以帮助你梳理一些常用算法的原理和应用。

专门针对面试的算法学习非常推荐牛客网左神的算法课,我之前找工作有学习左神的课,感觉帮助很大,在此也支持一下左神。课程内容包括初级、中级和高级班,初级班帮助小白入门,系统地讲解了基本的数据结构和算法,并配合对应的编程题进行讲解,非常系统且有针对性,涵盖了很多高频面试题;中级班和高级班作为进阶,会讲一些比较难但是很好的算法,同时也会讲到很多好的例题,能够帮助开阔眼界,如果在面试中聊到会让面试官眼前一亮。具体买什么课可以根据自己情况,对于学生党可能觉得有些小贵,建议可以几个同学一起购买,毕竟对于知识的投资可以带来很大的回报。如果想要优惠码可以私信我,买左神的能够便宜不少。
在学习视频课的同时建议配合左神写的《程序员代码面试指南》这本书,学习效果会更好,其中讲解的编程题都非常经典,不仅仅限于国内的IT公司,而是面向全球,包含了国外知名IT公司的一些面试高频题,可以帮助开阔视野。
在学习数据结构与算法的同时,建议同步学习C++语法知识,两者基础都学习完之后,就可以刷题了,而在刷题的过程中,可以同步学习STL 源码剖析,有助于你更游刃有余的去使用STL,提高代码效率。
刷题的话,建议先刷LeetCode,英语不好的可以到LeetCode中文网站,LeetCode中有一个数据结构的探索专栏,根据难度,分为初级、中级和高级,基本覆盖了各个知识板块的面试高频题,可以帮助新手循序渐进地刷题,培养写代码的感觉。
另外的话,《剑指offer》这本书中也涵盖了很多面试高频题,可以到牛客网的剑指offer专栏中刷题,由于题目难度划分层次不太明确,新手刷起来效率会偏低,建议在刷完LeetCode探索专栏中的初级、中级之后,再去刷剑指offer的题目,其中的题目在面试中出现的非常高频,建议最好刷两遍,熟练掌握每道题的思路和优化方法。
在刷题的过程中,要非常注意方法,一般将刷题方法分为龟系和兔系。
龟系刷法的精髓就是每个题目要注意质量,不要满足于一种解法,各种解法都尝试写一写,并对比它们的时间空间复杂度。但龟系不是说在一道题上耗死。越是龟系越要注意时间上要掌握好分寸,能解出来最好,解不出来也不要倔强。我觉得比较好的一个平衡点差不多是一个小时。如果一个小时还是解决不了,可以看看提示,如果还是解决不了,可以看看讨论区的答案或者网上搜索答案。
兔系刷法精髓就是要暴力,天马流星拳,大力出奇迹。作为兔系选手,讲求的就是要疯,一上来就看答案,照着答案写。这个做法看起来不靠谱,其实它有内在的合理性:大部分算法都不是我们发明的,如动态规划,二叉树,线段树,并查集,贪心算法等等,到后来所谓的不看答案自己做出来,其实都是在用固定套路。
另外编程题的知识点很多很杂,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必知必会》
  • 《redis设计与实现》
数据库的知识面试问的不多,但是数据库对于以后工作是肯定会用到的,如果有时间建议将基础打好,可以先看《数据库系统概念》,了解数据库的基础知识,然后阅读《mysql必知必会》这本书,可以帮助你快速学习 mysql的基本语法。
设计模式
对于设计模式,如果没有大型软件的项目经验,这方面的能力很难体现出来,所以可以作为知识点的扩展学习,对其进行了解即可,面试常考的有单例模式、工厂模式等常见的设计模式。

“以上知识的学习路线和相关书籍,是我结合自己的学习经历总结的,不一定适合所有同学,但我相信大的方向还是具备通用性的,在学习过程中可以作为参考,也可以根据自己情况灵活调整自己的学习路线,找到自己认为最有效率的学习计划。
”求职过程
网申
建议最好到公司招聘官网去投简历,能内推的尽量走内推,可以免去笔试环节直接面试,这样效率更高,内推的渠道很多,例如直接到牛客网搜索相关公司内推的帖子、找师兄师姐内推等。

另外,要把握好简历投递和面试的时间线,对于自己很想去或者很难的公司,不要开始就贸然地投简历面试,最好先投一些相对容易的小厂面试,这样可以提前进行面试的训练,帮助自己找到面试的感觉,同时面试的通过概率相对也大一些,从而帮助自己树立信心。
之后,等到自己找到感觉准备好了,就可以开始面试比较难的一些公司以及自己心仪的大厂,但是也要注意大厂投简历不要太晚,根据各人情况而定,例如腾讯,如果投提前批HC会更多,如果挂了,还有正式批的一次机会,但是如果投的太晚,只能参加正式批,不仅少了一次复活机会,而且那时候HC可能已经没多少了,面试的竞争压力肯定也会相对大一些。
另外,投递简历和正式面试之间一般还要过一段时间,不要等你完全准备好了再投递简历,那时候可能就晚了一些,建议按照你的复习计划的完成时间再提前一些时间去投递简历,小厂和大厂之间投递简历的时间过渡也是这个道理。
最后要说明的,投递简历的时间早晚有利有弊,早了HC多,可以提前斩获offer,晚了准备更加充足,面试经验也更多,因此需要根据自己情况进行判断,我的建议还是谨慎一些,如果你已经面过几家小厂并且表现都很不错,找到了面试的感觉,那么可以尝试面一些大厂,否则,还是等到自己准备充足之后再去面大厂。
简历
简历的内容一般包括个人信息、项目经历、专业技能、个人荣誉这四个方面,其中项目和技能是最为核心的。
对于项目,描述逻辑顺序一般是:简介项目的需求和目的——自己主要负责的内容——分为几点详细描述自己的工作——最终的进展和相关成果。

对于自己所做的工作要非常清楚,同时要善于挖掘自己项目中的技术点,对每个技术点要烂熟于心,多问自己为什么,为什么用这个技术,这个技术的优点和缺点是什么,为什么适合现在的项目,使用之后取得的效果等等,然后有条理地将它们写在自己的工作中。
对于专业技能,首先要真正了解自己的掌握情况,对自己的掌握程度要描述准确,一般用词是了解、熟悉、精通。如果只是学习了基本理论知识,没有很深入,建议用了解;如果理论知识学习比较深入,并且有相关的实践经历,建议用熟悉;而如果在某个技能上可以说是大牛甚至专家级别,才建议用精通。因此,一般大部分时候建议用了解和熟悉来描述专业技能,精通尽量不要用。
简历的排版风格看上去简洁舒服即可,不用太过花哨,可以看看一些前辈的简历排版或者在网上搜一些简历模板也可以。另外,简历的重点是要突出自己的亮点,如果成绩比较好,写上自己的成绩排名,如果有一些竞赛经历,获得了比较好的成绩,可以在个人荣誉中突出,同时项目可以按照重要程度进行先后排序。
最后,最重要的就是简历内容一定要符合个人情况,实事求是,不要夸大自己的能力,如果你能将简历上描述的内容掌握到80%~90%,那么面试官对你的印象一定不错!
笔试
笔试这方面内容可以分为客观题和编程题两部分,其中客观题考察的知识点会比较细并且广,需要把各个知识板块的基础掌握扎实,这里我推荐《王道程序员面试宝典》这本书,涵盖的知识点比较全面,对笔试很有帮助。但是在笔试中也会出现一些知识点的跨度,比如你是主C++,可能一些主JAVA开发的公司客观题有很多JAVA的知识点,这确实是一个头疼的问题,也是个不可控因素,建议首先要将自己领域的基础知识打扎实,对于跨领域的知识如果有时间可以去了解一些。

做完客观题,最后一般是几道编程题,整体来说,笔试的编程题难度一般比面试要大一些,代码量也多一些,同时不像面试只需要写出核心代码,笔试还要处理输入输出,实际地编译通过所有测试用例,这方面平时要多训练,尽量将代码写在IDE上,自己要熟练地处理各种输入,并能写测试用例进行测试,在遇到bug的时候,要自己调试解决,提高自己快速定位bug的能力。要知道,处理输入输出、调试程序解决bug以及测试是coding的基本能力,必须要掌握好。另外,对于C++的同学,在Windows上建议还是用VS来写代码,方便调试代码。
对于编程题,面试由于代码量不会太多,一般考察基本的数据结构多一些,如数组、字符串、链表、二叉树、栈、队列等,对于算法主要考察动态规划,而笔试考察的数据结构主要以数组、字符串为主,在这两种数据结构的基础上更多地是考察哈希、动态规划、贪心法等常用算法,二叉树考察的很少,很难的笔试题可能会考察图,包括dfs、bfs、最短路径、最小生成树、拓扑排序、并查集等问题。
正是因为笔试的不可控因素较多,如果由于笔试成绩不好没进入面试会很可惜,为了降低风险,建议能内推尽量找人内推,可以免去笔试环节,直接进入面试。
技术面
“在具备了技术上硬实力的基础上,技术面试技巧也是非常重要的,它决定了你能否充分展现自己的实力。
”从以下几点,来谈谈我对面试的看法:

面试前准备:面试之前,首先要调整自己的心态,有一个好的心理素质,防止自己在面试中过于紧张而显得很慌乱。然后就是自我介绍的准备,一般3-5分钟时间,简单介绍自己的信息、项目经历和一些获奖经历等等,有些自己的亮点,可以在自我介绍的时候突出表现,有可能引起面试官的兴趣。内容可以事先在纸上写好,在家里或宿舍对着镜子多练习几遍,直到自己能表达地条理清晰,流畅自然。然后就是面试问题的准备,这方面首先是自己对相关知识有了系统的学习,并做了知识点的总结或者笔记,然后在网上收集一些面试的高频题来检验自己。之后可以在网上找一些面经,尝试着模拟面试去回答面经中的问题,面试不多的同学会有这种感觉,面试官问的这个问题你实际上知道,但是突然问你,你不一定能回答的很有条理,很有逻辑性,这个模拟训练能够很好地提升自己这方面的能力,在面对每一个问题,力求回答条理清晰,描述流畅,并且分析透彻,最好能够横向纵向地进行一些扩展。
面试中:首先,在衣着方面,面技术的同学穿的干净得体即可,不用特意穿正装,如果你穿着正装去面试,很有可能发现只有你一个人穿了。。。如果是现场面试,最好自己打印几张简历过去,在面试的过程中,一定要保持自信的状态,面带微笑,说话礼貌谦逊,给面试官第一感觉比较好。面试的时候,一般是先进行自我介绍,面试官在这个过程中了解你的基本信息,然后开始问问题,如果对你的项目很感兴趣,一般会问项目问的比较多,对项目中的每个技术点都可能问的很细很深,有可能会针对项目问一些开放扩展性的问题,比如这个项目或者技术点,你认为还有没有能够优化的地方,应该怎么优化?因此要将自己的项目烂熟于心,每个技术点的细节都要清楚,而且要能够发散的去思考,对一些技术点进行展望和扩展。在问项目之外,重点就是问基础知识了,在回答问题的过程中,注意一定要控制自己的节奏,要尝试引导面试官往你擅长的知识上走,遇到自己很熟的知识,也不要太着急,语速也不要太快,有条理并且全面地问答出来;如果是不太熟或者不记得的知识,可以先对问题中的一些概念进行解释,打打擦边球,在这个过程中也能给自己一些思考的时间,如果实在不清楚或者不记得了,就坦诚地说自己不太熟,如果勉强自己乱回答,反而效果更差,给面试官不好的印象。另外,互联网大厂一般会要求现场写代码,要求将核心处理代码写在纸上,因此在平时刷题的过程中,尽量一个一个字母敲上去,不要用代码补全,当然刷题就显得非常重要。在面试的最后,一般面试官会问你还有什么问题想问?这时候问一些自己感兴趣的话题,例如部门研究方向,用到哪些技术等等。
面试后:每次面试完,就不要太在意面试结果怎么样,下去之后及时将面试问题记录下来,特别是自己答得不好的问题,一定要花时间去研究,解决这些问题,下次面试再遇到相同的问题就能够很好地解决。每经过一次面试,都能发现自己项目或者基础知识的一些不足,下去一定要将项目进行适当地修改和补全,基础方面也能发现自己比较薄弱的地方,要多看书多研究,同时也会发现自己在表达方面的一些不足,要及时调整,尽量在下次面试能够做得更好。
HR面
对于HR面,一般你的技术面表现和本人性格都OK,HR面问题就不大,但是也要重视起来,毕竟是通往offer的最后一关。HR面一般是和专业知识无关的,主要看个人性格和岗位匹配度,会问一些个人信息,如家庭情况、有没有女朋友,想去的工作城市等等。常见的HR问题,可以到网上搜一些常见的回答技巧,在面试中稍加注意即可,在此基础上,最重要的还是保持坦诚谦虚的态度,做真实的自己!

“总之,找工作就是一场战役,在这里你会不断跌倒不断爬起来,在这个过程中,一定要调整好自己的心态,做好长期坚持的准备,不要因为一次面试的失败就否定自己,变得情绪失落,如果真的受到挫败,对情绪影响很大,可以找朋友家人倾诉,有助于排解自己的不开心,在下次面试前一定调整好自己的情绪,以饱满的精神状态去面对每一次面试。


推荐阅读:




校招薪水,是面向全球高校学子的校招薪资交流以及求职互助平台。平台致力于校招薪资的透明化,给招聘信息做减法,在提供高可信的薪资查询服务外,鼓励大家远离焦虑,避免套路,减少踩坑,让广大校招求职者更加专注于求职这件事情。目前平台已经累计提供了数千万次免费薪资查询服务,累计合作无套路信息推广企业达数十家,在国内外名校学子中口碑极佳,公众号跟小程序用户数已累计突破30W。校招薪水,用薪相随!校招实习以及雇主品牌宣传合作请添加微信:zjuerdream。


辛苦整理,喜欢的盆友告诉我在看哦
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:15
帖子:4
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP