我的大学Android开发学习之路——从开始到微信/支付宝/抖音Offer
前言
笔者2016年高考考入华中科技大学计算机科学与技术专业。
2017年底(大二寒假)拿到今日头条(字节跳动)深圳研发中心Android开发实习生Offer,在深圳研发中心实习至2018年3月。
2018年4月加入新成立的今日头条武汉研发中心实习,2019年5月离职。
2019年春招拿到腾讯(微信)、蚂蚁金服(支付宝)暑期实习Offer,2019年7月加入微信实习。
2019年秋招拿到字节跳动SSP(抖音)、微信(转正)、猿辅导SP(斑马英语)校招Offer,最终选择留在微信,目前已转正。
在我的大学四年中,有四年的Android开发经历,两年半的实习经历,有两款Google Play上架的应用,最重要的是最后拿到了自己满意的Offer,也算是给大学生活画上一个比较完整的句号了。
写这篇文章的目的在于,一是为了总结自己的大学四年;二是给有着和我一样的目标的同学们一些参考和建议(包括对应届生比较实用的面经),希望可以给读到这篇文章你们一些帮助,希望你们也可以达到自己的目标或是在追求更高的目标的路上更进一步,也算是作出一些微小的贡献。
技术学习与个人成长
大学四年的经历很长,总归不是三言两语就能表达清楚的,每个人所处的阶段不同可能感兴趣的内容也不同,这篇文章我着重分享基础知识的重要性及如何学习。
基础知识主要指一些计算机科学中较为基础、通用的知识,包括被称为“四大基础”的计算机组成原理、算法与数据结构、操作系统、计算机网络和其他例如C语言、汇编、数据库、计算机体系结构、编译原理等。
可以发现这些都为计算机专业开设的课程,具体学校、学院会根据侧重不同开设数电、模电等偏底层的课程或是游戏开发、面向对象编程等上层课程,这部分课程可以根据兴趣选择深入程度,优先级会比前面这些通用的课程低一些。
在回答应该花多少精力学习基础知识时,我的回答通常是四个字“往死里学”。基础知识的重要性可以体现在以下几个方面:
基础知识决定了学习能力和深度
整个计算机的知识体系其实很像计算机网络里面的分层模型,每一层都只关注这一层应该做的事情,在低一层提供的抽象的基础之上进行开发的同时为高一层提供抽象接口。
这就像滚雪球的过程,对已有知识的充分理解,可以帮助你在能更加容易地学习新的知识的同时不断巩固和加深已有的知识,最终雪球越滚越快也会越来越大。
计算机的学习曲线就是一条开始缓慢,而后不断提速直至达到一个人理解能力的极限的曲线,基础知识扎实的同学的学习速度和理解能力会远远超出基础知识不牢靠的同学,拉开越来越大的差距。
更强的学习能力可以带来更深的技术深度,但基础知识对技术深度的影响还不止于此。
对于Android开发而言:
技术深度一部分体现在对Android系统底层的理解上,理解了底层的运作才能对应用的行为有更全面的了解、解决一些应用层面很难理解的问题,才能根据底层的原理进行针对性的性能优化。而Android底层就是我们所熟悉的Linux,对于操作系统的认识在这里完全适用,另外,也需要有非常多的基础知识才能理解应用的运行时环境JVM,知道其是如何运行我们的应用代码并作出优化的。
技术深度的另一部分可以体现在对软件架构的设计能力上,而操作系统、计算机网络、数据库系统等课程中的设计理念和原则都是非常经典和优秀的,对这些系统设计的学习可以潜移默化地提升我们的软件设计能力。当时读到Android系统源码中对于输入事件的处理代码时,突然发现这不就是组成原理中CPU流水线的设计吗,后来来微信以后也在代码中发现了类似的设计,这就是优秀设计的魅力。
基础知识是面试时的重中之重
在我所经历的面试中,越是能力要求高的公司/岗位,对于基础知识的考察就越重视。很多人不能理解,基础知识大家都知道会考察,考察的问题也大同小异,为什么这些面试官还会不厌其烦地问这些问题?
对于每个刚从大学毕业、想从事开发岗的候选人来说,无论是否是所谓科班出身,通用的基础知识一定是衡量大学中对于计算机知识的掌握程度的最佳标准。一是所有人都会去学,不会出现刚好问到没接触过的方向的情况;二是对于基础知识的考察非常容易分辨真实水平,虽然面经网上一抓一大把,问题也就那么几个,但对于基础知识的掌握程度更多的靠的是前面所说的,不同知识间的相互印证和加深。
举个例子,“进程和线程的区别”是操作系统的一道非常经典的面试题,很多人都能轻松背出这个标准答案:“进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位”,但深入一步问“操作系统为进程分配了哪些资源?”,“操作系统为什么要进行线程调度,是如何进行的呢?”,这就不是大多数人能答得出来的了,更不用说面试官可以一步步深挖,直到知道面试者的认识极限。
为了提前对面试者的基础知识进行筛选和节省面试投入,现在各个大厂都会进行笔试进行考察,也非常流行进行交叉面试,让不是这个方向的面试官考察通用能力。事实证明,基础知识牢靠的面试者会非常容易得到面试官的好评,通过率也往往非常高,毕竟语言和具体的开发方向工作后都可以慢慢学习,唯独基础知识是必须在大学中才能学好的。明白了这一点,又怎会不去重视大学中基础知识的学习呢?
如何学习基础知识
花了这么大的篇幅介绍基础知识的重要性,还是想让大家从心里认同基础知识的价值,这是开始学习的第一步:弄清楚为什么要学,这样才不至于在这个过程中感到迷茫和动摇。下面我想分享一下这些年来,我对于技术一些归纳和总结,和自己对作为一名Android高级开发者需要掌握那些技能的笔记分享。
《高级UI》
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
《Framework精编内核解析》
主要内容包含:
- 深入解析Binder
- 深入解析Handler
- Dalvik VM 进程系统
- 深入解析 WMS
- PackagerManagerService
《360°全方面性能调优》
内容主要包含一下几点:
1、设计思想与代码质量优化
2、程序性能优化
- 启动速度与执行效率优化
- 布局检测与优化
- 内存优化
- 耗电优化
- 网络传输与数据储存优化
- APK大小优化
3、开发效率优化
- 分布式版本控制系统Git
- 自动化构建系统Gradle
4、项目实战
- 启动速度
- 流畅度
- 抖音在APK包大小资源优化的实践
- 优酷响应式布局技术全解析
- 网络优化
- 手机淘宝双十一性能优化项目揭秘
- 高德APP全链路源码依赖分析
- 彻底干掉OOM的实战经验分享
- 微信Android终端内存优化实践
《Android第三方框架》
本篇内容要点(1042页)
- 热修复设计
- 插件化
- 组件化框架设计
- 图片加载框架
- 网络请求框架
- RXJava 响应式编程框架设计
- IOC 架构设计
- Android架构组件Jetpack
《NDK模块开发》
NDK是原生开发工具包,这套工具允许Android使用C/C++代码,并提供了众多的平台库。
主要内容包含:
- NDK 模块开发
- JNI 模块
- Native 开发工具
- Linux 编程
- 底层图片处理
- 音视频开发
- 机器学习
《Jetpack架构组件从入门到精通》
- Android Jetpack - Navigation
- Android Jetpack - Data Binding
- Android Jetpack - ViewModel & LiveData
- Android Jetpack - Room
- Android Jetpack - Paging
- Android Jetpack - WorkManger
- Android Jetpack架构组件之Lifecycle
- Android Jetpack Compose 最全上手指南
《Flutter技术进阶》
- Flutter跨平台开发概述
- Windows中Flutter开发环境搭建
- 编写你的第一个Flutter APP
- Flutter Dart语言系统入门
《2020大厂面试高频知识点》
一、图片
二、网络和安全机制
三、数据库
四、插件化、模块化、组件化、热修复、增量更新、Gradle
五、架构设计和设计模式
六、性能优化
七、Android Framework
八、Android优秀三方库源码
所有资料已经全部上传至开源项目【GitHub】,有需要的朋友自取。
遇到问题
对于这些基础知识的学习过程并不轻松,时常会碰到不能理解的知识点,我的习惯是一般会先跳过这些点,有些是知识点的编排问题导致后面才会解释的概念提前出现,看到后面再回过头来自然就能理解了;另一些情况确实是书籍讲解的不够细致,比较直接的办法是直接搜索相关文章、博客、问题等帮助理解(有些专门针对于一个技术细节的文章讲得会比书中详细得多),麻烦一点的话就是找其他书的对应部分做参照,如果还没有找到答案,我觉得大概率这个问题其实并不重要,有时候过分关注于细节就是一种浪费。
一方面是不懂的地方可以暂时跳过,另一方面是如果一本书读完还觉得云里雾里,完全没了解到这门课程的内容,那么绝对不能就此罢休,可以换个课程学一段时间再回过头来再细读一遍,或者干脆就换本书继续学。还是前面所说的,基础知识值得我们“往死里学”。
最后
最后的最后,还是要强调一下“身体是革命的本钱”这句话,身体的健康是这一切的一切的前提,失去了健康意味着人生就此变换了方向,以前做的大部分努力都将付之一炬,这是绝大部分人所承受不起的。
知易行难,与君共勉。
我的大学Android开发学习之路——从开始到微信/支付宝/抖音Offer的更多相关文章
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android开发学习之路--基于vitamio的视频播放器(二)
终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
- Android开发学习之路--MAC下Android Studio开发环境搭建
自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...
- Android开发学习之路-记一次CSDN公开课
今天的CSDN公开课Android事件处理重难点快速掌握中老师讲到一个概念我觉得不正确. 原话是这样的:点击事件可以通过事件监听和回调两种方法实现. 我一听到之后我的表情是这样的: 这跟我学的看的都不 ...
- Android开发学习之路-Android Studio开发小技巧
上一次发过了一个介绍Studio的,这里再发一个补充下. 我们都知道,Android Studio的功能是非常强大的,也是很智能的.如果有人告诉你学Android开发要用命令行,你可以告诉他Andro ...
随机推荐
- hive学习笔记之六:HiveQL基础
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- ES服务的搭建(八)
看下图的淘宝页面,可以看到搜索有多个条件及搜索产品,并且支持多种排序方式,例如按价格:其实这块有个特点,就是不管你搜索哪个商品他都是有分类的,以及他对应的品牌,这两个是固定的,但其它参数不一定所有商品 ...
- 8、oracle密码过期设置
8.1.登录到oracle实例: [oracle@slave-node2 ~]$ echo $ORACLE_SID orcl [oracle@slave-node2 ~]$ sqlplus sys/1 ...
- LeSS 的诞生(一):大规模团队该何去何从
<敏捷宣言>发布后,"敏捷"被越来越多的小型开发团队认可.与此同时,另一个问题也逐渐暴露了出来:以 Scrum 为首的敏捷方法论对那些大规模的开发团队并不友好. 基于此 ...
- Tars | Win10下Docker部署TarsJava(SpringBoot)全过程及踩坑记录
@ 目录 前言 1. 相关环境版本: 坑点一:VMware与Win10 Docker冲突 坑点二:20.版本TarsJava(SpringBoot)依赖文件缺失 2. Docker安装: 坑点三:Do ...
- 字典翻译@Dict
1.编写翻译字典@Dict /** * 数据字典翻译注解 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) publ ...
- 6 shell内置命令
知识点1:什么是shell内建命令? Shell 内建命令,就是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件. 内建命令与普通命令的性质是不一样的,内建命令并不是某个外部文件,只要在 ...
- Python单元测试框架unittest之生成测试报告(HTMLTestRunner)
前言 批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLT ...
- [刘阳Java]_SpringMVC文件上传第1季_第10讲
今天来介绍一个关于SpringMVC框架的文件上传功能.首先我个人感觉SpringMVC框架的文件上传还是要比Struts2框架要好用一些,灵活性更强.因为SpringMVC框架的文件上传有几种不同的 ...
- 初探SpringRetry机制
重试是在网络通讯中非常重要的概念,尤其是在微服务体系内重试显得格外重要.常见的场景是当遇到网络抖动造成的请求失败时,可以按照业务的补偿需求来制定重试策略.Spring框架提供了SpringRetry能 ...