日常随笔-4-万字面经教你如何拿大厂offer(非科班)

工作经历

最近换工作,先说结果吧,拿到最高的是的年薪40+,权衡之后选择了腾讯offer,其中也有要23k觉得要多了的,主要是上一家base太低了,有时候自己都不敢要太高,现在想通了,我来面试,通过了凭什么要拿上一家的base来压我,说出来不怕笑话在上一家年薪21+,哎,一言难尽。

回想起从毕业到现在也4年了,当初毕业的时候不是Java开发也不是计科出身,也没参加过培训班(我个人非常反感培训班),只因偶然的实习走上Java开发这一条路。大学没有好好学习,参加工作以来,也是走过一些艰辛的道路,回想大学刚毕业那会,错过了校招,拿到学位证后来了广州。

第一份工作

毕业后花了两个星期,找了一个做期货交易系统的公司做了廉价劳动力,当时试用期工资4.5k,转正后5.3k。在这里用的是Java语言开发,用的框架是SSM,这里早上8点50打卡,下午5点半下班,加班需要提申请,所以基本不加班,午休两个小时。

这里的工作主要是维护一个开户模块,可以理解为用户注册,只是这个注册会稍微复杂一点,系统是早就做好的,改动也非常小,记得有一个月都没有写过一句代码,当时,在这里大部分是时间是看书,在这里我看完了《Java编程思想》、《Java并发编程实践》、《Effective java》接触的框架东西少一些,数据库基本都是用到才去查。

工作半年后,忽然觉得,这就是我未来的生活吗?想出去了,但是怕出去了简历会黑。没想到的是,8个月后,公司受政策影响,业务收缩,公司裁员,大多数毕业生首当其冲成了第一批优化人员。据留下来的同事说,最后基本只剩下20%左右。当时感觉很沮丧,虽然自己想辞职但是现在被裁员,感觉自己能力不被认可,现在才觉得,年轻的时候根本不需要怕裁员,特别是自己本来就要打算走的时候,拿着N+1走,岂不是美滋滋

在这里主要的收获主要是了解了在实际开发过程中的流程,从产品的需求提出->技术评审->设计->开发->测试->部署->维护一整套流程的熟悉。还有就是spring mvc框架的使用,以及看的那几本书

第二份工作

找第二份工作的时候,想来深圳,因此当时人在广州,那时候还不流行电话面试,很多面试都要现场面试,所以每次都是早上坐车从广州到深圳然后去面试。第二家工作的公司是一家做互联网金融的公司。

第一阶段,刚进技术团队的时候做的工作是将一个外包系统从外包公司手中完全接手过来做二次开发,整个过程压力也比较大,很多人都应该知道外包系统问题很多。日志不规范,很多重要的信息没有打印出来,导致出问题的时候多半靠猜然后去验证,因此在第二份工作中首先提升的就是解决问题的能力。见识了不少问题,数据库死锁,服务器假死(JVM垃圾回收导致)、数据库崩溃(因为一个表数据增长很快但是没有建索引)以及事务问题。每一次解决问题都是对自己的一种提升,会逼着去学习很多知识。主要工作还是稳定线上的环境,这样技术团队才可能抽时间去解决其他问题

第二阶段,经过前一阶段的努力,线上问题终于少了很多,这个时候核心团队也陆陆续续进来了一些新人,这个阶段应管理层的要求工作的重心开始转移偏管理方向,但是我个人并不是十分愿意,因为我觉得我的技术经验并不是很足,这个时候应该做更多编码工作。但是技术团队缺人,也只能先硬着头皮顶上。在这个阶段,开始考虑这个外包系统的重构,这个时候已经很熟悉业务,为了重构的工作能顺利进行,这个阶段学习了很多spring cloud、MQ、Mongodb、mysql的很多知识,也开始从事一些系统的设计和统筹工作。在这一阶段中,主要学到的东西一些技术框架和中间件以及数据库的选型的知识,也学到一定的系统设计经验。在团队中Leader很推崇DDD的一套,也在开发过程中实践了这一套东西,参考数目《领域驱动设计》。

在这家公司的时候,因为平时遇到一些问题,已经开始意识到基础知识的重要性,遂开始补基础知识。操作系统方面选择的《现代操作系统》第四版,算法和数据结构的主要是《算法》红色的Java描述、还有更理论化的《算法导论》看这些东西的时候感觉还是很抽象,特别是操作系统,有些概念真的很难理解。真羡慕科班出身的

第三份工作

因为第二份工作的薪资远不及自己的期望,并且感觉团队已经到了技术天花板,自己继续待着很难有更好的提升,想了很久之后还是决定整理行囊,重新起航。遂入职了第三家公司,第三家公司做的业务还是互联网金融,主要做引流,就是贷款超市之类的业务。进公司时,整个系统的架构已经完整,更多的是迭代的开发,技术架构依然采用的微服务的架构,粒度的话已功能模块划分,整体30多个微服务吧。

在这里提升主要还是对框架以及各种中间件的使用。对于技术,开始有一些自己的思考,不在像当初对于新技术的无脑推崇。特别是经历过两段微服务系统的经历后,越来越觉得微服务不是银弹。在很多场景,采用微服务不仅不能达到预期的效果,反而会给技术团队带来更多的问题。在这一家公司的时候还好,因为有专门的团队在做CI/CD,如果小公司没有这样的团队,采用微服务后运维的复杂性也会提升,虽然现在采用Jenkins也很方便,但是要做到柔性下线还是比较困难。反观单体服务,其实还是有很多好处,无需考虑分布式事务问题,运维简单,服务调用简单问题排查容易。很正常一般工作几年后见过的系统多了一些之后就会去思考当初的设计是不是合理,如果现在再去设计,自己会采用什么样的方案

第二个提升更多是开发流程的规范,对于一个项目的生命周期有了一定的新的理解。

第三还是觉得基础很重要,又拿出了操作系统的书看了一遍,这次也看了一些计算机网络,这一阶段对数据结构和算法的学习主要是有空就刷Leetcode上的题目,目前刷了300多道吧。在这个阶段自己也开始学习分布式系统的基础知识

面试准备

面试知识准备

找工作之前,自己要先给自己一个定位,是想进互联网大厂还是传统公司、中小型创业公司。因为这两种公司面试的套路完全不一样的,考察的知识点也是不同的。当然也有些小公司很喜欢采用大厂的套路,中小型公司更看重候选者的对各种框架的理解和使用经验。这里只是列了一个大纲,后续的文章我也会陆续写一些专题供大家参考

  • 大厂面试知识点
    1. 操作系统是免不了的,基本都会问
    2. 计算机网络,像什么TCP协议、HTTPS协议等这些必问
    3. 数据结构
    4. 算法
    5. 常用开发语言的基础
    6. 系统设计
    7. 数据库,必须要了解索引的实现、MVCC、各种锁以及优化的原理
    8. 如果你简历中有redis,那么我建议你至少要看一遍《Redis设计与实现》
    9. 你简历中的项目,以及你们设计的依据,设计的不足以及改进
    10. 如果面试的岗位是需要转语言,可能对你使用语言的框架考察会比较少
    11. 灵活的脑袋,面试过程中很可能遇到不会的东西,面试官很可能会给你讲基本概念,然后让你推导某些结论
  • 传统公司、中小型创业公司
    1. 相对大厂面试,对于计算机的基础知识考察得相对少些,也不是说不考
    2. 对框架的原理理解和使用
    3. 对各类中间件的原理理解和使用
    4. 简历中的项目
    5. 常用开发语言的基础(比如Java的集合、并发、JVM等)
    6. 如果你面试的公司和你简历中项目类似,可能会被问业务相关的知识
简历准备

简历很重要,即使你技术再强,别人却不认识你(当然,网络知名技术大佬除外),只能通过你的简历判断,所以一定要写好简历。写简历也要有技巧,要避免通篇的文字,筛选简历很累的,我在上一家公司准备走时,组里要招人补充,期间帮忙筛选过简历,有时候HR给过来的简历多达几十份,看到字多的根本不想看。

  • 尽量用最少的文字要突出重点
  • 多用定量的指标来展示自己在项目中的贡献,比如你的项目用户量是多少,并发是多少。如果你做了数据库优化,可以用前后查询时间对比。
  • 尽量真实,不要夸大,避免给自己挖填不上坑,也可能影响后续的背调
预面试

在去面真正想去的公司之前,要先出去找一些公司来做一些实战演练。

  • 一来可以检验你的知识掌握度
  • 二来可以了解一下目前的面试行情
  • 最重要的是练自己的嘴巴以及去适应面试环境,因为今年疫情之后很多公司都是电话面试,有些人可能刚开始不是很习惯,有些公司是要求写代码,因此可以提前习惯非IDE环境下写代码

面试经历

平安面试(产险)

猎头推荐,时间有点久了,当时也没有记下来

  • 一面,电话面试,大概30多分钟,主要考察的是Java基础知识和Redis
    1. 自我介绍
    2. HashMap
    3. ConcurrentHashMap
    4. sychornized
    5. 用过的redis数据结构
    6. redis持久化机制
    7. 有没有做过mysql优化,如何优化的
    8. 其他忘记了
  • 二面,电话面试,也是大概30多分钟,在公司随便找了个空的会议室面的
    1. 自我介绍
    2. 简历中基础服务短信服务是如何处理错误的,一开始没怎么理解,我问了面试官,这里的错误是指业务返回的错误还是通信异常,面试官说都说一下,balabala了很久这个问题
    3. 简历中的某一个项目的架构设计是怎么样的
    4. 简历的项目中引入redis解决什么问题的
    5. 因为我简历中写了优化报表查询,问了我如何进行mysql优化的
  • 三面,电话面试,HR面,一些常见的问题,比如在项目中学到什么、抗压能力等。结果没有然后了,不知道什么情况,可能我说期望的团队是敏捷开发团队和平安的文化不符吧
360健康

Boss直聘上投的,这一家前两轮技术面试还好,第三轮说是事业部负责人,但是全程问的HR问题,加上全程面无表情的脸以及问问题的谈吐着实恶心到我了,当场想走人,我又不是求着你给我工作,再说我面试通过也不一定去,一副高高在上的样子,刷新了我对360的认知,这辈子都不会去360面试

  • 一面,电话面试,约的晚上,面试官人不错,只是面试题目时间有点久,大概记得都是Java的常规题目,具体不记得

  • 二面,电话面试,好像也是晚上,面试官人不错,

    1. 谈软件工程的思想比较多,因为我在上上家公司做过重构,因此在重构微服务划分以及数据库选型讨论的多一些
    2. 对Spring的理解,主要从spring解决的问题方向一步步区阐述的
    3. 最后面试官详细的介绍了他们的项目以及2021的项目规划,其中也讨论了一些未来需要做的技术方向以及团队情况
  • 三面,重点来了,从业以来,第一次面试遇到这种人刷新了我对他们公司的认识,如果她真是事业部的负责人,那么这种公司不去也罢,虽然技术问题我不记得了,但是她的各种奇葩问题我至今都难以忘怀,HR和我约的上午9点半,我一大早起来怕迟到,到了之后发现HR在上海的,不在深圳分部,然后叫我在楼下等了一会儿一个看着像搞技术的人把我领上去了在一个有一张小桌子的休闲区等待,接下来就是无尽的等待,如果我不问HR,可能我会在这里坐一上午也不会有人来问我是来干嘛的吧。我等了40分钟后忍不住问了HR说要是面试官不方便我就先回去了,另约时间吧。她说面试官在开会,她去问一下,你要开会那你就不要约面试啊,你开会拖一下很正常,但也不会拖40分钟吧。然后我等了快50分钟的时候来了一个中年女人,上来面无表情的说一句不好意思,没介绍她自己,所以我不知道她是负责人还是HR,所以我不知道我那一次面试属于哪种面试,然后开启了她对我的各种拷打,各种灵魂质问,下面就是她问的一些问题

    1. 看你工作5年不到,换了三家公司,为什么换这么频繁呢?答第一家公司受政策影响,裁员,并不是主动离职,第二家公司薪资低并且感觉自己技术很难有大的提升,第三家公司是因为业务重组被调到边缘部门

    2. 听了你的介绍,你觉得自己很优秀,你凭什么觉得自己优秀呢?把在上上家工作经历详细介绍了一遍,如何从外包手里接手过来,然后稳定系统后,带领技术团队重构。

    3. 你如果真的像你说的那么优秀,为什么你离职公司不挽留你呢?答挽留了,但是觉得自己在那里主要是薪资低并且感觉自己的技术在团队里触及到了天花板,很难有大的提升,并且如果最后因为加薪就留下,传出去以为我用离职来要挟公司加薪,在上家公司离职原因是业务重组,被调到一个边缘部门,所以选择离开

    4. 抓住了上家公司,接着问,你真的像你说的那么优秀,为什么你提出离职的时候,公司没有把你调到其他核心项目组呢?答,公司的各个部门都是有人员编制的,并不是说想换就换

    5. 听了你的描述,你的意思是公司要将就你?我问,什么意思?她补充到,你不是说了吗感觉自己技术没有提升就要离职,在上家被调到边缘部门就要离职,公司本来就是很多工作都不能提升自己的,你的意思不就是公司要将就你个人吗?这个脑回路我真的是服了,合着我们无产阶级就应该被压迫,是吧?即使做得再难受也得忍着,是吧?薪资再低,公司让你干啥就干啥,即使你再不情愿你也得干着,不能离职,是吧?听了这番描述的时候我当场想走了,出于对别人的尊重,我忍住了,但是已经不想回答任何问题,后来出来了之后回家的时候想,我真是傻,别人都先不尊重我还想着尊重别人,脑子被驴踢了

    6. 你以前从事的互联网金融行业,现在想换互联网医疗行业是为什么呢?我觉得互联网医疗未来前景应该不错,中国医疗紧缺,短时间不可能补充新的医生医院,但是可以利用互联网提升医疗行业的效率,经过这次疫情,国家应该会扶持互联网医疗

    7. 你凭什么觉得自己换了互联网医疗行业,自己可以做好(请允许我说脏话MD,又来了凭什么),我讲述了自己在上上家之前也没做过互联网金融,进入公司之后,短短时间内就熟悉了互联网金融的业务知识,并且可以说是在公司最艰难的时候帮助公司度过难关,我有信心做得好互联网医疗

      最后想说的是,你在面试别人的时候别人也在面试你的公司,经过这次后,我已经将360永远剔除出我择业公司选择。也许是我来面试打断了她的会议,也可能是她在会议被批了,但是作为面试官,我觉得你是公司的牌面,做生意都讲求买卖不成仁义在。何况你全程一副司马脸,我一点面试的心情都没有,我只是来面试的,我不是你的出气筒更没有义务让你解气。如果你们看重别人换工作频繁,可以在招聘信息中像JD那样写明5年不超过两家,那我简历都不会给你们。

腾讯PCG事业线

boss直聘上hr要的简历,简历处理还是比较效率,很快就有面试官联系约面试时间,基本都是约在晚上,面到第四轮,最后未通过,说实话第四轮面试没通过有点冤枉,可能越到后边越是在乎导致回答的时候畏首畏尾,本来自己擅长的东西结果完全没有get到面试官想问的点,而且这个组也是我很感兴趣的方向,只怪自己没有把握住机会。其中问的还是有很多比较好的问题,在这里分享给大家,当然时间有点久,当时也没想到要分享出来也没有面试后记录笔记,凑合着看吧

  • 一面,腾讯会议面试,时间大概80分钟样子
    1. 自我介绍
    2. 针对项目的一些提问,我的主要是问项目中引入的一个分布式事务中间件Seata,然后面试官说感觉我们的项目不需要用到seata,回答了用seata的原因,主要是事务有实时性要求,并且项目已经稳定不想大量改动代码。接着问了一些分布式事务原理2PC、TCC
    3. Java中锁体系(主要介绍了sychornized、AQS原理以及通过AQS实现的ReadWriteLock和ReentrantLock,附带讲了一些JDK1.8加入的乐观锁)
    4. JVM垃圾回收算法(主要介绍了CMS中,年轻代的标记复制算法和老年代标记清理和标记整理)
    5. JVM垃圾回收器执行大致流程(主要讲了初始标记-并发标记-重标记-清理)
    6. Java中并发容器
    7. 操作系统进程和线程
    8. 说说虚拟内存
    9. TCP协议三次握手和四次挥手,以及原因
    10. 手写代码(腾讯会议共享文件里写)
      1. 100个线程,id是顺序编号,用擅长的语言实现各个线程按id顺序输出自己的id(利用了wait和notify解决)
      2. 给定几个字符,输出它们的全排列(回溯法解决的)
  • 二面,腾讯会议面试,时间大概70分钟
    1. 自我介绍
    2. 针对项目的一些提问,我的主要是问项目中引入的一个分布式事务中间件Seata,然后面试官说感觉我们的项目不需要用到seata,回答了用seata的原因,主要是事务有实时性要求,并且项目已经稳定不想大量改动代码。接着问了一些分布式事务原理2PC、TCC
    3. Java中有哪些锁
    4. ReentrantLock、ReadWriteLock和StampedLock使用场景
    5. 一颗500个节点的完全树有多少叶子节点,当时自己有点懵懵的,一下子忘记怎么算,面试官说你可以在纸上推导一下,结果搞了几分钟算出来了
    6. 知道哪些排序算法
    7. 快速排序的时间复杂度是多少,为什么时间复杂度是这个
    8. 数据库的索引有哪些常见的数据结构
    9. B+Tree的时间复杂度是多少,这个问题也是懵逼了,最后自己推导出来的,忘记了节点内的key是有序的可以用二分查找,被提醒后才明白
    10. 为什么数据库选择B+tree做索引(围绕着减少磁盘随机IO回答)
    11. HTTPS协议的握手大致流程
    12. 算法题目(腾讯会议共享文件里写),矩阵的最长递增子序列Leetcode329,刚开始用dfs解,面试官问可以优化吗?我说可以加备忘录,改了一遍
  • 三面,腾讯会议面试,时间大概60min
    1. 自我介绍
    2. 选择一个自己熟悉的项目在draw.io上画出架构图
    3. 项目中采用的分布式事务中间件从发现问题到最后采用这个中间件中间过程经历了哪些流程,你在这个过程中充当什么样的角色
    4. redis为什么用单线程处理事件
    5. 熟悉IO复用吗,讲了select和epoll
    6. redis的持久化机制
    7. redis是如何故障恢复的,主备间如何同步数据,这里的时候忘记了,后来面试官问如果是你,你会怎么做,回答了利用rdb文件恢复,然后rdb备份之后的变动通过aof的日志来恢复
    8. 你说你项目中用redis来解决接口的幂等,如果并发不高的情况下用数据库怎么做幂等?回答了新增操作可以用唯一索引,如果是更新操作可以用乐观锁,详细的介绍了一下乐观锁
    9. 算法题目
      1. 一个矩阵,每个矩阵中有一个数字,从左上角出发到达右下角,每一次移动可以上下左右四个方向移动,不能出界,求经过路径和最小的路径有多少条?这个题目想了一会,自己想用递归方式解决,但是发现并不是每个点可以从四个方向移动过来,递归走不通,后来面试官又出了一个简单的
      2. 求一个数的开方数,精确到小数点6位,这个比上边的简单,采用二分法
  • 四面,腾讯会议,自己傻逼了
    1. 先做了个题目,利用数组构建一个环形缓冲区
    2. 10亿个数和1亿个数求交集
    3. 熟悉红黑树吗?从这里开始傻逼了,居然回答了解过没实现过,真想抽自己嘴巴,其实后来觉得面试官肯定不是想真的问你熟悉吗?而是想听你讲一下
    4. 秒杀系统和普通业务系统有什么区别?又傻逼了,我真的是列举了区别,后来想想,其实肯定是想问的系统设计,我说完区别后,面试官问没有其他想说的吗?我说大致就是这些吧。系统设计的东西一点没有讲,其实就是想问既然和普通系统不同应该如何设计一个秒杀系统,完蛋了
    5. linux下如何查看进程打开的文件句柄
    6. linux如何查看某个端口被哪个进程占用
    7. 面试官问你有开源项目吗?这里就知道自己完蛋了
顺丰

顺丰面的岗位是一个供应链金融和保险业务,技术面试是三轮,第三轮是去现场CTO面试,最终给的offer20k

  • 一面、二面,电话面试,大同小异,都是常规题目,具体时间太久记不清楚
  • 三面,现场CTO面试,因为CTO比较忙,所以没有面试多长时间,也没有反问环节
    1. 常规自我介绍
    2. 讲一下最近做的项目的技术架构
    3. eureka和consul的区别
    4. 如果eureka服务端挂了,服务A还可以调用服务B吗
    5. eureka的自我保护机制
    6. 项目中feign的各种超时时间怎么设置的
    7. 项目中服务熔断和降级怎么做的
深信服科技

深信服面试一共三轮,两轮技术面,一轮HR面,流程很快,两个星期不到拿了offer,我的期望是23k,结果对方给的28.8k,这个是唯一一个没有觉得我期望高的,并且也没有拿上一家的薪资压我的,从这一点上来说,深信服还是很不错的

  • 一面,电话面试,时间大概40min
    1. 自我介绍,主要简单介绍了工作经历、项目以及在项目中担任的角色
    2. 选一个项目详细介绍
    3. redis在项目中主要用来解决什么问题
    4. redis的分布式锁原理,和Zookeeper的分布式锁区别
    5. redis除了分布式锁还用过哪些功能,问了一些底层的数据结构
    6. 了解哪些并发容器
    7. ConcurrentHashMap是如何做并发控制的
    8. 讲一下Java中Synchronized关键字
    9. 因为我简历中有写报表优化,问了Mysql优化是怎么做的
    10. 知道哪些排序算法
    11. 讲一下快速排序算法过程
    12. 知道操作系统IO复用吗?讲一下你所了解的
  • 二面,视频面试,给了一个网站,上边有4个题目,大概就20min左右吧,题目做完就面试完了
    1. 链表的形式,其实是考察java是值传递还是引用传递的问题
    2. 也是链表形式,将两个链表交叉处理
    3. 写一个方法判断两个链表是否相交
    4. 一个字符串包含字母、逗号、空格,统计出现的单词词频数,问了面试官,可以用String的方法,用了String的分割函数写了个正则表达式分割
  • HR面,也是一些常规问题,在之前项目中担任的角色;解决的最难的问题,解决的过程,最终的效果,得到的收获;你希望加入一个什么样的团队
腾讯PCG事业线(另一个部门)

信息流推荐系统架构开发四面没过,一度怀疑自己能力,进入了自我否定时期,觉得自己真的太菜了。隔了几天boss直聘上又有个哥们叫我投简历,我说我已经面过腾讯四面挂了。他说不影响,可以试试他们部门,想了想,面不上也没啥损失,又去试了一次,因为此时已经拿到一些offer,所以也没那么大压力

  • 一面,这个一面感觉是全组出动,有3个面试官来问了问题,一个偏向基础,一个偏向项目(女面试官),一个考算法
    1. 先做了一个题目,判断一个字符串是否可以通过子串重复来生成?想了想没想出什么好办法,暴力求解
    2. 自我介绍
    3. jvm的内存结构有了解过吗
    4. jvm垃圾回收算法
    5. jvm垃圾回收器有了解哪些?能详细说介绍一些CMS回收器的流程吗
    6. 能挑选一个你觉得非常熟悉的项目详细介绍一下吗?可以从架构、业务逻辑、技术难点几个方向介绍
    7. 你说用redis来防止重复提交,是如何做的
    8. 你们系统有限流吗
    9. 你知道的排序算法有哪些,它们的时间复杂度是多少
    10. 你可以详细讲一下快速排序的过程吗
    11. 如果不用递归方式,你会怎么实现快速排序
  • 二面,三面,因为时间比较久了,很多题目都不记得了,面试官问之前面试官有让写算法题目吗?我说之前面的一个部门四轮每轮都有写,这个部门上一轮也写了,后来他说那就不用写了,后来也问了面试官面试的流程大概多少轮面试,面试官说至少4轮技术面,其中有交叉面
  • 四面,GM面,这一轮面试时间拖了很长,导致我以为没有然后了,就去一家公司入职了,入职一个星期后HR又联系我说GM太忙了很难约到面试时间,第一个定了一个后的时间,结果面试前一天HR打电话说GM临时有重要的会,改一下时间,又延后了四五天,不过面试官问的问题非常经典,尽管当时我回答的不是很好,但是我下来晚上回顾的时候,突然间感觉来了,把存储引擎、缓存、Hadoop的思想、redis集群思想、以及mongodb的负载均衡思想和一致性哈希都串起来了,以及利用reft协议去详细思考如何设计一个高可用、强一致性,动态扩容,数据自动负载均衡的key-value数据库,当然只是谈大致架构思想,我觉得太经典了,以至于我想之后单独写一篇文章来讨论。也会在那一篇文章中简单介绍面试中如何应对系统设计题
    1. 如果让你来设计一个key-value的数据库,数据量10亿条记录,每条记录100kb,你会如何设计?说实话,当时面试还是感觉有压力的,因此我觉得并没有设计出一个完整的数据库,只能算设计了一个存储引擎,也是比较粗糙的设计,利用日志结构的文件系统思想,将新增和修改都当成日志顺序写入文件尾部,然后内存中用hash结构存储key对应的最新文件位置。对于文件中的垃圾数据,用定时任务去定期合并文件清理,释放磁盘空间
    2. 为上边的数据库设计一个缓存,你会怎么设计?这里主要采用hash+双向链表结构,然后补充了mysql innodb缓冲池中用到的分代的LRU优化感觉用在这种数据库缓存中很有用,因此详细讲了如何利用分代思想来优化LRU避免遍历数据表数据导致的热点失效问题
    3. 为上边设计一个索引,如何要支持范围查询,B+Tree
    4. 一个机票系统(高并发)需要调用一个第三方服务(支持高并发,但是延迟很高),这个场景我确实没见过,回答了两个方案面试官都否决了
    5. 设计一个防止发生死锁的方案,主要从死锁的四个条件出发,尝试打破这四个条件中任何一个,具体详情可以看我之前总结的操作系统-死锁章节

总结

如果你想进大厂,一定要提前准备,

不要裸辞

不要裸辞,不要裸辞,不要裸辞,重要的事说三遍。我就是一个活生生的例子,因为大厂流程真的很长,我从收到腾讯口头offer到最后收到入职指引都花了两个星期,offer审批要一个星期左右,背调一个星期左右

简历一定要真实

大厂的背调很多都是第三方背调公司在做,一旦发现简历作假,那以后也没法再进这家公司会被列入黑名单,入职时间和离职时间一定要和你的离职证明对的上。

心态要调整好

很多时候面试没面上不要怀疑自己,大家工作几年之后,除了混子,其实该会的也都基本会,有时候只是你的技能和他们公司不匹配而已,不代表自己技术不行

最后祝愿大家都能找到自己满意的工作,想学习计算机基础知识,又觉得看书时间少的同学可以关注微信公众号“程序员学知识”或者扫下边的码,历史消息中有总结了操作系统的知识,对付面试应该是够了。算法的话我只刷了300多道题目,也在github上,如果有想看的话,可以私信我,或者公众号发送“算法github”,里边有些题目写了简单的思路,只是我为了防止自己忘记加的。我是算法菜鸟,不要拿什么难题来问我,简单的大家可以探讨一下。

日常随笔-4-万字面经教你如何拿大厂offer(非科班)_第1张图片

你可能感兴趣的:(问题随笔,编程经验)