c++面经

转载 自留

一、前言

我的秋招故事很长很长,期间无穷多的心酸与苦难,当然也不乏兴奋与惊喜。写在这里,是对自己这段生活的一种怀念,更是想给目前还处于彷徨无助看不到希望的同学一种激励。这不是一篇纯粹的笔经面经,但我自认为这是一个曾经浮沉校招大小笔面试的非科班学子的面试记录与总结心得。

当然,我认为会是个励志故事,你若不认同,就只能说我的文字太过拙劣,也许满足不了你,但是只要有同学能够从中汲取到正能量,能够学到某些小窍门,甚至只是一个小问题,我都是开心的。

那么,首先交代背景,我是个非科班的硕士生,水平很有限,真正开始准备工作需要的技能与知识是在一年前,具体专业的话,这么说吧,我是舒克也是贝塔,院系(本4硕17)。因为本科研究生都做了不少硬件的事情,所以软件方面需要加强的东西极其多,复习期间都是白天做项目,晚上学习,凌晨1点之前都不可能回到宿舍。并且在七八月份,找工作的关键时间,被导师要求写SCI文章(撰写加来回修改30+遍),更是直接只能忍着所有的困意与疲倦,奔波在各个面试地点,回来迅速转换思维写文章。

如果你现在还是秋招,因为找不到工作很低落,那么我想跟你说,曾经的我,比你要痛苦得多,我只是知道,当我熬过去那段一躺下睡觉就会觉得心脏隐痛,感觉随时猝死的时间,我就会重生,命运不会抛弃愿意自我抗争的人。(说到这里,想到之前大家讨论的导师和学校,我只能说我航这个问题从来都是重灾区,可是吐槽是没有任何作用的,如果你厌恶你的生活,那就付出十倍百倍的努力来改变的下一步的生活吧,那才是我们要关注的重点。)

扯远了,收回来。我本科和研究生都做了很多嵌入式的事情,所以部分offer也与此相关。但是个人在接触硬软件清楚自己的意向是软件开发,所以主要往C++开发方向发展了。求职主要面向的是C++软件开发,后台开发,服务器开发。

二、offer情况

1) Get offer 或者offer流程中
腾讯(后台开发,offer,薪资各方面都算满意)
网易(C++开发,offer,三面面试官说前面的评价都是优秀,可能sp)
完美世界(服务器开发,sp offer,薪资不低)
趋势科技(软件开发,offer)
寒武纪(软件开发,offer,薪资还可以)
恒润(这一家可能只有北京高校知道一点,我航和我理去的比较多,sp offer)
多益网络(游戏开发,offer)
涂鸦移动(软件开发,offer)
CVTE(软件开发,终面,拒绝)
shopee(后台开发,offer,月薪不错)
远景能源(软件开发,终面,但不知道是不是被我说出的腾讯offer情况吓走了)
美团(后台开发,内推的三面完成,应该是G了)
深鉴科技(C++开发,offer,薪资很高,比普通的sp要高)
招银网络(软件开发,offer)
招商金融(软件开发,终面谈了所有offer情况,CTO坦言给不了我那么高工资)
中兴(软件开发,offer,谈薪后直接拒)
新华三(软件开发,终面谈薪后拒offer)
华为(IT软件开发,终面,面试官加了微信…)
4399(游戏后端开发,offer,谈薪后拒绝)
2)GG的公司
阿里巴巴(三面,挂)
京东(玄学面试,一面挂)
360(面试官很专业,但不容忍错误,挂)
58(后台开发,一面挂,所有面试中体验最差的公司,没有之一,没有之一,没有之一)
商汤科技(笔试好难,应该挂)
小米(笔试后没消息,挂)
携程(玄学笔试,至今没通知,挂)
3)待面试中
头条
4)放弃的公司
放弃面试:百度,滴滴,海康,好未来、蘑菇街(这么晚才接到电话也是醉了)
放弃笔试:类似去哪儿、深信服、TPlink之类
没错,列举这些,就是想说明一点:我是几乎混迹所有互联网大厂笔面试的非科班学生 。

三、面试

本面试主要分成三块内容:

第一部分:知识水平的提升方法与面试技巧,针对非科班或者知识面薄弱的同学,讲解准备校招与校招过程中应该具备的能力与技巧,包括但不限于推荐书单,技能说明,面试技巧等。
第二部分:大体上描述C++研发或者后台开发在笔试面试中高频出现的问题;
第三部分:挑选其中20家公司,描述自己的面试经历,说说不同公司的面试题目与感受(因为面试公司太多,所以我过程中基本上都没有做记录,只能凭着记忆写,但是重要问题都会提及)
1. 提升知识水平的学习建议
1.1 提升硬实力
校招是对面试者的种种考核与展示机会,在没有实力之前去面对,是很无能为力的,结局往往也不会是可喜的。所以首先前提在于提升自己的知识水平,在本身实力不足的前提下,过得的强调技巧,一门心思想走捷径,很可能是会酿下苦果。
所以,最重要的是你要有足够的硬实力。语言基础,操作系统,计算机网络,数据库,设计模式,算法,我认为都应该学习,扩展自身的知识宽度。如果跟我一样是非科班的同学,毫无疑问你要花时间将这些基础都有侧重点的学习一遍或者几遍,这样不至于面试官提出的一些问题你完全不知所谓。不需要什么都懂得很深,但是基础的东西要能够说明白,并且在某些关键问题中尽可能地挖深,研究透彻。假设你C11特性就是了解得特别多,用一个同学的说法就是,C11的知识点早就刻入骨子里了,闭着眼睛都写得出来,那么我相信你在其他保证基础没问题的前提下,一定可以获得一个很不错的offer。
下面我说说基础的学习资料。我认为在有时间的前提下,应该将基础知识都先补全了,保证知识全面的前提下,再做深度研究。而且由于非科班同学对于大部分东西都是第一次接触,本身没有一个特别好的框架或者概念,往往不知道这些知识的内在联系与实际应用场景,不要担心,先安心扩展自己的知识宽度,在慢慢将这些知识融会贯通的时候,自然而然你自己就会有答案,甚至你会在笔试面试或者与同学的交流中得到答案。顿悟的前提一定是大量知识的积累。

四、读书的建议:

(1)读每一本书都建议一定要读取书的源码,自己敲一遍,相信我,读没读过源码,是否自己能够写出代码差别还是很大的。
(2)强烈建议处于校招或者准备校招的各位,要有一个读书计划,上面不仅要有读每本书的计划时间(10天或者两周),并且记载读完每本书的感受或者问题。如果可能,可以记录读书过程中发现的问题,并且在很多博客上去查找答案。如果一番读书过程,受益匪浅。

1、C++:
C++ primer 5(不建议C++ primer plus),基础书籍,必读
深度探索C++对象模型 基础书籍,必读
STL源码剖析 STL方面的神书,建议读
Effective C++
More Effective C++ 推荐
侯捷老师的书籍与视频都很推荐,之前有个牛油给出了侯捷老师的视频,我下下来了,但是忘记是哪位同学了。在最后我将我的所有学习资料都打包放在百度云盘上,有喜欢的同学可以下载。

2、操作系统:

深入理解计算机基础(CSAPP,神书,极度推荐,号称比同等质量的金子更加之前的书,这个评价一点也不为过,必读)
现代操作系统(在读完上一本书后读,讲述操作系统的概念,可以配套网易云盘北大或者清华的操作系统课程视频)
UNIX环境高级编程(APUE,强烈推荐,如果想进腾讯,建议此书列为必读,如果能够理解这本书的内容,网络编程不会是你拿到offer的拦路石)
还有一个是之前一个师兄推荐的,MIT6.828的这门课,要求自己设计出一个简易的操作系统,是一个极好的实践项目(7个lab)。

3、计算机网络:

计算机网络(谢希仁,基础书籍,必读)
图解TCP/IP(简单明了,花上三四天时间读读这本书,挺有好处的,基础书籍,非必读)
TCP/IP详解(卷一,进阶书籍,必读)
UNIX网络编程(卷一,神书,进阶书籍,强烈推荐,跟APUE一样,腾讯的敲门砖)
图解HTTP(非必读,面试过程中http问的问题一般偏多,可以考虑在http方面详细研究,作为自己的亮点)

4、数据结构:

网易云课堂浙大的数据结构课程(推荐,0基础学生的必备良药,基础视频,每节课的配套题目必须独立完成)
大话数据结构(推荐,但是个人感觉不如浙大的视频讲解)
算法4(推荐,书籍代码是java语言,不影响理解)
以上三种不建议都详读,建议浙大视频+作业,过程中快速读算法4即可。没有太多时间,可以学习完视频,完成所有课程作业之后直接学习算法。

5、算法:

剑指offer(准备校招刷一遍,校招过程再刷一遍,哪里不会刷哪里)
程序员代码面试指南(左程云,好书,配套左神的视频使用效果更佳)
Leetcode(后面会给出部分leetcode题目详解的电子版,题目牛客就可以刷,但是不太全,如果你想进阶的话可以刷,我并没有刷,在不能确保自己其他基础水平达到的情况下,不建议贪多只花时间刷算法)

6、数据库:

数据库概论(基础,快速读,重在了解概念与基础)
Mysql必知必会(基础,快速了解mysql的好书,推荐)
高性能mysql(建议读前面索引和性能的部分即可)
数据库面试问题不会太多,而校招时间有限,所以建议基础先打好,后续再学习更深入的部分。

7、设计模式:

大话设计模式
设计模式能够在笔/面试中用到的不多(大牛除外),所以可以扩展这方面的基础,对其进行了解即可,重点研究单例模式,工厂模式等常见的设计模式。

8、Linux:

鸟哥的linux家常菜(基础书籍,必读)
如果有兴趣看linux内核的话,可以看看
深入理解linux内核
Linux内核设计与实现(LKD)
Linux内核完全剖析——基于0.12内核

9、校招基础准备:

王道程序员面试宝典(好书,将大部分的基础都进行了讲解,基础问题基本上都涉及到了,可以很好的应对面试上的小问题,推荐面试前期或者基础不扎实的同学看一遍,后面有电子版。)

10、提升软实力与笔/面试技巧

笔试很多题目就是面试出的基础题目,语言基础、网络、数据库、linux,这些都是必考的,所以在校招之前和校招过程中,最好保持每天刷一定量的题(50起),注意查漏补缺,重点刷自己的短板(去刷2000题吧~)。但前提是,以上书单或者相似的内容都已经学会,否则很容易在笔/面试中铩羽而归。

提升软实力:

面试是一场个人show,是对自己目前已有知识与项目的一种展示,更是对面试者的全面审查。所以不只是硬实力的比拼,也考虑个人的综合素质,也就是所谓的软实力。我认为软实力这方面主要就是每个人的情商表现了,性格方面的东西是很难取改变的,由此每个人的作风也有所区别。但是在面试过程适当的掩盖自己的锋芒与说话的技巧还是极其重要的。大体可以总结为:
(1)保持自信的姿态,相信自己能够胜任这一份工作,语言有力,连贯并富有力量感
(2)保持谦卑的态度,认可面试官的知识能力,能够坦然接受面试官的所有评价,即使是嘲讽,切忌强烈反驳(双选过程,实在不开心不外乎就不去了)
(3)适当展示自己的价值观与人生观,每个公司都喜欢找契合自己公司文化的人,所以适当展示这方面,会给面试官一种很舒服的柑橘
(4)锻炼自己的反应能力,面试问题是不可控的,面试官会问到什么问题大都是无法预测的,所以保持绝对的热情与饱满的精神状态去面对,即使遇到不懂的问题很多时候也能够凭借本身的实力与灵活的现场反应能力回答上一二,加上面试官的提示,是完全可能回答好的。
(5)专注的注意力,在面试过程中,有时候是会有前后联系的,能判断到面试官擅长或者感兴趣的内容时,可以尽量往哪方面描述,可能会有意想不到的效果。

准备笔试的技巧:

(1) 学习过程中,注意总结笔/面试会可能会问到的问题,重点研究。举个栗子,鸟哥的linux家常菜这本书通俗易懂,看过一遍,估计也就一周。推荐边看边刷题(赞一波牛客的题库),即使刷题耽误了看书时间,也能慢慢让你培养出笔试的感觉,看完了你自然而然就知道这本书哪一块是重点,哪一块过一遍即可,然后再去刷题,看面经里面出现的linux命令的题目(如果分数ok,题目也都会,那么下一本)。
(2) 笔试过程中注重归纳与总结,记录每一类高频问题,可以在牛客上先找别人列出的问题,但是一定要将每个问题研究透彻,随时对其进行补充。
(3) 算法题除了多刷图以外,可以在自己电脑上将自己平时练习的算法题目进行总结,写一些通用的小算法,例如字符串题目、数组题目,dp问题,有些问题经常只是意境变换了,实际算法还是用得上的。
一言以蔽之,多看多练多总结,笔试不能高分也会通过。
另外:如果有线下笔试,都推荐线下笔试,难度会降低。

面试的准备与技巧:

面试是一个考核的现场,在实力之外,是需要技巧来支撑的,能够掌控面试节奏与放任面试节奏绝对是两个感受。。而校招本身就是一场战役,如果大厂岗位逐年减少,而IT学生越来越多,僧多粥少,没有准备的站会输得很惨。
(1)简历问题:互联网简历最重要的就是技能树和项目,其他都是锦上添花的东西。所以写上简历的东西一定要极其熟悉,自己深入项目,考虑面试官会询问什么问题,如果面试官问到你没有考虑到的地方,可以尝试发散思维去想去说,最好不要什么都说,甚至可以说你自己理解的但是其实不太相关的东西,至少要让他知道你是考虑过项目的整体框架,内在联系,存在问题以及改进空间的。另外,在面试几次之后,项目你也介绍过几遍了,面试官可能也提出一些问题,基于这些问题,重新润色简历上的项目描述,并且重新熟悉自己介绍项目的说辞,对面试官可能提出的问题做到心中有数。
简历上的技能,对自己写的每一项做到心中有数,例如,你写上“熟悉TCP/IP协议及其编程”,那么面试官问你建立服务器的socket函数有哪些,分别什么作用,你总不能不会吧?我最开始对数据库不太熟,没有系统复习过,简历上就没写数据库,然后美团面试的时候,一直问JAVA和数据库,我都直说不会/不太熟,面试官没有过分刁难,虽然还是问了很多。
(2)面试的准备
面试之前,前面简历的问题要熟透,嚼烂已知的项目的坑,并在后面面试中慢慢补全。知识技能方面,多看面经,首先将面试岗位的高频面试题都事先熟悉,用面经上面的题目自我考核,判断自己能不能很流利地回答出来。何谓流利地说出来,就是富有条理性的,透彻的,横向纵向结合的描述。并且在看面经的过程,可以扩展的看,每个问题的延伸问题,最后都花时间去琢磨(博客是个好东西,多看)。后面我会给出我知道的C++研发高频题目。
(3)面试过程的技巧
首先如果可以现场面,推荐现场面试,优势在于能够让面试官看到你的精气神,确保面试期间精神饱满,富有交流欲,尤其和面试官保持眼神交流,让他看到你的态度,并且对于每个问题,不管会不会,多问问面试官总是没错的。这个我认为是最重要的,每次面试官问的问题,我一般都是紧盯这面试官说,我是这么考虑的,您看看对不对/我对这一块不是特别熟悉,但我是这么想的,麻烦您指点一下/对于这个问题,我们分成三部分考虑,首先…
有人说面试变成了一站到底,这是很难避免的,面试官为了追求效率,考察你是否具备他们所要的技能,那么语言基础、网络、数据库、算法、linux基础,都必须至少两三个问题,于是他们就一个一个蹦出来。这种时候,你最好要稳住节奏,表现出足够的表现欲,对擅长的问题进行扩展,深挖,让面试官意识到你在某一方面很厉害,促使他去按照你想的方向去了解。聚个栗子,面试官问是否了解linux的IO模型,我一般是这么回答的,“对于这个问题,我们首先要理解同步异步、阻塞非阻塞的概念,balabala,他们之间的区别可以类比为XXX。

在理解这些之后,我们将IO模型分为五类,分别是XXX”,讲完这些估计就要五分钟,相比你不咸不谈说,有五种,是XXX,面试官不详细问它们的特点你就不说,是不是差距很大。假设我有点忘记了IO模型的分类,那么前面的铺垫是不是也可以给自己时间去回忆。我经常是在面试期间忘了某个问题的答案,于是一边打打擦边球,一边大脑快速回忆这个问题,很可能在讲着讲着就想起来了。即是你想不起来,也绝对你比支支吾吾说不了几个字强太多了。

(4)面试的心态
前面说到了,精神一定要饱满,尽可能有信心一点。当然,我觉得对于前面几次面试的同学或者手上还没有靠谱offer的同学,紧张无可避免,那么就告诉自己,上次我面到了一面,这次我只要一面过了就好,一点一点目标往上提。
面试中自己的面试尽可能不要太受面试官影响,毕竟有些面试官确实不太负责,在面试期间时不时做一点别的事情,我们要做的就是做到自己的最好,描述清晰而流利,控制语速(我中兴面试的时候自我介绍实在太熟了,说得太快,被面试官提了一下)。
非科班同学面试经常碰到的一个问题就是,你不是这个计算机专业的呀/你的专业跟我们不匹配啊。这个问题很现实也很尖锐,毕竟科班出身的人就那么多,我凭什么要你不要他们,所以你要展示的就是你得计算机技能不比别人差,你的自学能力比普通人要强,或者你做的项目比别人牛逼,或者你比别人更能坚持,语言是很无力的,即使你说了,面试官也不一定就相信,所以在后面的面试拿出实力来表现自己。放在这里是想说,首先你自己心态要摆正,非科班对面试是正buff还是负buff,重点还在面试者自己身上,大公司一般不会卡这方面,更不会因此鄙视你,所以坦然一些,用实力告诉他们我们能行。
(5)面试后的总结与再准备
面试后,最关键是什么?还是总结。很多时候其实面试完毕你就大致知道结果了,至少你知道你能够根据面试官的反馈知道你自己的缺陷在哪里,记录下来。如果可能,每天都用word或者博客进行记录,短暂时间的将重点问题记录在手机备忘录上,然后找时间将这些问题一个一个克服。

我个人是将问题都分类,分类总结记录,并且查资料将问题彻底弄明白。在经历三四次这个过程之后,你应该会很赞同这样一句话:面试是提高能力的最好途径。没错,你最初的总结一般都是很片面的,或者不符合面试需求的,但是在实战几次之后,你就会明白哪里才是重点,哪里是次要的,也明白自己的优势或者擅长的地方是哪些。

在知道这些之后,面试过程中,就可以尽可能的避重就轻,引导面试官往你擅长的方面去说。还是聚个栗子,腾讯面试的时候,问了我http的状态码,我当时真的完全忘记了,就说这个我记得不太清楚,但是我了解的http是应用层上的XXX,版本有http1.0 1.1 2.0,动作一般有…,为了安全会用https来代替http。这样过渡掉这个问题,引导面试官来到你说的这些问题上(当然前提是你说这些可不能不会,不然就是自己挖坑自己跳了)。

还是回归面试后的心态,面试后就尽量不要过度去考虑这一场面试通过与否,最重要的是总结和准备下一场面试。这里也适用于笔试,校招时候公司太多,每天面试笔试往往都很多,没有太多时间给你感伤或者惊喜,在没有确定秋招结束之前,这里一直都是战场,不能松懈否则你可能就输了下一场。尤其是,如果面试失败了,那种低落情绪几乎避免不了,我们要做的就是尽可能缩短这个低落时间。我一直很看重京东的面试,抱了很大的期望,面试过程中感觉也很不错,但是当天就挂了,当时表示完全理解不了,非常低落,甚至开始怀疑自己的能力。这个时候,就必须和家人朋友聊一聊,放松一下,然后重新开始(有个信念,就是这是千万人都在争的路,输了也正常,但是我们都没有退路,没有任何办法,总结总结重新开始吧)

面试过程,真的不是学习或者工程能力强就能够拿到offer的,自身软实力也极其重要。心态,反应能力,态度,甚至状态都是能否通过一场面试至关重要的因素,这些就要靠我们自己去慢慢摸索与准备。我在拿到一些offer之后,跟同学讨论过,发现挺多人存在一个问题就是:对于很平常的问题,他们表现出不知道应该怎么回答,例如专业面的你在项目过程中最大的难点是什么,怎么克服的;HR面的你怎么评价你的研究生/本科生涯等等。这些问题说白了都是情商,无关技术,但是又很影响面试官对你的看法。这些问题没有标准答案,但是,保持诚恳的态度与真实的描述(当然实现要有所准备)是总是能够拉近和面试官的距离的。

你可能感兴趣的:(杂七杂八)