前言
我们移动开发程序员应该首先明白一个要点,能够学习的东西可以区分为『知识』和『技能』。
知识,就是你知道就知道、不知道就不知道的东西,比如『计算机系统中一个字节是包含8个bit』,你知道了之后就算掌握了。
技能,是需要练习的东西,不是知道不知道的区别,只有熟练还是不熟练的区分,比如『写代码要用有意义的命名规则』,你知道了这一点,不代表你掌握了这个写代码命名的技巧,你需要去写代码练习,但是练习还不够,你需要反复练习,还需要别人给你反馈,你才能练习得更好。
是的,知乎上有些内容全都是『知识』(有的还只是伪知识),不是技能,记住,知识只需要记忆力,技能需要反复练习。
【一面】
- Android四大组件是什么?你最熟悉哪个?
- Activity的生命周期?
- 旋转屏幕的时候会发生什么?
- Java的常量池?不同String赋值方法,引用是否相等?
- HashMap的实现?树化阈值?负载因子?增长系数?
手写代码:O(1)的单链表元素删除(×:倒霉孩子没见过这套路…经过提示也没想出来,可见做题的重要性)
手写代码:获得单链表的最后N个元素
【二面】
- 写过C++是吧?
- 知道STL容器的allocator吗?
- 手写代码:实现无锁同步 (×:我写成了CAS操作,被打断,说特定的ARM处理器没有这个同步原语,不能依赖相关指令。包括信号量等也不行。)
- 手写代码:自定场景,实现一个满足需求的内存池 (×:晕乎乎写出了几个bug,面试官眼尖…而且自我感觉回收算法不够好,感谢放过)
- 手写代码:从长序列中找出前K大的数字,堆排序
- JVM的垃圾回收算法了解吗?
- 对象可达性分析,哪些是GC root?
- TCP和UDP的根本区别?
- 什么场景下使用UDP?为什么?
- 提问简历,关于FFmpeg
- 我的提问:
- 面试官是哪个组的?
字节跳动今年是否真的缺人?招聘策略是什么?(答:是。项目和实习经验吃亏没关系,今年招聘重视基础,换去年我肯定不给你过。)
【三面】
- 介绍项目,高三暑假做的App
- 画某个功能的模块图,写出相关接口
- 这样设计有什么问题?如何改进?
- QQ视频聊天使用什么协议?
- 视频聊天为何会卡顿?
- TCP流量控制算法的细节? (×:包速率增长的函数关系说不清楚,感谢面试官放过)
- 假设有节点自带p的丢包率,如何判断丢包是因为带宽不够还是随机丢包导致?
- 如果视频聊天出现卡顿,如何在应用层面缓解?
- 手写代码:大整数加法,要求代码可读性(×:又写出搞笑bug系列,被二面搞傻了)
- Android应用中的卡顿是什么导致的?
- Service和Thread有什么区别?Service的代码是在哪个线程运行的?
- AsyncTask?Executor?
- AsyncTask有哪些缺点?
- 用过IntentService吗? (×:没用过,感觉就是个适合处理单次计算任务的方便设施)
我的提问:
- 面试官是做什么的?
- 面试官对非科班学生有什么看法?
- 面试官认为我存在哪些不足?
学习福利
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
详细整理在腾讯文档可以见;
可以见;
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。