个人简介
学渣一枚,2017年6月某空港学校毕业。从事Android开发已经4年,开发过机顶盒应用,做过手机app,21年年后入职新单位从事车载应用开发。
工作经历
因为新公司入职不就主要说说前面的工作情况。
煎熬&没有太多的成长(第一家公司)
处于这个状态并不是因为公司不好,相反是自己表现的不好。在公司时,公司有完善的培训机制(还可以选择其它方向的一些培训,由其它部门的资深开发人员进行授课),入职时有对应的导师进行培训。更加幸福的是每个月老板都会买书给我们看。
既然在这么好的一个环境为什么我还是这样难受呢?总结有下面的原因。
- 心思杂乱。python、js 、web 都想要学习,最终的结果确是什么都没有。
- 贪玩 下班之后很多空余时间都在玩游戏。
- 自身技术基础不够,却又选择了错误的东西进行学习,导致主要工作上没有做出太好的成绩。最终的结果就是被公司拖着走。
茁壮成长&发展
为甚么要在成长前加上茁壮二字,因为相对与第一家公司,个人的技术成长要好太多。
2018年的时候有幸接触到了时间管理,开始学着对自身状态进行调整。有计划有目的的进行学习。每天会提前一个小时到达公司进行技术类书籍阅读。两年时间看完的技术书籍有:
- Android开发艺术探索
- 大话设计模式
- Android 源码设计模式
- Android 进阶解密
随着时间的进行,自己也在项目小组由一个辅助的角色变成项目主力开发,同时自己成长到了中级开发水平,也会和初级的小伙伴进行一些技术交流。
相比于第一家公司,这边并没有一些技术培训和导师指导。但是我的技术成长却相对较大。个人的理解是:内在驱动大于外在。
前景展望
从3月份开始进行面试。前后面试大约有6家,通过几家公司的面试也大致了解到了自身的价值(能拿多少钱)。其中最遗憾的是面试某笔记,前三轮技术面已经过了,结果vp挂掉了。可能是自己表现太积极,因为确实很想去,甚至做好了如果能去愿意接收降薪的准备。
相较于公司的其他小伙伴,我的面试过程还算比较顺利。我认为最好的我们不应该为了面试而准备,而在于平时就应该注重积累自己的技术。
一些面试经历
公司一:
软件面试官:
- 自我介绍、工作履历简述。
- SVN 和 Git 区别?描述下 Git 提交过程以及什么是工作区和暂存区?
- Git 中 merge 作用?和 rebase 有什么区别?
- Java 中强引用、软引用、弱引用、虚引用区别。
- Https 和 Http 区别,内部使用哪儿些算法。
- 对称加密和非对称加密区别。
- Jetpack 实际项目中用过哪儿些?
- 简述 Apk 包大小优化思路。
- Kotlin 拓展函数怎么实现的?基于什么原理。
- Kotlin 属性委托怎么实现的?基于什么原理。
- 简述 SharePreferences 以及过程中遇到的问题。
- 为什么选择 MMKV,MMKV 有什么优势,内部原理是什么?
- 简述 Handler 以及原理。泄漏怎么解决?
硬件面试官:
- Flutter 实际开发经验有多久?使用/了解过 Flutter 混编吗?
- 怎么优化的 Flutter 包大小?
- Flutter 中 Element、Widget 简述。
- Android Compose 了解过吗?简述一下。
- so 库动态加载有了解过吗?
- 简述 MMKV 原理。
- SharePreferences 有什么缺陷?支持跨进程吗?
- 在不使用任何三方库,如何实现弹幕功能?如何保证低端机上流畅性。
- 自定义弹幕中,你 Model 怎么设计?View 又怎么设计?
- RecyclerView 和 ListView 有什么区别?
- RecyclerView 缓存原理。
- 在不使用任何三方库以及系统提供控件,如何实现 RecyclerView 下拉刷新?
- 直播是什么实现的?需要注意的有什么?使用过的视频格式有什么?如何保证视频以及文字/语音同步性?
- 开发过音频相关吗?用的是什么?音频格式是什么?
- 微信小程序使用什么开发的?Vue 还是?
公司二:
- 工作多久了,你觉得你和其它 Android 工程师相比,有什么优势。
- 你的 GitHub 主要内容是什么?
- 假如当你带小朋友,你是如何和他进行分享以及帮助等?
- 你持续写东西,输出的动力是什么?
- Kotlin 用多久了,你认为你的 Kotlin 掌握水准在哪儿?初级、中级、高级?
- var、val、let、apply 有什么区别?
- let 返回 it,apply 返回 this,它们有什么区别?为什么这么设计。
- lateinit 作用是什么?
- Kotlin 协程有用过吗?用在什么场景?
- 协程是个什么东西?
- 有了解过协程如何切换线程原理吗?
- Retrofit 和 OkHttp 是什么关系?
- Retrofit 是如何通过注解来方便我们 api 调用?基于什么原理。
- JetPack 用过哪儿些?
- ViewModel 用来做什么的?
- ViewModel 如何实现生命周期绑定?
- ViewModel 为什么存在?那我直接创建个类不可以吗?如何实现数据绑定。
- ViewModel 如何实例,如何使用的?
- LiveData 如何实现的?
- LiveData postValue 和 setValue 赋值,这两个会不会丢失数据,有没有遇到过?
- MVC、MVP、MVVM 区别是什么?
- Rxjava 用的多么?map 和 flatMap 有什么区别。
- RxJava 使用哪儿个操作符能保证顺序执行?
- 如果让你自己设计一个 Glide 你会如何设计?
- RGB_565 每个像素点占多少内存?
- 为什么会使用 RGB_565?
- 为什么要对图片进行一些压缩?那服务器直接给我们直接裁剪指定尺寸大小不就好了。
- 假设现在有一张 1MB 图片,我直接设置给 ImageView,那么它在内存中占用空间有多大?
- 性能优化都做过哪儿些内容?
- 瘦身的话,我们都是怎么做的呢?
- armeabi 和 armeabi-v7a 有什么区别?
- so 库可不可以动态加载,如何实现?
- Android 版本从 5.0 到 12 都更新了什么东西?
- Android 5.0 ART 是个什么东西,具有什么优势。
- 今天的面试,自我感觉怎么样?
公司三:
- 请做一下自我介绍、学历说明以及工作经验。
- 公司团队多大,主要负责哪儿些内容?公司是否有自营项目?外包吗?
- 为什么 Google Play 搜索不到,原因是什么?怎么处理的?现在是一个什么样的状态?
- 关于弹框隐私协议,工信部怎么规定的?
- Luban 压缩具体在业务中做哪儿些操作?你知道它内部使用了哪儿些算法吗?
- 图片使用 Glide,你为什么使用它,它有什么优点,内部算法有什么?
- 请手写 Glide 加载图片地址到 ImageView,并且图片展示效果为一个圆。
- ShapeableImageView 你知道原理是什么吗?最低兼容版本你知道吗?
- 假设后端接口列表中返回了超大图片,你是如何处理优化并正常显示列表中的?
- 使用过 Jetpack 的哪儿些东西,你对它评价怎么说?
- Jetpack Compose 了解过么?简单谈下个人理解。
- Kotlin 与 Java 区别在哪儿里?
- Android 原生 Apk 以及 Flutter Apk 大小优化怎么做的?
- 怎么统计性能调优数据?
- 项目中接触过 WebView 相关吗?这块怎么处理的?
- SpannedString 原理是什么?都用过它做什么操作?
- TextView 中 setText(Html.fromHtml()) 内部原理知道吗?
- 简单描述 CoordinatorLayout 以及内部事件如何分发?
- 图片轮播怎么做的?如何做到我在最后一张无缝滑动到第一张图片?
- 你知道 Retrofit 是怎么发出的请求吗?
- 你的 Android 借壳分享微信中 mmessage_content 怎么算出来的?
- 项目中 Flutter 中是原生开发还是混合开发?使用了哪儿些框架?
- 假设地图现在没有开源库,你怎么在 Flutter 实现地图效果?如果我想当前页面上面是地图下面是其他内容呢?
公司四:
- 自我介绍以及学历简述。
- HashMap 内部存储是怎样的?
- hash 冲突是个什么概念?冲突之后怎么解决?
- 哈希桶是什么结构?
- 链表结构节点是怎样的?
- Java 中的 volatile 是线程安全的吗?如果对他做自增操作,例如 a++。
- Handle 中的 postDelay 实现原理是怎样的,它是怎么实现的延迟处理?
- 优化线上 Apk 大小都了什么操作?做完 Apk 大小之后从多少降低到多少?
- 下载转换率怎么统计的?
- 假设现在给你个需求,需要在打包的过程中去处理图片,你有什么思路?在哪儿个 task 去做 hook?
- 资源编译的流程是什么样的?
- 360 加固原因是什么?
- 你觉得加固或者安全方面,应该从哪儿个方面入手?Dex 层怎么处理能防止反编译?
- so 加固你知道有什么方案吗?
- 你比较擅长什么?设计或者某个技术有比较深的了解?
- 责任链模式简述,一般用于什么场景下。
- 你怎么理解的依赖倒置设计,具体在什么场景下使用?
未来要做的事
- 学习数据结构 678月刷完leetcode 最热100题
- 源码阅读总结
- 蓝牙应用层的运行原理(6月已完成)
- 系统binder机制
- 系统Anr原理
- 其它的一些框架源码阅读
工作上的小建议
- 如果你初入职场,在专业知识不是太牢固的情况下建议不要花过多得时间研究其它的一些东西,而是专注于提升自己的专业技能
- 关于职场技能的学习,我们要记住,我们的学习都是有目的,学过之后一定要总结归纳。不要反复的重头在来。
- 关于工作的选择,我的理解是合适最好。就好比将一个成绩极差的学生放在及其优秀的班级,他往往是跟不上老师的节奏的。需要下来花大量的时间来补,而成年人往往缺少这样的时间。
- 关于数据结构和设计模式,许多多年开发的小伙伴居然也有说不重要。举个简单的例子,gradle项目之间怎么判断循环依赖的呢?学习了图的知识,了解拓扑排序。你会知道至少这个是判断循环依赖的的一种方式。不了解他们很多时候只能停留在api调用。而了解数据结构你才有编写一些深层次东西的可能。
- 最后一点,静下心来,做自己想做的事,每一个目标都需要一点一滴的努力。
感谢你看到这里,如果你觉得文章还不错,或者对你小有启发。欢迎点赞转发。
以上就是一枚普通的Android开发者的4年。
希望能够有机会入大厂上岸。
面试大厂需要准备的一些技能
面对这么多的公司,每个公司的考察重点都不一样,我们在面试一定要做好充分准备,只有充分地准备好了面试,才可以更有自信地吊打面试官。
Android面试会涉及到很多杂而乱的知识点,所以想要进入大厂,你不仅需要有十分扎实的基本功,还需要有完整的解答逻辑!
这份锦囊里还包含了百度、阿里、腾讯、京东等众多大厂的Android面试真题,详细介绍了各企业的面试重点、解决方案,帮助大家做好面试准备,斩获大厂高薪 offer!
通过这份锦囊,你能收获:
- 了解大厂的面试考核标准,有的放矢地准备面试;
- 掌握一手最新Android面试真题,有针对性地刷题;
- 为自己心仪的公司提前做好准备,面试更有信心。
多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!
Android学习路线图
首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式,总之希望能够帮到你们!
模块化学习资源
接下来是每个模块我整理出来的文档学习资料,帮助大家更细致化的学习。
《Android汇总复习资料—Java》
《Android汇总复习资料—Android》
《Android汇总复习资料—Android扩展》
《Android汇总复习资料—Kotlin》
《Android汇总复习资料—Flutter》
《Android汇总复习资料—算法》
除了上面的学习路线,还可以额外的配合以下方式学习,效果翻倍~
①看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
②读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
③面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
④2020大厂面试高频知识点
- 图片
- 网络和安全机制
- 数据库
- 插件化、模块化、组件化、热修复、增量更新、Gradle
- 架构设计和设计模式
- 性能优化
- Android Framework
- Android优秀三方库源码