杨云君,《Android的设计与实现 卷Ⅰ》作者,资深Android系统专家,不仅在Android应用开发方面积累了丰富的经验,而且精通Android系统级开发和性能优化,对整个Android系统的架构设计与实现原理有十分深入的研究和透彻的认识。
[[77393]]
以下为小编对杨云君作者的访谈内容:
小编:请和大家介绍下您及所从事的工作?
杨云君:
2006年大学本科毕业,此后在企业级应用领域做过网银中间件和运营系统。
2009年初涉足移动通信平台,开始接触Symbian和Android。
到目前为止,一直从事Android应用层,系统框架层的研发工作,主要解决ANR,OOM,System Server Watchdog、性能优化以及系统级调试等问题。
小编:您是如何踏上Android开发这技术领域的?
杨云君:
踏上Android领域可以说有点阴差阳错,起因要从2008年开始说起。2008年可以说是一个让大多数人悲喜交加的年份,雪灾、地震、奥运、金融危机、企业大裁员以及后来的房价大跌。这么多大事集中在一个年份,人总是要有些改变的,不能改变的那只有神了。那一年Java EE及其衍生品SSH(Struct+Hibernate+Spring)在很多领域已经是遍地开花,掌握这个领域技术的人才已经饱和,一些有规模的公司已经具备完善的程序库并形成了自己的开发模式。很多时候,开发变成了“配置+Copy/Paste+数据库”的简单模式,Java EE再也不是那个熟悉EJB便被奉为牛人的辉煌时代了。随之而来的是大量低技能从业者的涌入,在此期间也遇到过不少有趣的事情,下面列举一二:
a.公司招聘的新人问为什么String s = “abc”这句要加String?
b.新人不懂指针,我问:大学里都学过C语言,指针应该都学过了。新人答曰:我们老师都不会,讲到指针就略过去了。
c.公司里很多人,不会使用Linux和Oracle数据库,甚至都不会安装,甚至多次不会安装。
大家可能会说,你这什么公司啊,我们公司的人就比这个强!!实不相瞒,上述事件就发生在国际知名的世界500强软件公司。
上述事件,不足以说明问题,但我已经隐隐感觉到这个领域是没有出路了。改变的种子已经埋下了,但不知道改变什么,如何改变。
上述事件发生后,时间就到了2008年的下半年,我有幸被派去国外总部出差学习,接触了国外的软件从业者。本以为国外从业者的状况会比国内好一些,可一个月过去了,我发现,他们也好不到哪去,只有核心的几个人承担核心的工作,其余的人还是在打酱油。于是我开始慌了,都是打酱油,那老人如何比新人更优秀呢?难道打更多的酱油?
就在此时,美国金融危机全面爆发(以美国两大房贷巨头暴跌为标志),公司在其母国开始重组并裁员。那时候我并没有意识到问题的严重性,或许大多数人都没意识到,都沉浸在奥运的欢乐中(呵呵!有朋友炒了几张奥运门票赚了几万)。
时间过的飞快,一段时间的学习结束后,我便回国了,在国内分公司继续任职。趁着奥运的余温,我也乐呵了一段时间,暂时忘记了烦恼,晃荡到2009年。
可好景不长,金融危机远比想象的严重,国内分公司也开始裁员了,裁员规模远超想象,几乎每天都有多名同事离开。离开的还好,反正横竖都是走人,最痛苦的是没离开的,天天沉浸在折腾中,那种心情可想而知。
大半年折腾过去了,发现500多人的公司还剩下一100来人,我就被剩下了。总算做了回“剩人”,好歹不是“剩男”。在有些人看来,剩下总是好的,据说有离开的同事,1年没找到工作。
大裁员过后,我虽然被委以重任,但我已经不想继续在这个领域里发展了,此时我突然想到在国外出差时候,有几个同事在摆弄一个叫Android的东西,于是开始看Android方面的资料,周围的同事看到我在学习android,便给我推荐了Symbian系统,于是我Symbian和Android一起看,后来觉得Symbian没有前途,便毅然学习Android。现在想想当初真悬,如果学了Symbian,现在不知道去哪哭了,看来独立思考的能力是很重要的。
打定主意后,便开始准备了,之后又发生了一些足以改变我一生的事情,就不便多说了。再后来,告别了器重我的国外领导,降薪进入一家国内领先的Android方案公司。
小编:您从事Android开发这么多年,已然是一个老兵,您是如何一路坚持走到今天的?
杨云君:
从2009年从事Android至今已经4年多了。09年降薪从Java EE领域转入Android领域,主要是因为这个领域基本是一片空白,如果后续普及,自己可以有先入者的优势,冒点险是值得的。2011年Android大爆发,用人需求大增,最多的时候一天接到70多个面试电话,周围陆续有同事另谋高就,这时候我觉得Android市场已经有很大的泡沫了,一旦泡沫破灭,很多公司都要玩完(可以参考上次手机泡沫破灭的例子)。于是我也随大流迅速换公司,进入一家更稳定的公司。一路坚持至今,是想自己的技能获取***的价值。
小编:据了解,最近您推出了一本新书——《Android的设计与实现 卷Ⅰ》,而这书是针对Android四层架构中的某一层编写的,什么原因促使您写了这本书?可以分享一下写书过程中印象深刻的经历么?是否还有著书的计划?
杨云君:
《Android的设计与实现 卷Ⅰ》是我的***本书,这本书主要针对框架层的核心模块的运行机制进行详细分析。我的初衷是想写一本性能优化的专著,可后来发现,如果读者不理解框架层的运行机制,性能优化一说只能泛泛而谈。因为性能优化涉及应用层,框架层,运行库和内核层等,应用程序开发者往往只在应用层理解应用程序的运行机制,而系统层面的问题很少涉猎,这样的话,很难以系统的视角分析性能问题以及ANR,OOM等问题。以ANR为例,其成因大约有十几类,其中大多数都是系统层面的问题,而非应用程序本身的问题。至于是否还有著书计划,要看市场和读者的反馈。
小编:Android Framework在Android系统中处于怎样的地位?
杨云君:
Framework在Android系统中处于一种承上启下的地位。承上的意思是框架为上层应用提供api和运行机制;启下的意思是框架屏蔽了下层的复杂性,为上下层的交互定义了一套规范。
小编:Android Framework运行在Linux内核之上,Binder 是Android对Linux内核层的一个扩展,您能简单介绍下Binder的机制和实现么?
杨云君:
从Android体系结构的角度看,Binder是Android对Linux内核层的一个扩展,属于字符设备驱动,Android便是通过这个驱动程序实现不同进程之间的间接通信。Android通过对Binder驱动的封装,提高了一套Binder操作的框架,便于上层使用,这样Binder的概念便不仅仅是一个驱动,而是拓展为一种架构。通过这种架构,Binder实际上成为“框架的框架“,Binder框架分成Native层和Java层两部分。Android吸收了组件化的设计思想,将大量核心功能放在不同的Service组件中实现,需要使用这些功能的其他组件,可以通过系统提供的接口访问这些Service。提供服务的组件和使用服务的组件可以运行在不同的进程中,通常把Service组件所在的进程称为Server进程,把使用Service的组件所在的进程称为Client进程,这其实是一个C/S体系结构。Binder变为这种体系结构提供进程间通信功能。
小编:您有这么些年的Android开发经历,对Android应用层,框架层源码开发以及性能优化有着深入的研究和认识,在学习上有什么心得可分享?Android应用开发者和系统开发者怎么高效的学习Framework呢?需要掌握哪些技能?
杨云君:
学习一门技能,最重要的是两个方面:合适的项目经历和主动的自学能力。技术总是在变化的,但核心的东西万变不离其宗。学习者应该把一个模块彻底搞明白,即便后续版本有变化,也能很快适应。理解框架层的运行机制是一个合格应用开发者必备的技能,但框架层浩如烟海,学习框架层必须循序渐进各个击破,不能眉毛胡子一把抓,比较好的入门路线可以参考《Android的设计与实现 卷Ⅰ》的论述,***以Binder框架层、Package Manager、消息机制、Activity Manager等模块入手。
小编:您作为一位专门从事Android手机定制和开发的工程师,可以谈谈对Android系统的认识么?
杨云君:
Android系统是一款优秀的智能手机操作系统之一。没有Android的普及,大多数人可能还停留在以Symbian为代表的功能机时代。Android的优点不必多说,相信大家都比较认同。Android不足的地方主要体现在性能方面,这个随着系统的完善,或许会进一步优化。
小编:目前有很多Android的手机,商家为满足一些需求都会修改rom然后定制它们,这样很容易导致开发的功能在不同的手机上显示各不同,产生各种问题。面对这样的情况,解决此类问题您有什么建议?
杨云君:
Android既然是开源的操作系统,厂商定制是不可避免的,这个就需要应用程序开发者和美工配合做好不同机型的适配工作。
小编:要成为一位优秀的开发者,是否存在快速成长的捷径?普通程序员如何一步步向优秀的开发者目标靠近?
杨云君:
我想,快速成长的捷径只存在于天赋极好的人身上,大多数人还是需要不断的主动学习和项目锻炼才能快速成长。普通程序员要想一步步向优秀开发者的目标靠近,不断的主动学习和项目锻炼是很必要的。不断的主动学习,就是要不断夯实自己的编程基础,对Java、C++、C等基础语言需要有一定的掌握,对基本的算法有一个足够的理解。项目锻炼指的是要早项目中锻炼自己分析问题和解决问题的能力,并总结经验。
小编:不同的Android开发阶段,需要掌握的知识也不同,更清晰的了解自己处于哪一阶段哪一水平对开发者来说很重要,您可否对学习Android的开发者提供一个发展规划呢?
杨云君:
要清晰自己所处的阶段,必须首先熟悉Android的体系结构中各层涉及的技术。初学者往往以为Android是以Java编写的,这是极大的错误。Android是集Java、JNI、C++、C、汇编,脚本,Linux,modem、硬件体系结构等等于一身的集大成者。通常应用层主要以Java为主,框架层以JNI、C++和C为主,编译模块以脚本为主,内核层会涉及linux操作系统,以C和ARM汇编语言为主,此外还有特定硬件的实现库以及modem主要也以C和汇编为主。可见框架层是Java和C语系的分水岭。以Java为主的开发者,可以应用层和框架层为重心,以C语系为主的开发者,可以内核、modem为重心。我的初衷是以《Android的设计与实现》系列图书为引线,规划一个完整的框架层学习路线图,卷1以JNI,Android启动,Binder,消息通信异步处理,Package Manager,Activity Manager为主,卷2则主要分析UI系统
小编寄语:生活在变化、科技在更新,世界万物的改变,或潜移默化,或轰轰烈烈,但万变不离其宗,技术也不会例外。快速成长的捷径就如作者说的,只可能发生在少数人身上,大多数人需要不断的自我学习以及项目的磨砺成长起来。只要我们肯坚持,不放弃,我想一定会成功的!