上海疫情数据:得出10项颠覆性结论

网友们越来越神通广大了.......

母子乱伦:和儿子做了,我该怎么办?

2021年推特网黄Top10排行榜

​突发!长江存储、上海微、寒武纪、兆芯等36家被列入“实体清单”

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

入职腾讯音乐,我是这么准备的!

程序员Carl 代码随想录 2022-10-13

作者:程序员Carl

代码随想录网站:https://programmercarl.com

为了准备暑期实习面试,可以充分到什么程度?

这位录友在知识储备量和学习方法上,还是挺让我吃惊的。

也不由让我感觉目前求职真的卷,准备的如此充分 才能找到大厂实习,感觉和秋招都一个水平了。

他下面的分享中,关于计算机基础的学习方法讲了很多大家疑惑的点,例如:

  • 是上来就看八股文,还是看书?
  • 看书有怎么看?
  • 看书的角度是怎么样的,重点在哪里?
  • 遇到不理解的怎么办?

特别是他学习mysql,redis的过程,其方法非常值得大家参考。

学类似的技术,可以并行的学, 很多时候你遇到不懂的不要死扣,而且看其他相关内容,回来再看的时候,就会有不一样。

有趣的是,他最后给出了一个方法,自称为 “黑魔法”,这个名字我是没看出来啥, 但具体方法 还有干货满满。

例如:

  • 看linux源码,看懂一部分就可以,如果面试的时候 和面试官聊上一聊。
  • 学习技术的时候 不断问自己:这个技术是用来做什么的,优势是什么,为什么用它,它解决了什么问题
  • 比如消息队列中的 RocketMQ、Kafka,分布式存储系统 HDFS、Ceph、HBase,搜索引擎 ElasticSearch,分布式服务治理框架 zookeeper、etcd 这些,在学习它们的过程中,不断对比它们的异同,它们是如何工作的,应用场景如何以及它们是如何保持一致性可用性分区耐受性的等等

这种学习技术的态度不仅值在校的录友学习,对已经工作的录友也非常有启发。

大家一定要仔细看完本篇,对比自己的状态之后就会发现应该改进的地方。

以下是这位录友 在知识星球里的分享:


个人情况

背景:末9本科班,无实习几乎无竞赛

暑期实习去向:腾讯音乐-C++后端开发

写在最前面:打铁还需自身硬。大环境确实很卷,我们的学历竞赛论文背景这种“硬实力”短时间改变不了,但是面试过程,我们的面试表现却是可以不断改进的,如果有面试机会,一定要努力争取!

面试情况

下面都是进入面试的公司,本人比较菜,所以有面试机会的基本都是些没笔试或者不看笔试的公司,当然除了拼多多(My dream)。

岗位基本都是 C++ 后端开发

按面试时间线排序,三月中旬开始投递的

  • 阿里云 二面挂
  • 字节 三面后被告知没 hc 了, 需要转客户端,拒了
  • 商汤 二面通过了但锁 hc 了,无后续,该职位在官网也下架了
  • 拼多多 hr 面完后,泡池子被杀了
  • SmartX 太难啦,一面就挂了
  • 深信服 一面后锁 hc,无后续
  • 美团 kpi ,笔试完两个月后捞的我,纯纯 kpi
  • 腾讯音乐(tme) 四面技术 已offer

当时拼多多 hr 面完进池子后感觉稳了,所以把其他面试都拒了,比如字节和蚂蚁都捞了我,但都拒了。

其实后面想想还是比较后悔的,如果有机会还是尽量争取吧!

后来感觉不太稳,听说 tme 面试效率很高,所以投递了 tme 试试,想着跟拼多多互为保底,总不能两个都凉凉吧呜呜。

过了一个艰难的五一假期,一回来,tme 就陆续有别的部门发 offer 了,但一直没到自己部门,所以等得也很煎熬。

然后拼多多池子被杀鱼了也挺难受,所以一直挺郁闷,又投了 smartX 和深信服,降低自己的期望,总不能找不到班上吧哈哈。

后来 5月 11 号接到 tme 的电话,说要约面,我就挺纳闷的,然后就确认了是技术面,原因是转部门加面,然后就加面了两轮最后通过了。

后来知道是因为原部门裁员了,所以实习 hc 也缩减了,自己比较幸运前面面评不错就被捞了

前期准备

主要分四部分讲吧,算法、八股、项目以及黑魔法

写在前面:这部分内容需要看的书籍、如何安排时间的比较简略(星球里本就不乏此类推荐),更多的是我个人的碎碎念哈哈。

1、算法

毫无疑问,我的算法从 0 到 1 ,都是看卡哥的代码随想录一步一步积累的,可以说正是卡哥领我入门的

毫不夸张地说,没有卡哥就没有今天的我。

从去年的4月份陆陆续续的开始刷题,到现在刷的不多,大概 500 题,代码随想录基本三刷了。

也正是卡哥题解给我的积累,才让我有能力自己去分析其他题目解答其他题目

这样的算法积累,让我在十余场面试中,手撕不出来的仅仅一道,所以还是非常感谢卡哥的!

2、八股

准备八股我是去年 6 月(大二暑假)开始的,我们学校那时候操作系统和计网都没教,所以只能自己学(相信大部分小伙伴也是这样的)。

我罗列一下我学的一些技术栈:C++,操作系统,计算机网络,MySQL,Redis,网络编程,设计模式(面试前没接触过,面试到后补的),可以把这位大佬看做我的 v2.0 嘿嘿。

具体的书籍推荐在星球里面也很容易找到,我就不再赘述。

我再谈谈自己每门课的一些学习过程,仅供参考:

C++: 没啥好说的,多看书,多看面经,多写代码,还有我喜欢 C++。知识星球置顶3里有详细的C++学习路线。

操作系统:去年 6、7 月份完成首次的学习,我不太建议这两门课上来就看面经

我自己的做法是,比如操作系统,我对比了两三本经典书的前几章,然后选择了一本最对我胃口的,深度读下去,学完之后就对操作系统有了一个整体概念的认知。

这之后再去根据面经强化,又回到书中寻找相应答案,不断循环加深自己的记忆和理解。

特别地,我会去特意去看各种概念比如进程线程、调度算法等在 Linux 下的具体代码实现,以实现概念到实际代码的知识迁移过程。

《深入理解计算机系统》、《操作系统精髓与设计原理》都是极好的参考书籍。

计算机网络:去年跟操作系统并行学的,计网给我的感觉就是知识点特别散,我的建议是,先分层,比如 OSI 五层,自顶向下的学。

每一层重要的协议单独拎出来搞清楚即可,然后通过提问,一个 url 发出去之后如何得到回复、一个数据包是怎么通过 Linux 网络协议栈发送/接收的,来形成整体的感知。

《计算机网络:自顶向下》和 小林 coding 的《图解网络》帮助我构建了完整的知识体系和对一些问题的思考的补充,两者互补。

MySQL 和 Redis:为什么要放在一起讲呢,其实现在回想起来学这俩数据库的过程,真的有点歪打正着的感觉!

按原计划,MySQL 和 Redis 应该是 8 月的30天和9月的15天共45天完成的。

MySQL 我一上来就看《45讲》,但是效果太差,因为很多 SQL 语句都不懂,遂转战《SQL必知必会》,花了三两天把常见的 SQL 都熟悉了一遍就开始了我的 MySQL 之旅。

MySQL 我认为是分块学习的(后来悟得的),比如我自己分为这几块:索引、日志系统、锁机制、事务机制、主从复制及集群架构。

而在第一遍学的时候,索引、日志系统真的很难去理解,因为这完全跟以前学习的无论是操作系统还是计网,都很难有共通之处,但深入学习后发现也无非是这么一回事。

遇到不懂的多想想,这个技术为什么诞生解决了什么问题、它是如何做的如何解决问题的、它做得怎么样如何评价它、有没有类似的解决同一个问题的其他技术、这些类似技术之间又有什么异同如何评价他们间的区别,它们又各自适合怎样的场景,把这些问题解决了,相信你对某个技术肯定会更加全面的了解和掌握。

当时我学到锁和事务的时候,就死活搞不明白幻读,然后就转战 Redis 了,Redis 我看的是极客时间的专栏,蒋德钧老师也是将 Redis 的内容分块来解读,我有很大一部分学习的方法由此受益。

这时候神奇的事情就来了,先去学 Redis 的数据结构,我也会去对比 MySQL 的 innodb 用的 B+ 树,为什么 Redis 支持那么多种数据结构,会去思考这里面的原因,做对比。

学日志系统的时候,也会想 RDB 不是跟 binlog 好像吗, AOF 跟 redolog 好像啊,当然也不一定很像,而是说这种做法,这种日志刷盘的机制,写日志的机制确实很像,所以也会引发我的思考,对比,也会为此着迷(雾) 。

看完到这里,我又回去学 MySQL,之前死活学不会的锁和事务好像又明朗起来了,虽然是不相关两个技术,但很神奇地引导了我解决问题。

所以我想说的是,学类似的技术,有时候可以并行的学,这个学不下去了,看看别家是如何解决这个问题的,可能会对你有启发,甚至就算不是同一个方向的,也有可能给你醍醐灌顶的感觉。

当然我想说,学习技术的时候可以将它划分成更小块,但并不意味着它们是互相孤立的,对中间件的整体架构的把握也是非常重要的。比如锁机制、日志系统都是为事务系统保驾护航的,一样的道理没有 binlog 也很难去做主从复制。

3、项目

我的项目可以理解为一个云盘,基于开源的分布式存储系统 fastDFS,用了 Nginx,MySQL,Redis。

我主要说说面试被问的大致方向。

项目背景是必问的,做这个项目的原因是什么,应用场景是什么

fastDFS 技术选型及其架构,主从复制机制等,如果你的项目用到某些开源代码,你应该熟悉它的架构,以及一些同类产品的异同,比如 fastDFS 同类的有 Ceph、HDFS 这些,了解更好。

用到的常见中间件如这里的 MySQL 和 Redis 基于项目拓展出来八股,为什么我要强调基于项目,比如我这里的分布式存储系统,就基本会问我 Redis 集群和主从复制(已经被问烂了)。

一些功能的实现逻辑,比如秒传文件、分享文件如何实现。

根据你的项目拓展的一些场景题以及一些可以改进的点,你需要思考

搞分布式,避免不了共识算法 raft,CAP 理论等。

涉及你的项目,有哪些常见的工业算法需要了解。

所以总的来说是这三方面:

  • 项目背景和技术选型
  • 重要功能的实现逻辑
  • 用到的中间件的八股及其拓展场景

4、黑魔法

看到“黑魔法”大家肯定很疑惑,什么是“黑魔法”?

其实就是我自己想的一个词,看到这里,你会发现其实大多数人都可以靠自己的努力完成上述知识的学习以及面经的强化。

但是如果人人都能做到哪一步,那么我们应该突出自己的亮点、提高自己知识的广度和深度,从而在面试的时候给面试官留下特别的印象呢,我来谈谈自己的一些做法,仅供参考,因为每个人有不一样的想法和方向。

1、去读 Linux 源码

因为刚开始学习计算机系统时,就对操作系统十分感兴趣,但是大多教科书上都是一些概念性的内容。

比如我们最熟悉的:进程是资源分配的最小单位、线程是任务执行的最小单位,咋一看进程线程八竿子打不着啊,它们的实现(描述它们的结构体)应该也是完全不一样的吧?

可事实是,但我跟着网上的博主阅读 Linux 源码之后,其实 Linux 里的进程线程都是用同一个结构体 task_struct 描述的,但他们的具体区别又在哪呢,这就需要不断深入了。

这只是其中一个例子,还有比如进程调度的算法在 Linux 内核中又是如何演进的?

如今主流的 CFS 调度算法又有何特点?Linux 下的 LRU 算法又是如何实现的,跟我们平常学的概念又有什么不同?等等。

所以,每当面试官问到我操作系统的时候,我基本上都会扯一扯 Linux 源码,我会说 Linux 里面是如何如何实现的,当然有些面试官会不在意,也有面试官评价我的时候夸过我这方面了解很深入,所以如果可以的话,这也会成为你的加分项。

2、去读 Redis 源码

说来也奇怪,对于一个 cpper 来说,Redis 应该还是比较远的,但是我当时心想,MySQL 作为关系型数据库,怎么着也得学一个非关系型数据库对比对比,看看他们之间的的区别吧,也算是给自己增加多一门技术栈,增加面试的竞争力了吧!

所以就这样踏入了 Redis 的学习之路。经过第一轮对 Redis 的基本概念掌握之后,我继续跟着蒋德钧老师的 《Redis源码剖析与实战》阅读 Redis 源码。

在这个过程中,你可以对 Redis 的整体架构有更深一步的了解,还有 Redis 真的是单线程吗?

渐进式 rehash 的过程究竟是怎么实现的?Redis 中也有 LRU 内存淘汰算法,它的实现跟 Linux 里的 LRU 算法实现又有何差别?等等这些问题都可以让你在源码中获得答案。

Redis 在我面对一些 java 面试官时,有了多一门共同语言,比如我拼多多三次技术面试,面试官都与我深入讨论了 Redis,所以也算是给自己增加了多一个竞争的机会。

3、去了解分布式的知识

我人生中的第一次面试是阿里云,面试官当时问我 CAP,raft 的时候我一头雾水,这也让我与分布式结缘。

对于一个 cpper 来说,分布式应该还是比较远的,但是毕竟面试遇到了,所以自己也去找了一些资料,自己琢磨了一番,没想到就进入了一个全新的世界。

这里的技术都是我没见过的,比如经典的 raft 共识算法,CAP 理论、各种各样的一致性、分布式 ID、接口幂等性、一致性哈希等等

其实经过我的学习,我认为分布式在计算机知识的殿堂中,应该是不亚于操作系统计算机网络这种基础课程,因为我们的世界就是分布式构成的,基于此我也有去认真的补课去学习这些陌生的领域。

4、去了解更多的中间件

在后面的学习中,我接触了更多的中间件,主要是得益于分布式的学习,引申出来很多没见过的技术栈。

比如消息队列中的 RocketMQ、Kafka,分布式存储系统 HDFS、Ceph、HBase,搜索引擎 ElasticSearch,分布式服务治理框架 zookeeper、etcd 这些,在学习它们的过程中,不断对比它们的异同,它们是如何工作的,应用场景如何以及它们是如何保持一致性可用性分区耐受性的等等

在这个过程中可以让我接触到更多以前从来没见过的实现和工程数据结构以及算法。

有了这些,以后遇到一些面试的场景题也可以迅速反应,当然更重要的是学到更多的知识。

致谢

首先非常感谢卡尔哥,他是我学习算法的领路人,帮助我迈过了求职的第一座大山,我非常感谢卡哥。

第二非常感谢星球的小伙伴们还有我的身边的好室友、好同学们,一起努力奋斗,特别是字节大佬 Prince_H_23(知识星球里的一位录友)。

最后感恩我的家人,从决定就业不考研一开始的反对和不理解到最后的支持和理解,他们也付出了很多。

自己的暑期实习告一段落,也算是给坚持和偏执的自己一个答复,2022年的目标提前完成了第2个,希望腾讯音乐的实习一切顺利多多学习,希望秋招的时候自己能成为offer收割机再和大家相遇,更希望我之前的一些经验可以帮助到大家。

爱你所爱 行你所行


可以感受到每一位拿到大厂实习offer的,除了知识储备量达标以外,还能看出来对技术的追求,这一点往往是很多同学忽略的

可以在知识星球「精华」里找到原始帖子,也可以去找他一起交流学习。

最后欢迎大家加入代码随想录知识星球这里有很多优秀的人,有很多精彩的事!

点击下方【阅读原文】,了解星球详情

文章有问题?点此查看未经处理的缓存