写点什么

三年开发经验, 字节跳动抖音组离职后, 一口气拿到 15 家公司 Offer

发布于: 2021 年 07 月 21 日

我这篇文章并不是简单的描述一些面试中的题,或者总结一些技术知识,而是想记录我整个的想法和准备的过程,以及一些心得体会,让大家更加全面的去看待工作、跳槽和生活(从我的角度,当然肯定有不合理的地方,大家借鉴就好)

在字节跳动的两年时间中见证了抖音从百万日活到 2.5 亿、团队从 10 人到 100 多人的过程,技术上不同时期的选型以及迭代、沉淀和更替。项目上经历了一个工程到模块化再到组件化最后插件化,深刻理解项目不同阶段和不同体量的时候技术框架的选型。流程上不同阶段不同的方案,一直在探索最大的效率的协同开发。产品上从不断试错到稳步发展的过程,也就是数据驱动业务的过程。

字节跳动是一个伟大的公司,优秀的同事真是数不胜数,我在其中只是一个菜鸟,仰望各种大佬,不管是从技术方面还是做人做事的方面都学到了很多、成长了很多。在抖音的两年十分感谢我的同事、领导对我的帮助和提携,尤其是亨惠、火火老师、马老师、夏老师、将军、若雷、乐华、龙博等等一群大牛,还有漂亮的 pm 小姐姐佳鑫,和帅气的设计师冬冬,只能说我是何其的幸运,能够和一群优秀的同事一起共事、见证一款伟大 app 的崛起。

这次面试了以下几个公司(不是面试顺序):Airbnb、快陪练、探探、猿辅导、趣头条、脉脉、动动、瓜子二手车、伴鱼、最右、BIGO、音娱、快手、小红书、美菜网、微软、亚马逊、Ihandy、饿了么、爱奇艺、右划。

其中面试没通过的是:脉脉(一面挂),其他的公司都到了 hr 面谈薪资,美菜网、音娱、动动、猿题库等公司 hr 开诚布公的跟我说给不了我要的价钱,虽然技术面评价不错,我也明白,由于拿到一些 offer 后,我对不太想去的公司会要的比较高,我自己都觉得肯定不会给。微软和亚马逊有另外的情况,因为当时已经基本确定拿到 Airbnb 的 offer 加上眼睛因为上火长了针眼,特别疼,就直接拒绝了。可能有同学发现了,为什么这次我没有去 BAT 去试试(百度、阿里、腾讯),百度的确没有投递,阿里和腾讯不是我不想去,实在是太慢了(可能是我没有走内推,而是在 boss 投递的原因),基本上是投递后一个月后才告诉我简历通过去面试。

为什么要跳槽

为什么要跳槽,这个问题一定要思考清楚,因为跳槽的成本其实是挺大的,在一家公司积累的不仅仅是人脉还有对当前行业以及业务的熟悉度,新进入一家公司,一切需要从头再来,需要快速的证明自己,尤其是技术人员,还有就是对新环境和代码的熟悉,这些都是成本,所以在跳槽前,一定要想好,为什么要跳槽。其实马爸爸有一句经典的话“要么钱没给到位,要么心委屈了”,说的很形象,我这里再细说一下:

  • 钱没给到位,其实所有的人对自己的评价都是比自己真实的水平要高一些,这就导致,大部分人认为自己现在贡献很大,老板应该加薪,尤其是看到一些同事做的不如自己(可能是自己认为),工资拿的和自己一样,甚至比自己高,那就更加有钱给的少了的感觉。

  • 做的事情是否有价值或者说是否有持续盈利的趋势,这个很重要,一个公司的产品不盈利没前景,就算给你开不错的工资,作为一个不想混吃等死的人来说,都不想继续再待下去。

  • 机会,作为一个已经有 3 年工作经验的人来说,这个时候更加需要的是一个机会,能够证明自己,给公司带来更大的价值,完成进一步的突破,如果当前的公司并不能给你这个机会,那么你就需要考虑跳槽了。

那么跳槽的核心就是利益最大化,当然这里说的利益,不仅仅是薪资福利,还有自己的职业规划。

职业规划

作为技术人员,我大概总结了下面三个方向,其实哪个方向都是大有可为,关键还是要看自己。

  • 技术经理

  • 架构师

  • 专项领域的专家

  • 薪资福利

作为一个不再年轻的程序员来说,已经不能忽略薪资和福利,不再像刚毕业的同学,只要能成长、只要平台好,薪资什么的不重要。其实每个阶段都有自己的侧重点,我大概对薪资、平台、成长排了个序(自己的观点)

  • 1~3 年,平台>=成长>薪资

  • 3~5 年,平台>=薪资>=成长

  • 5~10 年,平台=薪资>成长(这个阶段也可叫做规划)

上面是自己不成熟的看法,从自身的一些经验出发的,仅供参考。

准备

这是最辛苦的阶段,你不仅要把日常的工作做好,还要开始着手准备刷题、基础知识准备以及高阶知识的准备,除此之外我还对英语进行了一些准备,由于不管是想去外企、出国以及看英文的文档,英语都是必不可少的,英语在我们的日常生活中也越来越重要,我们要,整个阶段大概持续了 4 个多月。其实每一次跳槽,都是对这几年工作的一个梳理和总结,虽然大家都明白“面试造火箭、进去拧螺丝”的道理,对于公司而言,这是筛选人才的一个方式,毕竟人是第一生产力,只要有优秀的人才,那么造出的火箭才可能“一飞冲天”。对于个人而言,如果公司里同事优秀的人,那么你肯定也不会差,我们肯定更希望和优秀的人一起共事。

刷题

我的方式还是之前的老套路 LeetCode+《剑指 offer》,虽然老,但是效果非常不错。这个过程不仅是个脑力活还是体力活,由于不能再公司刷题,我一般的选择方式是在晚上回到家后,由于公司经常加班,我通常到家是 10:00-11:00 期间,先锻炼半个小时(一会再聊这个事情),然后刷题半个小时到一个小时。当然也可以在上下班的路上抽时间看看题。

LeetCode,刷了 300+的题,这里的刷并不是指仅仅只刷一遍,我来回刷了四遍,手写了一遍(写了 200 多道),保证我看到题目或者类似的题目,我能第一时间想出最优的解题思路。《剑指 offer》,这本书真的很棒,总结的很到位,以及每个阶段的思路写的都很详细,我是百看不厌,大概 50+题,多看几遍,这能做到举一反三。

可以点击这里即可获取到文章中的文档,资料

简历

简历的重要性就不言而喻了,怎么样写好简历是个技术活,当然如果你有很好的背景(学校或者公司),那么不管你怎么写,基本上都不刷掉你,我们作为一般的人还是需要下一番功夫的。拿我的简历作为例子,大概有以下几个部分:

  • 个人信息:姓名、出生日期、教育背景、博客地址、github 地址、联系方式(手机、邮箱和微信号)

  • 工作经历:毕业后待过哪些公司,一般是倒序,项目尽量精简明了,可以参考 SMART 原则

  • 专业技能:自己熟悉的一些技能,这个为什么我写到最后,因为对于工作三年的同学来说,面试官更加注重的是你的项目经历,大部分面试都是看你的项目经历来提问。

  • 怎样写简历,这个开源网站不错,教你怎么写简历,而且有一个在线 markdown 在线网站,可以导出 pdf。

英语

其实这个过程对于大部分同学来说是不用准备的,由于我这次想去外企试试,而且,英语在我们的日常生活中也越来越重要,不论是看英文文档、电影、外出旅游,都成为了必不可少的一种技能,所以我在 2018 年中旬就开始准备学习英语了,我学习英语的方式有下面三种

  • 薄荷阅读,到写这篇文章为止已经坚持了 259 天,每天 10 分钟,薄荷阅读一般在下班的路上听读,这个确实不错,而且可以选择适合自己水平的小说,每天就当看小说,这个过程还是很愉悦和放松的(感觉又回到我大学,看玄幻和武侠小说的时候,诛仙、庆余年、雪中悍刀行、将夜以及金庸的小说,鹿鼎记我就看了 3 遍),目前看了黑骏马、小王子、纳尼亚传奇、傲慢与偏见、真爱至上(遇见你之前)和真实人类(正在读)

  • 百斩词,坚持了 214 天,每天 10-20 分钟,在午休的时间。

  • 流利说,坚持了 188 天,每天 30-40 分钟,在午休时间(头条是 12:00-14:00),由于需要跟读一些文章,一般会找一个小的会议室。整个过程真的很枯燥,由于目标很模糊,只是学好英文,可以简单对话,但是这个目标太宽泛和不明确,中途好几次想要放弃,但是想了想还是坚持了下来,得出的结论是,做一件事情前要设定一个明确的目标。

  • 收获:单词量增加了很多,阅读的水平也提高了,可以无障碍的阅读大部分的英语文档和英文小说。听力增长的也比较快,一般的文章,不看文字,大致能挺动,但是口语就是一般了,由于流利说只是跟读或者背诵,提高的并不多,但是纠正了一些读音。

锻炼

“身体是革命的本钱”,这句话我本人十分认可,就算你技术世界第一,如果身体不好,那么也是空谈,我一直坚持着健身,基本上每天早上半个小时和晚上回到家半个小时,跟着 Keep 来做运动。

每天早上半个小时和晚上回到家半个小时,跟着 Keep 来做运动。周六日,如果没事,游泳 2 个小时,将近 4 公里。前一段时间体检,我的尿酸过高,这是是由于肉类、豆制品以及海鲜吃的过多(字节跳动的伙食真是太好了,每天各种肉类,每次都忍不住要多夹一些),而且不运动,我这个就纳闷了,我每天都在坚持运动呀,医生告诉我,我做的是无氧运动,会产生肌酸,和尿酸还会产生竞争关系,由于都是通过肾来分解,中间也有大概半年停止了游泳,所以我就克制吃肉了,而且又恢复了游泳,过了 1 个月检查,就减下来了。

大家一定要挤出时间来锻炼,身体好才能工作有精神,而且身体是自己,一定要珍惜。

面试

由于时间的原因,有一些面试题记录的不是非常的详细,但是大致是这些,可能会漏掉一些题。这篇总结与 2017 年面试总结一样,我并不会给出答案,一个是因为,面试太多,细节实在记不住,而且有些题也有可能记错,有时候一天最多面试了 4 家,从早上 10 点到晚上 9 点一直在面试,我连续面试一周后,直接上火了,眼睛长了个针眼,肿的老大了。二是因为,我这篇文章主要目的并不是带你复习 java 的相应知识点,而且每个人都有自己的侧重点。

“求其上者得其中,求其中者得其下”,按照这个原则这次面试我就大胆的面试架构师或者能够带人的职位,所以很多问题都是架构的考虑和知识的广度以及自己的思考,这些回答很大程度上是开放题,相信大家都有自己的想法和见解,我就不班门弄斧了,真的是因为抖音发展的太快,见识了太多的问题和优秀解决方案,所以只要自己用点心,可以学的地方还是很多的。

1

公司:快陪练

还是先填个人信息表格,其实我不太喜欢这种方式,一上来就是个人的详细信息,你又没有给我发 offer,我也没决定要来,而且还没技术面。不过既然来了就要尊重公司的办事方式,我只简单写了一下我觉得可以告诉公司的个人信息。然后做了一份笔试题,一道算法和一些网络方面的知识,不难。快陪练整体的环境并不是很好,环境很嘈杂,而且我是在门口面试的,很乱。

一面

  • MVC、MVP 和 MVVM 的原理和区别

  • 设计的六大基础原则

  • 使用 UML 画一下访问者设计模式

二面

  • 先聊了聊为什么离开现在公司,毕竟现在这么火

  • 我做的项目中的一些解决方案,组件化、字节码注入、包体积的极致优化

  • 直播的架构设计

三面

设计一个上传日志的大小,涉及到,性能、文件大小、怎样压缩、时机、TopK 问题等聊了聊在字节跳动做的事情

总结

是一家创业公司,给的薪资还是挺不错的,但是由于是 996,没有加班工资,多出来的钱可能就是加班工资吧,后面听 hr 说公司正在打算取消 996

2

公司:探探

是通过脉脉上网红马映怡推荐的,马映怡之前在字节跳动,今年 4 月份到了探探,在脉脉找到了我,正好我有出去看看的意向,就约了时间去面试,探探的办公环境还是比较好的。

一面

  • OpenGL 一些知识,顶点着色器、片元着色器的工作原理,什么是 VBO(这个没想起来),以及 shader 的一些简单问题

  • View 的事件传递机制

  • 包体积优化

  • JVM 相关知识,Dalvik 和 ART 的区别

  • 组件化的实现方案

  • 算法题,ViewGroup 的层级深度,转换为二叉树的层级深度

二面

  • 二面面试官,比较注重思维,我理解为聪不聪明的意思,有点脑筋急转弯的意思,要求的最简单有效的方法。

  • RecyclerView 防止内存 OOM 的一道题,充分利用自身的缓存机制,可能我始终没理解问题所在,虽然给出解决方案,但是面试官不满意,太繁琐

  • 讨论 LRUcache 的实现和时间复杂度

三面

cto 面试

  • 聊了一下抖音发展的过程中我的角色,做过什么事情,有什么收益

  • 在华为的一些经历,为什么离开华为

  • 聊了一到算法题,查找两个字符串的交集和字符串 1 中有字符串 2 中没有的问题。

四面

这次主要是聊一下我将要做的工作,以及让其他面试官再次了解一下我,因为评级比较高,所以需要谨慎点。

总结

整体来说探探发展还是不错,尤其近两年要上市(和陌陌签了对赌协议),环境也不错,管三餐,加班不严重,双休,工资也给力,但是也是由于近两年要上市,所以要做的东西还是比较多和急,需要你有一定的能力。很尴尬的是在给我 offer 的第二周,探探就被 Android 市场下架了。

3

公司:猿题库

我是在 boss 投递的猿题库的 Android 开发岗位,结果 hr 小姐姐把我当成了 server 开发,先进来一位 server 的童鞋,让我写了一到算法题(二叉树的镜像),然后看看我的简历问我,是不是面试 android 的,我说是,她尴尬的说我是 server 面试官,然后赶紧与 hr 沟通,调整成为 Android。猿题库面试应该是有硬性的时间指标,应该是每一轮面试都要差不多 1 个小时,并且会出 1~2 道算法题。

一面

  • 热修复,主要说了 ClassLoader 的方式和 Rubost 的插装方式,重点介绍了 Rubost 的原理。

  • 实现直播礼物的一些技术选型,和播放带有 alpha 通道 MP4 的解决方案

  • 怎么实现字节码注入

  • 抖音组件的探索,SPI 到字节码注入,优缺点。

  • 接下来就是两道算法题

  • 1. String 字符串的数字相加

  • 2. 使用三个线程顺序打印有序的数组

  • 提问环节

二面

  • 包体积优化:静态 Lint,Proguard,AndResGuard 和删除 R.java 中的所有字段,删除 access 方法,在 gradle 的 transform 阶段将压缩 png 和 jpeg,使用 google 开源的 redex 方案,每种方案的原理以及优缺点

  • MVVM-livedata 的实现原理

  • 属性动画的原理,这里没看过,不太清楚

  • Kotlin 写一个 let 的扩展函数,大体写了一下代码。

  • 算法,可能是我写的太慢了,所以就只有一道

  • 1. 给定一个有序的数组和目标数,找出与目标数最近接的 index,要求复杂度是 log(n)的时间复杂度

三面

  • 三面就比较轻松了,面试官一直乐呵呵的,又问了一下 alpha 视频的解决方案,然后聊了聊为什么要离开这么火的项目,问了问我的经历之类的,最后写了两道算法题

  • 二叉树的深度和广度,要求一次遍历给定一个二叉树和一个目标数,在二叉树中是否存在一条路径的所有节点的和与目标数是相同的 case,并且打印。

总结

效率并不是很高,而且并不主动,可能是跟我要的薪水太高有关系,后面通过询问才知道,技术面试是通过了,可能字节跳动本来薪水就很高,我再跳过来,猿辅导考虑到我的工作年限和年龄,会倒挂一大批人,所以只能平薪过来,而且这样知道我肯定不会来,就没主动跟我说。

整个面试环节总体来说还可以,但是就是效率不高,也可能是我运气不好,我是 4:10 到猿题库的,然后在前台等了 20 所分钟,hr 才来,说了刚才在电话会议耽误了,这个理解,然后等待面试又等了 10 多分钟,来了 server 的面试童鞋,写了道算法题,重新调整到 Android 面试,又等了 15 分钟,真正 Android 面试开始在 5:10 左右,面试完成后基本到了 8:30 了。对自己的表现基本满意,就是好久不手写代码,有点生疏,写的比较慢,大多数问题和答案都得到了面试的认可,对一些知识点没有复习到,其实我是这样认为的,并不是所有的问题或者知识都需要知道,你只需要有 1~2 个方面了解的很透彻,得到面试官的认可就行。

4

公司:趣头条

一面

  • 在抖音上显示自己做的功能,框架的搭建,实现原理,所做的优化点等。

  • 组件化的实现,为什么做组件化,不同实现的优缺点。

  • hashmap 的实现原理

  • view 的优化,减少层级,异步加载,x2c 框架引入,优缺点,textview 的优化。

  • mp4 播放 alpha 视频实现的原理

  • 一面面试官大概聊了 1 个小时左右,没让我写算法,细究原理和细节,非常仔细。

二面

  • 冷启优化的一些方案。

  • 数据驱动业务的理解,怎么做,和 pm 产生分歧怎么解决。

  • 我所有做的优化的收益是什么,有什么数据支撑。

  • 事件分发机制,举了一个具体的例子来解决。

  • http 的一些问题,1.1 和 2.0 区别,心跳机制,https 怎么建立链接,怎么进行数据加密等。

  • 为什么离开抖音,职业发展,诉求等。

  • 聊了大概一个小时,面试官的思路相对独特,不是为做技术而做技术,技术始终要服务于业务,我非常认可。

总结

趣头条北京位于海淀,位置不靠近地铁,需要步行一段时间,整体的环境也一般,不过效率挺高的,在面试完的第二天就给我发 offer 了,面试流程也相对较少。对趣头条的营收模式看的不是很清楚,类似发钱看新闻,但是现在头条也再做这个,趣头条能够搞得过头条是个问题,如果没有增长点,那后期的转型是什么?ps:从我拿到 offer 到现在已经一个多月了,股价从 10 美金跌倒了 5 美金,也就是说,我如果来趣头条,我的期权已经退水了一半,瑟瑟发抖,看来期权什么的还是很虚呀。

5

公司:瓜子二手车

瓜子二手车真的是太远了,从海淀到工作地方将近花费了 2 个小时,而且还不在地铁附近,还需要坐公交。

一面

  • 聊了一下项目中做过的东西,字节码注入相关知识,transform 优化,mp4 礼物实现等

  • 从桌面点击 icon 图标开始,整个启动 activity 的启动过程

  • Binder 的实现原理

  • 插件化的原理,以及 hook 点,大概有两个,可以网上搜索一下

  • hashmap 的实现原理

  • 单例的实现,sychrnized 的实现原理,以及双锁不加 violate,会不会有线程安全问题

  • 二叉树,读取每一层最右边的节点

二面

  • 聊聊大概履历,以及在华为、字节跳动都做了什么,为什么要离开。

  • 职业规划,怎么带领团队

  • 代码设计的基础原则,以及用 UML 画出工厂模式

  • 将两个有序的链表合并成一个有序的链表,递归和循环两中方式

  • 时间分发机制,并且需要从 Android 的 sensor 开始到应用层,我只知道从 Activity 开始的流程。

  • 聊操作系统 Unix,汗颜,我知之甚少。

  • 对新技术的看法(flutter),瓜子二手车也已经开始在项目中使用 fultter 相关技术

三面(总监)

  • 自我介绍,为什么要离开抖音

  • 线程安全的问题,sychronized 和 viloated 的使用

  • 实现一个 CAS(乐观锁)的方法

  • HashMap 的实现原理,怎么优化内存占用,优化 resize 的过程,这个是开放的问题

四面(VP?)

  • 自我介绍,在抖音做了什么

  • 在抖音做的比较好的两件事情

  • 设计一个美团的框架,组件化

总结

瓜子二手车是众多二手车中做的还算比较好的公司,现在像优信、人人二手车好像都不是很好了,就是太远了,公司附近也没有地铁站,就算是公交站还需要走 2 公里,但是面试官感觉还是比较有水平的,后期的 hr 跟我谈也是诚意满满,整个团队在我来看,还是一个想做事情的态度。总体来说 hr 还是非常真诚的,想去的朋友可以考虑考虑。

6

公司:伴鱼

笔试

  • 双锁单例,为什么要价 violate

  • 内部类访问外部类

  • 函数值传递的一些题

  • 子类继承父类,个字都有静态变量、静态代码块、构造函数,执行的顺序

  • int 数组,除了一个数字外,其他数字都出现两次,找出这个只出现一次的数字

一面

  • 图片压缩原理,以及在 transform 阶段进行的必要性,讨论的还挺激烈

  • 内部类引用外部函数的参数,为什么要 final 定义,值传递

  • 判断一个应用是否切到后台

  • 组件化的探讨,假设场景,怎么处理

  • 插件化的实现方式,以及对相应的场景进行讨论

二面(伴鱼的架构师)

  • 一个疑难杂症,也是自定义插件,讨论是否有更好的方式,最后结果是,他想了一个比较巧妙的方式,没有实践过,但是告诉我可以,保留自己的意见。

  • 字节码相关知识,ASM 以及 MD5 的实现原理,png 的压缩原理,这里比较乱,就是说到哪问道哪,比较发散。

  • 对成为架构师的几点看法

三面

  • mp4 实现 alpha 通道的原理,优缺点,收益是什么

  • m*n 的二维数组,做(0,0)出发,可以上下左右走,0 为畅通,1 为阻塞,目标位置(k,j),问是否能到达这个位置,类似迷宫的算法总结

感觉伴鱼的面试目的是问倒你,很多次讨论问题,我说你有什么看法或者正确答案的时候,面试官就让我回去自己上网搜一下,或者给出的方案,经不起我的推敲,我问上两三个问题,面试官反而有点语塞,感觉很奇怪。

7

公司:最右

笔试题

  • 引用关系

  • 自定义 view 步骤

  • activity 生命周期

一面

  • 介绍最右的现状

  • 常用的播放器,以及优缺点

  • opengl 的绘制流程

  • 音视频编解码的流程

二面

  • 在抖音做的工作

  • 性能优化,包体积优化,冷启优化,卡顿优化的一些实现方案

  • mvc mvp mvvm 的区别,以及自己实现的轻量级 mvvm 的原理

  • 编解码的相关知识

  • ijkplayer 的优缺点,以及是否看过相关源码

  • flutter 的探讨

总结

总体来说面试流程中规中矩,但是面试官的问题并不是很全面,更加关心的是自己的关心的领域,对于我提出的问题(大前端和 flutter),见解也仅仅是需要对新技术保持一定的敏感度,从公司产品来看,尤其是 4 月份出过一些事故,dau 跌的非常厉害,好像只有 100w+的日活,办公环境也一般,后面 hr 让我去跟 cto 再谈一轮,因为考虑到各个方面的因素,就直接拒绝了。

8

公司:BIGO

BIGO 是 YY 旗下的一个公司,目前刚刚收购了一个海外的直播产品,而且将来会把业务放到北京,还是想做一些事情,员工福利也是不错的。由于现在主要的人员还是在广东,前两面都是电话面试

一面

  • 多线程怎么保证线程安全,violated、sychronized、reenterLock,这三个锁的原理以及区别,JVM 是怎样实现 sychronized 线程安全的。

  • HashMap 的实现原理,put()原理。hash 冲突,resize,1.8 的改动,什么是红黑树,优点。

  • ui 优化,主要从检测和优化两个部分说明,优化又分为通用的优化,和改变绘制流程的优化。

  • jvm 的介绍,内存介绍,gc 等

  • binder 机制

二面

  • hashmap 是否线程安全,concurenthashmap 实现原理,1.8 之后有什么改变

  • 播放透明的 mp4 的原理

  • 冷启优化和 ui 卡顿的监测和优化

  • thinker 实现插件化的原理,我们使用什么什么实现热更新,热更新的通用方案,以及优缺点

三面

  • 介绍自己之前的工作经历,在华为做了什么,为什么离开华为,在抖音都做了什么工作

  • 实现 mp4 播放 alpha 视频的原理

  • 是否使用过 kotlin,kotlin 的一些特性

  • 内存泄漏和 oom 怎么产生的,内存泄漏的监控,leakcanery 的实现原理

  • 看过哪些第三方框架的源码,具体的实现原理。retrofit、okhttp 和 eventbus 等

总结

BIGO 一二面还是偏基础的知识,并没有很深或者很偏的问题,三面面试官是之前腾讯的大佬,面试更多的我做过的项目讨论和架构的问题,以及其他方面的一些问题,整体感觉还是比较好的,hr 小姐姐是广东人,说话的声音很好听,也很真诚。

9

公司:音娱科技

主要做的日本的直播产品,好像是 A 轮,公司并不大,创始人好像也是头条出来的,各种福利制度和头条进本类似。

一面

  • activity 生命周期 以及各个函数的含义

  • activity task 的四种类型

  • fragment 的生命周期

  • 启动 server 的两种方式

  • intent 传输数据的大小限制

  • binder 的原理

  • activity 的启动流程

  • hashmap 实现原理,1.8 的改动,红黑树概念

  • 合并两个有序的链表

二面

  • 为什么离开抖音

  • 组件化实现方案 spi 的缺点,怎么使用字节码注入

  • Dex 的组成,为什么每个 dex 会有 65536 的限制

  • 还有好多,时间太长记不太清楚了

总结

是 A 轮创业公司,面试技术是通过了,最终卡在薪资,可能我要的太高,公司可能觉得依照我现在背景,性价比不高,就没谈下去,后面跟其他公司聊的时候,又了解了一些这个公司的情况,拿完年终奖后,很多人开始跳槽了。

10

公司:小红书

一面

  • Activity 的生命周期、fragment 的生命周期,onRestart()什么时候调用

  • service 的两种启动方式,service 的生命周期

  • binder 机制

  • 进程保活:1.防止进程被杀 2.杀死后再拉起,详细的答案网上搜一下,这里就不列举出来了 app 的包体积优化,lint、proguard、andresguard 原理,字节码注入,删除 R.java 的变量,删除 access001 方法,压缩图片资源和使用 redex 等。

二面

  • 自我介绍

  • 对 JNI 和 C++了解吗?基本不了解,就略过了

  • Activity 的 launchMode,每个 Mode 的含义,Activity 的启动流程

  • 怎么样实现 MP4 播放 alpha 的视频,编解码的一些流程,NV20、YUV、RGB 一些概念,SurfaceView 和 TextureSurfaceView 的区别

  • 组件化的实现,都有什么技术方案,优缺点

  • 使用数组实现一个队列,有 void add(int val)和 void pop()两个函数,而且需要考虑扩容

三面(业务线负责人)

  • 介绍自己,介绍在抖音做过的事情

  • 哪两件事情做得最有成就感

  • 怎样重构代码,基本的 6 大原则,详细讨论每个原则的含义,使用过的设计模式

  • 假定场景,接口定义的有缺陷,第二版需要修改,是增加还是直接修改,以及还有没有其他的方案,怎么去做,为什么,这个是开放的题,结合设计原则,以及真实的情况和自己的一些例子说明即可

四面(Android 负责人)

  • 介绍自己,为什么离开抖音

  • mp4 播放 alpha 视频的实现方案,详细解说

  • 跨部门合作,具体的一个例子,怎么去沟通,假设一个例子,用最恰当的方式去沟通。

  • 怎么向上管理以及向下管理

五面(类似 VP 级别)

  • 对技术选型的看法,flutter、c++、java、kotlin,核心是解决问题

  • 是否会使用 kotlin,优势,以及在项目中真正带来的收益

  • 组件化,依赖版本号不同的解决办法

  • 插件化,一些实际问题的,具体是什么记不太清楚了

总结

小红书的装修真是豪,办公环境特别棒,但是面试流程有点多,足足面了 5 轮,不过总体来说技术还是很不错的,不论是广度还是深度,是一个值得加入的公司。

11

公司:饿了么

一面

  • 包体积优化,Lint、proguard、andResGuard 的原理,以及抖音做的一些包体积优化的方案

  • 线程和线程池的讨论,为什么要用线程池,线程池各个参数的含义,如果队列满了会发生什么,为什么线程池的数量是 cpu 核数+1 好吧,记不起来了

二面

  • 自我介绍

  • 线程安全的方式,sychronized 和 violated 的区别

  • 怎么自定义 Transform、自定义 Task,Task 之间怎么依赖,大致顺序是什么,增量编译的概念,异步加快文件的读取,ASM 接口的使用 cookie、session、token 的含义和区别,这里我确实不熟悉,就直接说我不太清楚了。

三面

  • 自我介绍

  • 在抖音都做过什么事情,相关的几个方向深入讨论一下

  • 对于架构的思考,怎样设计一个好的架构,6 大设计原则,分别说明一下

  • 用过什么设计模式,为什么要用设计模式,对于设计模式的思考

  • 怎样提高开发效率,较少沟通成本,实例说明下

  • 为什么要引入 kotlin,优缺点

  • 以后的规划

四面(交叉面)

  • 介绍自己,为什么离开抖音

  • 音视频的相关知识,NV20,YUV,RGB 的关系,为什么 mp4 的压缩率比 webp 的动画要高,编解码的流程,通用的编码格式,软硬解的区别。

  • View 的绘制流程,硬件加速的原理和软件绘制的区别,以及相关的 view 的优化

总结

总体来说面试体验还是不错的,三面面试官对于职业发展和新技术的见解都是非常深刻,也给与了我很多建议。

12

公司:美菜网

一面

  • 动画实现的方式,帧动画和属性动画的实现原理

  • 一张图片加载到手机内存中真正的大小是怎么计算的

  • OOM 产生的原理,内存泄漏是由于什么引起的,GCRoot 有哪几种类型,JVM 等

  • 一个二分查找的变形题,具体的题目记不清楚了

  • 为什么要做组件化,组件化的实现方案都有什么,优缺点

  • Activity 的启动流程

  • View 的绘制流程,从 VSYNC 信号开始

二面

  • 性能优化,包体积优化,R.java 优化,access$xx 方法优化,资源优化原理

  • MVVM 是什么,我自己做的轻量级的 MVVM 的实现方式,优点是什么

  • 看过什么第三方的源码,retrofit 原理,动态代理和静态代理的区别,是否使用反射,okhttp 的原理,Http 和 Https 的区别,Https 的 socket security layer 的握手,EventBus 的原理,3.0 的区别,APT 的使用以及怎样处理字节码(ASM、javaassit、BECEL 等)

总结

美菜网真的是好乱呀,面试人感觉有几十个,现在美菜网扩张这么厉害吗?我面试的时候我旁边的哥们也在面试,真的是很嘈杂,不过面试官的基础还不错,看过一些源码,但是并没有问到什么特别好的点,对整个新技术的见解和对我的建议(一般会问面试官一些对于新技术例如 flutter 看法,和对我的一些建议)感觉不是很深。跟 hr 谈完后就离开了。

13

公司:爱奇艺

一面

  • 从 Activity A 跳到 Activity B 的生命周期的调用过程,如果是异步进程呢

  • 冷起优化,systrace 怎么使用,实现原理

  • ANR 是什么,怎么上报 ANR,有些手机拿不出,有些手机拿不出 anr/traces.txt,怎么查找 ANR 问题

  • 插件化的原理,Activity 的启动流程,hook 点

  • 一个类,内部有一个链表的数据结构,实现 void add(Node n)和 void remove(int index)的函数

二面

  • 介绍工作经验,为什么离开抖音

  • HashMap 的实现原理

  • 在抖音做的工作,主要说了 ui 优化和冷起优化两个部分,扩展开来,讨论了很多相关的知识点

  • 手写消费者生产者模型的代码

总结

这次面试的是爱奇艺 TV 端奇异果,并不是爱奇艺移动端 app,因为我还是想做 app,二面之后,我就跟面试官说了我的想法,就没必要聊下去了,就直接走了。

14

公司:快手

一面

  • handler 介绍,为什么阻塞不会造成 anr,屏障消息,产生内存泄露原因,handler 内存泄露的引用链

  • 事件拦截机制,view 的绘制流程

  • android 的系统渲染原理,renderthread 的解释,三缓冲机制播放透明 mp4 的原理,surfaceview 和 textureview 的区别

  • opengl 的绘制流程,texturesurface 是什么,顶点着色器和片元着色器各自作用,VOB 是什么

  • 一个无序的 int 数组,给一个 target 数字,找出数组中两个数字相加为 target,并输出坐标

二面

二面面试官是 facebook 回来的,面试风格的确和之前的面试官讨论不一样

  • hashmap 的实现原理,怎样找到 index,size 为什么是 2 的倍数,怎样 resize,resize 过后,之前的 hash 冲突还存在吗?currenthashmap 的实现原理

  • 怎样保证多线程的安全,什么是乐观锁,怎么使用

  • 设计一个发送语音模块的架构,需要写出所有接口函数,并且需要详细说明,可能面试官更加在意设计能力,这里讨论的时间非常长。view 的绘制流程,onMeasure、onLayout、onDraw,各个参数是什么含义,尤其是 widthMeasureSpec、heightMeasureSpec 以及对应的 AT_MOST、EXACTLY 和 UNSPECIFIED

  • 数组中存有 1-3 的三种数字,例如[1,2,3,1,2,2,1,3,3],将其排序为[1,1,1,2,2,2,3,3,3],要求时间复杂度,后续将内容变为一个对象,继续排序

三面

  • 工作经历介绍,为什么离开抖音

  • mp4 播放 alpha 视频的原理,与其他方案的对比,收益点是什么

  • "之"字形打印二叉树

  • 1~100 盏灯,都是亮的,第一次将能被 1 整除的数的灯按下,变暗,第二次将能被 2 整除的数的等按下,变亮,第三次将能被 3 整除的数的等按下,变暗…第 100 次将能被 100 整除的数的灯按下,问,最后有多少盏灯是亮的。

总结

总体来说面试官的技术还是很厉害的,二面面试官的背景很好,思路也独特,有点外企风格。三面面试官比较注重算法,和解决问题的思路。整个面试流程真的是不太友好,三次面试去了三次,而且前两次都是在茶水间,一直说会议室订不到,环境特别嘈杂,而且前两次都是临近饭点,茶水间送饭更是杂乱,感觉快手效率和环境有一些混乱(个人面试感觉),但是不能否认快手在 2018 年的成绩还是很好的,尤其是直播的营收甩抖音直播几条街。

HR 面总结

在大多数互联网公司内(除了外企),到了 HR 面,基本上已经定下来,正常的聊聊就能发 offer 了,只要别太“个性”,或者三观异于常人就能收到 offer,大体就是一个积极乐观的态度。有几点需要注意下:

  • 不要说前公司和前 leader 的坏话

  • 对于为什么离开原公司,标准答案是目前公司不适合现有的自身发展,寻求更好的机会,(当然大部分都是因为钱 心知肚明就行,不用说出来)

  • 展现自己积极乐观和乐于助人的一面

  • 注意以上几点大体就没问题了

讨论

我会讨论几个话题,当然都是从我认知出发,并不一定对,欢迎大家一起探讨。

面试

面试过程其实大部分时候是,面试官或者公司是主导方,大部分的节奏是跟着面试官走,但是我觉得面试其实就是一个相互探讨的过程,不仅是公司在选择你,你也在选择公司、以后工作的同事和 leader。所以我这次面试中,更多的是和面试官探讨,也会反问面试官一些问题,不仅仅是最后面试官说可以问他几个问题,在面试过程中就会询问一些,优秀的面试官会跟你探讨,并且讨论出一个合理的方案或者正确的答案,整个过程非常愉悦,相互都学习到了,但是有一些面试,则不太友好,问道的问题总是说自己回去百度一下,这个很让我无语。

这次最大的收获就是跟 60 多位面试官的交流,更加让我认清我自己,认清自己的长处、短板和以后的规划,和对做人做事的看法,在这里真诚的感谢 60 多位面试官。

互联网寒冬

对于这个话题,从我自身的角度而言有一些感触,从 2018 年开始互联网就一直有寒冬的说法,各大互联网开始裁员、缩减 HC 甚至对码农的年终奖下手(辛辛苦苦一年,就指望年终奖~),当然最近确实环境有一些波动,但是远没有网上传的寒冬已至那么严重。从我的面试结果来看就知道,互联网并不是寒冬,只不过是更加理智,对所有的面试者来说要求的更高,所以我们更加要注重自身能力的培养,这并不是说我们要全身心的投入到刷算法,背理论知识等,我们更加注重自己的理论知识怎样能够为公司、产品带来更大的价值,从软实力方面来说,不仅要把事情做好,更要做好向上管理和向下管理。个人建议:想好为什么要跳槽,无脑跳是最不好的情况,如果一定要跳槽,最好的情况是骑驴找马,不要裸辞,跳槽需谨慎!!跳槽需谨慎!!跳槽需谨慎!!

学历是否重要

我的答案是重要,我就是学历的受益者,只要投递出的简历都会邀请面试(除了一些对工作年限限制非常严格的企业,hulu)。当然,在互联网的圈子中,核心是你本身的技术,但是有多少人的技术能达到逆天或者非常牛逼的地步,如果你是这样的人,啥都不用说了,但是我觉得绝大部分的程序员都是普通人、平常人,不要说什么 3 年以后公司就不看学历了,学历是一辈子的事情,那些高考能够碾压你的人,出了社会只要他们愿意,照样能碾压你,你努力,你拼命,别人也不会睡大觉等你,所以,能提升自己的学历,还是要尽量提升的。

大公司 VS 小公司

“大公司拧螺丝、小公司独当一面,进步更快”,我不太认同这句话,当然具体情况具体分析,每个人的情况不同,但是我还是觉得大家能去大公司还是尽量去大公司,原因我总结了以下几点:

镀金,这一点我相信大部分同学都是赞同的,我就不赘言了。知识的深度和积累,在大公司你能学到的东西更深和更加系统,而且可以有时间自己去思考和学习,尤其对于工作时间不长的同学。和优秀的人一起工作,大公司碰到优秀同事的概率更大,像我这样的普通人其实都是在模仿和学习,正是由于身边有了优秀太多的人,才会有危机感,才有机会跟着他们去学习,学习他们怎样学习、怎样思考问题甚至怎样为人处世。在华为中有到鑫和李桥,在抖音中,有夏老师、江老师还有乐华大佬等等,太多人,我从他们身上学到太多的东西,有一些能让我受益终身。

选择

选择同样是非常重要的,选择的首要前提是你要有很多机会,不然你都没机会怎么选择,在很多机会摆在你面的时候,一定要认真思考,不要冲动,想好自己需要的,多听别人的意见,最后自己决定。我们不能保证每一次选择都是正确的,但是能保证我们是不后悔的,遇事要冷静,多思考。

这里说的选择不仅仅是选择去哪个公司,从事什么方向,还有与什么样的同事工作,选择什么样的 leader,甚至是生活中的事情,网上说一个人要有一些成就,需要具备下面几点,我觉得非常的对:

  • 你自己要行

  • 有人觉得你行

  • 觉得你行的人也行

生活与工作

其实这个话题对我来说有一些困惑,“工作是为了更好的生活”,这句话是非常正确的,但是作为一个没有背景、父母帮你付不起首付的普通人来说哪里来的享受生活,唯有不断努力、不断的进步才有更好的物质回报,北京是全中国的人才聚集地,在工作的三年中,我不敢有一丝的懈怠,因为身边比我条件好,能力比我强,年龄比我小的人太多了,不论在哪里资源的分配都是二八原则。有很多身边人说我是苦行僧,不懂得享受生活,太无趣,的确我不否认,但是我知道唯有这样,我才能为我的父母、爱人以及以后的孩子撑起一片天,反过来讲,这些又是我的动力。感慨有点多了,这个话题全看自己,我满意目前的一个状态。个人拙见,大家看看就行。

推荐两份优秀文档

1、阿里架构师花近十年时间整理出来的 Java 核心知识

由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

这份 Java 核心知识点。覆盖了 JVM、锁、并发、Java 反射、Spring 原理、微服务、Zookeeper、数据库、数据结构等大量知识点。

如果需要获取到这个【核心知识点整理】文档的话可以点击这里即可获取到文章中的文档,资料







2、阿里巴巴 2021 年 Java 程序员面试指导小册

整份手册分为了七个篇章,分别是:高并发篇、分布式篇、中间件篇、数据库篇、设计模式篇、数据结构与算法篇、阿里巴巴 2020 年全年面试题总结篇!

需要完整版的朋友可以点击这里即可获取到文章中的文档,资料

高并发篇

秒杀的核心思想:层层过滤

尽量将请求拦截在上游,降低下游的压力

充分利用缓存与消息队列,提高请求处理速度以及削峰填谷的作用

大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案

分布式篇

中间件篇

根据得到的文档和查询语句的相关性,对结果进行排序

数据库篇

设计模式篇

工厂模式

简单工厂

数据结构与算法篇

分析 HashMap 的 put 方法

阿里巴巴 2020 年全年面试题总结篇

配置中心之简版

最后

感谢大家能耐着性子,看完我啰哩啰嗦的面经,以上仅是个人的观点。感觉两年稍纵即逝,在这两年中成长了很多,感谢所有帮助过我的人。

可以点击这里即可获取到文章中的文档,资料
发布于: 2021 年 07 月 21 日阅读数: 32
用户头像

Java架构师,高并发,高可用,分布式 2020.03.18 加入

领取文中资料加微信:MXC1146 即可获取

评论

发布
暂无评论
三年开发经验, 字节跳动抖音组离职后, 一口气拿到 15 家公司 Offer