目录
数据库内核开发/C++后段实习
第一次实习
背景
2024年10月末,大四保研结束(ZZU->BUAA),先来无事,想找个实习做一下。
简历简单搞了一下(就是将自己之前保研简历魔改了一下),主要就是学历部分将保研后的学校写入,竞赛方面还是ACM系列(ICPC区域银,CCPC邀请赛金),把数据库课设(SpringBoot+Vue)和Lainchain项目拿掉了,毕竟问了也啥都不会。项目栏改成了校园经历,将自己ACM实验室队长+程序设计实验课助教写上去了。
总结:简历只有学历(ZZU+BUAA),竞赛(ACM系列),校园经历(ACM实验室队长+程序设计实验课助教)就没了。
途径
当时找的ACM群友内推,将简历发给群友后,群友看到我竞赛这么多就直接给内推了。审核也很快,第二天直接约机试。期间没做任何准备。
机试
机试具体题目忘了,只记得只有pdf题面,没有oj评测。也没有面试官,只有个提交代码的网页。
前两题我记得是中等难度的模拟(或者类似),我都是打正解了,第三题正解是hash(不是字符串hash,需要对特定格式的字符串进行hash或者什么的,记不清了),当时想到正解了,没敢写。就把60分暴力交上去了。
随后结束以后,邮件约面试。
面试过程
面试整体过程比较压抑,面完给人的感觉就寄了。
尽力回忆一下面试流程。
面试官:你先简单介绍一下自己吧。
我:巴拉巴拉。。。(应该照着简历介绍的)
面试官:我们先来手撕一下代码,给你一些点,一些区间操作,怎么怎么。。(忘了具体题目)
我:现场手撕代码,好像用的线段树,期间出了很多问题,面试官应该也是ACMer能够根据我的代码hack我的程序。。。到最后好像也没弄出正解来。。。
面试官:开始拷问八股。。。(尽力回忆版)
- 说一下对象内存模型。
- 说一下什么是栈区,什么是堆区数据,怎么区分他们。
- 你对STL了解吗?说一下vector怎么扩容的,他的复杂度怎样的?
- 了解C++11语法吗?
- ...
我:瞎回答,由于没有系统准备过C++八股,全是驴头不对马嘴(vector复杂度我竟然分析成了nlog)。。
面试官:我们是...公司,主要是针对数据库内核进行开发,你之前有做过什么类似的工作吗?
我:之前上过数据库课,了解基本的SQL命令。
面试官:那说一下从XXX表里查询XXX怎么做?(具体提了一个SQL的题,但忘了)。
我:SQL命令我是之前学的,现在有点忘了。
面试官:你知道数据库比如mysql这些,内核都是什么吗?都是怎么工作的??
我:不了解。
。。。(沉默)
面试官:那我这边面试就基本结束了,你还有什么想问的吗?
我:没有。
总结与反思
面试完就感觉寄了,全程被面试官牵着走,问啥啥不会。但面试官还是很不错的,技术面由于都是实际工作的人面试的,所以专业性很强,会实时解答我的问题。但到后期,一直都是他在解答,(发现我真的啥也不会)就结束面试了。
给我的教训,
- 简历中不能没有项目支撑,否则相当于完全将主动权交给对方。
- 不同语言,语言的八股一定要准备的。这时基础,面试中可能文档比较少,但一定会有。(我这场面试八股篇幅还挺大的,可能因为没有项目的缘故)。
AI infra/机器学习系统工程师(C++)实习
第二次面试。。。
背景
2025年12月初。北航研一,在上一段面试中被打自闭了,大四剩余时间就先发奋图强一段时间将黑马的C++语法过了一遍并用博客总结(重点,后面要考),这里全是基础语法,不涉及C++11的内容。随后在25年6月-10月在朋友的撺掇下,学习了MIT 6.S081课程,详见https://blog.youkuaiyun.com/gcfer/category_13059249.html,听完所有课程并完成所有实验之后,开始学习CS144课程至今,详见https://blog.youkuaiyun.com/gcfer/category_13071261.html(但是没做完,就做完前5个lab,完成了TCPSocket相关内容)。
简历方面:学历(ZZU+BUAA)、竞赛(ACM相关)、项目(上述提到的两个项目)。
途径与准备
本来想的是期末考试之后(1月20日)再实习,11月末就在BOSS上开始找打算能不能约到1月末。随便投了几个,结果HR说太晚了,我说到岗时间可以商议(在我心中实习>期末考试/学业成绩)。然后就投简历了。结果第二天中午正睡觉(14点左右),HR就打来电话(垂死病中惊坐。。。),我当时迷迷糊糊的,HR问的问题也都是了解基本情况,我当时头脑不清醒也就随便回答了。然后HR就说约第一轮技术面了,问我时间如何,我说第三天下午可以,就敲定了第三天下午。当时快挂之前,HR着重询问我代码能力如何?刷不刷力扣?我自信回答我是打竞赛等,没问题。。。(面试的时候真打脸。)
随后便没心情睡觉了,感觉C++八股准备的还是太差了,下午,晚上和第二天早上又临时准备了一下C++的八股。
面试过程
面试整体表现比上次好(自我感觉)。面试官也开视频了,一看就是典型的技术人员。
面试官:先简单介绍下自己吧。
我:我就照着这个简历介绍吧,开一个视频共享,这样也方便您看着。(操作飞书的共享屏幕,第一次用,需要读十秒。)那个,他目前在读秒,需要等10秒。
面试官:没事,不用紧张。现在好了,你开始做自我介绍吧。
我:介绍学历,介绍本科期间竞赛,介绍项目MIT 6.S081,操作系统项目。
面试官:打断一下,我来问一些问题,你了解操作系统操作文件的命令是什么吗?
我:freop这些吗。
面试官:好的。你知道系统调用内存的系统调用是什么吗?
我:malloc/new吗?
面试官:你这是应用层,我说系统层面分配内存是什么系统调用?
我:sbark?
面试官:嗯,可以。我看你项目里有进程和线程,你说一下进程和线程的区别?
我:我的理解是进程是资源分配的基本单位,进程有自己的虚拟空间,线程是实际执行的基本单位,甚至上我的狭义理解线程就是代码块,一个进程中可以有很多线程,这些线程实际执行进程的任务,并且共享进程的空间,同时cpu调度也是对线程进行调度的,通过切换线程来实现切换进程。
面试官:好的,你觉得在你这个项目中,你最大的收获/你遇到的最大困难是什么?
我:(瞎几把说)我觉得因为我之前学习操作系统都是在课本上学习的,这个项目就是从代码上让我具体清楚操作系统是如何实现的。我觉得最大的收获包括这个文件系统,我之前根本不能理解inode是个什么东西,现在我清楚了他就是一个数据结构,里面有文件名,文件地址,数据索引快,包括我在项目中通过将in ode的二级数据索引块修改成三级索引块来增大单个文件大小的。以及页表,之前我不理解为什么要有页表,为什么要做这个地址转换。学习完我了解到页表通过设置不同的页表实现将进程隔离开,让每个进程都拥有自己的虚拟空间。吧啦吧啦吧啦。。。
面试官:好了,你接着介绍吧。
我:介绍CS144,计网项目。
面试官:我考查一下,你说一下TCP是怎么实现可靠传输的,以及他的流量控制。
我:TCP有个超时重传机制,就是如果我发送任何占据字节的报文的话,TCP的另一个端点收到后,都要进行显示回复,同时我这里会有一个计时器,如果一段时间内我没有收到回复,我就认为该报文在网络中丢失了,我就重传该报文,大概就这些。(我当时只想起超时重传了,流量控制好像没回答。。)
面试官:对于乱序字节,TCP是如何做的?
我:就像我在项目中的,TCPReceiver中有一个排序器,该排序器接收乱序字节并缓存,如果TCP开启SACK的话就会SACK回复该乱序字节,当然ACK还是累计应答的。简单来说就是该排序会缓存乱序字节。
面试官:TCP是通过哪个字段来处理这些乱序字节的?
我:Seqnumber,他表示数据首字节号,还有数据的长度来重组乱序字节。
面试官:你了解大端小端吗?网络协议这些用的是大端还是小端?
我:具体定义忘了,但我知道操作系统和网络协议这些用的大小端不同,而且网络的大小端符合人类正常读写习惯。
面试官:那人类正常读写是大端还是小段?
我:回忆了一下定义,低地址处存放高位权,想起来了,人类正常读写和网络协议应该都是大端。
面试官:好,你这个是课程的实验吗?
我:呃,是的。
面试官:接着介绍吧。
我:我对git,docker,conda这些容器都能够熟练运用。
面试官:说一下在git和docker中用到的最复杂的命令是什么?
我:git我用到的最复杂的就是通过查看提交列表并回退到某个版本。docker就是run按照某个镜像启动容器,start开始一个容器,关闭一个容器,将某个容器打包成镜像。。。
面试官:接着介绍你自己吧。
我:介绍自己熟练掌握C/C++,Python,Java怎么怎么
面试官:C++的语法,你了解过哪些?
我:资源获取即初始化这些,即资源的获取和对象的初始化绑定,资源的释放和对象的析构初始化。用对象的生命周期来管理资源。同时用智能指针来管理资源。
面试官:你知道这个术语是什么原则吗?就是那几个字母是什么。
我:RAII(资源获取即初始化Resource Acquization Is Inialization)。
面试官:好,介绍下智能指针怎么管理资源。
我:智能指针unique和shared。通过将智能指针和资源绑定,会智能管理这些资源。
面试官:对于shared智能指针,使用有什么风险吗?就是如果一个项目里全是shared指针,会有什么问题吗?
我:有,会有循环引用的问题,这会造成死锁,就比如A引用B,B引用A这就死锁了。需要用到第三个智能指针weak。
面试官:好的,我看你简历上说你的博客说你有200多篇文章,你现在能具体打开让我看看这都是什么吗?
我:(打开博客)我有两个博客,一个是我打竞赛时写的博客,这些都是题解类型的,200多篇。另一个是优快云博客,想做成技术博客这样的。(打开另一个博客)
面试官:我看到你有C/C++语法的专栏,你点开让我看看。
我:(含泪打开C/C++语法专栏)。
面试官:我看到你这个有继承、封装、多态的文章,你打开,就照着这个目录,我提问你。我看你这有虚函数,你能说一下虚函数是怎么实现的吗?
我:虚函数是基于“继承”来说的,就是子类继承父类。父类用virtual关键词定义虚函数,子类继承父类,重写该虚函数,这样就能用父类指针指向子类对象来实现多态。(具体记不清了,胡言乱语。。。)
面试官:我想问的是在编译时期会发生什么?具体虚函数是怎么确定用哪个方法的?
我:get到了,有个虚函数表,在编译时期,子类继承父类时也会复制其虚函数表,随后重写函数时同样会记录到虚函数表中,在实际运行时会查该表,来决定具体用哪个方法。
面试官:好,那析构函数需要用虚函数吗?
我:(不会。。。)这涉及一个析构顺序的问题,会先析构子类再析构父类。应该不需要用虚函数表。。。
面试官:(看出来我不会,开始解答)我当时学的时候,说的是如果不用虚拟函数,则是静态的,在编译时期就写死了,当然编译器也在不断进化,但我当时学的时候是这样的。
我:昂,对。
面试官:好,最后我们考察一下代码能力,我觉得你应该没什么问题。说题目:链表的组内翻转。
我坑吭哧哧在打代码,过了大概10min,没有结果,面试官看出来我写的很磕磕绊绊,说要不你先实现一下全链表翻转吧。我快速实现了全链表的翻转,发现自己组内翻转的逻辑有问题,修改代码+调试。。。过了10min,面试官说,再给你最后10min,过了1,2分钟,我就调出来了。面试官看了看觉得没问题,就让我简单介绍下思路。
面试官:我这边基本上结束了,你看你有什么问题问我吗?
我:(厚着脸皮)那个吗,您绝得我今天面试表现怎样?
面试官:我也不卖关子了,我觉得问题不大。那个你了解过机器学习系统这些吗?
我:我之前上课用过华为昇腾得MindStudio这些。不过都只是使用了,没深入了解过。
面试官:你觉得他们架构目前有什么问题吗?
我:我使用的时候觉得他们支持的模型太小,而且支持值tensorflow1.x版本,太老。
面试官:没事,那咱们没有这个讨论的必要性了。那没事的话就结束今天的面试了。
我:好,拜拜。
终于结束了,长舒一口气。大概持续了1个小时10min左右。
我尽可能的还原当时的面试经过了,看似很不错,实则途中还是有很多问题没答上来,包括面试官会问一些我没听过的名词的问题,我回答不上,由于这些名次当时都没听过,现在也回忆不了。
总结与反思
目前结果还没出,也还没约HR面试,但这次面试和第一次相差太多了。总结下来还是发觉,实习面试也不是儿戏,都得好好做准备。总结如下:
- 首先简历关,要有项目支撑,且项目尽量和投递岗位有关。我这个是OS和计网都是基础,所以面试官也都有的问。
- 要对简历负责,你简历的任何部分都要做好被提问的准备。
- 简历关能过说明如果你真的如简历一样,那一定是可以的,面试只是确认你是否和你简历上写的一样,或者说考察你简历上的写的东西的熟练程度。
- 机试分成两种,一种是有OJ,有计时,没有面试官的。这种我比较擅长;第二种是面试官随口提问题,让你现场手撕。这种情况下由于面试官一直在视频那边看着而且时间更有限(面试官往往最多等你半个小时),我都会比较紧张。。。表现往往不出自己的真实实力,还是要锻炼自己的心里素质。冷静编码,多加注释,用小样例理清复杂逻辑往往是个好办法。
- 最后,整个面试过程要自信,面试官不是敌人,将面试过程当作展示自己的舞台。自信,即使哪个知识点不会,也要讲自己知道的相关的尽可能说出来,多展示自己。
- 任何语言,语法关都是要过的,语言是基石,八股还是要多准备的。
未完待续...
希望所有看到这里的人都能有所收获,最终拿到满意的offer!
931

被折叠的 条评论
为什么被折叠?



