“学学学,学到什么时候是个头?技术专家到底需要什么能力,我直接对着搞不就行了么?” ,前段时间,写过一篇关于程序员如果实现“财务自由”、“年薪百万”的文章,然后就有个小伙伴在评论区问我道。

这是个好问题。我本身是专家岗,也参与过不少的技术专家面试。在写这篇文章前,以免有偏颇,特地向阿里和字节跳动的两位负责专家岗面试的小伙伴求证他们的看法。 虽然我们三个方向不同(Android、java、前端),但面试套路却基本相同。今天我们就从面试角度来分析程序员专家岗具体需要哪方面的能力,希望对小伙伴们有所帮助。

一、什么才是专家岗最重要的能力

在我的读者老爷中有不少技术能力很优秀的朋友,跳槽面试专家岗的小伙伴想必也不在少数。 专家岗面试会问很多问题,但究竟是什么能力让我们通过了专家岗面试?

解决问题的能力! 但凡参加过专家岗面试的同学,应该会有个经验,面试的开场都会非常的友好,一般从我们做过的项目开始问,然后慢慢地就有点招架不住了,问的问题越问越深!

专家岗面试喜欢问源码、问框架,这是所有专家岗面试同学最大感触。 为什么? 知己知彼,才能百战不殆,写代码亦是如此。 我们只有深入理解原理,知道我们所用的框架、组件,究竟是怎么设计出来的,才能在他们出问题的时候,找到究竟是哪里出了问题并将它们修复。

普通程序员,只知道调用网络框架的一个功能就能实现网络通信的功能,但是突然有一天,当我们想增加重试次数来定制重连方案的时候,很多小伙伴会因为框架没有提供类似的接口而手足无措。 这就是专家岗和普通岗的最大区别!专家能够深入原理、源码,当它不支持哪个能力的时候,就改动源码让它支持,而普通岗的同学,只会调用函数。

技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

学Android的同学,应该听说过Lottie动画框架。这个框架比较厉害,它能够将AE动画,直接转化成json文件,在写APP的时候,直接使用Lottie框架加载这个json文件就能实现动画效果。

技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

在2019年,我发现这个框架的时候,就想把他推给整个公司的所有项目使用。 但在推动的时候就出问题了,一方面因为是需要通过AE将转成json文件,所以,首先要求有人懂AE,以判定转化的json文件如果有问题,要如何修改。另一方面,负责在APP中加载json文件的lottie框架,还不成熟。甚至有些效果存在bug,需要解读并修改源码。

刚开始根本推不动,没人愿意去尝试一个看不到前景的技术,而且要修复bug,学习AE,何其困难麻烦。于是他们不愿意研究,就我来帮他们研究,他们有bug解不了,就我来帮他们解。业余时间学了两个月AE,通读了lottie源码,把整个链路搞清楚,把源码中存在的问题进行修复,最终在公司内部面向所有的开发、UI、交互做了一场Lottie培训。 在面向全公司培训Lottie的那一刻,真爽。

技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

养兵千日,用兵一时。在绝大部分的公司,框架都是已经定型的,没那么多重构、改造的工作要做,招专家岗的主要目的,就是为了以防万一,哪天出了疑难杂症,有人能顶上。所以,解决问题的能力是专家岗最基本、最重要的能力。

二、怎样才能提升解决问题的能力

要能够解决问题,我们就需要深入源码、深入框架,了解他们的原理,能够耐得住寂寞,沉得下心来钻研。入门知识遍地抄,深入起来啥没有! 这一点小伙伴们应该都有经验,初级的知识点,一搜一堆,你抄我的,我抄你的。但真正深入起来,毛都找不到! 我在学习自定义控件的时候,网上根本没什么文章,甚至连什么是canvas都讲不清楚。 怎么办? reading the fucking source code !!!

所有的奥秘,都藏在源码里面。自定义控件的系列博客,我写了四十多篇文章,参考别人的文章特别有限,绝大部分都是我自己的理解,有些名词都是我自己造的。文章写了三年了,有关自定义控件的知识,还是我研究的那些。看似自定义控件的文章遍在飞,其实都是从我那里抄的,很多案例都是直接照搬。 甚至有小伙伴跟我说,他们老师上课用的ppt,都是用我文章的精简版。攀登高峰必然是艰难的,有时候网上的资料非常有限,想要深入研究,就只能耐得住寂寞,自己钻研。这是专家岗的必经之路。

技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

三、锦上添花

如果说解决问题的能力是通过面试的基本条件,那下面的这些,就是锦上添花的作用了。有时候,你的一个动作就能让别人就觉得,woc,这个牛逼! 就像精通雕花的厨师,并不一定是好厨师。但精湛的雕花技艺绝对能忽悠住一群憨批。

而下面这些就是能让我们在形式上给别人这种感觉的方法。

1. 精通代码调试(debug)

很多人在写代码的过程中,经常会有的一个问题就是:为什么我写出来的代码不能运行?为什么运行的结果不是我想要的?几乎所有的程序员写代码都不是一遍就能写好的。但是顶尖的程序员非常快的就明白自己代码的问题可能是什么。

这是一个很重要的能力,但是偏偏学校里不教,面试的时候考官也不经常提及。对于顶尖程序员来说,这个过程在脑海中就是电光火石的一瞬间。只要你解决的问题足够多,你做出来的猜测就会越准确。

2. 重视能够节约时间的工具

最近打败人类的AlphaGo每天可以进行上百万局的下棋训练,我们人类一万个小时的训练却需要10年之久。也就是说,电脑运行几分钟,可能就等于人类工作好几年。学习利用工具为我们节约时间,这是非常重要的。

我还在大学的时候,有一次一个同学做分享,非常骄傲的说,我能直接用txt文档写网页。牛逼吗?牛逼!但这真的有意义吗?有时候,在IDE上几个快捷键就能生成几十行代码。而你用txt敲得再快,也得要几分钟。 得把时间用在刀刃上,刀刃就是深入源码、提升自己解决问题的能力!

3. 向上管理的能力

在职场上,会哭的孩子有奶吃,是有道理的。一味的沉着于干活,不能把自己的功劳表现给自己的上级,等于没干。向上管理的艺术,不是要求我们唯命是从,而是把领导做为支持者,向他要资源、要权力,以达到我们在项目上的成绩,同时想办法让领导认同我们的成绩的本领。

四、雪中送炭

雪中送炭有点夸张了,只是单纯的觉得跟上一个标题比较搭。这些年在不断的学习源码的过程中,自己也总结出了一台方法心得和学习笔记(已整理成一个pdf),接下来给大家做一些分享,希望能够帮助到有心提升而不知从何而起的伙伴们!(对了,因为我自己是做Android的,所以分享的是Android相关源码的学习经验)。

学习目录

  • 包括MMKV 源码
  • ARouter 源码
  • syncTask 源码
  • Volley 源码
  • Retrofit 源码
  • OkHttp 源码
  • ButterKnife 源码
  • Okio 源码
  • SharedPreferences 源码
  • EventBus 源码
  • Android 自定义注解初探
  • View 的工作机制源码分析
  • Android 触摸事件分发机制源码分析
  • Android 按键事件分发机制源码分析
  • 深入解析 Handler 源码
  • 深入解析 Binder 源码
  • 深入解析 JNI 源码
  • 深入解析 Glide 源码
技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

笔记目录

1.深入解析微信 MMKV 源码
MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今,在 iOS 微信上使用已有近 6 年,其性能和稳定性经过了时间的验证。

  • 获取 MMKV 对象
  • 修改数据写入
  • Protobuf 处理
  • Protobuf 实现
  • 跨进程锁实现
  • 文件锁封装
技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

2.深入解析阿里巴巴路由框架 ARouter 源码
ARouter是阿里开源的一款android路由框架。通过路由进行界面跳转,区别于 Intent的显隐式跳转。在模块化的项目中,友好的解决了因模块互相依赖冲突,而界面互相跳转不了的问题,使用ARouter进行跳转,两个 library互相不依赖,也可以相互跳转。

  • 初始化
  • 路由跳转
  • 总结
技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

3.深入解析 AsyncTask 源码(一款 Android 内置的异步任务执行库)
AsyncTask是一个抽象类,它是由Android封装的一个轻量级异步类(轻量体现在使用方便、代码简洁),它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。

  • 功能概述
  • 创建
  • 执行
  • 取消
  • 线程池
  • 不足之处
  • 总结
技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

4.深入解析 Volley 源码(一款 Google 推出的网络请求框架)

  • Volley
  • RequestQueue
  • ExecutorDelivery
  • Request
技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

5.深入解析 Retrofit 源码
Retrofit 是目前使用广泛的 Http Client 框架,它适用于 Android 和 Java。

  • 目录
  • 源码分析
技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

6.深入解析 OkHttp 源码
一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。比如可以使用http客户端与第三方服务(如SSO服务)进行集成,当然还可以爬取网上的数据等。OKHttp与HttpClient类似,也是一个Http客户端,提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。

  • OkHttp 3.7 源码分析(一)——整体架构
  • 总体架构
  • kHttp 3.7 源码分析(二)——拦截器 &一个实际网络请求的实现
  • OkHttp 3.7 源码分析(三)——任务队
  • OkHttp 3.7 源码分析(四)——缓存策
  • OkHttp 3.7 源码分析(五)——连接池
技术砖家?那秃子到底比我强在哪里,能比我年薪多个100w

7.深入解析 ButterKnife 源码
8.深入解析 Okio 源码(一套简洁高效的 I/O 库)
9.深入解析 SharedPreferences 源码
10.深入解析 EventBus 源码
11.Android 自定义注解初探
12.View 的工作机制源码分析
13.Android 触摸事件分发机制源码分析
14.Android 按键事件分发机制源码分析
15.深入解析 Handler 源码
16.深入解析 Binder 源码
17.深入解析 JNI 源码
18.深入解析 Glide 源码