说在前面,面试时最好不要虚报工资。本来字节跳动是很想去的,几轮面试也通过了,最后没offer,自己只想到几个原因:1、虚报工资,比实际高30%;2、有更好的人选,这个可能性不大,我看还在招聘。我是面试Android开发的,3年经验,下面是面试流程:
一面
1.插件化。启动activity的hook方式。taskAffity。 2.okhttp支持HTTP2?http2的功能有哪些?tcp方面拥塞控制?tsl的握手和具体的非对称加密算法。非对称名称 3.handler的post(Runnable)如何实现的。callback,runnable,msg的执行优先级。 4.阻塞是怎么实现的?为什么不会阻塞主线程? 5.求二叉树中两个节点之间的最大距离。 6.206含义,未修改资源是哪个,302含义,301含义 7.多进程通信问题。binder优势。aidl生成的java类细节。多进程遇到哪些问题? 8.动态代理传入的参数都有哪些?非接口的类能实现动态代理吗?ASM的原理 9.Application和Activity在Context的继承树上有何区别?二者使用上有何不同? 10.任意一颗二叉树,求最大节点距离
二面
1.设计一个日志系统。 2.内存泄露的分类。怎么查看内存泄露的问题 3.touch事件源码问题。 4.组件化的问题。module和app之间的区别。moduler通信是如何实现的。 5.native奔溃的日志采集,怎么处理? 6.注解实现一个提示功能:如果int的值大于了3需要提示。
三面
1.介绍下flutter的启动流程 2.介绍下flutter与weex的区别 3.组件化介绍一下 4.webview中与js通信的手段有哪些? 5.介绍下flutter_boost的原理
四面
1.适配器和装饰模式各自特点和使用场景 2.视频编解码是怎么做的 3.三色球排序
HR面
1.询问了除字节跳动以外,还在看其他工作机会么?分别是什么 2.字节、XXX公司、XXX公司,你的优先级是什么,为什么? 3.之前薪资待遇是多少?你期望的薪资是多少? 4.平时有什么爱好? 5.了解职位需求吗? 6.有没有想问的?
这是我在某论坛看到的故事,我知道我们很多程序员都有一个大厂梦,但如何针对大厂进行面试准备,如何和 HR 聊天,比如谈钱等等,很多程序员就显得手足无措了。本文就根据自己一些见解谈谈这些问题。
什么是合适的候选者
在介绍如何面试之前,这里先从公司的角度来分析:”到底什么样的候选者是公司所需要的技术人才?“就我在现在这家公司的一些面试官经验来说,一个具有如下特征的Android程序员是我们所需要的:
- 具有本科及以上学历(名校更好)
 - 具有2年及以上的工作经验(名企更好)
 - 技术扎实,有技术追求和工作激情
 - 良好的沟通和协作
 
在上面的四条中,其中第3条是最为重要的,即技术,技术是决定能否通过面试的最重要最直接的原因。一般来说,越是大公司,其对技术的要求就越高,尽管部分岗位并不需要那么好的技术,但是为了对候选者做出区分,其面试过程仍然会面试一些稍微深入的话题,相信大家都有所体会。
除了技术以外,良好的沟通和协作能力也是比较重要的。也许很多人觉得这个比较抽象,心里会想:”你怎么知道我有没有良好的沟通和协作能力呢“?其实这个问题并不难,面试过程就是一次沟通过程,如果不能和面试官很好地沟通,这就说明候选者的沟通有问题。如何很好地和面试官沟通呢?给如下几点建议:
- 礼貌和尊重。
 - 听懂面试官的问题并直接回答。
 - 谦虚谨慎、态度友好。
 
下面对学历和工作经验做一些说明,学历并不是一个硬性要求,即使候选者学校不怎么好也是有可能通过面试的,这就要求候选者技术非常扎实。而工作经验,之所以是2年以上,这是因为社会招聘的对象一般都是有一定工作经验的,而1年工作经验略短了点,拿百度来说,社招的最低级别一般为T4,差不多刚好就是2年经验左右。
这里做下总结,理想的候选者应该是这样的:
- 扎实的技术功底,有技术追求(必须)
 - 态度、沟通和为人都很好(必须)
 - 2年左右工作经验(基本必须)
 - 名校、名企、高学历(非必须,加分项)
 
基本来说,满足1和2就能通过面试,3和4都是次要条件,但是一般来说不满足3就很难满足1,不要说特例,木有参考意义。
由此可见,技术是面试结果的决定因素。那么到底技术掌握到什么程度才能比较轻松地通过面试呢?说了那么多,好像和Android没有一点关系,下面就开始以Android为例来分析下面试过程所需的技术。
技术知识梳理目录
下面的所有技术知识点详细内容都整理在了开源项目添加小助理vx:MAYAZBSP
1.JAVA多线程并发
- JAVA并发知识库
 - JAVA线程实现/创建方式
 - 4种线程池
 - 线程生命周期(状态)
 - 终止线程4种方式
 - sleep与wait 区别
 - start与run区别
 - JAVA后台线程
 - JAVA锁
 - 线程基本方法4.1.11. 线程上下文切换
 - 同步锁与死锁
 - 线程池原理
 - JAVA阻塞队列原理
 - CyclicBarrier、CountDownLatch、Semaphore的用法
 - volatile关键字的作用(变量可见性、禁止重排序)
 - 如何在两个线程之间共享数据
 

2.微服务
- 服务注册发现
 - API 网关
 - 配置中心
 - 事件调度(kafka)
 - 服务跟踪(starter-sleuth)
 - 服务熔断(Hystrix)
 - Hystrix断路器机制
 - API管理
 

3.分布式缓存
- 缓存雪崩
 - 缓存穿透
 - 缓存预热
 - 缓存更新
 - 缓存降级
 

4.Spring 原理
- Spring 特点
 - Spring 核心组件
 - Spring 常用模块
 - Spring 主要包
 - Spring 常用注解
 - Spring第三方结合
 - Spring IOC原理
 - Spring APO原理
 - Spring MVC原理
 - Spring Boot原理
 - JPA原理
 - Mybatis缓存
 - Tomcat架构
 

5.JVM
- 线程
 - JVM内存区域
 - JVM运行时内存
 - 垃圾回收与算法
 - JAVA 四中引用类型
 - GC分代收集算法 VS 分区收集算法
 - GC垃圾收集器
 - JAVA IO/NIO
 - JVM 类加载机制
 

6.JAVA基础
- JAVA异常分类及处理
 - JAVA反射
 - JAVA注解
 - JAVA内部类
 - JAVA泛型
 - JAVA序列化(创建可复用的Java对象)
 - JAVA复制
 

7.JAVA集合
- 接口继承关系和实现
 - List
 - ArrayList(数组)
 - Vector(数组实现、线程同步)
 - LinkList(链表)
 - Set
 - HashSet(Hash表)
 - TreeSet(二叉树)
 

8.Netty 与RPC
- Netty 原理
 - Netty 高性能
 - Netty RPC实现
 - 关键技术
 - 核心流程
 - 消息编解码
 - 通讯过程
 - RMI实现方式
 

9.日志
- Slf4j
 - Log4j
 - LogBack
 - Logback优点
 - ELK
 

10.Zookeeper
- Zookeeper概念
 - Zookeeper角色
 - Zookeeper工作原理(原子广播)
 - Znode有四种形式的目录节点
 

11.Kafka
- Kafka概念
 - Kafka数据存储设计
 - partition的数据文件(offset,MessageSize,data)
 - 数据文件分段segment(顺序读写、分段命令、二分查找)
 - 数据文件索引(分段索引、稀疏存储)
 - 生产者设计
 - 负载均衡(partition会均衡分布到不同broker上)
 - 批量发送
 - 压缩(GZIP或Snappy)
 - 消费者设计
 

12.Hbase
- Hbase概念
 - 列式存储
 - Hbase核心概念
 - Hbase核心架构
 - Hbase的写逻辑
 - HBase vs Cassandra
 - MongoDB
 - MongoDB概念
 - MongoDB特点
 

13.Cassandra
- Cassandra概念
 - 数据模型
 - Cassandra一致Hash和虚拟节点
 - Gossip协议
 - 数据复制
 - 数据写请求和协调者
 - 数据读请求和后台修复
 - 数据存储(CommitLog、MemTable、SSTable)
 - 二级索引(对要索引的value摘要,生成RowKey)
 - 数据读写
 

14.RabbitMQ
- RabbitMQ概念
 - RabbitMQ架构
 - Exchange 类型
 

15.设计模式
- 设计原则
 - 工厂方法模式
 - 抽象工厂模式
 - 单例模式
 - 建造者模式
 - 原型模式
 - 适配器模式
 - 装饰器模式
 - 代理模式
 - 外观模式
 - 桥接模式
 - 组合模式
 - 享元模式
 - 策略模式
 - 模板方法模式
 - 观察者模式
 - 迭代子模式
 - 责任链模式
 - 命令模式
 - 备忘录模式
 

16.负载均衡
- 四层负载均衡 vs 七层负载均衡
 - 负载均衡算法/策略
 - LVS
 - Keepalive
 - Nginx反向代理负载均衡
 - HAProxy
 

17.数据库
- 存储引擎
 - 索引
 - 数据库三范式
 - 数据库是事务
 - 存储过程(特定功能的SQL 语句集)
 - 触发器(一段能自动执行的程序)
 - 数据库并发策略
 - 数据库锁
 - 基于Redis分布式锁
 - 分区分表
 - 两阶段提交协议
 - 三阶段提交协议
 - 柔性事务
 - CAP
 

18.JAVA算法
- 二分查找
 - 冒泡排序算法
 - 插入排序算法
 - 快速排序算法
 - 希尔排序算法
 - 归并排序算法
 - 桶排序算法
 - 基数排序算法
 - 剪枝算法
 - 回溯算法
 - 最短路径算法
 - 最大子数组算法
 - 最长公共子序算法
 - 最小生成树算法
 

19.数据结构
- 栈(stack)
 - 队列(queue)
 - 链表(Link)
 - 散列表(Hash Table)
 - 排序二叉树
 - 红黑树
 - B-TREE
 - 位图
 

20.一致性算法
- Paxos
 - Zab
 - Raft
 - NWR
 - Gossip
 - 一致性Hash
 - 一致性Hash特性
 - 一致性Hash原理
 

21.Spark
- Spark概念
 - 核心架构
 - 核心组件
 - SPARK编程模型
 - SPARK计算模型
 - SPARK运行流程
 - SPARK RDD流程
 - SPARK RDD
 

22.Storm
- Storm概念
 - 集群架构
 - Nimbus(master-代码分发给Supervisor)
 - Supervisor(slave-管理Worker进程的启动和终止)
 - Worker(具体处理组件逻辑的进程)
 - Task
 - ZooKeeper
 - 编程模型(spout->tuple->bolt)
 - opology运行
 - Storm Streaming Grouping
 - ResourceManager
 - NodeManager
 - ApplicationMaster
 - YARN运行流程
 

23.云计算
- SaaS
 - PaaS
 - IaaS
 - Docker
 - Openstack
 - Namespaces
 - 进程(CLONE_NEWPID 实现的进程隔离)
 - Libnetwork与网络隔离
 - 资源隔离与CGroups
 - 镜像与UnionFS
 - 存储驱动
 

24.Hadoop
- Hadoop概念
 - HDFS
 - Client
 - NameNode
 - Secondary NameNode
 - DataNode
 - MapReduce
 - JobTracker
 - TaskTracker
 - Task
 - Reduce Task 执行过程
 - Hadoop MapReduce 作业的生命周期
 - 作业提交与初始化
 - 任务调度与监控。
 - 任务运行环境准备
 - 任务执行
 - 作业完成
 

如何获取免费架构学习资料?
资料获取方式:
关注+转发后,私信关键词 【资料】即可免费获取到!
重要的事情说三遍,转发、转发、转发后再发私信,才可以拿到!






关于程序员,除了做项目来提高自身的技术之外,还有一种提升自己的专业技能就是:多!看!书!
所有的知识点都整理在了开源项目添加小助理vx:MAYAZBSP

如何和 HR 聊天,比如谈钱等等
首先你面到 HR 了,说明你基本已经成为备选人之一了。这时候 HR 会和你聊很多问题,这些问题都是为了了解你的一些个人情况的。比如说性格啦、反应能力、情商等等。另外大部分公司的 HR 并没有一票否决权,面试没有成功多半是有更好的备选人而不是因为 HR 把你卡掉了。
然后说到谈钱的一个问题。首先以最少的工资招到需要的人肯定是 HR 的考核之一,所以压价是很正常的一个事情。并且上家公司的薪资也是一个很重要的参考,一般来说涨薪幅度在 30% 以上是很牛逼的事情了,通常都在 20% 左右。
你的开价一般就是 offer 的上限了,考虑到压价的情况,你可以在原本期望薪水上上浮 1K 左右,然后可以根据面试的情况来有选择性的开价。
- 面的不错,本来想要 16K 的,那么就多要个 1-2K 没啥问题
 - 面的一般,那就报 16 K 吧
 - 面的一般或者不大好,但是又很想进这家公司,可以酌情下降 1-2K,这个主要还是看自己
 - 不怎么想去这家公司,随意开价
 
结语
如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。
如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。
来源:oschina
链接:https://my.oschina.net/u/4372568/blog/4788202