客户端秋招总结&技术路线分享
背景&基本情况
本人双非本,上海211通信硕士,一段手机厂Android实习经历,lc大概刷了400题,拿得出手应该就只有国奖+2篇SCI。转码大概历时一年零2个月,虽然跟某些大佬相比,我不值得一提但我足够满意,当然未来也会保持继续努力,始终学习。经历了寒冷刺骨的2023秋招整个过程,从8月底开始陆陆续续投递了上百家公司,但能有笔试的可能只有一半,而笔试通过有面试的可能不到20家,可能是我投递比较晚了,也可能是笔试分不够出众,又或者是简历不够好,基本上没什么大厂的面试,目前是拿到了百度的offer以及一些中小公司的offer。但是在实习之前我其实一直学习的是Java后端,所以现在做的这一期分享谈不上成功之路,更多的是给想转客户端的同学一些参考,当然我说的也不一定对,读者看着取舍就行了哈。其实不建议盲目转客户端,这是因为客户端就业面要窄很多。前台可以是Android、ios、小程序、web甚至是鸿蒙,但后台需求量还是远大于前台,更何况在当今客户端的岗位会被前端的岗位蚕食掉一部分,就好比你去kfc你会专门为点餐而下载一个app吗,答案显然是否定的,当下人们都追求快节奏的生活;同时很多公司不愿意出成本招聘专门的原生开发工程师,技术栈会更偏向于以flutter为主的跨端开发;另一方面,银行国企对于客户端的需求更是少的可怜;客户端的学习成本完全不低于后端,从某种意义上来说,客户端毕业不进大厂即失业的说法也确实有道理,所以要真的要想明白了再转,往长远了考虑。那我自己之所以我选择在客户端逆行是因为确实在实习的时候接触到客户端让我产生了兴趣,比起后端抽象逻辑,对有人机交互的开发会更感兴趣。如果看到这里,读者还愿意看下去,相信也是真心想做客户端开发(本人水平有限,如果有什么错误,也欢迎指正)
客户端技术成长路线分享
- 计算机网络、操作系统、计算机组成原理、数据结构与算法、数据库原理等计算机基础课:学习这些一方面是为了应付面试,就Android的面试,很多公司爱问http/https,tcp/udp,hashmap,linkedhashmap,用户态/核心态等八股;更重要的是,对Android开发及体系的全面理解,Android应用层建立在linux操作系统上,所以才有Java和C++分别去写应用层代码和系统层代码,而系统层代码会做一些系统调用,这就需要了解一些操作系统。
- Java:由于笔者之前学习的是Java后端开发,所以Java基础还比较扎实,语言的学习一定是需要不断地实践思考的。在学习Java的同时也需要去搞懂Java中的多线程(包括各种锁和线程管理)、JVM、集合类实现原理,这部分一定需要去慢慢啃原理甚至源码。
- kotlin:kt目前作为Google主推的Android开发语言,以其空安全、简便性和各种语法糖会更进一步受到Android开发工程师的喜爱,同时支持Java和kt相互调用。同样地,kt的学习也需要不断地去实践,写一些小demo,更重要的是去识别kt与Java之间的区别,以及kt所拥有的新特性(协程、扩展函数、更优秀的函数式编程、一些常用的关键字如by lazy、lateinit、apply、run、with、object等等)。总之,kt学习过程中一定是需要和Java去对比着来的。
- Android基础 推荐Android第一行代码(尽量看最新的版本,用kt写的)
- Android四大组件(Activity、Service、ContentProvider、BroadcastReceiver)的使用;
- Activity的生命周期,Activity显式跳转和隐式跳转,各种操作的生命周期变化(包括横竖屏切换、Activity间跳转、Activity非正常销毁生命周期变化),Activity的LaunchMode;
- Android动画;
- Service两种启动方式及生命周期;
- 网络编程、SqlLite、SharedPreferences;
- Fragment管理,与Activity之间的通信;
- Intent、Bundle、Parcelable使用;
- 常见的控件和布局使用,ContraintLayout;
- 常见的UI框架如ViewPager、ViewPager2、ListView、GridView、RecyclerView的使用,ListView和RecyclerView的缓存机制,RecyclerView的LayoutManager自定义布局,ViewPager2原理。
- Android进阶 推荐Android系统源代码情景分析
笔者认为学习Android Framework非常有必要,一方面对于整个Android体系的把握,另一方面做Android Framework可以往智能车载系统开发等方向走。笔者花了1-2个月的时间看了Android系统源代码情景分析,看完以后对我触动很大,也理解了Android体系工作过程,所以笔者还是非常推荐读者有时间的话都学习一下Framework的知识,只要你肯专研,其实也并没有想象中那么难。
- c++学习,学c++一方面是为了看懂系统源码,特别是binder基本上是用c++写的;另一方面NDK相关开发用的就是c++;
- Android Framework,包括handler(Android线程间通信、Android应用层心脏)、Binder(Android 进程间通信、Android系统层心脏)、AMS、PMS、WMS工作原理;
- Android 启动流程(包括系统开机流程、应用启动),Launcher工作原理,zygote工作原理;
- 自定义View,View绘制(ViewRootImpl中三大绘制整个过程),滑动冲突;
- Hook,动态代理;
- AIDL使用和原理(其实本质上还是用的Binder),Messager使用和原理;
- Android启动优化,Android应用整个启动流程和可以优化的点(1、业务,2、线程处理耗时任务,3、线程池管理,4、界面渲染,5、避免启动卡顿,6、闪屏),还有一些启动优化常用的工具如systrace;
- Android卡顿优化,卡顿产生的原因,卡顿的检测;
- Android内存优化,内存泄漏产生的原因和检测,内存溢出产生的原因和检测,LeakCanary原理;
- 构建原理(gradle、groovy),Dalvik虚拟机和dex文件;
- ANR原理和解决手段;
- 开源库使用和源码,okhttp、retrofit、livedata、databinding、rxjava、glide等,glide缓存机制和内存优化;
- MVC、MVP、MVVM使用;
- Android开发架构,组件化、模块化;
- 黑科技:插件化、热部署(笔者也还在学);
- 混合开发
这一块笔者还没有深入研究,但是大方向还是比较明确的。
Flutter(dart语言学习、flutter原理);
WebView、RN(js)
- 设计模式 推荐HeadFist设计模式
笔者过去看系统源码的时候总能碰上怎么也想不通也看不懂的一块代码,其实究其本质是因为其中的设计模式不够了解。同时,掌握设计模式可以写出一手惊为天人的代码,至少不会在code review的时候挨批 (别问我怎么知道)。安卓中常用的有单例、适配器、工厂、责任链、建造者、观察者、装饰器等。
关于未来
目前的话是签了百度,希望还是能学习到一些东西,同时也会不断地打磨自己的技术。后面的话可能还是会往大前端/framework开发的方向转,很多公司都采用大前端的组织架构,这也避免了未来跳槽会遇上岗位少的尴尬;另外framework开发的话可以去一些手机厂或智能车载公司做一些系统级开发。仅以此记录整个寒冬般的秋招,整个9-10月都感受到了如同西伯利亚的冷风,后面应该不会再面了。最后希望我的贴子对你有用,也希望能看到这里的你能拿到满意的offer。
小插曲
放一张9-10月的安排
#秋招##Android##Java##我的秋招记录##你的秋招进展怎么样了#