专访郭霖:成长无止境


留意文末赠书活动

嘉宾 | 郭霖

文 | 张霞

郭霖,Android开发工程师,Android GDE(Google认证开发者专家)。从事Android开发工作9年,有着丰富的项目实战经验,负责及参与开发过多款移动应用与游戏,开发了 LitePal、giffun、coolweather、PermissionX 等多个开源项目,对 Android 系统架构及应用层开发有着深入的理解。

在 CSDN发表 Android 技术文章百余篇,博客访问量超过1000万次,荣获 CSDN 认证专家,并连续多年被评选为 CSDN 年度博客之星。个人技术类公众号“郭霖”,订阅数超9万人,每个工作日都与读者朋友们分享最新的Android知识。

2014年,创作了《第一行代码——Android》,2016年和2020年出版了第2版和第3版。此书至今累计销售29万册,获得了读者的广泛认可和好评,被誉为「Android 开发第一书」。

本期图灵访谈旨在与读者朋友们分享郭霖的技术成长之路,包括如何提升专业技能,如何提高学习能力、如何不断实现自我成长,如何跟上技术发展的趋势。

1. 请问你最早接触编程是在什么时候,是如何对编程产生兴趣的?你通过编程做过哪些有意思的事?

准确来讲,我最早接触编程就是在上大学的时候。虽然在高中时,我凭借兴趣爱好有自学过一些网页制作方面的知识,但是现在回头来看,那个时候学到的一点皮毛还不算是接触编程。

我印象中大一刚开学的时候有一堂课,老师问了我们一个问题:有没有同学在之前接触过C语言?台下两个班一共90多名学生,没有一位举手的。说明提前接触编程知识的人毕竟还是少数,至少在我们那个年代是这样的。

而现在,我的好多大学同学都从事了IT行业的工作,由此可见,大学确实是大多数人未来职业的摇篮。

至于我是如何对编程产生兴趣的,不如问我是如果对计算机产生兴趣的。我上中学的时候,计算机还不算非常普及,学校每周会开一节信息技术课程,学生能上机操作。

每到那一节课,大家都非常开心,因为可以放下书本玩电脑了。现在看起来好像再正常不过的上网、打游戏,那个时候还是件奢侈的事情,我可能也就是在这样的环境下对计算机产生了浓厚的兴趣,然后不知不觉中走上了这条道路吧。

而通过编程做过哪些有意思的事情,这个就真的太多了。自从在大学里接触了编程,学生时代的自己就觉得无所不能了一样。

我写过内网的聊天软件在学校内使用,还在宿舍搭建过服务器,上机考试时用来传递答案(还好我已经毕业了),其他学院的老师还邀请过我帮忙去做他们学院的网站,等等。其中很多事情现在看上去好像挺幼稚的,但当时觉得挺有意思的。

2. 请问你大学学的是什么专业?最初的职业规划是怎样的?后来是如何走上Android开发之路的?

我在大学学习的是网络工程专业,是计算机学院的一个专业。不过我最后并没有从事网络工程方面的工作,而是步入了软件开发行业,可能我还是对编程更感兴趣吧。

我最初的职业规划是做Java服务器开发,那个时候真的学习了很多Java服务器方面的知识,对Java语言和SSH框架可以说是用得滚瓜烂熟了。但是最终毕业面试的时候却没能面上服务器开发的工作,所以最后也就和这个方向失之交臂了。现在想想倒未必是件坏事,不然Android行业里可能也就不会有我了。

至于我走上Android开发之路算是一种机缘巧合吧。2010年夏天,我在闲逛电驴时发现一位老师上传了一份Android开发****,那是我第一次听说Android操作系统,并且了解到Android也是使用Java开发的,所以就产生了浓厚的兴趣。在之后的几年里,移动互联网以极快的速度蓬勃发展,我算是借着这股浪潮走上了Android开发之路吧。

3. 在读大学期间,你觉得在校所学的哪些课程、掌握的哪些技能是对你后来的技术发展帮助最大的?哪些知识是一定需要尽早学习,打好基础的?相信对这个问题的回答对于在校学生会有很好的参考价值。

我现在作为一个过来人的身份,可以更好地回答这个问题了,可惜当初上学时的我还不懂。

在读大学期间,你可能会觉得有很多课程枯燥乏味,甚至觉得学了完全没有用处。当然,有很多课程确实如此。但是,算法和数据结构这门课程,会对你未来的发展产生巨大的影响,所以至少这门课程你必须好好学。

我当初不明白这个道理,那个时候更看重的是实践能力,觉得做出一个App比解出一道算法题要厉害多了。殊不知算法考验的是编程的思维和底蕴,而App考验的只是业务逻辑能力。这么多年过去了,当初我写App用到的技术现在早已过时,而算法永远都不会过时。

毕业多年之后,我才慢慢懂得了这个道理,后来我花了大量的时间在算法和数据结构方面进行补课,也算是为自己当年的无知买单吧。希望现在的学生能好好重视这门课程,不要像我当初一样。

另外,这几年人工智能技术非常火热,而这个行业的前面树立着高高的数学城墙。所以,大学时的高等数学和线性代数这两门课程就非常重要了。

很可惜,这又是我当初没能学好的两门课程。总之,感觉自己还是有很多遗憾的,希望现在的学生能更加意识到一些大学课程的重要性。

4. 你在学习和研究Android技术的过程中,有哪些重大的转折点或者让你印象深刻的经历?

我在学习Android技术过程中的重大转折点,我认为是在2013年的时候,我做出了开始写技术博客这个决定。没有这个决定,就不会有后来的《第一行代码》。所以我一直都认为这是我人生的一个重要转折点。

我在上大学的时候是学校里公认的编程高手,但是我却不知道自己有写技术文章的能力。这个事情很奇怪,我那时没有写过博客,没有这方面的经验,只是抱着记录自己的学习过程这样的心态去写的,但是看过我文章的朋友都说我写的文章最容易理解。

陈冰老师更是在我仅仅写了四篇文章的情况下,就邀请我去编写《第一行代码》这本书,当时我还担心自己是不是遇到骗子了。要知道,那个时候我才刚刚毕业不到一年时间,直到现在想想仍然还是觉得挺不可思议的。

5. 从2013年到现在,你坚持写作技术博客快8年了,这需要惊人的毅力和难以想象的付出。我们很多读者朋友都是通过阅读你的博客成长起来的,优质的内容让他们受益良多。那么坚持写作这件事对你自身而言,有哪些帮助或者好的影响?

我只能说,写技术博客对我自身的帮助和影响实在是太大了。前面已经说了,决定开始写博客对我来说是一个重要的转折点,没有这个决定也就不会有后来的《第一行代码》。

至于为什么可以坚持写了这么多年,其实并不是因为什么责任扛肩上。原因很简单,写博客对于我来说是一个自我学习的过程。技术变化日新月异,移动开发并不是一个学会了就可以一劳永逸吃一辈子的行业,你必须保持不断学习。

我在学习各种新技术的时候,为了更好地记录和整理,会将它们写成博客。我相信很多人在学习的时候都有做笔记的习惯,我只是把这个笔记写得更加详细和清晰,让这些笔记不光我自己能看得懂,别人也可以看得懂。

6. 你写作一篇技术博客平均要花多长时间?平时工作很忙,你是如何保持如此高产的?

正所谓慢工出细活,我写文章的速度其实很慢的,平均大概要一周才能写出一篇技术博客,直到现在这个速度也并没有提升多少。

我写文章会经历几个固定阶段,包括构思内容,勾画大体知识框架,编写Demo,写成文章,检查语病和错别字,最后才会发布出来。很多读者觉得我的文章疏漏很少,因为我在发布之前会做比较严格的检查。

至于问我如何保持如此高产,这明显不是一个事实。因为我写文章的速度是比较固定的,所以空闲时间多的时候我就能高产一些,而工作繁忙的时候,我就很难抽出时间写文章。

从CSDN的年度文章统计其实就可以看出,2013年我一共编写了45篇技术博客,而2018年一共只写了7篇。不过好在今年我的产能还算不错,目前已经写了17篇,平均每个月两篇左右,希望可以继承保持下去吧。

7. 你的博客写得通俗易懂,你的文字就像具有魔法一样,无论多么复杂的内容,你都能讲得清晰透彻,请问你有哪些写作经验和写作技巧?

这个问题还真有不少朋友问过我,但实际上,我也不知道该如何回答。

刚才说了,我其实自己都不知道自己竟然有写技术文章的能力,我之前没有做过这方面的练习,也没有学过任何写文章方面的资料,就只是凭着感觉去写,没想到竟然能够得到那么多人的认可。

上次和一位朋友聊天时,他就问了我同样的问题,我知道他是希望我能给出一个总结好的固定的套路和流程,然后按着这套流程就能写出一篇好文章。但是我自己的脑海里从来没有固定的写作框架。

我在写文章时,最多只是会列举一下这篇文章大体要写哪些知识点,把它们列成目录,然后就是想到哪儿写到哪儿了,我也总结不出更多的东西。所以最后反倒是他帮我总结出了一个结论,说我在这方面是有天赋的。

不过在写文章的时候,我有时会对一句话反复读来读去,感觉不够通顺或者表达不是很准确的时候,我就会尝试换一种表达方式,以保证整篇文章读下来的感觉都是通畅的,或许这也是我文章写得慢的其中一个原因吧。

8. 现在新技术的发展日新月异,开发者要提升自己的学习能力,不断掌握新知识,扩展知识领域,才能及时跟上时代的步伐。你的学习能力非常强,学习效率也很高,请你分享一下你的学习经验和建议。

这个就有点不太好意思了,我并不认为我的学习能力很强,只是学习方法比较正确而已。

想要持续跟上各种新技术日新月异的发展,首先要明确学习的方向才行。那么要怎样明确学习的方向呢?我个人的方式是始终跟着Google的节奏走。

我每年都会看Google的IO大会,在这些大会上,Google每年都会推出各种新技术,而这些新技术通常就预示着下一代的开发潮流,那么就可以成为你的学习方向。

有了学习方向之后,接下来就是要怎样去学习的问题了,我通常会利用Google搜索引擎来查找好的学习资料。这个很简单,输入你想要学习的某个技术的关键字,一般搜索结果比较靠前的就是最佳的学习资料了。

我拥有的一个优势是,我阅读英文技术资料的能力还不错,通常学到的技术内容可能就超前一点。所以,把英语学好,对于你做软件开发这个行业,会有比较大的帮助。 

另外,我一直热衷于参加Google的各种线下技术活动,之前都是作为观众参与,今年首次在GDG上进行了技术演讲。受疫情的影响,今年线下活动的人数受到了严格的限制,但即使是这样,我也感受到了非常浓厚的技术氛围。

有许多开发者与我进行了技术讨论,他们咨询了我很多问题,同时也发表了他们自己的观点,我也从中学到了很多。如果以后有机会,我还会去参加更多的线下技术交流活动,这是一个非常棒的体验。

9. 今年你申请了Android GDE(Google认证开发者专家),并且顺利通过,恭喜你!这一认证对于一位Android开发者而言,是非常有意义的。能否请你为大家分享一下申请的宝贵经验呢,比如需要具备哪些条件,申请流程是什么,面试流程是怎样的。

谢谢,能够成为Android GDE我也感到非常荣幸。其实,一开始收到Google邀请的时候,我还是有点犹豫的,因为GDE申请的流程非常复杂,而且还要用英文进行面试,我对此并不是非常有信心。

但是感觉如果拒绝Google的邀请又有点不太礼貌,所以我就抱着试一试的态度去申请了。结果我的运气非常好,成功地成为了一名GDE,对此我也感到非常开心。

这一认证对我而言是非常有意义的。现在我和Google建立了直接的联系,有技术问题也可以直接向Google进行咨询,所以对于我自身的学习帮助是非常大的。

至于申请GDE的流程,Google对申请人的技术能力以及技术影响力有比较高的要求,会对你的申请资料进行严格的审查,以评估是否满足GDE的资格,接下来还要通过两轮面试,才能正式成为一名GDE。

我在博客中写了一篇非常详细的文章来介绍整个申请过程,感兴趣的朋友可以到我的博客《分享我成为GDE(Google开发者专家)的经历》中去了解。

10. 除了研究Android技术和工作之外,你还抽时间开发了LitePal、giffun、PermissionX等多个开源项目。这些项目都是兴趣所致,但都受到了Android开发者的关注和喜爱,那么你开发这些项目的契机分别是什么

其实对于任何一个开发者而言,如果你写的开源项目能够被很多其他开发者使用,这都是一件很酷的事情。所以我相信每个开发者都是愿意去写开源项目的,只是可能还没有找到一个好的契机或切入点而已。

而我写的这些开源项目,切入点都是那些我认为开发中存在的痛点。以前工作时需要频繁和数据库打交道,SQL语句写到想吐,所以我就写了LitePal这个开源库,来简化Android上的数据库操作。

另外,Android提供的权限申请API非常不友好,每次编写申请权限的代码,对我来说都是一个痛苦的过程,所以我一直希望能编写一个开源库来让权限申请变得简单,于是就有了PermissionX。

值得一提的是,PermissionX的第一个版本其实来自于《第一行代码——Android(第3版)》,本来主要是为了教读者朋友们如何开发一个开源库的,后来我发现这个项目的意义不仅限于教学目的,而是真的可以投入实际的项目中使用,所以后期又对它做了很多的功能增强,才变成了现在的PermissionX。

11. Google非常重视Kotlin,将Kotlin作为了Android开发第一语言。你也一直比较看好Kotlin,将《第一行代码——Android》(第3版)使用了Kotlin语言进行重写。但是与国外相比,Kotlin在国内的热度目前似乎不是特别高,你觉得真实情况是怎样的,背后的原因是什么?

使用Kotlin语言的原因很简单,因为这就是未来。我觉得作为Android开发者,需要做的是去适应技术趋势,而不是去对抗它。

每年Android的开发技术都会发生很多变化,而近几年最大的变化莫过于编程语言的改变。

Google在2019年的IO大会上明确宣布了Kotlin First,所以Kotlin目前是Android开发的第一语言。作为Android开发者,我们必须去适应Google的技术趋势。

目前Kotlin在国内的热度还不算高,我认为主要是因为Google的新技术在国内有一定的滞后性,普及还需要一定的时间,但是毫无疑问,Kotlin是Android开发的未来。

Google现在主推的许多新技术都是基于Kotlin的,比如说协程。已推出的各种库也在用Kotlin重写,比如Room、Paging3等。未来即将推出的新技术也会基于Kotlin,比如Jetpack Compose。

也就是说,如果不学习Kotlin,可能将会完全跟不上以后的Android技术开发趋势。所以,我相信Kotlin在国内终将会普及,只是时间的问题。这也是《第一行代码——Android》(第3版)使用Kotlin进行重写的原因。

12. 《第一行代码》(第3版)的阅读门槛是什么?读者需要掌握哪些基础知识才会更容易读懂和上手?认真读完这本书并跟着书动手实践之后,读者基本可以达到哪种水平?对于希望得到进一步提升的读者,你有哪些学习建议?

虽然这本书全书用Kotlin进行了重写,但是加入了大量Kotlin语言的知识讲解,所以读者并不需要有任何Kotlin的基础就可以阅读这本书,并且读完之后,读者将可以很好地掌握Kotlin这门语言。

但是如果读者之前完全没有接触过编程,我认为读起来还是稍微有点困难的。因为这本书是以读者有一定编程基础(最好是只有Java基础)为前提的,书中有一些地方会对Kotlin和Java进行对比,所以如果读者有Java基础的话,将会更好地理解这本书。当然,即使没有Java基础,但有其他编程语言的基础,也是可以的,因为编程语言在很多思路上都是相通的。

第3版除了加入了Kotlin语言的讲解之外,还基于Android 10系统进行了最新的升级,加入了Jetpack中重要组件的讲解,并综合运用这些知识在全书的最后开发了一个MVVM架构的项目。

所以,全书学习完之后,读者能够具备比较系统的Android开发知识,并且将会拥有独立开发Android App的能力。

如果阅读完这本书之后,读者希望进一步提升自身的能力,那么关注我的公众号和博客就是一个不错的方式。毕竟书中的内容是不会变化的,而我会在公众号和博客中持续更新技术文章,帮助读者学习更多的知识。

畅销书《第一行代码》的最新版

本书被Android开发者广为推荐。全书系统全面、循序渐进地介绍了Android软件开发的必备知识、经验和技巧。

第3版基于Android 10.0对第2版进行了全面更新,不仅将所有知识点都在Android 10.0系统上进行了重新适配,同时加入Kotlin语言的全面讲解,使用Kotlin对全书代码进行重写,而且还介绍了最新系统特性以及Jetpack架构组件的使用,使本书更加实用。

本书内容通俗易懂,由浅入深,既是Android初学者的入门必备,也是Android开发者的进阶首选。

京东领劵价格更低

留言活动 

说说你在学习 Android 的过程中

遇到的困难或疑惑

我们将挑选 3 名精彩留言的读者,每人将获得一本《第一行代码 Android 第3版》。

统计截止时间:10月30月 12:00