上岸字节基础架构,大二转专业后我终于走到这一步

如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备简历实习上岸经历校招总结阿里、字节、腾讯、美团等一二线大厂真实面经也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载

原文地址:https://mp.weixin.qq.com/s/p_1B66vJSr2pnjwKKOVa6Q (opens new window)

作者:阿秀

友情提醒,今天这位学弟的经历十分硬核,如果你还在学校里读书,不妨花5分钟看完这位学弟的分享,绝对会让你受益匪浅!

今天分享一位本科学弟的提前批上岸经验和总结,以前就聊过提前批上岸很不容易,也不建议大家跟风去投递提前批,这里不再赘述了,具体详情可以看下这篇文章:

说回这位学弟,这位学弟是并不是科班出生,而是转专业过来的,他大一大二都是土木工程专业,大二后转到了计算机专业过来。

他很清楚自己的劣势,那就是相较于那些科班生,那就是整个大学学习时间会少1-2年,所以,在转专业过来后也是一直很认真努力的追前人的脚步,这一点你从他下面的自述中就能够看出来。

阿秀读完他的分享后觉得他最优秀的品质就是耐得住寂寞,愿意通过自己啃书去理解计算机基础和底层知识,去夯实自己的基础,而不是做无根浮萍。

最终他也是自己设计了一个操作系统和CPU,而这两个项目则帮助他在秋招提前批和正式批阶段大杀特杀

这篇文章是这位学弟上个月分享在阿秀的学习圈中的,现在分享出来,如果你想与他本人一对一的交流,可以在阿秀的学习圈中的置顶精华找到他的这篇文章,与他本人进行深入沟通。下面是这位同学的自述,其中的我代表这位学弟本人:

一、土木转入计算机

二、秋招面试

  • 1、八股算法
  • 2、项目及面试
  • 3、实习
  • 4、其他

三、我的面经

  • 1、计算机网络&数据库
  • 2、C++、编译链接
  • 3、操作系统、Linux
  • 4、CPU

四、我用过的一些资料

五、关于学习的一点看法

六、最后结语


大家好啊,之前看了很多朋友分享自己的经历,今天我由看客变为分享者,也来分享一下自己这几年的学习、以及找工作的一些经验等等。

# 一、土木转入计算机

先简单介绍一下个人的背景:中流 985,23 届本科,前两年土木专业,后面转专业到计算机,因为大二下才转专业,需要多读一年,本科总共要读 5 年。

可以先聊聊我的转专业的经历,我们学校转专业不需要转出条件,只是转入有条件,也就是说不是那种得专业前多少才有资格转专业,每个人都有资格转,就是看对方是否要你。

我是大二转的,并且是前一个月才真正的下定决心转,为什么这么晚,原因有三:

一是对建筑仍保有幻想,

二是大学咸鱼没想过,或者更准确的说是没有勇气,不想去想,

三是好面子,因为转专业后会降级。

那个学期刚好疫情爆发,在家网课,待在家里是真的舒服,这种舒服要如何长久保持下去?

与父母仔细讨论了下,然后正视了其实自己一直知道的未来发展的问题,考虑了一周,最后下定决心转。

我们学校转专业要考数学英语,然后计算机要笔试 C++ 数据结构,然后还有面试机试,但因为疫情的原因,只有面试。

有好的地方也有不好的地方,好的是少了这么多要考的,坏的是我那时一直不太会说话,对于面试完全没概念没经验。

但怎么说,那几个月使劲儿的学,面试啊、算法啊各种准备,求大佬经验,最终还是过了。

然后就到了计算机,回顾我大学前两年读的土木,相当于走了两年的“弯路”。

为什么“弯路”打上引号呢?原因有二:

第一个原因:高考完填写志愿时,第一志愿其实就是写的建筑行业,我最开始的“理想”就是设计高楼大厦,逢山开路遇水架桥,但是大家都知道建筑行业的确不景气现在,再者家里没什么资本,不好也不敢一条路走到黑,理想败给了现实。

第二个原因:正是 2 年时间的浪费,让我明白时间的宝贵,让我明白了我到底想要什么,将来到底要做什么,算是及时醒悟,所以也不能完全算作弯路。

到了计算机这边之后,算是比较努力的,但也从来不敢轻易说自己尽力了,很努力了之类的用词。

感觉印象当中尽力或者说拼尽全力的努力只有三个时期:临近高考的时候,转专业准备那一个月,还有就是每次考试前两天。

出去这三个时期之外就是我转专业到计算机这边后的学习了。

平时大多数时候效率不高,但也有学,除了完成学校课业之外。

自己有花时间沉下心来去研究底层的一些技术,比如操作系统方面的,在这期间也有将学习的过程记录下来写博客,做公众号等等。

所以总的来说算是比较努力,稳步向前。

最终结果还行,工作方面找到了不错的工作,目前只面了一些公司,拿到了一个字节的提前批offer 以及 2 个小中厂吧,因为字节给的是基础架构部门的offer,让我很满意,也终于是感慨自己这一两年没白学吧。

下面就来说说我则会一两年的学习经历以及自己如何准备的,还有就是一些面试的经验吧。

# 二、秋招面试

目前来说,大大小小的面试大概有三十多场了,还是有一点经验了,简单来说主要有以下四个方面:

  1. 八股、算法,其实就是理解背,勤刷题
  2. 准备一个比较厉害的项目,并为每个项目做个简单的 PPT
  3. 面试时变被动为主动,想法设法的把面试官往自己的闪光点方向引,给面试官展示项目 PPT
  4. 找个好点的实习

# 1、八股算法

八股、算法,没多少可说的,就是看,理解,还有就是就是刷题。

特别是算法,没什么取巧的,力扣,牛客上面的高频题使劲刷,我目前力扣上是刷了 350 多道,相对来说是比较少的了。

面试一般没什么问题,但是笔试的话,唉,一言难尽,基本不会,这里就是反面教材了,还是要多刷些题,多总结。

八股的话,网上各种很多,秀哥的网站也很全,相当的全,但我这个人有点强迫症,想着最好自己再整理一番。

我的做法是,每个科目自己整理了三份 md(比较喜欢用typora),就比如说 C++:

  1. 第一个 md 里面就是网罗整理“所有”的 C++ 面试题/知识点,C++ Primer、Effective C++、侯捷老师视频 等里面重要的知识,看面经时遇到不熟没见过的就把它写进去。
  2. 第二个是不熟的部分放在另一个 md 里面,就像背英语单词,再弄一个生词本。
  3. 第三个是画思维导图把零碎的知识串起来。

基本后面我复习的时候都是直接看导图,拿着不熟的部分背一背,只要背熟理解了,应付基本的面试八股大概率没啥问题了。

# 2、项目及面试

对于项目,可得好好说说,我这次提前批上岸,算法八股其实都挺拉,基本上就是靠项目制胜。

一个比较牛逼的项目可以让面试更简单,可以让面试绝处逢生,柳暗花明

可能您觉得我说的有点夸张了,但至少对于目前的我来说,的确是这样。

我简历上有一个项目:计算机系统设计,名字取的有点“假大空”。

实际上我第一版简历上主要有两个项目,一个是“自研设计”操作系统,另一个 CPU 设计,后来一次与朋友聊天,他说他准备跟着东大的一个项目(CPU OS)写一写。

我就想,目前我已经简单的学习研究了 CPU 和 OS,何不也将这两者合二为一:“计算机系统设计”,于是项目介绍:希望在自己的 CPU 上运行自己的操作系统,逼格一下子上来了。

而这也的确是我后面努力的目标,准备作为毕业设计的题目。

都说程序员的究极浪漫,CPU、OS、编译器,三位一体,目前已经有牛人做了,比如我了解的清华有大佬做了这三位一体,这个大佬似乎是直博了吧,老师评价特高,然后说后来者可以加入网络、路由器方面的,做出四位一体。

现在其实也有相应的项目,比如国内的一生一芯,南京大学的 nemu,相当于一个纯软的实现,然后东京大学也有专门做这个的,设计了个超标量 CPU,移植 xv6,以及配套的一些编译链接器之类的。

emmm,扯远了,我目前就大概做了个 OS 部分,还有个简单的 CPU,这之间的各个方面兼容性的问题,都还没做,任重道远。

然后简历上就把这个写上去了,各个情况也说明清楚,另外将这学习过程记录下来,最后汇集成了一本电子书,自我介绍的时候就介绍给面试官。

基本上面试官都很感兴趣,然后就会让我介绍,这里就有个技巧:为项目做个简单的 PPT,方便展示,基本上面试官都会让我展示,做个 PPT 展示的好处多多:

  1. 有个 PPT,方便叙述,基本不会出现讲述卡壳之类的事情,也方便面试官理解你做的事情
  2. 展示 PPT,其实面试的主动权就掌握在了咱们面试者的手里,变被动为主动,方便应对不同情况灵活变化
  3. 最重要的一点,讲述 PPT 很耗时,基本讲完后,就没多少时间了,然后就会让我写两个题就结束,甚至全程聊项目不写题了,所以这是不是让面试变得简单了

而且只要项目真的过硬,即使其他地方没有考察到,面试官基本会给过的,至少目前对于我来说都给过了,除了百度的三面吧。

后来总结了下,倒不是出在项目上,而是投递的方向有些不相关,虽然是 C++ 岗位,但是 AI 平台,问了些 AI 的问题,这些确实不知道不了解,没办法了。

另外这个项目以及我那本电子书是真的让我绝处逢生过,其中有一场面试,问的很细节,深入道具体代码了。

我当时实在记不太清了,模模糊糊说我项目里面这么这么做的,他说工程里面不行,我就说目前这个项目还很简陋,这么做应该是可以的,结果我们两个可能有点“杠”上了。

然后他直接批评我说态度不行,还质疑我这些所有的项目是不是自己做的?是不是在网上找了个项目跑了跑就完事了?

说实话当时有一点气愤,虽然项目的确目前大多数是别人的,我最多算是复现,自己的东西有但是不多,但是我是真的很认真的分析了每一行代码。

前前后后啃了有半年,说我敷衍了事的确有些气愤。

最后我就解释说我做的工作博客都有记录,还有相应的电子书,您可以看看,然后结束了面试。

最后,我发现我格局小了啊,那个面试官气量大,给过了。

并且觉得我还不错,推荐给大老板加面,属实是我格局小了,老板大气。

但也从侧面体现出一个好的项目,只要的确有认真做事,面试官还是能看到,即是说今年环境不好,也还是会给我们机会。

上述就是我如何备战以及面试的一些经验,对于备战就是背八股,刷题,准备一个好项目以及PPT,面试时就尽量往这个项目和 PPT 引导。

# 3、实习

实习还是很重要的,我目前的面试基本上都是以实习经历和项目为主。

我们学校其实有实习,但因为疫情变成线上模式了,有些水,然后自己去找了个实习,我是在美团找的实习,找实习的准备基本上就是和找工作差不多了。

我当时找实习时投递的比较晚,都到 4 月了,基本没人要了。

那段时间四处碰壁,最后好在美团收留了我。当时想的是再准备准备,然后 3 月下旬投递。

结果好多没反应,所以能早投递还是早投递。然后给面试的公司又因为准备的不是很充分,还没有上述那样融合项目做个PPT展示。

还有的感觉答得挺不错,但面完就挂,反正各种原因吧,找实习的时候是挂麻了,过不了。

那段时间压力是真大,好在美团收留我,我最近离职前也申请了转正,不知道能不能过,emm 希望能过。

相对来说,我这次秋招找工作顺利许多,目前只面了 6 家公司的提前批,只有百度的三面挂了,3个过了,2 个排序等待。

百度挂了前面也说过了,主要问题还是出在方向不太对吧,当然自己实力不足也是原因。

所以这里想说的就是,我从找实习四处碰壁到秋招相对顺利的转变说明,多做准备还是很有效果的。

# 4、其他

有的朋友可能有自己在写博客,做自媒体公众号方面的东西,之前我有看一个朋友说这方面有加成。

但其实就我的情况,单说自己有写博客,有开源分享的习惯,基本没用,开头自我介绍提及,简历结尾标注网址都没用,面试官不感兴趣也不看。

但是换个方法,把写的文章做成合集弄成电子书,介绍的时候说,诶我有出过电子书,亲自实验,这个效果明显不一样。

有不少面试官感兴趣,自我介绍后就有面试官说:你出过电子书?看看呢。

或者在面试过程中,有相关的面试题你就把面试官往这方面引,我就在介绍操作系统的项目时候就把面试官往电子书上面引,他就会去点链接,看你写得文章博客,对你感兴趣,然后”给过

# 三、我的面经

聊聊面经吧,我平时主要使用的语言是 C++、面试时涉及的方向大概就是网络、操作系统、C++、MySQL、Linux 相关的比如常见命令之类的、以及一些杂项编译链接,ELF 文件格式之类的

# 1、网络、数据库

计算机网络方面,目前还没有遇到出格的面试题,具体的题目就不说了,看的八股里面都有,只是有些题目背的不太熟,还有些问法可能不太熟悉,一下子没反应过来。

MySQL 我直接说的有了解,不深,所以也没问什么出格的题,都是常见的八股,但奈何奈何没背熟,主要是学习的时间短,一些东西不理解,后面再好好补吧。

# 2、C++、编译链接

C++、编译链接相关,绝大部分八股上都有,不多说,说几个当时不太清楚的:

1.RVO 返回值优化

2.构造和析构过程中调用 virtual 函数,这个下来找了找是 Effective C++ 里面的东西,秀哥的网站上也有

3.共享计数的方法来管理资源,这个计数器应该放在资源一端还是引用(指针)一端,在 C++ shared_ptr 里面,有个指针指向一块内存区域,所以它们共享计数的方式是所有指针共享了一块内存。当时没理清这里,然后就讨论计数跟资源放在一起如何,跟引用一端如何,第三方又如何。另外还遇到过让模拟实现 share_ptr 的题,需要写出所有的构造函数以及析构,感觉涉及的要点还是挺多的,当时没“完全”写对。

4.聊链接时,因为想表现一下自己,动态链接说多了给自己挖坑,说了地址无关与延迟绑定,然后问钩子技术,不了解卒。

5.ELF 文件的一些细节,特别是字符串索引相关的,忘得差不多了。

6.编译型 解释型,有概念,但没说清,以前具体看过解释型相关的一篇文章,感觉里面包括的具体东西还是有点复杂,后面再好好学学

# 3、操作系统、Linux

操作系统、Linux 相关:关于操作系统,我八股基本没背,除了一些硬八股:调度算法、死锁等等,答案稍显固定的背了下,其他的都没背。

因为我项目中有操作系统,对于操作系统的基本原理我也很熟悉,所以问的问题我就按照项目所作,按照自己的理解来说了。

至于考察的一些题目,因为项目就是“做”了个基本模块都有的操作系统,操作系统大概 4 个基本的模块:内存管理、驱动管理、文件管理、进程管理,所以问题就主要涵盖这些方面。

比如启动的详细过程,如何判断启动盘,期间的实模式到保护模式,开启分页机制,然后引申到缺页异常的三种形式(交换,写时复制,延迟分配)等等

提到最开始启动的一部分代码是汇编、然后到 C,这期间的转变细节,有些遗忘,回答模糊。这地方其实有些复杂,关乎到 CPU 相对寻址,绝对寻址,变量处理的一些问题。然后引申到 汇编到 C 这期间应注意的问题,比如说全局变量如何处理,汇编一侧处理?C 来处理?(汇编)

内存管理部分:基本方式就是链表和位图,对于物理内存管理,项目用的最简单的空闲链表,然后引申到伙伴系统和 Slab 分配器;虚拟内存部分,自己项目里面进程虚拟地址空间布局,堆、共享区的管理,引申到 Linux 里面 mm、vm、线性区等等。

提到 Linux 里面 kmalloc 有什么特点,分配的物理内存连续,当时不了解卒。

驱动管理部分:主要就是中断相关,详细描述了按下一个键到显示在屏幕的详细过程,这期间涉及的部分有:键盘中断、键盘驱动(键盘中断服务程序)、显卡驱动。

DMA 工作原理,不了解卒

文件管理部分:描述分区布局,inode 目录 路径 文件描述符,描述文件系统调用 write read 的全过程,open close dup 等等所做的事情,软链接硬链接

文件系统的日志设计,针对写磁盘操作,使得磁盘保持一致性,原有项目设计的很简陋有写大文件溢出问题,让现场设计完善,没设计好卒

进程管理部分:“吹”/聊自己设计的进程、线程、协程,设计的进程间通信方式(除了socket),以及常见的一些问题:调度算法、孤儿僵尸进程的概念、怎么解决(wait函数),进程线程协程如何切换(重点是换栈),进程切换为什么慢(页表切换、TLB),特权级转换时内核栈用户栈的切换(x86下TSS段的ESP0,risc-v sscratch)

提到了 Go 协程,协程队列是否与某个线程关联等等问题,不了解卒

Linux 进程相关,如何找到出问题的进程,通过 ps 命令啊什么之类的

另外有个公司大老板问设计模式相关的问题,直接不太熟,卒,说我既然要设计操作系统,设计模式这本书得好好看看才行,我:嗯嗯嗯嗯嗯。

其实设计模式我看过,真只是看过,一些东西没理解,然后隔了好几个月基本忘完了,感觉面试基本不会涉及,我也就没准备,看来还是得找个时间细细研究下。

# 4、CPU

项目有个简易 MIPS CPU 设计,所以也涉及了一些 CPU 相关的题目,感觉很少遇到这方面的面经,这里把遇到的说一下:

1.流水线机制,谈理解

2.相关性问题:结构相关(哈佛、冯诺依曼)、数据相关、控制相关

3.精简指令集、复杂指令集的特点区别,有点八股,当时没背,就天南地北的说,从 risc-v 和 x86 谈中断、谈寄存器、谈分段分页等等

4.设计 CPU 之前的环境搭建相关的,交叉编译、Jtag 等等,因为是学校的项目,所有的前置环境都弄好了,这些全然不知,懵逼卒

5.与上层软件的兼容方面,因为前面夸下海口了要在自己的 CPU 上运行自己的操作系统,emmm 直接说还没做,还不是很了解,任重道远

6.Cache 相关,Cache 一致性,另外内存一致性,原子操作等等,内存一致性还没完全搞明白,只知道一些基本概念。

我面试遇到的基本上就这些问题吧,秀哥的网站很全,那也是他当初的学习笔记,怪不得秀哥能拿到字节SP,真的是有两把刷子的。

另外如果某些方向自己有研究,有自己独到见解,就不用去背八股了,按照自己的说就行,背八股只是我们对于不是很熟悉的知识一种无奈的做法,其实感觉有一些限制住思维。

当然我这里说的是那种”软八股“,对于一些硬性知识点,那就直接理解着背就行。

面试官估摸着也更喜欢听我们说说自己的见解,我面试时就遇到过面试官夸奖说你这理解的还不错,有自己的看法。

# 四、我用过的一些资料

这里贴一贴我学习时的一些资料;

八股来源:秀哥网站、以及网上,牛客等地方搜罗出来的,全部整理到自己的文档里面

C++:C++ 就是那几本书吧,《C++ Primer》、《Effective C++》 然后就是侯捷老师的视频,编译连接方面看 《程序员的自我修养》、还有些网站:我最常用的 cplusplus.com:https://cplusplus.com/reference/,另外还有个cppnsights:https://cppinsights.io/,这个网站让你看清写的 C++ 代码本质

算法:leetcode、牛客、还看了些 acwing、OI Wiki,前两个刷题,后面两个也有题,有些讲解文章不错

网络:《图解TCP/IP》、《图解 Http》、小林的博客、《TCP/IP网络编程》《Linux高性能服务器》

数据库:学的不好,基本上就看了《MySQL必知必会》《MySQL是怎样运行的》《Redis设计与实现》,还没完全消化

操作系统相关:

1.一些书籍:《操作系统真象还原》真正领我入门的一本书,《Linux 内核完全解析》相当于 Linux 0.1 的注释,《深入理解Linux内核》当作手册查询

2.代码相关:mit 的 6.828,《操作系统真象还原》配套OS代码, 清华的 rcore:http//rcore-os.cn/rCore-Tutorial-Book-v3/index.html,ucore,Linux 0.1,胡自成大佬的 BookOS, 前面两个我有仔细研究过,后面的是遇到一些问题时当作参考,触类旁通嘛。其中 mit 的 xv6 和 清华的 rcore 都有讲义,值得一看。

3.学习过程中需要的各种手册比如 i386、磁盘、risc-v 等等,整理了一部分在这:https://pan.baidu.com/s/1PruOGM9CFMQq8Fca6aQCMw?pwd=rand。

4.最后就是自己写的关于操作系统的电子书,目前是第一版,基本上都是 xv6 本身的东西,将 xv6 完整的捋了一遍,写了本电子书,并为其代码写了详细的中文注释,项目地址:GitHub:https://github.com/Rand312/xv6。

这个项目地址只涉及了 x86 版本的 xv6 本身的东西,目前我已经在其上做了很多其他的东西,比如一些高级功能、三种缺页异常、线程协程、调度等等,以及不同架构 risc-v mips,都有简单做,但还没更新,后面有时间再慢慢弄。

5.最后 CPU 本身设计方面,主要就是我们学校老师自己的书籍:《计算机系统设计-基于FPGA的RISC处理器设计与实现》

# 五、关于学习的一点看法

这里分享一些自己学习计算机的感悟,对于一些比较出名的大黑书,比如说 CSAPP、现代操作系统、体系结构等等,我自己的感觉不建议拿着就啃,这些书没有一定的基础看了基本白看,一些东西看了还是不懂。

就拿 CSAPP 来说,涉及了很多方面,但每个方面其实也不是特别深入,属实让人有点摸不着头脑,比如:

  • 讲编译链接的部分不如去看《程序员的自我修养》
  • 异常虚拟内存等东西不如直接去看《操作系统》
  • 网络编程不如直接看《TCP/IP网络编程》,

《现代操作系统》更是纯理论,不如直接看OS源码来的实在。

当然并不是说这些书不好,只是说一开始就啃可能是不太好,把它当作总纲,等学到一定程度时再回头看可能更好,会有着一种明悟。

最近我有看《C 程序设计语言》大致就是这种感觉,《C 程序设计语言》也有点总纲的感觉,里面其实涉及了很多东西,每次看都有不同感悟。

当然这只是个人看法,怎么学还是看自己,合适自己的才是最好的。

这里推荐几个很牛逼的项目,如果能跟下来绝对收获很大:

  • 1、南大的 nemu,其配套实验我目前是目前做完了,这个项目很厉害,相当于纯软的形式设计了个CPU,然后上面还有个OS,还有存储之类的东西,有时间可以从前至后好好捋一下。
  • 2、国内的一生一芯计划可以去了解下,也是很不错的项目,我看到秀哥星球里就有小伙伴在跟这个项目。
  • 3、东京大学的相关项目:有CPU 有 OS 还有前端演示,太特么的牛逼了,我也是准备着试一下,希望能搞出来。
  • 4、胡自成大佬,这位大佬也还是本科,自己做的OS很完备了,大家可以看下,这是链接:http://121.43.99.128/,另外他在 B 站也有账号:我叫小骨头,可以去膜拜。

# 六、最后结语

要分享的大概就这么多吧,希望对大家有所帮助。

感觉我的分享可能还是有点用处,特别是为项目准备个PPT展示,亲自实验效果很棒,这个方法其实也是我实习的时候一位老哥给我说的,给我分享了一些经验之谈,很感谢他。

秀哥在我求职的过程中提供了许多帮助,这篇分享也主要想要回馈秀哥,感谢秀哥在我求职期间提供的帮助。

就连我的简历都是秀哥改的,他给我改了好几个版本,我面试时就有面试官说我的简历写得很清楚,能够很好得方便他们了解我

后面的几个月的时间,我打算打算去试一下考研,冲一冲更好的学校,大学读了几年也还是去考一下,不尝试考一下感觉不得劲儿。

所以我的秋招之旅大概就到这结束了,除了再面一面最近开的一些大厂,但不出意外的话基本就会去字节了,方向感兴趣,大老板还是学长,除了地点在北京可能稍微不适其他都很满意了。

过完这几个月之后,大概就是全力准备毕业设计,就是完善搞定那个项目,目前还有很多问题没有解决,希望在毕业之前能搞一个粗胚出来。

最后希望大家在这秋招也都能找到称心的工作,准备考研的都能顺利上岸!