【专家简介】李宁

  资深软件开发工程师、IT讲师和技术顾问,从事软件研发工作10余年,实践经验十分丰富。资深Android开发专家,国内Android应用开发的先驱和传教士,开发了基于Android平台的新浪微博客户端、完美通信、语音计算器、多功能日历等广受欢迎的应用。他还精通Java、.NET、C++等技术,曾经多次在微软组织的技术大赛中获奖。同时,他还是一位经验丰富的技术作家,多次为《程序员》杂志和其他技术社区撰稿,著有多本Android专著,广获读者好评。

李宁( 安卓巴士配图)


  安卓巴士:您是什么时候接触到计算机,怎么走上编程这条道路的?

  李宁:我算是接触到计算机比较早的了。记得还在上小学,到老妈的单位(国家一级科研单位)去用计算机玩游戏,那可是80年代末哦!尽管也有彩屏的计算机,不过在国内还很少,也非常昂贵,可能现在的小朋友都无法想象,一台PC高达4万的价格足以让大多数国人望而却步(那时一个月挣400就很高了)。

  正是较早接触到计算机,才是我对这个家伙产生了浓厚的兴趣,不过当时也是玩玩游戏而已。在初一时又弄了台英文打字机练习了指法。真正开始接触到程序设计,是在高二那年。利用学校的计算机学习了Basic语言和五笔字型输入法(估计现在很少有人用了)。不过这还不算是真正的程序员,因为还没有编写过一个有价值的程序。

  由于对计算机的喜爱,大学填写志愿时所有的专业都是计算机,当时计算机在国内并不流行(机械和电子更流行),不过很庆幸我选对了方向。上了大学以后,才真正如鱼得水,因为身边都是很优秀的家伙(那时的学生质量很高,在毕业时大多数都可以独当一面),在大一开始学习了pascal、然后是C/C++语言等,这才算正式进入程序员的行列。

  未来要走什么路,可能就决定于小时候的一件事或某些短暂的经历!

  安卓巴士:您学习的第一个语言或技术是什么?大概用了多久?能和我们分享下学习编程中的一些经历吗?

  李宁:第一种语言是Basic,不过这种语言没有太深入学习,如果说深入学习,直到现在还偶尔使用的应该是Pascal,以及Delphi。说实话,学习第一种语言用了几个月的时间(用现在的眼光来看简直太慢了),因为语言中有很多技术当时很难理解,例如,递归就费了好大劲。

  从理论上说,学习计算机语言要比学习自然语言容易得多,计算机语言主要依靠逻辑思维能力,也许学习第一种语言会很费劲,不过这只是暂时的,当进入并熟悉了这个领域,就会如鱼得水,学习的速度也会以指数提高,这样掌握任何技术都会变得很容易。

  记得数年前开发了一个网上评卷的项目,原本计划在windows下使用delphi开发客户端,结果windows突然不太好使了,速度极慢,本想重装,但里面的各种工具极难配置,很麻烦,而且又没有时间来收拾windows。所以在我多年编程经验积累起的自信的驱使下,决定换另外一种以前只听说过名称的技术(wxWidget),并且将语言换成了C++,操作系统平台换成了Fedora Linux。wxWidget是一套跨平台的C++ UI程序库,尽管熟悉C++,不过当时很少在linux下工作,并且几乎没用过wxWidget。不过这种事对我来说发生的太多了。记得当年大学刚毕业时就接到一个活,用authorware(一个多媒体开发工具)开发一个多媒体演示程序,当时的水平可远不及现在,连什么是authorware都不知道。结果还是跌跌撞撞地完成了任务,当然,成功的原因除了技术功底比较厚外,一个重要原因就是公司给配了一个美女作为助手(录音和美工),再一次验证了男女搭配,干活不累的古训!

  这回扯远了,还是说哪个网上评卷的项目,学习wxWidget并没有费什么劲,但是,又一件很郁闷的事发生了,突然发现wxWidget的XML Library不支持中文(可能现在支持了),换技术也来不及了,结果自己做了一个XML解析器,哎,会的多还是有很多好处了,最后花了两个月终于搞定了(并不只是搞这一个项目)。

  安卓巴士:接下来您又学了哪些语言或技术?当时为什么会选择学这些?另外是什么因素驱使您不停的去学各种语言或技术?

  李宁:Pascal学完后,自然就要学C语言了。如果要判断某个人是否是学计算机的,只要问他是否学过C语言即可,所有科班出身的(包括专科)都必须学习C语言,也必须认识一个人:谭浩强。实际上,C语言并不是我选择的,是学校安排的,身不由己而已。

  也是从C语言开始,才接触到了更广阔的空间,如数据结构、编译原理、操作系统原理,尽管学校老师讲的这些理论和技术的效果并不算理想(原因大家知道的),但终于有了星星之火,剩下的就是燎原了!

  至于为什么要不断学习各种语言和技术,原因只有一个:我需要它!学习也并不是要学习所有的东西(人生不过百年,就算向天再借五百年也学不完),应该根据自己的目的去学习。例如,可以根据公司的业务,也可以根据自己要做的东西。例如,我现在正在做一个跨平台(主要是移动平台)开发的工具,所以需要学习各种平台的核心开发技术。当然,与此无关的技术可能也会去关注,但通常不会花更多的时间去研究。

  安卓巴士:您是什么时候开始接触Android系统的,看您很早就出版了《Android开发完全讲义》这本书,被称为国内Android应用开发的先驱和传教士,最近又出版《Android深度探索卷1_HAL与驱动开发》&《Android应用开发实战(第2版)》这两本书,能跟我们分享下您写书过程的一些故事么?

  李宁:Android应该是2008底(google刚发布G1的时候),应该是国内最早接触Android的一批技术人员。当时接触到Android也是个偶然,实际上,本想去研究google的其他技术,结果看到google放出来个Android模拟器,又了解到Android使用Java来开发,所以决定去玩玩,当时可没想那么多,学Android纯属娱乐。

  不过等用了Android一段时间后发现Android好像不光是Google的一个玩具,有可能成为Google的一条强有力的触角,所以后来开始深入研究Android的各种技术。

  其实在出版《Android开发完全讲义》之前,已经写过基本关于Java Web的书。写书、写blog是多年养成的习惯。主要目的是做一个知识的记录,以为这些东西不太可能永远记得。有人说写书很累,没错,的确很累,不过只将写书当成挣钱的手段当然很累,但是为了知识的记录和传播,就会感到很“酷”,而且写书会将自己的知识更好地梳理一下,也会发现自己对某些知识的遗漏,从而自己的技术水平会更上一层楼。

  记得2008年写我的×××座(Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring)的时候,手骨折了(纯属意外),利用在家休息的半个月,用一个手敲完了该书的两章内容(初中打下的指法基础没白费),看来那些肢体残疾的同学可以熟练使用计算机也不是不可能的。

  安卓巴士:Android和iOS之间您是如何取舍的?为什么最终会选择Android平台?Android自诞生以来版本改进了很多,但是版本更新太快也会给开发和适配带来很多挑战,您是如何看待和应对这些挑战的?

  李宁:实际上iOS我也在用,Android是第一个接触的移动平台,当然,接触Android最初是从经济上考虑的,因为我没有MBP。只能在windows或linux下使用Android。不过最后发现我的决定是正确的,因为将Android作为入口是一个非常好的决定。Android的开源和免费大大降低了学习成本和开发成本。当然,如果能力足够高,可以尽情地深入Android内部,定制自己的操作系统,这一点的确很酷。顺便做一下广告,继《Android深度探索(卷1):HAL与驱动开发》后,还会有卷2、卷3….卷n,会囊括Android高级应用和底层开发的方方面面(包括Framework、ROM定、各种系统工具的使用等等),出版的顺序也是学习Android的最佳顺序。如果要学习Android的底层技术,最好先学习Linux驱动。因为Android Framework很多地方都是用了Linux 驱动,而Linux内核是独立于Android的。所以不学习Linux内核(主要是驱动)的技术,很难理解Android Framework中的某些技术。

  至于Android平台的碎片化,的确很严重,这也是我现在正在着手解决的一个问题,还有Android的安全性和盗版问题,已经成为了Android的三大诟病。目前对付这些调整没有更好的方法,只能对同一款或同一类型的设备单独适配。这一点iOS估计以后一会遇到(但可能没android严重)。至于安全和盗版问题也很严重,尤其是安全,获取root权限后的手机尤为严重,而且目前没有什么太好的解决方法,除了安装一些杀毒软件外,可能就只有听天由命了!希望Google和第三方有更好的解决方案。

  安卓巴士:您是怎么看待ios和Android这两大阵营的?您认为封闭和开放谁会最终胜出?

  李宁:这是个老生常谈的问题。开放意味着分裂,封闭意味着孤立。这要看google和apple的目的是什么。Google的目的不是卖android手机,而是卖广告,所以android的用户越多越好,因此,开发对于google是最好的选择,这样google就可以花很少的代价迅速利用android占领市场,最近非常流行的开源硬件:arduino,也采用了同样的策略。常被称为开源硬件的Android。

  Apple的目的是为了卖IPhone手机(包括IPad)。要靠硬件挣钱,所以如果开发iOS,将会有太多的竞争对手和廉价的iOS手机,将会严重影响iphone、ipad的销售。所以封闭对于apple是首选。

  任何商业策略没有绝对的好与坏,Google和Apple的不同盈利模式决定了Android和iOS的最终策略。 当然,这两种策略各有利弊。不过可以用一句俗语来化解其中的矛盾:两利相权取其重、两害相权取其轻。 利益才是决定Android和iOS最终走向的砝码!

 安卓巴士:自学编程,你觉得该如何选择适合自己的书籍?你在各种技术学习中都选择了哪些书?

  李宁:对于信息时代的人获取知识的途径非常多,例如,网络就是一个非常好的途径。不过网络虽然信息量巨大,但有一个不好的是这些信息大多都是未经过滤和整理的,对于初学者和水平不是很高的程序员来说,很难甄别这些信息。所以就需要通过其他途径来获取知识,例如,培训和书籍。

  对于初、中级别的程序员,可以选择一些入门级别的书,或一些分析源代码的书。当然,有一定基础的程序员可以选择一些经典。例如,我学习Java会经常看Thinking in Java。C++会看Thinking in C++等,当然,还有一些经典的算法书,例如,高大爷的计算机程序设计艺术(The art of computer programming)就是非常值得阅读的好书,值得一生珍藏!

  例外建议广大程序员读写非技术领域的书籍,对开阔视野也有很大的好处。

  最后送给大家一句我比较喜欢的读书箴言:阅读吧,在每晚入睡之前!二个月后,你将拥有帝国,而你是帝国强大而自负的君主;你将拥有财富,而你取之不尽;你将拥有另外的生命,而你可主宰他的生死;你将幸福,再不孤独…阅读吧,在每晚入睡之前。

  安卓巴士:大约是在什么时候开始找到对编程的感觉?你认为编程学习的重点是什么?

  李宁:应该是大二学习数据结构时,更具体点就是搞明白链表的原理,并可以独立使用C语言实现双向链表和其他数据结构的时候。因为终于可以用C语言做点看似很牛逼的东西了。当时利用数据结构知识实现了一个有数据存储功能的简单数据库和一些图像处理程序。

  编程学习首先自己要对编程感兴趣,更准确地说,要对创造这个世界上没有的东西感兴趣。因为编写程序的复杂度几乎可以与目前地球上任何一种科学相比。而且程序员群体的平均学历和智商可能仅次于科学家群体。所以能够称为一名资深的程序员,说明已经成为了这个世界上智商最高的一群人。

  当然,除了兴趣,还要不断地练习和领悟。将自己学到的知识转换为能力才是最重要的,至于具体学习什么都不是重点,只要将说学习的东西发挥到极致即可。

  安卓巴士:编程的实战很重要,你平时都是如何进行实战提高自己能力的?

  李宁:多年前曾经有段时间的编程密度很大。经常一天要写数百行有效的代码(不包括注释、空行、括号和自动生成的代码),所以当时的技术水平提高的很快。不过现在早已过了需要编写大量代码才能提高技术的程度,尽管也会编写大量的代码,但较峰值时差了很多。

  对于在公司工作的程序员,可以通过公司的项目提高技术水平。但对于项目难度不大或没有太多项目的公司(例如,经常维护而不是开发新的项目),可以通过模仿有名的项目来提高自己的水平。例如,对于Android应用。如果在Google Play上随机抽取100个应用,你能独立(可以查找各种资料)做出来的占多大比例呢,如果能超过50%,说明你的能力已经比较强了,如果能超过80%,基本上已经可以肯定你已经是数一数二的Android专家了。大家可以用这个方法检测一下自己的水平。

  安卓巴士:能分享些对你所学过的技术或语言的学习小窍门吗?你当时是怎么越过这道坎的?等等……

  李宁: 学习语言第一次比较郁闷的就是数据结构了,由于第一次接触这些东西,多少有一些找不着北。不过放弃是不可能的,已经上了贼船了,下不去了!当你被某项技术搞到块崩溃时就暂时放下她,去做别的事。绝大多数时候,再来处理时自然就会柳暗花明。其实弄不出来是以为自己已经掉进了思维陷阱,正在朝着完全错误的方向越陷越深,跳出来的方法就是关机,然后过一会再打开。正所谓只有放下才能得到!

  安卓巴士:自学编程之路已有十多年,十多年中在自学中你最大的感悟和收获是什么?另外很多人都觉得编程非常枯燥无味,你认为自学编程该如何坚持下去?

  李宁:从理论上说,对自己感兴趣的事是不需要坚持的,没听说过叫某人再坚持玩一会游戏!玩游戏都是主动的,没听说谁被逼着去玩游戏呢。那编写程序为什么就不能主动呢?

  很多人觉得编程非常枯燥无味是因为没有目的性,当朝着某条路漫无目的地走着,就会觉得前途渺茫,因为还没有看到头。但如果已经知道路的尽头有无尽的财富,就有了无尽的动力。如果只将编程看做一项谋生的手段,就会感到非常累。而将编程看作是事业,并且可以从无到有创造很多东西,就会感到其乐无穷。还有就是除了工作,可以玩点其他的东西,例如,前面所说的arduino就是一款很好的玩具,难道不想创造属于自己的机器人吗?难道不想检验一下大学时学的计算机原理、人工智能到底好用吗?那就从现在开始创造一个完全属于自己的世界!

  安卓巴士:在众多语言或技术中,您现在主要使用的是哪个语言?为什么?

  李宁:目前主要使用Java,也会使用objective-C、C、C++和C#。因为需要做跨平台的东西,这一点Java是最方便的。至于其他语言,有的是为了辅助Java来用的,有的是其他平台的必须语言,如iOS。

  最后又想起某位古人说的话:作为一名优秀的程序员,应该三个月就学习一门新语言。

  哎,按这个标准,我离优秀的程序员还差得很远呢,看看有生之年剩下的语言还够我学不。不够就自己创造几种语言吧!