秋招我是如何七进五的
想了很多天想要以怎样的方式来分享些我的秋招经验,但是每次有了想写些什么的冲动的时候,又觉得自己实在是才疏学浅,写不出什么好的东西或者没有这个能力去分享些自己的经历,所以打算单纯的以此篇文章记录我的整个秋招过程。
投了battmd和快手,有幸拿到了滴滴字节快手百度阿里的意向了。
一、背景
1.1 菜鸡的开始
我来自一个双非一本学校,在学校中规中矩的上课,参加着各种社团、学生会,参加着各种各样的比赛,想着这就是我的大学生活,稍微好一点的是在学校的基础课程的学习中还算是比较认真,这也为我后来的飞速成长提供了一定的基础。众所周知,大学的课程比较偏入门化基础化,而我本身在学校的日子虽然不是每天上课睡觉下课玩游戏,也算是比较积极向上认真对待,会主动去参加些比赛,去接触些新的东西和知识,但是也没有想过往哪方面去深度研究过,直到今年的三月决定找工作,还不想走技术所以投了产品经理,但是很快我也意识到了产品经理我更加不行,我好像更喜欢做技术有关的事情,于是在四月份的时候我打算放弃春招了(因为我当时找春招也的确比较晚了,大家都快结束了),打算沉下来继续学习技术,准备来年的秋招。
1.2 菜鸡的机遇
转回技术之后,突然又迷茫该做什么,前端、后台还是客户端,那个时候的我觉得秋招能够有一份差不多的offer就够了,比如海康对于当时的我都觉得是很难进去的公司,从一开始看到很多人做后台,想着大家都在做后台那我也做后台吧,看了几天springboot的视频,什么都没学到只学会了发呆,我又陷入了沉思,到底哪里是我的出路,后来学校有做前端的同学被阿里录取了,说不羡慕是假的,就和他聊了聊前端大概需要学什么,该怎么学习,学了一段时间前端,始终觉得少了点什么,然后这个时候看到群里有学长问有没有做安卓的,突然像是什么被唤醒了,自己大二好歹是跟着老师学过一学期安卓的人,为什么不做安卓呢,然后发挥了自己厚脸皮的本领去问学长该往哪方面学习以及该有怎样的一个学习目标,学长很不错,很有耐心的告诉了我们学习安卓的每个阶段该掌握什么知识,于是每天的学习开始变得充实起来,白天七点起来学习安卓,晚上要求自己刷三道力扣然后玩玩手机大概十二点入睡,那段时间过的很充实,就像一学期浑浑噩噩的过了,到了期末老师划了重点,突然你就像开窍一样,之前学了一期都学不会的东西在期末突然都学会了。记得当时学长和我刚接触的时候我甚至搞不清楚jvm,后来这样学习了一段时间之后,能够很明显的感觉到了自己的飞跃提升,我想说的是并不是说你在大学啥都不学一下子就可以提升,前提是有尚且不错的基础,所以如果有人抱着学校上课没用,天天睡睡觉,期末老师画画重点反正也能过,自己也不主动去学的想法的话,我想说如果地基都没有又怎么造房子呢。
在之后学长和周围小伙伴的鼓励下投了滴滴的实习,在一面的时候几乎面试官问什么我就能够接什么,那个时候的我知道了,我真的比以前进步了太多了,起码在理论这一块是有了些成长,在这个过程中我还发现了周围一些同学的问题,在我周围,不缺少比我有资质有基础的同学,但是在这个过程中他们却很少坚持下来,或者说他们缺少了一些勇气。
1.3 在滴滴的成长
来到滴滴之后,部门是新成立的部门,安卓团队就我和我的导师,而iOS和小程序都是只有一个人的团队。没有太多的技术文档,没有前人指路,甚至连个分享的小伙伴都木有,跟导师说过最多的话就是什么时候给我找个小伙伴啊,导师总说小伙伴在路上了,而我现在要走了,也没等来和我一样的实习生小伙伴。在一开始的时候没有文档没人指导,我们负责的模块的代码我一开始都找不到,我看了别人的模块看了一两天,直到后来终于找到了我们的模块,然后从首页开始逐渐搭建了一个自己的模块体系,也算是原有老的模块的代码有了一个认识,但是不妙的是我刚熟悉了老代码,这一块的东西就全部要被抛弃,“对不起,传统公交被砍掉了,现在我们要做信息公交。”,人手不足,我被迫去造垃圾代码了,一下子把首页的两个入口的所有子模块都交给了我,我内心:我是谁我在哪?但是既然交给了我我就一定要完成,也不能拖团队后退呀,每天在如果项目因为我delay了的担忧下一点点的理清自己的思路,那段时间每天打车回到家已经十二点甚至一点了,虽然很累但是也很充实,记得有几次回到家坐在床上突然半夜起来发现自己灯也没关澡也没洗的已经睡着了。在这次开发中起码对我负责的所有模块,我能够很清楚的跟别人说清楚我的思路,在后续的几个版本迭代中,我涉及的模块越来越多,甚至到后来,我已经能够清楚的跟后来的社招同事讲清楚每个功能对应哪一段代码了。
在这里,同事对我十分照顾,实习时的一面面试官每次在我遇到问题的时候都会耐心的帮我解答,甚至给我发了十多本书,每次见到我都会问我最近学习了没看书了没,我来考考你,我也是有什么事都会跟他一吐为快,真是一个很棒的人,而我旁边的小程序同事,是能够两个人从乐高、奶茶聊到技术的人,对待生活的乐观态度也一直是我学习的榜样,即使整个小程序团队到现在还是几乎只有他一个人,即使很多时候他做了一个团队所做的事,但是也没见他说一句脏话或者一直愁眉苦脸过。而我的导师在我心里一直就是一个完美老师,有着很棒的技术,虽然仅有一次他看过我的垃圾代码,但是也在这一次里体会到了我们之间的差距,也暗暗告诉自己要向他学习,在生活中,对待自己的老婆孩子温柔有担当,喜欢健身热爱生活,还有着有趣的灵魂,记得有一次在看程序员小灰的一个动画故事,他看了一眼就知道我在看什么,真是一点代沟都没有呢。其他的同事也对我很好,有吃的会跟我分享,有技术上的问题会给我耐心解答,甚至在后来我秋招的过程中,也是他们一直听我分享我的每次面试经历并且告诉我该在哪一块上有改进。
二、秋招浅谈
1.1 扎实的基础
感觉这是被无数前人说的不说的的一句话,可是很多人恰恰连这一点都没有,他们使用了很多高大上的框架,使用了很多看起来高级的技术,看了很多源码,可是当你问起他,java的基本类型是什么?可能会答得磕磕绊绊,在面试的过程中我问的最多的问题就是请问你们公司对校招生会有一个怎样的期许或者怎样的校招生才是你们想要的?听到最多的答案是我们首先想要这个人有着扎实的基础,其次才是项目经验,有没有项目经验不是那么重要,毕竟在以后的时间里是可以积攒的。作为安卓开发这个岗位,我个人觉得需要掌握的基础如下:
一、Android基础
1. Activity
Activity的四大启动模式,以及应用场景?
Activity中onStart和onResume的区别?onPause和onStop的区别?
2. 屏幕适配
# 平时如何有使用屏幕适配吗?原理是什么呢?
3. Android消息机制
# Android消息机制介绍?
# Looper在主线程中死循环为什么没有导致界面的卡死?
# IdleHandler介绍?
4. View事件分发机制和View绘制原理
为什么UI更新要放在主线程中而不是子线程?
5. Bitmap
# Bitmap的内存计算方式?
# Bitmap的高效加载?
二、Android进阶(建议到这里还是踏踏实实去系统的进行下安卓的学习)
1. Binder
# Binder的介绍?与其他IPC方式的优缺点?
# Binder的通信过程?Binder的原理?
2. 序列化
# Android有哪些序列化方式?
3. Framework
Zygote孕育进程过程?
# App的启动过程?
# Activity启动过程跟Window的关系?
# Activity、Window、ViewRoot和DecorView之间的关系?
4. 性能优化
# 平时做了哪些性能优化?
三、Java基础
1. Object
# equals和==的区别?equals和hashcode的关系?
#object有哪些公用方法?
2. String
# String、StringBuffer和StringBuilder的区别?
#String为什么是final的?
3. 面向对象的特性
# Java中抽象类和接口的特点?
4. 集合
5. 泛型
# 说一下对泛型的理解?
# 什么是类型擦除?
6. 反射
# 动态代理和静态代理
7.static
#Static class与non static class的区别
8.异常
#异常的结构,运行时异常和非运行时异常
四、Java并发
1. 线程
# 线程的状态有哪些?。。。。。后面还有一系列常见问题
2. 线程池
3. 锁
# 死锁触发的四大条件?
#在java中怎么保证多线程的安全?
# synchronized关键字的使用?synchronized的参数放入对象和Class有什么区别?
# synchronized的原理?
# synchronized和Lock的区别?
。。。。
4. 线程间通信
# notify和notifyAll方法的区别?
5. 多线程间的特性
# 多线程间的有序性、可见性和原子性是什么意思?
五、Jvm
1. Java内存模型
# Jvm内存区域是如何划分的?
2. GC机制
# 如何判断对象可回收?
# GC的常用算法?
# 说一下四种引用以及他们的区别?
3. 类加载
# 类加载的过程?
# 类加载的机制,以及为什么要这样设计?
六、网络
1. HTTP和HTTPS
# HTTP是哪一层的协议,常见的HTTP状态码有哪些,分别代表什么意思?
# HTTP 1.1 和HTTP 2有什么区别?
# HTTP和HTTPS有什么区别?
# HTTPS传输过程中是如何处理进行加密的?为什么有对称加密的情况下仍然需要进行非对称加密?
2. TCP相关
# TCP的三次握手过程,为什么需要三次,而不是两次或者四次?
。。。。。还有很多,几乎大家的面经也比较常见,但是面试官想听的往往不是说背的答案,而是你看完答案消化后的一个自己的理解
七、设计模式
单例模式(很重要,注意几种单例的写法,以及一些细节,为什么要这样写之类的)
工厂模式
。。。。
八、MVP、MVC、MVVM
九、算法(这一块建议还是刷力扣,虽然我本人不怎么刷题,但是刷过的题我都会有个思路有个印象,会把刷过的题用到的方法举一反三)
十、操作系统(虚拟内存、页表段表、进程线程、死锁、冯诺伊曼体系、用户态和内核态、进程内存上限。。。)
大概的一个内容就如上面所列的,虽然内容看起来不多,但是可以衍生的问题是很多的,而且面试官在问这些问题的时候不是想听你背答案,他想听的是你自己的一个理解和思考,比如说你知道单例模式怎么写,这个时候我问你为什么要加volatile关键字呢?静态内部类一定是安全的吗?这些都是需要我们自己去深度理解的,而不是看看面经而不去深究。
其次如果有着还算不错的项目和实习经验也是加分项,这个项目不是说跟着视频或者其他的一些学习资料敲一遍就行了,应该在做项目的过程中加入自己的思考,项目背景是什么,技术路线是什么等一系列的思考,而不是敲一遍就完事了。机器能做的事为什么需要人来做,恰恰是人有着自己的思维,可以去思考去变通,去创造自己想做的东西。
1.2 尝试的勇气
我周围很多同学都缺少了一种尝试,我不知道是温水煮青蛙的心态,还是他们真的不着急,很多人都不愿意跳出自己的舒适圈,还没有尝试过就觉得自己不行,就像当初的自己也没想过有一天会进大厂。我记得当初知道本部门没有hc之后,每天都焦虑的早上六七点醒了,想着要是秋招找不到跟滴滴一样的公司了该怎么办,但是焦虑是解决不了事情的,还是得有所尝试,在之后我投了字节的提前批,尽管挂了,但是在面试的过程中也了解了自己相比之前有所进步,自己不是之前我自认为的那个很菜的我了,虚心的和面试官请教了自己要在哪方面努力,然后沉下来去学习。与其焦虑,不如踏出自己的舒适圈和外面的人多交谈下。
1.3 面试总结和技巧
面试的一个总结我觉得是一件很重要的事情,对于我来说,每次面试都是一次学习的过程,都是一次查漏补缺的机会,而且在和面试官的交谈中,他们也会给你一些不错的建议,甚至你能够在他们身上看到榜样的光芒,在每次面试完之后除了和周围的人讨论下面试的一些小趣事,还会对刚才的面试做一个回顾,自己没回答好的题没回答上的题目赶紧去记录下来,然后进行学习,复盘是一件很重要的事情。
除此之外,在面试的时候要保持自信和乐观的心态,和你交谈的人可能也只大你几岁,可能甚至是你最后的同事,虽然在这一点上我也没有完全做好,每次面试前都会跟朋友吐槽好紧张啊,但是进入面试状态的时候就会尽快调整自己的紧张心理,能够尽量在面试中展示自己最真实的水平,在面试的过程中我也出现过有些问题不知道的情况,这个时候不要慌张,面试官并不会因为你的一点点问题抛弃你。
1.4 运气和心态
我的秋招之路的确有很多运气成分在里面,一家家的流程快速走完,和每个面试官都能够像聊天一样,到最后都是哈哈哈哈哈笑到不行的那种,但是担心和紧张也不是没有的,这个时候调整心态是很重要的,记得最开始的时候美团和腾讯两家接连挂,滴滴也没有出结果,就感觉一切都回到了原地一样,当时走在去西二旗地铁站的路上,下着雨看着周围来来往往的年轻人,想想大家都这么拼,为什么我要畏惧,既然找到了自己的不足,为什么不去克服这些不足呢!说句俗气的话,你笑对人生,人生也会笑对你啊。
在秋招中还有一点就是要抱着学习的心态,虚心的把每次面试当作一次学习的机会,而不是认为自己在大厂工作或者有着这样牛逼的背景就觉得自己有多厉害了,人外有人天外有天的话从小听到大了,比自己厉害的人有很多,沉下来去虚心的进行平等的交流也是一件很重要的事!
1.5 招聘者想找的人
1)动机
我曾经看到滴滴CTO张博在一篇文章中写到:每个人在招聘的时候,我都会认真的问他们:你的职业生涯如何才算成功,你还有什么未完成的心愿。不是所有的人才都能在你的业务里成功,人才的能力模型与业务内核匹配度越高,越有可能落地成功,这个分析过程跟产品经理的工作类似,本质是业务价值和人的价值的交换,通过交换实现双赢。
2)潜力
人无完人,管理者不会把希望寄托在找到完美的人上,而是用不完美但是有潜力的人,把事情做到尽可能完美,同时,在做事情的过程中,让每个人都能变得更好。
最下面一层,人的本质的两块基石:品德,聪明。这两个方面跟每个人的成长经历和家庭背景有关,不容易改。品德是这个人做事情的动机是否使命驱动,是否始终坚持全局利益至上,有瑕疵的人,能力再强也不能用;聪明,是指洞察人和事物本质的能力,我认为这一点主要看你在面试的过程中你和面试官交流时单位时间交换的信息量,聪明的人非常清楚面试官想问的是什么(洞察人的能力),同时也非常清楚自己想表达的思想核心是什么,并用简单可理解的语言描述出来(洞察事的能力)。
中间一层,跟成长性相关的四要素:开天眼,复盘,深度思考,知行合一。开天眼,是通过别人的经验来学习,每个人受限于时间和经历,能够直接亲身经历的人和事有限,通过开天眼能够极大的扩展认知范围,很多事物在内核层是相通的;复盘,是通过自己的经历学习,每件事情做完后,通过思考,这件事情离最完美的状态还有哪些不足,如果重来一次,有哪些地方可以改善,善于复盘的人和不善于复盘的人,经历同一件事情,成长速度是不同的;深度思考,开天眼和复盘都是信息输入,通过深度思考,找到其中内核;知行合一,任何理论都要放在实践中检验,然后回到复盘、深度思考的循环中,迭代优化。这四个跟成长相关的要素,一定程度可以后天培养,但是如果这个人性格比较自负或者ego太强,会影响到开天眼和复盘,压缩进一步成长空间。
最上面一层是经验,如果一个人在下面两层基础非常扎实,并且过去已经在一些领域达到过比较高的高度,让他进入一个全新的领域,一般半年之内就会成为专家,一年之内会成为资深专家,过去在这个领域的经验反而不是很重要。
三层的重要性,从下到上,依次递减。
1.6 保持学习
今天离职审批通过了,突然意识到真的要走了,在北京的这段时间就真像做梦一样,遇到的人和事都很棒,秋招也要结束了,希望自己不要因为短期的一些成就就停滞不前,记录下来告诫自己也希望看到文章的你也保持努力。