前言
网易的面试结果已经出来好几天了,一直拖着不是很想写面经,反正这会儿闲着无聊,又总是要写的(一来呢是当做一种记录吧,二来呢留给自己和需要的人看,好有个方向)就这会儿写了吧...
首先还是感谢吧,感谢网易面试官的肯定和建议。
网易一共经历了四轮面试,前三轮技术面,第四轮总监面。二面完了之后,HR 邀约去杭州参加现场面的,但是因为距离原因拒绝了,后来改成视频面,说实话,我现在有点后悔当初的决定了... 俗话说,见面三分情嘛哈哈哈哈
网易一面(28 min)
- 自我介绍
- 项目经历(老老实实一五一十介绍项目经历)
- 然后一个项目一个项目地问
- 介绍项目功能,挑一两个你觉得的实现难点讲讲
- 聊项目聊了好多,就是聊天一样的,很轻松
- 聊了很多 Flutter 的东西,比如怎么接触到 Flutter 的,为什么这么喜欢 Flutter,为什么创办这个 Flutter 开发者协会
- 聊着聊着二十多分钟过去了,面试官说我给他的感觉很好,所以也不打算问那些基础的(只有他觉得是基础)东西了(可能是累了hhh),然后就问我有什么要问的吗
提问环节:
- 网易内部对 Flutter 的看法,以及对 Flutter 未来的看法,以及值不值得学习
- 如果能拿到 offer,有没有要求必须要去实习
- 什么时候有结果
网易二面(30+ min)
这一面真的... 不知道咋说,由于在这次面试之前不久被百度的面试官怼惨了,看来本人真的是心态超级不好啊,被怼了之后,再去看网上的面经,觉得自己啥都不会,越看越丧,甚至开始自我否定...
所以对网易二面真的没抱什么希望了,面试官问什么我就答什么,会的就答,不会就说不会,也不多说什么,基本就是一问一答式的(除了聊 Flutter 的时候确实比较激动),面试中途我甚至有说想放弃面试、不想耽搁彼此的时间,不知道是面试官真的没听到还是假装没听到(可能是要完成任务吧),他还是继续问问题,我看他脸色感觉他是真的都听不下去了,像是两个机器人在交流,时间一过半小时,面试官就问有什么问题问他嘛,我说没有,然后就挂断了...
对面试官提的问题印象很模糊,只记得很少一部分问题了......
- 自我介绍 + 项目
- 讲 Service 的使用
- 使用 Service 的时候有没有遇到过问题?有没有在多种机型上测试过
- 数据持久化
- 问了挺多 SharedPreference 的东西
- Gradle 相关
- Activity之间传数据
- 如果 Activity 之间有大量数据(几兆)要传,应该怎么做
- 事件分发机制
- 自定义 View
- 自定义 View 中的自定义属性是如何调用的(好像问的是调用)
- 对比 ListView 和 RecyclerView
- 讲一下设计模式(然后问了两个我名字都没听过的设计模式,让对比一下)
- 讲一下 MVC MVP MVVM
- Flutter 中的难点、原生通信、异步、框架原理等等......
网易三面(110+ min)
- 自我介绍 + 项目经历
- 如何实现推送?(我说建立一个长连接)
- 一条推送信息应该有哪些内容
- 为什么这么设计,讲一下每个字段的含义?这么设计有什么问题?
- 服务端如何确保客户端收到消息了?
- 如果服务器发出去一个消息,客户端还没收到,断网了怎么办?
- 如何处理重复消息?
(还有好多好多问题,考虑安全啊、性能啊、各种意外情况啊,反正就是要搞死你......)
聊了会儿 Flutter
一个印象较深的问题:Flutter 可不可以实现三维模型?(大概这么问的...)我说不行,因为 Flutter 的绘制引擎 skia 是2D绘制引擎。 他又问 如果有3D绘制引擎呢??还有 Flutter 与原生通信的问题...
撕代码:
一个二维平面上有 n 个气球,都是标准椭圆(也就是说可以通过两个坐标确定一个椭圆的位置及大小),椭圆的外切矩形与坐标轴平行,椭圆的分布是随机的,但是不存在两个椭圆交叉的情况(不存在外切矩形相交),问最少需要多少条平行于 y 轴的线,能够穿过所有的气球?
找出两个单向链表中的公共部分。
- 平时怎么学习的?
- 平时有看什么书?(我说最近有看 《Android进阶解密》)
- 这本书的章节是怎么安排的?它有什么特点?
- 如果要你写每一章的 topic 你会怎么写?
提问环节:
- 应届生进入公司能接触到哪些业务?
- 如何看待“程序员是吃年轻饭的”这一观点?
网易四面(总监面 25 min)
- 自我介绍
- 大学学过哪些课程?然后问了某些课程的分数
- 一个无序数组建堆的时间复杂度是多少?
- 死锁是什么?如何产生的(产生死锁的条件)?
- TCP 中的滑动窗口
- 看过《算法导论》这本书嘛?
- 职业规划
- 为什么选择杭州而不是北京
- 为什么不读研?
- 印象最深的项目
最后依然是提问环节
面试总结:
我的秋招应该也就到这儿了,说实话,我不想再折腾了,因为经过这么多笔试、面试,发现自己的技术真的还很差,基础不牢固,知识点掌握的不够深入,我习惯性在面试结束后让面试官点评一下自己的表现,听到最多的大概就是“对某某知识点理解的不够深入”“加强基础”。
如果最终没能保研,我将全身心投入,准备明年的春招,据说到时候压力更大、更难,能怎么办呢?加油吧!!!
技术外这些准备要做好
首先是准备简历:
简历编写需要注意的几点:
1.标题的直接按照姓名-几年工作经验-应聘岗位格式来填写。
例如 小明——四年工作经验——Android开发高级工程师。因为要知道,HR筛选简历是非常快的,你要在第一时间就让他看到他想要看的信息。HR一开始最关心的就是工作年限和岗位,你直接在标题栏用最大的字体写出来会比很多人介绍了半天项目最后写年限要好得多。
2.个人信息写最前面。
个人信息栏其实不用写很多东西,最主要的就是姓名、联系方式、性别、如果学校是名校那么就写上,如果本科学的是计算机专业也可以在这里写上,如果都不是就最好放到最后去写,因为最前面的东西永远是最先看到的内容,也是你最有竞争力和卖弄的资本。
3.有技术博客和github开源项目的一定写在最前面。
这是活生生的例子。我在面试华为的时候面试官就特意去看了我的csdn上的博客。然后说写的还是不错的,给他留下了一个不错的印象,所以这点是绝对的加分项最好就是写在最前面。
分析考点:
技术面是一场技术面试官对候选人的综合评估
先从面试官角度来分析,在面试过程中的对候选人一些考查点吧。知己知彼百战不殆,面试过程中逆向思考一波,有助于我们怎么应对技术面。
候选人人设是否跟简历一致
主要看候选人是否坦诚真实,这个会直接影响能不能通过。候选人上的项目经验和技能点应该尽可能与候选人匹配,比如说,候选人说做了XX项目,但是问起是怎么实现的,却答不上来,或者说熟悉xx技能点,却只会调用常用的api,对其源码细节一点都不熟悉,那多半是不给过的。如果候选人要吹牛B,能拿出能圆上吹牛B的实力,也是可行的。比如说某某模块其实是你同事做的,但是你也完全理解了,可以应答如流,面试官是不会计较的。
技术的扎实程度和项目经验匹配程度
考查包括对技术的理解和解决问题的能力,包含一些细节,运用的场景,实现的原理等等,目的是为了测试候选人技术水平上限。答得越清晰,越深入,对细节掌握越牢靠越好,不一定需要全部答出答完美才能拿到offer,但这些题回答的效果最能影响到offer能谈多少钱。小厂偏重于技能、项目经验匹配度,大厂偏重于基础、原理。小公司,面试官通常希望候选人尽快上手,就希望候选人有类似竞品或者功能开发经验的候选人,所以也可以从这些方面做准备。大公司呢,可能会提出一些场景来考查候选人怎么设计,这就要求候选人功底深厚,逻辑严谨了。上面的题集我没写答案,因为我觉得很多题本就没有标准答案,也没有必要背题的“标准答案”,优秀的回答,应该是形成自己的理解输出的,说的有理有据就行。
候选人亮点、优势
一般是作为候选人的加分项,或者是面试官为了更快的打开话题,了解候选人的优势,并测测候选人的优势到底屌到什么程度。这个问题回答好了,候选人甚至能翻盘。
如何学习Android面试中所需的技术
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!
有需要的朋友可以点击下方课程链接了解更多哟~
https://edu.51cto.com/course/32703.html
为了更好更快地学习Android面试中所需的技术,大家可以了解一下我的Android进阶学习路线:(附面试题与学习资料)
- Android学习路线图
首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式,总之希望能够帮到你们!
接下来就是需要梳理知识,提升储备了!(Android八大模块进阶资料)
- 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
- Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化
- 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化
- 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
- NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发
- 微信小程序:小程序介绍+UI开发+API操作+微信对接
- Flutter:Flutter入门+Flutter进阶
- Kotlin: Kotlin入门教程 +Kotlin 实战避坑指南 +项目实战《Kotlin Jetpack 实战》
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
然后再是通过源码来系统性地学习
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
最后刷面试题
内容涵盖:Java方面、Android方面、音视频、Flutter、算法、Android Framework、企业常见174道面试题等等…共1700+页 质量非常高!!!
Android方面
- 试从源码角度分析Handler的post和sendMessage方法的区别和应用场景?
- 谈谈Android的事件分发机制?
- 谈谈自定义View的流程?
- 谈谈你对Android性能优化方面的了解?
- 自定义 Handler 时如何有效地避免内存泄漏问题?
- 谈谈Android中内存优化的方式?
- 谈谈你是如何优化App启动过程的?
- 请回答一下Android进程间的通信方式?
- 请简要谈谈Android系统的架构组成?
- 请简述一下 Android 7.0 的新特性?
- 什么是冒泡排序?如何优化?
- Activity 与 Fragment 之间常见的几种通信方式?
- 对于 Context,你了解多少?
- 谈一谈startService和bindService的区别,生命周期以及使用场景?
- 简单介绍下ContentProvider是如何实现数据共享的?
- 说下切换横竖屏时Activity的生命周期?
- 说说Activity加载的流程?
- HandlerThread 的使用场景和用法?
- 谈谈 Handler 机制和原理?
Java相关方面
- 分别讲讲 final,static,synchronized关键字可以修饰什么,以及修饰后的作用?
- Java 中深拷贝与浅拷贝的区别?
- 什么是反射机制?反射机制的应用场景有哪些?
- 谈谈如何重写equals()方法?为什么还要重写hashCode()?
- 请说一下HashMap与HashTable的区别
- 谈一谈ArrayList的扩容机制?
- 请简述 LinkedHashMap 的工作原理和使用方式?
- Java 中使用多线程的方式有哪些?说一下线程的几种状态?
- 谈谈线程死锁,如何有效的避免线程死锁?
- 什么是线程池?如何创建一个线程池?
- 谈一谈JAVA垃圾回收机制?
- JVM中类的加载机制与加载过程?
- JVM、Dalvik、ART三者的原理和区别?
- JMM是什么?它存在哪些问题?该如何解决?
算法方面
- 如何运⽤⼆分查找算法
- 如何⾼效解决接⾬⽔问题
- ⼆分查找⾼效判定⼦序列
- 如何去除有序数组的重复元素
- 如何寻找最⻓回⽂⼦串
- 如何⾼效进⾏模幂运算
- 如何运用贪心思想广域玩跳跃游戏
- 如何⾼效判断回⽂链表
- 如何在无线序列中随机抽取元素
- 如何判定括号合法性
- 如何寻找缺失和重复的元素
- 请说一说HashMap,SparseArrary原理,SparseArrary相比HashMap的优点、ConcurrentHashMap如何实现线程安全?
- 请说一说HashMap原理,存取过程,为什么用红黑树,红黑树与完全二叉树对比,HashTab、concurrentHashMap,concurrent包里有啥?
- 请说一说hashmap put()底层原理,发生冲突时,如何去添加(顺着链表去遍历,挨个比较key值是否一致,如果一致,就覆盖替换,不一致遍历结束后,插入该位置) ?
Android Framework方面
- 你了解Android系统启动流程吗?
- Android中多进程通信的方式有哪些?
- 为什么 Android 要采用 Binder 作为 IPC 机制?
- system_server 为什么要在 Zygote 中启动,而不是由 init 直接启动呢?
- Zygote 为什么不采用 Binder 机制进行 IPC 通信?
- Binder有什么优势
- Binder是如何做到一次拷贝的
- MMAP的内存映射原理了解吗?
- 说说四大组件的通信机制
- 简述下 Handler 机制的总体原理?
- Handler 或者说 Looper 如何切换线程?
- Handler、Mesage 和 Runnable 的关系如何理解?
- Handler 为什么可能导致内存泄露?如何避免?
- Handler在系统当中的应用
- Handler如果没有消息处理是阻塞的还是非阻塞的?
- handler.post(Runnable) runnable是如何执行的?
- ActivityManagerService是什么?什么时候初始化的?有什么作用?
- Instrumentation是什么?和ActivityThread是什么关系?
- ActivityManagerService和zygote进程通信是如何实现的。
Kotlin方面
- 请简述一下什么是 Kotlin?它有哪些特性?
- Kotlin中实现单例的几种常见方式?
- 在Kotlin中,什么是内联函数?有什么作用?
- 请谈谈Kotlin中的Coroutines,它与线程有什么区别?有哪些优点?
- 说说Kotlin中的Any与Java中的Object 有何异同?
- Kotlin中的数据类型有隐式转换吗?为什么?
- Kotlin中集合遍历有哪几种方式
- Kotlin内置标准函数let的原理是什么?
- Kotlin语言的run高阶函数的原理是什么?
音视频方面
- 怎么做到直播秒开优化?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- FFMPEG:图片如何合成视频
- 常见的音视频格式有哪些?
- 请叙述MPEG视频基本码流结构?
- 说一说ffffmpeg的数据结构?
- 如何降低延迟?如何保证流畅性?如何解决卡顿?解决网络抖动?
- 平时说的软解和硬解,具体是什么?
Flutter方面
- Dart 语言的特性?
- Dart 多任务如何并行的?
- dart是值传递还是引用传递?
- Flutter 特性有哪些?
- Widget 和 element 和 RenderObject 之间的关系?
- 使用mixins的条件是什么?
- Stream 两种订阅模式?
- Flutter中的Widget、State、Context 的核心概念?是为了解决什么问题?
- 说一下Hot Reload,Hot Restart,热更新三者的区别和原理
- Flutter 如何与 Android iOS 通信?
- 说一下什么是状态管理,为什么需要它?