专访邓凡平:Android开发路上的快速学习之道
邓凡平(⽹名innost),毕业于中科院研究⽣院,资深Android开发⼯程师,热衷于Android源代
码的研究,对Android的架构设计和实现原理有⾮常深刻的认识和理解。现任Tieto信息技术有限
公司⾼级软件架构师,主要负责Android系统⽅⾯的研发⼯作。《深⼊理解Android 卷I/II》作
者,华章公司《深⼊理解Android》系列书籍总策划。此外,他对Linux内核、C/C++/Python相
关的技术,以及⾼性能⽹络服务器和多核并⾏开发等也有⼀定的研究。
我的学习⽅法是以点带⾯,建⽴⾃⼰的知识结构
CSDN:请和⼤家介绍下你及所从事的⼯作?
邓凡平:⼤家好,我叫邓凡平,来⾃湖南。2000年进⼊华中科技⼤学⽔电系,所学专业是⽔利
android学习教程⽔电与⾃动化。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:软件架构师必须具备哪些技能或素质?哪项技能(素质)是你认为最重要的?
邓凡平:虽然每个公司定义架构师的职责都不相同,但架构师也需要具备⼀些基本技能:
1. 较为⼴博的知识⾯。这项技能对团队组建尤为重要,因为你得知道哪个模
块是短板、哪个模块是核⼼。
2. 要有不断学习和改进的欲望。
3. 某个时间、某个阶段要能迅速明确⽬标。知道要做什么,⽐知道怎么做有
时候更重要。
CSDN:要成为⼀个架构师,是否存在快速成长的捷径?普通程序员如何⼀步步向架构师的⽬标靠近?
邓凡平:我⽐较反对速成之类的说法。架构师只是⼀个职位,⽽没有放之四海都⼀样的职责。所以,普适的速成⽅法很难到。从个⼈成长的⾓度来看,我倒是有⼏点建议:
1. ⼯作前3年求知识的⼴度。这三年对任何⼀个职场新⼈来说都很重要,所以
要抛开语⾔之见(例如C/C++孰优孰劣)、平台之见(Linux好还是
windows好)。⼤家只要抱着⼀个问题来学习。即,这项知识你都清楚
吗?不清楚就去学,⽽不要把其他观点牵扯进来。
2. 三年之后可以根据⾃⼰的兴趣爱好选择⼀个合适的平台进⾏深耕细作。这
个阶段求深度,并保持⼀定的⼴度。在这⾥,深度和⼴度并不⽭盾,⼆者
是相辅相成,互相促进的关系。
3. 任何事情都要把握度。求深度、⼴度,什么时候才算完了呢?我建议⼀定
要结合⼯作情况来调整。例如⼯作中是搞Android App开发,空闲时间拓展
⼀下Android framework的知识是不错的选择。但如果去研究iPhone或云计
算等与⼯作毫⽆关系的内容,这种做法就值得商榷了。
Android是开源世界的集⼤成者,是⼀个完整的系统
CSDN:随着智能终端的发展,安全问题⽇益凸显。⽽开放的Android平台也成了恶意软件攻击的头号⽬标。研究⼈员已发现Android上的流⾏软件普遍存在安全陷阱与安全漏洞,那么,⽬前有哪些安全问题需要重视?从技术上应该如何减少这些漏洞呢?
邓凡平:我对安全⽅⾯的问题没有太多研究,不过可以向⼤家推荐⼀本书《Enhanced Security Soluti
on in Android》。另外,华章公司即将上市的《Android安全机制解析与应⽤实践》也请⼤家多关注。
CSDN:你能谈谈Android Framework是什么,以及Android NDK和Framework和NDK之间是什么关系?另外,什么是Android内核?
邓凡平:Android分为⼏个层次,⾸先是Kernel层,它⽤得是Linux Kernel。然后是⽤户空间中的Framework层。最后是Application层。Android的核⼼内容⼤部分集中在Framework层,我个⼈⼜把它划分成两个层次:
1. 以Native语⾔编写的模块,包括负责显⽰的SurfaceFlinger、负责⾳频I/O
的AudioFlinger、负责媒体播放的MediaPlayerService、负责Wi-Fi的
wpa_supplicant、负责蓝⽛的Bluez。我称之为Native Framework
2. 以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包含的知识点⾮常多,读者应根据需要进⾏⼴度和深度的拓展,例如:
1. 如果⼯作中涉及到播放器开发,则可以深⼊研究Framework中MultiMedia
模块,包括播放引擎、编解码、OMX等。
2. 如果⼯作和Wi-Fi相关,则可以研究wpa_supplicant、802.11协议等。
3. 如果对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层⽽⾔:
1. 毫⽆异议的⼀点是:Java层最终会运⾏在⼀个或多个Java虚拟机上。当
然,这个Java虚拟机最终会以进程的形态运⾏在Linux之中。
2. 现在问题就出来了:Google花了⼤量⼼⾎⽤Java语⾔编写的
ActivityManagerService、WindowManagerService、
PackageManagerService等模块,不光能运⾏在云OS的虚拟机上,也能
跑在dalvik⾃⼰实现的虚拟上。在这种情况下,java虚拟机的作⽤就好⽐
PC机中的CPU。当你把CPU从Intel的换成了AMD后,就把运⾏在上⾯的
Linux叫做⾃主OS。个⼈认为这种说法有夸⼤之嫌。
3. 另外还有⼀个关键点:除了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都能长久⽣存下去。移动互联⽹需要不同的东西,不同的设计理念,⽽这对⼴⼤开发⼈员以及⽤户来说都是⼀件幸事。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。