我的大学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 ...
随机推荐
- 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)
1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...
- 45、screen命令
1.screen命令介绍: 当我们在使用linux远程工具进行远程访问服务器时,进行远程访问的界面往往不能关掉,否则程序将不再运行.而且,程序 在运行的过程中,还必须时刻保证网络的通常,这些条件都很难 ...
- 如何使用「mkvtoolnix」和「GoldWave」仅保留视频中左、右声道的其中一个声道?
为什么要这样做? 我手上有一部电视剧的视频文件(.rmvb),每个视频文件都是"国/粤双语"的,与其他双语视频的两种语言的音频保存在两个音轨上不同,我这里的视频文件的双语是分别保存 ...
- 2018-10-14普及模拟赛」Hash 键值 (hash)
今天,带大家看一看一道思维题... Hash 键值 (hash) 题目描述 Marser沉迷hash无法自拔,然而他发现自己记不住hash键值了-- Marser使用的hash函数是一个单纯的取模运算 ...
- JPA事务中的异常最后不也抛出了,为什么没被catch到而导致回滚?
上周,我们通过这篇文章<为什么catch了异常,但事务还是回滚了?>来解释了,之前test4为什么会回滚的原因. 但还是收到了很多没有理解的反馈,主要是根据前文给出的线索去跟踪,是获得到了 ...
- 1.3.5、通过Method匹配
server: port: 8080 spring: application: name: gateway cloud: gateway: routes: - id: guo-system4 uri: ...
- Python中调用Linux命令并获取返回值
方法一.使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256/512表示未找到,该方法适用于she ...
- tcp三次握手四次挥手----转
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给每一个报文段指派一个序号:序列号seq就是这个报文 ...
- sscanf功能详解(转)
#include <stdio.h> #include <stdlib.h> #include <string.h> static void sscanf_test ...
- FTP服务—三种登录类型的配置方法
目录 一.部署 二.配置vsftpd 1.匿名用户登录配置 2.系统用户登录配置 3.虚拟用户登录配置 1. 创建虚拟用户名单文件 2. 生成虚拟用户口令认证文件 3. 创建FTP根目录及虚拟用户映射 ...