美文网首页Android进阶之路
走心的中级Android工程师跳槽经验分享

走心的中级Android工程师跳槽经验分享

作者: 炙热是你233 | 来源:发表于2020-12-05 15:05 被阅读0次

    这些经验是我最近四个月,从准备面试到找到合适工作的汗水和泪水,希望对你们能有帮助!

    • define 跳槽
    • 跳槽前要思考的问题
      • 钱不到位怎么办
      • 心委屈怎么办
      • 离职前的思考
      • 确定要走时需要做的准备
      • 行情怎么样
    • 安卓跳槽需要复习的知识
      • 基础知识
      • 进阶知识
      • 不同公司侧重内容不同

    一、define 跳槽

    首先请思考一个问题:在你眼中“跳槽”包括哪些内容

    /******** 华丽丽丽的分割线 begin ************/
    
    /******** 先思考 3 秒再往下看 ************/
    
    /******** 华丽丽丽的分割线 end ************/
    
    

    没到“金三银四、金九银十跳槽季”,很多朋友都想要跳槽,但是对“跳槽”的理解可能仅限于“写简历、面试”。

    在这次跳槽前,我也这么认为的。

    那时候工作不顺利,正好在一个群里看到有公司招聘,就发了简历过去,面完试自己感觉良好,结果却打了脸,让人家拒了,理由是我要的工资太高了。

    仔细反省后,发现我准备的太仓促,或者说根本没怎么准备,只是写了份简历,然后有面试机会就去了。面试过程中有些项目细节答不上来,很多知识点也答得不好,让人家感觉水平一般。

    痛定思痛,在后来的几个月,我开始查阅各种跳槽、面试相关的资料,同时整理了重点复习知识点,按计划一步步学习。

    在两周前,感觉自己学习的差不多了,公司的情况也基本看清楚了,就决定离开。

    于是写简历、投简历、面试,面了五家,拿到了五个 offer,最终选择了对我目前来说最合适的一个。

    在这个过程中,我对“跳槽”的认识逐渐加深。

    咋一看“跳槽”就是写简历、换工作,但要想得到满意的 offer,其实需要思考、准备的内容很多,大概有这么几点:

    1. 跳槽前要思考清楚
    2. 掌握跳槽需要的知识点
    3. 写一份高质量的简历
    4. 了解简历投递的时机和方式
    5. 拿到面试邀请要做好功课
    6. 面试中要调整心态,努力表现
    7. 面试后及时思考总结
    8. 有多个 offer 如何选择
    9. 优雅的离职
    10. 准备入职

    这些应该是一次跳槽从开始到结束比较完整的流程了。接下来我们将详细了解每一部分。

    二、跳槽前要思考的问题

    我的如意工作是一个盖世英雄,有一天他会拿着高薪股权来迎娶我,我猜到了开头,却猜不到这结局...

    每一份工作都是以希冀开始,我们心怀憧憬,希望在公司里大展拳脚、做些成就。

    然而是什么让我们走到今天这地步,即将与它分手?

    一般离职有两个原因:

    1. 钱不到位
    2. 心委屈了

    1.钱不到位怎么办

    业界一种普遍的观念是“跳槽涨工资最快”,这也的确是现状。

    为什么公司迟迟不给加薪,非得逼得我们跳槽呢?

    答案很简单:因为公司没有意识到你价值的增长。

    我们在入职时可能只是一个菜鸟,但是在工作一段时间后,由于个人的努力以及业务的锻炼,水平已经有了很大的不同,自己心里觉得自己不再是菜鸟了,希望能拿更高的工资。

    但你可能一直在做一个项目,没有承担更多的责任,公司无法了解到你现在能力到什么程度了。

    这个时候,如果领导比较好的话,你可以先主动要求承担任务,积极完成(就是加班加点),然后在一段时间后找领导谈加薪。这样就有理有据,让人信服,领导一般都会同意。这样就不用跳槽了,省去准备面试题的繁琐。Over。

    如果领导不同意,那就没辙了。

    2.心里委屈怎么办

    员工离职的另外一种原因就是:待着不爽,心里委屈了。

    一些被动的原因比如领导更替、岗位调整、加班太多等,都会让人心里不舒服。

    拿我来说,公司业务转型,做的工作不是安卓应用开发,做久了心里不踏实,就想离职了。

    如果有条件的话,可以跟领导沟通能否恢复原样,如果无望,那就只好跳槽了。

    但在真正提出离职之前,还需要思考几个问题。

    3.离职前的思考

    If you don't like something, change it. If you can't change it, change your attitude. Don't complain.

    有的朋友可能会说:别废话,赶紧讲面试知识点,我干的不爽就跳槽了,还想什么想?

    非也,每次跳槽的成本其实很大,除去面试来回的时间不说,新旧环境的适应、业务的熟悉、代码的掌握,都需要成本,如果两次跳槽间隔太短,其实时间都花在了适应新环境上,真正学习、沉淀的内容不会太多,尤其在刚开始工作,更忌讳这样子。

    因此,在确定离职前,你需要先问自己 3 个问题:

    1. 现在的项目没有我可以学习的内容了吗?
    2. 离开这里我会失去什么?
    3. 到新环境可以得到什么?

    拿我自己来说,项目里的代码我没有掌握太扎实,框架层很多设计思路还搞不清楚,出去面试一问就问倒了。这时如果真的换了工作,恐怕又要接触新项目、新代码,根本没时间好好消化之前的代码。

    除了代码,人际关系也需要沉淀,在这个公司待了那么久,看到了一些同事的优秀品质,学习、借鉴他们也需要一定的时间,如果忙着换工作,可能就失去了和同事深入交流的机会。

    因此在第一次面试失败后,我把项目代码好好研究了一个多月,也跟同事请教很多学习、规划上的知识,为后面的路做好铺垫。

    4.确定要走时需要做的准备

    在确定要走后,尽量不要裸辞,现在的行情你懂得,没有准备就裸辞,等于断了自己后路。

    有的网友问我:辞职在家好好复习一个多月怎么样。我劝他还是算了,都不是自觉的人,天天在家反而更学不进去。最好的状态就是一边工作,一边搜集要学习的知识点学习资料,下班路上、晚上、周末去学习,那样精神压力不会太大。

    在开始复习知识点前,你需要确认以下 2 点:

    1. 定位
    2. 亮点

    定位

    “定位” 是指你要确定自己所处的阶段和想要的目标。主要包括:

    • 目前是什么水平
    • 有什么积累
    • 工作项目里有什么难点
    • 想找什么级别的工作

    比如我,给自己的定位就是:现在是中级水平,常见应用开发需求基本都能解决,开源框架使用没问题,部分读了源码,工作项目里主要是混合开发比较复杂,想找有利于自己成长的、大公司中高级安卓开发工作。

    亮点

    有的朋友可能对 “亮点” 的定义不是很明白。

    “亮点” 其实就是能够把你和众多应聘者区分出来的优秀品质。

    程序员面试主要考察这几点:

    • 技能水平
    • 学习能力
    • 团队合作
    • 工作心态等

    如果你在其中任何一个方面都有自己的优势,就赶紧找出来,写到简历上,面试表达出来。

    拿技能水平来说,根据做过项目的类型,确定自己当前擅长的点,比如你做的是电商应用,那可能就擅长混合开发、自定义 View;做的是电台应用,那可能就擅长后台进程保活;做的是大用户量应用,那可能就擅长监控、性能优化等等。

    找到自己已有的或者该有的亮点,然后去努力掌握、精通。

    5.行情怎么样

    有的网友说早就想跳槽了,但是听说行情不好,不敢跳。

    其实吧,价格取决于价值,影响价格波动的是供需关系。

    20117 年创业公司的确死了很多,P2P、O2O 死了一大堆,但活下来的又融了很多钱,也成立了很多新公司,也需要招很多人。

    这个时候,招聘的标准就比前几年要高一些了,去招聘软件上看也可以发现,大多要求 3 年以上经验。这是因为现在安卓初级太多了,各种应届生、培训班涌入市场,前几年会用 ListView 就可以找工作的日子一去不复还。不过真正的高级,或者有潜力的中级,还是很受企业欢迎的。

    因此,我们在想要跳槽时,不要被所谓的“差行情”拦住,而是要审视自己的水平,确定自己的目标,究竟是要找初级岗、中级岗,还是高级岗。

    面试前,面试官拿到你的简历,根据简历上的信息会建立第一印象。因此你想要呈现给对方一个怎样的定位,有什么亮点,都需要事先思考清楚。

    确定了方向后就要开始努力准备,下一节我们介绍安卓跳槽需要准备复习的知识。

    三、安卓跳槽需要复习的知识

    在介绍面试考察内容前,先来看看我认为的“中级安卓”需要掌握的知识点,这些是结合一些面经、自己实际面试以及请教前辈总结而来的,主要包括两部分:

    1. 基础知识
    2. 进阶知识

    面试中级及以下岗位时,在电话面试、一面、或者你简历没有突出亮点时,一般都会先问基础,目的是确定你基本功扎不扎实。

    如果基础知识有太多不会的就危险了,必须好好准备,这是躲不过的。

    电话面试、一面考察基本功过关后,就会进入下一阶段 --- 问些进阶的,看看你最高水平在哪里。

    这个阶段有不会的很正常,因为对方正在确定你的水平,但态度一定要积极主动,即使之前没有研究过,也要结合一些经验说出推测的结果,切忌直接说“我不会”。

    下面的所有技术知识点详细内容都整理在了开源项目【GitHub】,有需要的可以自取。

    一、基础知识

    基础知识主要包括以下几点:

    1. Java 基础
    2. 并发/异步
    3. 安卓基础
    4. 设计模式
    5. 常见的数据结构算法
    6. 网络基础

    1.Java 基础

    虽然现在 Kotlin 挺火的,但我面了几家大公司都没问 Kotlin,问了很多 Java 。所以一定要保证当前知识掌握熟练了,再学习新知识,不然真成了狗熊掰苞米。

    Java 基础主要包括以下知识点:

    • 内部类、静态内部类区别、使用场景
    • 抽象类、接口 实战使用场景
    • 集合
      • 集合专栏
    • 注解
      • 什么是注解以及运行时注解的使用
      • 使用编译时注解简单实现类似 ButterKnife 的效果
    • 反射
      • 深入理解 Java 反射:Class (反射的入口)
      • 深入理解 Java 反射:Field (成员变量)
      • 深入理解 Java 反射:Method (成员方法)
    • 泛型
      • 深入理解 Java 泛型
    • 异常
    • IO NIO

    建议看 《Java 编程思想》,不仅解答了 What 还有探讨 Why。

    2.并发/异步

    主要包括两部分:

    1. 安卓并发类
    2. Java 并发知识

    安卓的主线程模型,要求我们必须将耗时操作放到线程异步执行,否则会影响 app 的流畅甚至卡顿。

    因此必须掌握安卓提供的 Handler, HandlerThread, IntentService, AsyncTask ,这是安卓为我们封装好的异步类,从使用到原理,都要理解,面试常客。

    接着就需要了解 Java 的线程、内存模型和 Java 并发包下提供的类了,这也是大公司考察基础的常客。

    除了面试,如果你去看过开源框架,会发现里面有很多 ConcurrentHashMap, Lock, Condition,一开始看的你一脸懵逼,在掌握了 Java 并发知识后,再去看框架就会省力许多。

    Java 并发主要知识点:

    • 同步锁 synchronized与Lock区别
    • 什么是可重入锁
    • 线程通信方法
    • wait 和 sleep区别
    • wait-notify 模型
    • 生产者消费者模型
    • 线程池

    建议阅读书籍:《Android 开发艺术探索》、《Java 并发编程艺术》、《Java 并发编程实战》

    我把所有遇到的Java面试题做了一个整理,均放在了开源项目【GitHub】,有需要的可以自取。

    3.安卓基础

    安卓基础爱问的来来回回就那些点:

    • 四大组件,生命周期启动方式等常见问题
      • Android 进阶1:Activity 的生命周期
      • Android 进阶2:Activity 的 Task 与启动模式
      • Android 进阶3:Intent 与 IntentFilter 匹配规则
      • Android 进阶4:Service 的一些细节
    • 自定义 View 相关
      • 绘制流程
      • 事件传递
      • 滑动冲突

    这部分是常见的,应该大多数人都掌握差不多了,分享给大家我整理的Android基础部分面试题,有需要的去我的【GitHub】自取。

    4.设计模式

    我这次找工作,笔试里出现了两次写单例模式,记得几年前校招的时候就因为单例失去过一次好机会,单例模式的重要性,你自己掂量一下。

    设计模式考察的也不算太复杂,知道常用的几种设计模式使用场景,会手写单例的关键几种(静态内部类 double-check 知道区别)就可以了。

    建议去看看《大话设计模式》、《Android 源码设计模式》。

    5.数据结构算法

    我这次面试算法问的比较少,只手写过插入排序,建议把冒泡、插入、归并时间复杂度和实现熟悉熟悉,最好手写下,不然现场手写的时候容易出错。

    作为一个有追求的程序员,这些数据结构、算法是需要掌握的:

    • 数组链表区别
    • 链表插入删除
    • 栈及使用场景
    • 队列及使用场景(有可能拓展到阻塞队列)

    这些是基础,学好才能掌握其他的。

    红黑树、KMP、最短路径、动态规划、背包问题这些都属于进阶了,问的比较少,了解下即可。

    可以买本《剑指 offer》看看,锻炼下算法题的常见解题思路。《算法》就太科班化了,一般人也看不进去,有兴趣的可以看看。

    6.网络基础

    网络其实问的也不算多,因为毕竟不用我们自己去实现一个 HTTP Client,常见的网络问题大概以下内容:

    • 七层模型
    • HTTP 内容
    • 常见响应码
    • 缓存相关
    • TCP 三次握手、四次挥手
    • Socket 的使用
      • 进程通信之 Socket (顺便回顾 TCP UDP)

    进阶知识

    在确定你的基础够用后,二三面就会考察你的进阶能力。就应用开发来说,进阶知识主要有以下内容:

    1. 框架原理:缓存、网络、图片
    2. 性能优化
    3. 架构模式
    4. JVM
    5. 插件化

    1.框架原理

    作为有追求的安卓开发,怎么可能只满足使用框架而不知其原理呢?

    在面试时也经常会被问到:你熟悉什么框架的源码?

    这个时候如果没有准备就尴尬了,失去了给自己加分的机会。

    现在主流框架是 RxJava Retrofit OkHttp Picasso/Glide EventBus3,你可以选择其中两个左右熟悉一下源码和大概流程,重要的是理解为什么要有这个框架,解决的问题,如何解决的

    建议阅读书籍:《Android 进阶之光》

    2.性能优化

    性能优化又是另外一个高频问题,一般主要问内存方面、UI 方面的优化。

    常见问题:

    • 内存优化
      • 内存泄漏如何避免、检测
      • 内存抖动怎么办
      • 有使用过什么工具吗?
      • 如何避免 OOM
    • UI 优化
      • 布局卡顿怎么办
      • 如何判断布局是否需要优化
      • 有哪些工具

    这些问题你都可以从官方的 性能优化典范 看到,如果无法翻过去,可以看 胡凯的博客,总结的也很棒。

    另外也可以阅读《高性能 Android 应用开发》。

    3.架构模式

    高级的安卓开发不仅需要完成一个模块,还需要负责整个项目的设计与开发。

    常见的架构模式是按项目分层分,MVC MVP MVVM 这些,可以选其中两个进行学习、实践,对比了解优势和劣势就可以了,网上文章很多的。

    另外就是设计思想,OOP 面向对象开发的思想一般都知道,继承封装多态,什么时候用接口什么时候用抽象类,其实和设计模式相辅相成的。

    还有 AOP,面向切面编程,大型项目一般都会用到,在不入侵代码的同时添加功能,建议了解。

    还有路由,现在都流行组件化,组件化的一个问题就是组件间如何依赖,如何通信,这些都需要有良好的架构设计思想。我自己也在摸索中。

    这部分的知识属于个人经验,不同的人不同的体会,没有适合所有人的相关书籍,需要自己多写、多总结出来。

    4.JVM

    在去一家公司面试时,隔壁屋也在面试一个后台,在等待面试官时我偷偷听了下他们的对话。其中有一段对话记忆深刻:

    • 请介绍下 CMS 垃圾收集器。
    • 额,对不起,我只毕业一年,这方面了解的比较少。

    JVM 的知识究竟需要工作几年再了解呢?

    不同的人有不同的看法,我的看法是:尽可能早

    JVM 主要内容大概有这些(来自《深入理解 Java 虚拟机》):

    • JMM(Java 内存模型)
    • GC(垃圾回收策略)
    • 虚拟机性能监控、调优
    • 类文件结构
    • 类加载机制
    • 程序编译优化

    这些内容可能听起来比较遥远,很多人觉得我就开发业务,需要了解这么多吗?看起来都没什么用。

    理解这些内容,对我们日常的业务开发有极大地促进作用:

    • 了解 JMM 后,你对内存分配、OOM 的理解就不会只停留在表层
    • 了解 GC 后,对性能优化的理解也会更上一层
    • 熟悉类加载机制后,对你学习插件化也会有很大帮助
    • 了解虚拟机对程序的优化,就会明白一些并发原语的作用及意义

    而这些也是面试时经常问的问题,知道的越多,对你的加分就越多。

    建议阅读:《深入理解 Java 虚拟机》

    5. 插件化

    插件化这么火,各大公司都在研发自己的插件化,这不仅仅是对业务的支撑,同时也显示出他们安卓研发的技术深厚。

    有的朋友可能会说了:我现在的项目用户这么少,用这个有什么用。

    不说学了有没有用,在学习的过程中,可以对你现有知识体系有极大的提升,要开发插件化,需要掌握的内容大概有这些:

    • 类加载机制
    • 四大组件启动流程
    • 资源加载
    • 动态代理

    看到了吧,它是对一些疑难知识点的应用,通过有目的的学习,可以让我们对基础知识掌握的更加醇厚。

    面试时如果你说自己有主动学习这方面的知识,还能说出一部分知识点,不仅显示出你的技术能力,还体现了你的主动学习性和学习能力,大大的加分!

    建议阅读:田维术的博客

    进阶知识是我自己经验所得,如果有遗漏,欢迎补充。

    不同公司侧重内容不同

    有朋友可能会问了: 基础的内容太多了吧,我可不可以直接准备高级的。

    首先你直接学高级很费劲,容易误解不说,硬记下来没多久也就忘记了;其次面试时的提问顺序我上面也说了,都是从基础开始的,基础不扎实,活不过两集。

    这里再唠叨一句,如果一家公司靠投机取巧就可以进去,那进去的投机取巧者岂止你一个人,那样的公司氛围是你想要的吗?如果想进入一个理想的大公司,还是踏踏实实地一步步走吧。

    掌握了知识点后,接下来就要针对各公司侧重内容重点复习了。

    各大公司面试考察的知识点,网上相关的资料不少,我平时也在关注一些面经,做了一些搜集整理,看看里面有什么是自己欠缺的,然后找时间补上,有需要的朋友可以去我的【GitHub】自取。

    最后

    如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。

    如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。

    相关文章

      网友评论

        本文标题:走心的中级Android工程师跳槽经验分享

        本文链接:https://www.haomeiwen.com/subject/fytgwktx.html