0%

找实习总结

时至今日,经历了3个月的找实习工作终于落下了帷幕,幸运的是,最终拿到了自己最心仪的蚂蚁金服的offer。往年的话在现在这个时间点本来应该在实验室搬砖的,而今年受到疫情的影响,到现在还在家中。但在家也有在家的好处,在家如果有压力的话其实也能够全神贯注地去学习去准备找实习。

上次过年本来打算只在家呆两周就回学校复习的,但因为疫情导致回学校遥遥无期。时间不等人,各个公司招聘的节奏又跟往常一样,所以早早在家就开始复习了。一开始给自己定的目标,最理想的是蚂蚁金服,因为自己比较喜欢金融这一块的东西。蚂蚁算是国内金融+互联网这一块的巨头(貌似是估值最高的独角兽?第二是字节)。支付宝和微信几乎成了每个人必备的工具。发展的前景不可谓不好。在蚂蚁金服之后的理想的去向是字节跳动和腾讯。字节跳动作为估值仅次于蚂蚁金服的大厂,在近几年凭借着头条,抖音的火爆而迅速崛起。字节的产品可以说是占据了当代中青年内容输入的大头。我的同学,朋友,包括爸妈,爷爷奶奶都是头条或抖音的拥趸,每天把看头条当做读报纸一样的习惯去看。我自己也在疫情期间几乎每天都上头条了解国内外疫情的最新进展。在内容质量,排版方面来说,头条做的确实要比其他一些新闻应用做得好。例如相比于腾讯新闻,其内容的质量,排版都要更优(现在的腾讯新闻已经变成了百家号的聚集地,芝麻大的事情能发1000字的文章,狗屁不通浪费时间,如果腾讯新闻再不把把质量关感觉真的不行)。而相比于澎湃这种更专业的新闻应用。它又显得更亲民,少了一些复杂的专业术语,多了一些家长里短的闲聊。而抖音更是被誉为当代年轻人的精神鸦片,其影响力可见一斑。腾讯就不用多说了,游戏大厂,不说口碑,但用户量应该是国内毫无争议的第一。我给自己定的目标就是这三个,蚂蚁金服第一,腾讯or字节第二。但蚂蚁因为是阿里系,技术栈是java的,我自己本身的用java的,虽然说一个优秀的程序员无所谓语言,但是更换语言,尤其是对一门语言了解的越深入,更换的成本就越大,对于一门新语言的机制,语言特性都要重新学起。所以在语言方面,阿里对于我无疑是更合适的选择;而腾讯用的是C++,字节多用python和go,都需要更换成本。

这次算是第二次找工作了,自己也是有了之前一些找工作的经验,而且自己本身就耽误了1,2年,所以也没有时间再去试错,就要一步到位去定居的地方了。距离家乡近的,互联网方向发展前景好的地方,看下来应该就只有西安和成都两个地方。相比西安,成都的发展前景必然更好,天府之国,气候也湿润,其实是更适合人居住的。所以这次找工作就只把目标定在了成都,专心找成都的工作。

字节跳动

从2月中旬开始着手复习,先是把深入理解JVM又全面地看了一遍,把自己之前做的笔记也认真复盘,自己的项目也全面复盘了一遍。在二月底的时候就开始着手投简历了,其实这算投的比较早了,不过这种事情赶早不赶晚。早点投了简历也能逼迫自己早点进入学习的状态,先是投了一波京东,字节,和网易雷火。京东和字节是成都的,网易是杭州的,是为了练手(但网易效率真的太低了。。直到2个月后我都落定了才来了笔试邀请,有事就给鸽了🥶,京东到现在都没下文,要是能把北邮的简历都给筛了只能说明真的强无敌。。)。所以最后只来了字节的笔试邀请。成都的字节跳动是效率工程,之前是专门为内部hr做提高效率的工具,属于对内的一个团队。不过后来听说也要对外去卖产品了。非常有名的飞书(Lark)就是其产品,可以说是做的相当不错,国外也有很多团队在用。

这里要夸一波字节,效率真的高,全程都有hr跟进进度,不论结果怎样都会通知一声,而且流程很正式。就全程都给人感觉很舒服。字节的笔试不难,算是leetcode的medium难度。题目如下:

1
2
3
4
5
6
1.峰值定义:比前后元素都大;数组可能存在多个峰值,返回任意一个就行:如1 2 3 2 1 4 3,可以返回4或者3
>直接遍历比较前后即可,唯一需要注意的就是边界上的额外处理题目不难。这道题a过了


2.输出指定的二叉树的镜像:以二叉树对应的完全二叉树为参照,空白节点处使用#字符填充,使用层次遍历来表示二叉树,节点间使用空格分隔,如4 2 7 # 3 6 9。要求输出翻转的二叉树的层序。
>本来想直接按照层序遍历来按照节点的编号顺序来做的,其实画个图就能看出来,满二叉树只需要每层倒序就是其镜像树。但这么做只能a过80%。之后因为还有时间,就用重构二叉树,然后再求镜像的方法,依然是只能过80%。其实这道题最后还是没明白为什么没a掉,如果是时间复杂度的问题,重构可能比较慢,但每层倒序已经是O(n)的复杂度了,还是过不了,就有点不太明白了

所以最终笔试了90分(50+40)

笔试完的第二天,hr打电话来告诉我笔试通过,约了当天下午的一面。这是我找实习经历中的第一次面试。
题目如下:

1
2
3
4
5
6
1. jvm内存模型,垃圾回收方法,对象可达性分析
2. cms是怎么工作的,并发标记和重新标记之间发生了什么
3. mysql索引,聚簇和非聚簇索引,索引怎么优化
4. hashmap底层原理,hashtable,concurrenthashmap的区别和原理,怎么实现线程安全
5. aqs原理,如何把一个节点加到队列中
6. 算法题:类似围棋:01的棋盘,把所有被0包含的1变成0

其实真是要特别感谢这位面试官,给我找到了好多知识的欠缺之处。最明显的例子就是问了我cms的并发标记和重新标记之间的过程,其实这个部分在书上和其他面经或资料上很少提到,但却是CMS中很重要的部分,就是并发预清理,带着对这个部分的疑问,又去深入了解的三色标记法。可以说是对整个cms有了更深刻的认识。而hashmap更是老生常谈的问题,但要把它的整个工作过程完整细致地描述出来也不是一件轻松的事,这就是熟能生巧了。而对于算法题其实也是leetcode上的一道原题(bfs+标记),只不过最后因为时间不够就没做完了,但还是详细地描述了解法。整体答得还行。唯一的缺憾就是题没有做完。

面完第二天hr打电话来说一面通过,约了一下二面的时间(效率是真的高)
二面题目如下:

1
2
3
4
5
实现62进制加法:0-9a-z A-Z
getpost的区别,postput的区别
http状态码
mysql是binlog是什么
微博的长连接变短怎么做的

上来先是做题,不得不说字节对于算法能力看得真的很重。先笔试,然后每一轮面都有做题。算法题不难,就是多进制的加法,处理好映射和进位的问题就能迎刃而解,再者这种题做的太多了,几乎是不假思索地动手写。很快就写完了。剩余问的基础题也不难。只要好好准备一般都是在覆盖范围之内的。最后问了一道开放题。微博中如何长连接变短,变成t.cn/dasgjkd 这种形式。我回答的是在微博服务端利用hash对长连接生成相应的短连接,然后将其映射关系保存在数据库中,在访问的时候请求先到微博服务端,然后取出真正的连接后通过redirect或者forward来转到真实的地址。而对于网络的相关问题,重点在于幂等性上,知识并不难,但需要有所了解才能回答得上,所以还是应该广泛地涉猎知识

二面后隔了几天,hr打电话说二面通过了,简单聊了一下(基本是为什么想来成都,以及对于互联网快节奏的看法等)。之后就发offer了,效率是真的很高。

总结:字节作为互联网新贵,其前景相当不错。整个面笔试的流程突出的特点:
第一就是十分注重代码能力,除了1轮笔试,2轮面试都要做题。所以平常刷题还是很有必要的。
第二就是注重基础知识,对于网络,基础容器原理(hashmap,chm),并发原理(aqs工作原理、cas)的侧重点会更加多。
第三就是对于校招来说不太看项目,这是我面试过程中少有的两轮完全没有问任何项目,全程都在做题和问基础知识。因此突出一个基础知识以及刷题的重要性。
字节整个面试都使用飞书,体验感觉也很不错,感觉钉钉和飞书视频会议这部分做的很不错的

必须要感谢字节,首先发了offer让我心里有了底,而且指示了面试的大方向和重点。

之后经同学介绍,美团的业务部门也面了一下,整体的感觉也还行,面试题目如下:

1
2
3
4
5
序列化和反序列化一棵二叉树
jmm
mysql索引
泛型相关
项目相关

整体回答的还行,但最后问到入职的时间,人家需要能马上入职的,感觉不合适,就没有再继续了。

蚂蚁金服(阿里巴巴)

接下来是旷日持久的阿里的面试,从3月5日一面,到4月30日意向书发放,耗时2个月,经历了 笔试 + 基础面+主管面+交叉面+总监面+hr面+补笔试。基本算是7次试了。流程虽然很长,但非常有幸认识了非常好的主管,他的提问过程是非常比较体现语言魅力的,会挖掘你的潜力,去引导回答问题,而且不仅仅是问技术基础,还会提问一些开放性的问题来综合体现各方面的素质。还有一点是我觉得他的语气非常亲切,让人在交流过程中也不会紧张。而且他还给了我一些非常宝贵的建议,不仅仅是技术方面的提高建议,还有思维方面,在平时的工作生活中要养成多观察的建议。而且后续也一直是他帮忙跟进我的流程状态直到拿到offer,真的是非常非常感谢他。

今年的笔试是所有技术岗都必须参加的,但不得不说,题目真的太难了,只有第二题a了10%
题目如下:

1
2
3
1.输入10int表示10种牌个数(110的牌),可以打单牌(1),对子(11),顺子(12345), 连对(112233),求最少几次可以打完所有牌

2.给出n个不下降字符串(即string[i]>=string[i-1),求用给出的原始字符串,拼出不下降字符串的字符串最大个数?

第一题可能是需要贪心的就是类似于剪绳子,把绳子剪成2和3的小段,核心思想是去减4的段和5的段,所以我觉得应该是去尽可能凑其中的某两种或者某一种组合,如果直接使用递归形式的深度优先遍历,在复杂度低时可以解决,但是当数很大时就会耗很久,我也下来后写了代码进行验证,在数组全满的情况下需要将近10秒,所以其实还是不能全a的。由于做的时候没形成合适的代码流,(其实可以回溯拼一拼的)

第二题因为本来是以为和数组的最长递增子序列的做法类似,用动态规划的方法,只不过每次叠加的长度是其中字符串的长度,但这样做过不了,所以现在还没想到更好的办法,网上搜索也没有搜到更好的做法。

阿里的笔试风格和平常刷的leetcode的风格相差比较大,不太好做针对性的练习,所以还得平常多积累,多找找类似风格的题做

整个面试问题如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
一面:
网约车怎么设计,
讲讲HashMap
Java继承怎么体现在数据库表上:
mybatis怎么解决N+1的问题
hibernate和mybatis的区别
讲一讲spring IOC AOP
StringStringBuffer、StringBuilder区别
ruby on rails和springboot相比有什么优缺点


二面:
并发,锁机制,悲观乐观
threadlocal
简单介绍Springboot
Spring事务传播行为
mysql事务隔离级别
Springbean的生命周期,包括静态代码块,构造函数,初始化方法的执行顺序
幂等性,post,get
Linux常用命令,怎么看java进程,怎么查看java的cpu使用率
印象深刻的事
技术中印象深刻的事

三面:
介绍一下项目
项目中有什么难点,具体的解决方法,解决后有什么改进(刨到灵魂深处)
平常是怎么学习技术的,除了技术书还看什么书
有什么其他爱好,比如体育爱好之类的
为什么笔试题没做出来,现在如果让你重新做,你有什么好的做法吗?要求细化到具体方法,不能只说贪心、动态规划之类的泛化方法(刨到灵魂深处)

技术终面:
介绍一下毕设
毕设中有什么亮点,通过项目学到了什么
介绍一下项目,项目中有什么难点,怎么解决的


hr面:
自己的亮点
为什么想去成都
金融在生活中的使用场景

因为之前笔试成绩比较低,所以又补了一轮笔试,这轮的题目比较符合平常做的题目类型:

1
2
3
4
5
6
题目一:判断数字是否是回文对称数字
例如: 1232113577531 左右对称的数字为回文数字


题目二:LRU缓存实现
最近最少使用(LRU)缓存方案,是在缓存已满并且需要将新近被使用的项目添加到缓存时首先丢弃最近最少使用的项目。(不能使用LinkedHashMap)

第一道题直接用StringBuilder的reverse。第二个可以用HashMap+LinkedList,map来映射k-v关系,list来维护要淘汰的顺序。

由于四月是阿里整个财年的年底,所以hr很忙,一直到4月30号晚上才发了意向书,整个阿里实习求职历经两个月终于能画下个比较完美的句号了

整个阿里面试流程的重点在以下几个方面:

  1. java基础知识,包括并发,容器(hashmap是重中之重)。
  2. 数据库基础知识,这一块比较广,涉猎的多总不是坏事
  3. 框架,主要是spring的原理,这一部分还是应该去看一下源码,用小demo打断点跑一下流程的,因为spring继承体系纷繁复杂,各种抽象类之间跳来跳去,干看代码很难走通逻辑,所以打断点看流程是最好的学习方式。
  4. 在项目中的难点和总结,必须要对项目有比较深刻的理解和想法,所以平时在做项目的时候要多总结多输出知识

在5月之前拿到了自己理想的offer,也算是对自己的辛苦刷题和学习有所交代,期间还有一些其他公司的小插曲不足道,拿到了两个自己最想要的offer,后面就要好好努力了!