任玉刚,百度公司Android资深工程师,《Android开发艺术探索》作者,热爱分享和开源,常年活跃在CSDN和Github。除此之外,他还是CSDN博客专家,2014十大博客之星。从一名菜鸟演变为资深工程师,在他看来,也有自己的辛酸历程,尽管他已成为一名资深工程师,但他仍然不敢自称为“高手”,因为技术是无止境的,对技术应该抱有一颗敬畏的心理。
任玉刚,百度公司Android资深工程师
CSDN:请先自我介绍下,目前的工作领域以及公司。
任玉刚:大家好,我是任玉刚(微博),是一名Android程序员,目前我在百度公司参与百度手机卫士的开发工作。我时常活跃在CSDN和Github上面。
CSDN:从最初的Android菜鸟到如今的Android高手,这一路走来你有哪些辛酸历程?给你最大的感悟是什么?
任玉刚:虽然我在Android开发技术领域有了一些自己的理解,但是仍然不敢自称为“高手”,因为技术是无止境的,我们对技术应该抱有一颗敬畏的心理。
目前我从事Android开发工作已经有3年了,和大多数Android开发者一样,我也是一步一步过来的。尤其是我12年刚接触Android开发时,由于缺乏专业的指导,整个学习过程基本上都是以摸索为主,这个阶段就会感觉进步很慢,甚至有时候还会犯一些比较低级的错误,比如曾经用View去post一个runnable,然后在run方法中做耗时的操作。这种摸索的学习方式在一年后有了改善,毕竟摸爬滚打了一年,我也渐渐有了自己的学习方式和心得体会,就这样持续努力地学习着,到目前为止可以算是对Android应用开发有了一个不错的理解吧。
如果问我这三年的学习生涯中最大的感悟是什么,那我想说:“应该是学习路线和技术书籍的缺乏吧“。为什么这么说呢?
首先说学习路线。Android开发给人的感觉是门槛很低,因此有不少人会说Android很简单,实际上Android开发即简单也不简单。简单是因为它入门快、上手简单,不简单是因为Android的知识点比较琐碎,如何从琐碎的知识点中理解Android的本质并形成一个完整的知识体系,这是不简单的。相信不少开发者会有这种感觉,那就是觉得Android的好多知识点自己都懂,但是又不是特别懂,这点在面试中体现地比较明显,“我做应用开发完全没问题,但是大公司的技术面试却很容易失败”这种感觉相信很多人都会有,这就是碎片化的知识未形成一个完整的体系的表现。如何对Android建立全面的理解?这需要一种有效的学习方式,在学习过程中需要知道哪些知识点需要深挖、哪些知识点需要融会贯通、哪些知识点了解即可。有关Android学习路线这是一个深入的话题,并且有可能没有最佳的学习路线,因人而异。我结合自己在Android应用层的学习过程,描述了一个适合我自己的学习路线,大家可以适当参考下:http://blog.csdn.net/singwhatiwanna/article/details/49560409。
然后说一下技术书籍。如果大家看了上面的那篇Android学习路线,就会发现那上面提到的很多知识点都有一定的难度,并且也没有相应的书籍去专门介绍这些知识点,我曾经翻遍了图书馆的Android书籍,也没有找到一本书有讲述View的滑动冲突这方面的内容。所幸的是国内的Android技术圈比较活跃,网络上会有一些比较不错的技术文章可以供开发者提高Android开发水平,但美中不足的是,不少技术文章都比较零散并且也没有那么全面。这个时候一本好的技术书籍,它的作用无非是巨大的。
CSDN:为何想到写《Android开发艺术探索》这本书?契机是什么?
任玉刚:相信很多人已经阅读过《Android开发艺术探索》并且也很理解我写这本书的初衷,因为我在前言中做了详细的描述。我在前面有提到,国内的Android开发者在提高的过程中缺乏合适的学习路线和技术书籍,主要是市面上入门书籍太多了,但是我们不否认入门书籍为Android技术普及所做的巨大贡献,然而仅仅通过入门书籍的确无法进一步提高开发者的技术水平。为了让Android开发者更好地提升自己的技术,于是我写了这本书,读过书的朋友都知道,书中很多知识点都是新颖的、网络上无法搜索到的。
从内容上来说,《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。书中从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。可以看到,书中通篇几乎没有入门知识,更加侧重于Android知识的体系化和系统工作机制的分析,通过这本书的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。
有很多读者和我反馈,说这本书适合面试,很多公司的一些看起来很难的面试问题书中都有提及。但是我写这本书的目的不是为了让大家更好地面试,而是更好地提高技术从而成为高级工程师。
CSDN:写这本书期间有没有遇到过困难,又是如何克服的?
任玉刚:写书的过程是艰辛的,遇到最大的困难就是难以坚持。由于白天需要上班,晚上有时候还有加班,因此写书的时间就只有周末和每天晚上下班后了。大概书写到第4章的时候,有时候写着写着就会突然觉得好难受,压力好大的感觉,但是想到这本书对广大Android开发者的意义,想到我写这本书的初衷,我就会觉得这件事必须坚持下来,很多时候我们缺乏的就是坚持。回想起写书的过程的确很辛苦,但是书出版后我收到了很多读者对我的反馈,其中最多的反馈就是类似于“谢谢你写了这本书,让我很多知识点都豁然开朗”这种了,我很欣慰,总算心愿得以完成。可能有人说,写书是为了赚钱,这个了解的人都知道,通过写技术书籍来赚钱其实是不划算的。就我来说,写这本书的目的是为了更好地提高Android开发者的技术水平,同时传播我的技术,我是一个热爱开源、热爱分享的Android程序员。
CSDN:在你看来,Android开发者在学习过程中最棘手的问题是什么?
任玉刚:其实棘手的问题有很多,这里列举几个,比如自定义View、滑动冲突、IPC、源码阅读等等,Android开发者都深有体会,自定义View算是一个比较难的话题了,滑动冲突就更不用说了,很多开发者都搞不清楚如何处理滑动冲突。IPC的话主要是指AIDL和Binder相关的一些东西,这个在Android开发中真的很重要,至于源码阅读这个就更难了,很多人估计会觉得无从下手,其实这些都是可以理解的,因为它的确有难度,但是它们都是可以克服的。
自定义View和滑动冲突其实归根结底就是View相关的东西,把诸如View的滑动、事件分发以及View的底层工作原理搞懂,自定义View和滑动冲突就可以很好地解决了。
这里再说一下源码阅读的事。首先要学会下载源码,推荐的下载方式是从Google的源中把整个aosp的mirror都下载回来(大约80G,需翻墙),然后想看哪个版本就checkout哪个版本,还可以体验下编译源码的过程,这个事情看起来复杂,其实做起来很简单,大家可以尝试下。源码下载回来后,就可以阅读了,怎么阅读呢?给两个建议,第一:不要纠结太多的代码细节,第二:选择一个自己感兴趣的入口看下去。很多人一上去看源码就纠结代码细节,Android源码是非常复杂的,纠结细节只会让自己望而却步,纠结多了就“走火入魔”了。因此看源码前期主要以整体流程为主,尽量把系统的工作机制搞懂。为什么要选择一个入口看下去呢?因为Android源码很庞大,从哪里开始呢?我的建议是找一个自己感兴趣的入口,比如Activity的启动过程,从startActivity方法看下去,直到底层的AMS。
再强调下,阅读Android源码是一个合格的Android工程师必须要掌握的技能,不阅读源码是不可能理解系统的工作原理的,不理解工作原理就无法真正地提升技术水平。
CSDN:日程工作中你会通过哪些方式提升自己的技能?
任玉刚:在Android开发的学习过程中,我主要通过如下几种方式来学习:
在公司进行产品开发;阅读Android源码和Android官方文档;在CSDN写技术博客对知识进行总结和分享;关注Github中优秀的开源项目并提交自己的项目;在公司内部做技术分享;阅读相关技术书籍;业余时间持续学习。
CSDN:你认为作为一名高级工程师应具备哪些职责?如何向高级开发者进行演变?有哪些学习方法吗?
任玉刚:高级工程师首先要对Android应用层的理论体系有一个全面的理解,然后对Android Framework层也要有一定的了解,这2个方面都是Android层面的。除此之外,高级工程师还要有一定的技术架构能力,包括架构设计、代码规范、性能平衡等,还有很重要的一点,那就是高级工程师要能够指导初中级开发人员。
高级工程师是一个逐渐积累的结果,一个开发人员从初级工程师通过不断地自我学习和自我提高,当技术能力和项目经验都提升到一定程度后,也就达到了高级工程师的状态了。至于学习方法,因人而异,但是也不会相差太大,可以参见上一个问题中我对Android学习方式的描述。
CSDN:你在CSDN上的博客访问量挺高的,现在还会经常写博客吗?除了Android方面,你还会关注哪些领域?你用的比较多的语言有哪些?为什么?
任玉刚:我现在还是会坚持写博客,只是频率上较之前低了不少,我最近的一些博客主要侧重对Android学习路线的探讨,因为我觉得很多开发者需要找到自己适合的学习方式,因此我愿意把我自己对Android学习过程的理解分享出来给他们参考。
我现在的学习内容已经不仅仅局限于Android了,我目前开始关注iOS和HTML5的开发,包括最近很火的React-Native我也会去看,此外最近也在关注架构设计相关的东西。但是对于我来说,Android开发肯定是我主要关注的,iOS和HTML5我应该不会去深入地研究。其实这个话题涉及到深度和广度的问题,对于我来说,我倾向于先广度、再深度、最后再广度。比如在学校时可以多学一点技术来扩展广度,工作后肯定要专注于深度,当对一门技术达到一定深度后,可能又需要加强下广度来扩展自己的思维方式。