邓凡平(网名innost),毕业于中科院研究生院,资深Android开发工程师,热衷于Android源代码的研究,对Android的架构设计和实现原理有非常深刻的认识和理解。现任Tieto信息技术有限公司高级软件架构师,主要负责Android系统方面的研发工作。《深入理解Android 卷I/II》作者,华章公司《深入理解Android》系列书籍总策划。此外,他对Linux内核、C/C++/Python相关的技术,以及高性能网络服务器和多核并行开发等也有一定的研究。
-
我的学习方法是以点带面,建立自己的知识结构
CSDN:请和大家介绍下你及所从事的工作?
邓凡平:大家好,我叫邓凡平,来自湖南。2000年进入华中科技大学水电系,所学专业是水利水电与自动化。2004年进入中科院电工研究所读硕士,研究方向是超导磁体。2007年毕业后,进入中科大洋公司。从此跨入软件开发行业,至今已经6年。目前就职于Tieto公司,职位是高级软件架构师,主要负责Android系统方面的研发工作。
CSDN:回顾你的学生经历,能和大家分享一些有趣的事情吗?
邓凡平:从本科到研究生,我一直不喜欢所学专业,水电和超导都不喜欢。但是我并没有另起炉灶,而是希望在这些大专业里边找到自己的兴趣爱好点(我的网名innost就是国内一家超导技术公司的英文名)。硕士期间,因为要计算电磁场,发现Ansys是一个不错的工具,所以我就研究了它的用法。一个偶然的机会,我得以编写《ANSYS 10.0有限元自学分析手册》一书。该书已重印了十几次,至今仍是ANSYS入门书籍中最好的一本。(这里要说明一下,《ANSYS 12有限元自学分析手册》一书并非我写,只是出版社误用了我的名字而已。当时在写《深入理解Android卷I》,也就没时间理会这个事情,他们答应后续不会再用我的名字。)
从水电到超导,再到ANSYS,中间还搞过一段时间低温光纤传感。较多专业的转换,逼着自己掌握了一种能力,即快速学习所需知识的能力。这种能力对我日后的工作帮助非常大。
CSDN:你在大学本科专业是水利水电,而在硕士研究生的时候学习超导磁体,并非计算机出身,后来为什么转为一名职业的IT从业人员?
邓凡平:硕士毕业后,在北京没法找到专业对口的工作,后来机缘巧合去了中科大洋。记得当时大洋的领导问我:是想搞软件还是搞硬件?我想了半天,觉得研一还学过VHDL(一门硬件电路设计语言),就想去硬件部门。领导介绍说大洋的核心部门是软件,我就说那就做软件吧。就这样,我跨入了软件行业。
这个选择可能比较仓促,我的同学也觉得比较奇怪,毕竟当时在电力行业也有一些积累了。不过我一直对软件行业有如此多可学的东西而感到高兴。另外,软件开发是一个听起来比较光鲜的行业。
作为一个软件开发的新手,压力可想而知有多大了。幸好中科大洋是国内技术实力非常雄厚的公司,而且研发部工作气氛很好。那三年我很努力(没熬过夜,但是每天回家都读书、学习、做笔记),因为我知道自己属于零基础入门(从另外一个角度来看,这同时也是件好事,因为心中没有任何条条框框,很多东西都想去尝试)。在这样的环境下,我的技术水平在这三年中提升非常快,很快就成为公司的核心开发人员了。另外,大概一年半的时候,项目组的几个前辈跳槽,结果,开发重任只能放到我们这些小辈身上。这段时间技术成长非常快。回想这段经历,感触很深,一定要给新人机会正是这个道理。所以,现在的工作过程中,我也特别注意把机会给新人,帮助他们成长。
CSDN:你出版了目前唯一以情景方式深入Framework源码进行分析的书《深入理解Android卷I/II》,什么原因促使你写了这本书?可以分享一下写书过程中印象深刻的故事么?接下来还有著书的计划吗?
邓凡平:很高兴的是,这两本书现在已经不是唯一关于Android源码分析的书籍了。
它们的出版还是和个人经历有关。在大洋工作三年合同期满后,我跳槽到中科创达。原因很简单,因为它做手机、平板等这些我个人比较感兴趣、看起来很酷的东西。
当Android刚出来不久,中科创达就投入了几乎全部力量到这个平台中。为了配合公司的发展方向,当时我就想着一定要把Android中那些不会的东西都学会。大家都知道“好记性不如烂笔头”这句话,在学习过程中,我就把自己的学习心得记录下来。再加上工作中又需要这些知识,二者相互促进,使得自己在Android这块有机会、有动力去学习和积累。
写书其实都对自己的挑战非常大,尤其是在技术层面。当书写完后,整个知识结构就相应搭建起来了。
我个人感觉在工作中很少能学到系统性知识,所以在此也鼓励读者一定要抽出整段时间来学习系统性知识。
另外,学习过程一定要总结,现在云笔记是一个好东西。在工作时记下的东西,回家可以接着做。大家可以看我用Wiz做笔记时的示意图。这是2年下来的积累:
云笔记示意图
随着对Android的了解,我发现这两本书的内容还远不能包括Android的内容。所以我后来和华章公司高级策划编辑杨福川先生共同规划了一个《深入理解Android》系列书籍的发展路线图。它囊括了Android的重要模块。目前,Framework部分的卷I、卷II,专题部分的Telephony都已经完成,其他的部分我们希望能邀请正直、有钻研精神、乐于分享、志同道合的朋友一起来写,欢迎与我联系。
《深入理解Android》规划
另外,我个人觉得国内科研环境仍然很浮躁,所以每一本书我们都会请专家审稿,把好质量关,真真切切帮助开发者学到东西。
CSDN:你对Linux内核、C/C++/Python相关的技术,以及高性能网络服务器和多核并行开发等也有一定的研究,在学习上有什么心得可分享?
邓凡平:我的学习方法是以点带面,建立自己的知识结构。例如,工作中,往往只需要集中全力解决一点或几点问题就可以了。但这些点背后一定有一个较完整和深入的知识结构。所以,工作做完后,还需要继续学习背后的知识结构。以多核并行开发为例,09年做了一个FTP服务器,用到了多线程网络开发的技术,工作内容很快就定型了。但我觉得多核并行开发是一门新兴的技术,而我不想停留在仅会熟练使用多线程API这种程度,所以后续还花了不少时间去研读多核并行方面的专著。
所以,我觉得不管读者是在开发自己的产品也好,还是在修改bug也好,一定要努力从工作中提炼、积累出一个完整的知识框架。
这个方法说起来简单,做起来还是有点困难。因为它要求工作之后还得投入大量时间学习,把知识点串成面。而且,学这些知识的好处一时半会很难体现,需要耐心。
CSDN:你是怎么组建、管理好一个团队的?你觉得一个团队最重要的是什么?
邓凡平:这个问题很难回答,因为它要随环境、人而定。从目前我所在的Tieto公司来说,大家为之努力的就是要组建一个学习型团队。团队成员的技术素养很好,氛围也很民主和开放。另外,我们都有一种对知识追求的愿望(求知欲应该是人类都具有的原始且长久的冲动)。刚好学习型组织的核心理念也包括这些东西。
具体的管理手段有很多,比如时间管理、敏捷开发等。这些方法都有很多资料可以参考。不过大家一定要结合实际情况来因地制宜。
我个人觉得团队最重要的是要做到大家心中都有同一个目标,即华为所说的“力出一孔”。这一点比较难做到,决定于成员素质、公司文化等。另外,团队成员之间经常交流、统一对目标的认识也很重要。
CSDN:技术出生的人能做好管理者吗?两个身份之间如何协调?
邓凡平:我在管理岗位的时间并不长,所以对管理的认识还比较肤浅。从现在的职责来看,随着个人技术能力的增加,公司需要我发挥更大的作用,所以就安排一个团队一起为一个更大的目标而工作。当然,一个人单干和一个团队一起干活肯定有不同,所以我也需要培养技术团队管理方面的意识。
身份协调的话,要结合具体情况。我们每天都有Scrum Meeting。在Meeting中大家介绍自己的工作情况。然后还要制定中短期工作计划,并设置Check Point和负责人。如果中间有偏差,我们就要分析原因,及时调整。
我读硕士的时候,导师除了管理学生外,也在钻研技术,甚至做得比我们深入很多。这种方式我觉得可以在工作中采用。而且,它还符合Tieto公司的研发管理文化。
-
没有“速成”的架构师
CSDN:你作为一名高级架构师,谈谈对软件架构师的认识?
邓凡平:软件架构师只是一个职位,但具体职责每个公司都不相同。我现在的职责主要有两个:一个是培养和增强团队的Android技术实力,另一个是组织一个高效灵活、能征善战的技术团队。
CSDN:软件架构师必须具备哪些技能或素质?哪项技能(素质)是你认为最重要的?
邓凡平:虽然每个公司定义架构师的职责都不相同,但架构师也需要具备一些基本技能:
- 较为广博的知识面。这项技能对团队组建尤为重要,因为你得知道哪个模块是短板、哪个模块是核心。
- 要有不断学习和改进的欲望。
- 某个时间、某个阶段要能迅速明确目标。知道要做什么,比知道怎么做有时候更重要。
CSDN:要成为一个架构师,是否存在快速成长的捷径?普通程序员如何一步步向架构师的目标靠近?
邓凡平:我比较反对速成之类的说法。架构师只是一个职位,而没有放之四海都一样的职责。所以,普适的速成方法很难找到。从个人成长的角度来看,我倒是有几点建议:
- 工作前3年求知识的广度。这三年对任何一个职场新人来说都很重要,所以要抛开语言之见(例如C/C++孰优孰劣)、平台之见(Linux好还是windows好)。大家只要抱着一个问题来学习。即,这项知识你都清楚吗?不清楚就去学,而不要把其他观点牵扯进来。
- 三年之后可以根据自己的兴趣爱好选择一个合适的平台进行深耕细作。这个阶段求深度,并保持一定的广度。在这里,深度和广度并不矛盾,二者是相辅相成,互相促进的关系。
- 任何事情都要把握度。求深度、广度,什么时候才算完了呢?我建议一定要结合工作情况来调整。例如工作中是搞Android App开发,空闲时间拓展一下Android framework的知识是不错的选择。但如果去研究iPhone或云计算等与工作毫无关系的内容,这种做法就值得商榷了。
-
Android是开源世界的集大成者,是一个完整的系统
CSDN:随着智能终端的发展,安全问题日益凸显。而开放的Android平台也成了恶意软件攻击的头号目标。研究人员已发现Android上的流行软件普遍存在安全陷阱与安全漏洞,那么,目前有哪些安全问题需要重视?从技术上应该如何减少这些漏洞呢?
邓凡平:我对安全方面的问题没有太多研究,不过可以向大家推荐一本书《Enhanced Security Solution in Android》。另外,华章公司即将上市的《Android安全机制解析与应用实践》也请大家多关注。
CSDN:你能谈谈Android Framework是什么,以及Android NDK和Framework和NDK之间是什么关系?另外,什么是Android内核?
邓凡平:Android分为几个层次,首先是Kernel层,它用得是Linux Kernel。然后是用户空间中的Framework层。最后是Application层。Android的核心内容大部分集中在Framework层,我个人又把它划分成两个层次:
- 以Native语言编写的模块,包括负责显示的SurfaceFlinger、负责音频I/O的AudioFlinger、负责媒体播放的MediaPlayerService、负责Wi-Fi的wpa_supplicant、负责蓝牙的Bluez。我称之为Native Framework
- 以Java编写的模块,包括和App紧密交互的ActivityManagerService、WindowManagerService等。我称之为Java Framework
从App角度来看,Android内核就是framework。而从framework角度来看,linux kernel是内核。
对App来说,Android尽力向应用层避免其他OS上的进程及进程间交互手段,取而代之的是四大组件及把它们相互连接起来的Intent。这是一种内涵远高于其技术实现的设计理念。所以,我觉得把APP层以下的内容称之为Android内核更能体现Android的特点。注意,官方并未有这种划分,所以读者也大可有自己的划分方法。
Android提供的开发工具有SDK和NDK之分。其实两个都是传统意义上的SDK,只不过SDK提供的是Java API,而NDK提供Native语言的API罢了。NDK出现的目的是因为Android App是一个Java应用程序,它有时候需要调用Native库来做一些事情,而Native库就用Native语言的API来实现。
CSDN:你有这么些年的Android开发经历和对Framework源码的分析经验,能分享一下Android Framework工作方式及原理?Android应用开发者和系统开发者怎么高效的学习Framework呢?需要掌握哪些技能?
邓凡平:Android Framework各个模块之间以及Framework各模块和上层APP之间基本上都是基于C/S方式来交互的,交互手段有Binder、Socket、Pipe、共享内存等。这是Android Framework的核心工作机制。
Android Framework包含的知识点非常多,读者应根据需要进行广度和深度的拓展,例如:
- 如果工作中涉及到播放器开发,则可以深入研究Framework中MultiMedia模块,包括播放引擎、编解码、OMX等。
- 如果工作和Wi-Fi相关,则可以研究wpa_supplicant、802.11协议等。
- 如果对Activity切换、Provider工作原理感兴趣,可以研究Java Framework。
一个基本原则是:由点及面,努力构造完整的知识结构。
Android是开源世界的集大成者,是一个完整的系统。我相信大家只要在这个系统中钻研1-2年一定会受益匪浅。
CSDN:去年阿里云OS推出时就因修改Android代码而受Google责难,最后取消了与Acer的新品发布会。现在阿里云OS回来了,并表示将会力争成为第五大移动OS,大有与安卓划界的架势。阿里云OS和Android有什么关系?能否从技术层面分析一下。
邓凡平:讨论这个问题先得基于一个前提:根据已有的消息,云OS最核心的内容是自主实现了一个Java虚拟机。我们假设这个前提是正确的。
那么,现在来讨论Java虚拟机在Android OS中的位置。
Android Framework包括Java层和Native层。以Java层而言:
- 毫无异议的一点是:Java层最终会运行在一个或多个Java虚拟机上。当然,这个Java虚拟机最终会以进程的形态运行在Linux之中。
- 现在问题就出来了:Google花了大量心血用Java语言编写的ActivityManagerService、WindowManagerService、PackageManagerService等模块,不光能运行在云OS的虚拟机上,也能跑在dalvik自己实现的虚拟上。在这种情况下,java虚拟机的作用就好比PC机中的CPU。当你把CPU从Intel的换成了AMD后,就把运行在上面的Linux叫做自主OS。个人认为这种说法有夸大之嫌。
- 另外还有一个关键点:除了Java模块,Framework还包括Native模块,这些东西和虚拟机几乎没有关系。它们也属于云OS中的重要一部分。
仅从技术的角度来推测,云OS现在并将一直会参考Android。
那么,什么时候云OS可以被称作是自主OS了呢?
我个人觉得一个很简单的标志就是云OS有自己的SDK。阿里似乎并不比微软差钱。微软能搞一个独立的WinPhone,并且有自己的SDK。相信云OS或其他OS能拿出让国人为之真正振奋的东西。
不过,OS这个东西,需要长期积累、埋头苦干。另外,Redhat、Ubuntu对Linux所做的修改绝不亚于云OS,但它们还只是Linux的一个发行版本。所以,云OS和国内各种OS还将任重而道远。
CSDN:纵观Android的发展历程,你认为哪些因素是成功的关键?
邓凡平:Android的高速发展和芯片厂商尤其是高通的大力支持有直接且重要关系。我觉得可以组织人力调查一下这方面的内容。
另外,技术只是Android成功的一部分因素,还有很多商务、市场方面的因素。我对这部分内容研究较少,所以就不详述了。
-
移动互联网时代,需要不同的平台
CSDN:你关注移动互联网领域,你认为移动互联网现在处于一个什么阶段?
邓凡平:移动互联网现在还处于一个不稳定的快速发展时期,而且百家争鸣、百花齐放,让人看得眼花缭乱。移动互联网时代对程序员的要求除了在技术上要紧紧跟上外,另外还需要程序员们培养一些市场、商务、甚至产品设计、人文上的素养和技能。
所以,我个人一直反对将编程作为一种技能从小就来教育。编程仅是人们在计算机上实现一些事情的手段。就好比音乐家在电脑上谱曲,最重要的是这个音乐家的音乐天赋,而不是他会用甚至能开发谱曲软件。所以,我觉得应该要着力培养人文、音乐、哲学、美学方面的知识。
CSDN:有人说,多年来,Android一直是Linux的一个变体,你觉得Android和Linux之间有何关系?
邓凡平:Android Framework运行在Linux内核之上。从理论上来说,这个Framework也可以运行在Window内核之上。我的这篇博客曾记录了一位博友将Android移植到Win7的视频。我见过那段视频,它是直接将一个APK跑在win7上,而不是跑在模拟器或虚拟机上。
Android和Linux关系密切,这是事实。但它是不是变体,我觉得没有必要为此争论不休。这本来就是一个仁者见仁智者见智的问题。
CSDN:你是怎么看待iOS和Android这两大阵营的?你认为封闭和开放谁会最终胜出?
邓凡平:我花了很长时间才理解一个基本事实就是“萝卜白菜,各有所爱”。就好像我喜欢不锈钢餐具,而很多人喜欢瓷器餐具一样。我希望这两个OS,甚至Windows Phone都能长久生存下去。移动互联网需要不同的东西,不同的设计理念,而这对广大开发人员以及用户来说都是一件幸事。
CSDN:在移动互联网时代,Android占据一席之地,Android未来的发展趋势如何?
邓凡平:Android在Google及其它合作伙伴的齐心协力下应该会保持稳健发展的势头。而更多、更先进的硬件(如更多传感器、更强劲的电池)、软件技术(例如Miracast也会通过Android手机和其他智能设备让千家万户真真切切体会到技术改变世界的力量)。
CSDN:你从事开发多年了,这一路走来,最大的感悟是什么?
邓凡平:求知欲是人的本能,很高兴自己一直保持了这种本能。另外,做好时间管理、明确自己的目标也非常重要。
对于一些初学者我有一些以及和我一样仍在努力的人,有几点建议:
- 在工作初期,先求广度,再求深度;只有见识面广,才有可能融会贯通;要努力接触新事物;Be Active。
- 工作三年后,要选择适合自己的。这个时候,知道自己要做什么,比知道怎么做更重要。
- 要有团队精神。覆巢之下无完卵。团队不好,个人也不会好到哪里去。大家要齐心协力把事情做好,不要过多考虑个人得失。
- 要有定力和钻研精神。在知识学习上,高投入才可能有好产出。
- 注意身体健康。活得越久,才能学得更多嘛。这是硬件,没有它,任何软件都跑不动。身体健康与否作为一个人最重要的风险因素,相信软件工程师们一定会重视并加强控制的。
CSDN:你现在是如何分配自己的时间?是否还坚持在一线,这能给你带来什么乐趣?
邓凡平:除了工作和必要的休闲锻炼外,我大部分时间都花在看书或写书。不论技术、管理、历史等书籍,只要感兴趣都会去看。另外,工作中如果有些知识点很重要,回家后也会赶紧补习相关的知识结构。
学习可以满足求知欲。从可预计的未来3-5年来看,我还将工作在技术第一线。当然,我们团队成员技术实力都很高,团队意识也非常强,这也使得自己有时间和精力来钻研Android中还有那么多不了解的模块。同时,也希望能及时和大家分享自己的学习成果,独乐乐不如众乐乐嘛。
CSDN:你对CSDN有什么建议?对未来有什么期待?
邓凡平:希望CSDN能推出电子版的程序员杂志,可通过多看或京东电子书提供付费下载。
另外,我一直希望CSDN能打造一个独立、公正的技术社区,使得各方意见、各种声音都能在此表达并能被听到,给这个喧嚣、略显浮躁的移动互联网世界带来一股清新之风。
希望自己能一直保持乔布斯所说的“Stay foolish, Stay hungry”的状态。
CSDN博客: 请点击进入 新浪微博: 请点击进入
http://www.csdn.net/article/2013-05-02/2815118