You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
13 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 42 | Android开发高手课学习心得
> 你好,我是张绍文。专栏更新至今,转眼间最后一个模块“架构演进”也已经 更新完了。从“Android开发高手课”筹备到现在将近的八个月里非常感谢我们的学习委员孙鹏飞不管是文章答疑还是练习Sample鹏飞为这个专栏付出了太多太多这里再次衷心地跟他说一声谢谢。
> 无论是我还是鹏飞在写这个专栏的同时也是重塑自身知识架构的过程。在专栏的最后一篇文章我特意邀请鹏飞跟大家分享他的学习心得也算是跟大家做一个小小的告别。鹏飞对于Android系统框架、虚拟机、Linux等底层知识非常熟悉那他是如何做到的呢不得不说的是鹏飞是一个非常自律+宅的人拥有坚持每天早上7点钟起床学习一个半小时的可怕技能。
> 最近鹏飞也准备奔向新的工作岗位,在此也祝愿他在新岗位上能够发挥所长。接下来我们一起来听听鹏飞学习专栏的心得和思考。
大家好我是孙鹏飞。“Android开发高手课”接近尾声今天我来从一个学习者的角度对专栏做一下总结。专栏涵盖了Android开发的方方面面的知识有技术干货、心得体会、问题答疑和部分科普性质的文章从内容上来说和平时大家看到的教程不太一样没有过多介绍Android基础更多的是提供新的思路和分享经验。很多同学感觉学习比较吃力其实我也是如此在开始准备这门课程的时候很多东西也是从零开始学起。对于一个新的概念从模糊到清晰的过程不会那么容易它可能涉及Android和Linux很多细枝末节的知识点需要阅读大量资料给予支撑才能理解。
下面我就总结一下我学习专栏的过程和一些思考,希望对你有所启发。
## 关于“高手课”的思考
最近我了解到一些同学对C++和Linux感觉不知道如何入手这里说一下我的学习过程以及相关的学习资料。你可以跟着《C++ Primier Plus》学习一下基本语法和标准库里的函数使用比如字符串操作、内存分配、I/O操作等这里有一个很好的[网站](https://zh.cppreference.com/)学习C/C++语言,包括最新的特性都有介绍。
![](https://static001.geekbang.org/resource/image/a4/ed/a4969b8f63ab9df1b25f6f783bad0aed.png)
Linux应用开发的部分可以一步步的参考《UNIX环境高级编程》这本书熟悉一遍标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程以及各种I/O、进程间通信、网络IPC的使用。同时也可以参考《Linux/UNIX系统编程手册》这本书相对介绍得更详细一些。在了解了Linux应用开发相关内容后可以深入了解一下Linux内核相关的知识我推荐《Linux技术内幕》这本书是国人写的语言相对于一些翻译书要通顺一些而且还有大量的图解缺点是由于篇幅限制有一部分内容没有介绍。
从专栏中你可以看到有些内容涉及ARM的汇编ARM的汇编资料相对少一些而且实践起来不是很方便这里推荐一个网站[Writing ARM Assembly](https://azeria-labs.com/writing-arm-assembly-part-1/),可以学习到基本的汇编操作。关于实践可以使用[VisUAL](https://salmanarif.bitbucket.io/visual/index.html)工具来进行实验,这个工具可以逐步执行并可以实时观察寄存器和内存里的值。关于汇编相关的内容,我认为更多的时候只需要看懂即可,在实际中使用的地方可能并不是很多。
Android的更新迭代是很快的在快速的更新中我们需要保持对Android新特性的了解还要掌握兼容问题的处理方法。现在官方文档更新的速度还是很快的中文文档更新速度也很快大部分功能和API新特性的描述都可以在Android官网上找到很详细的文档比如[Android Q功能和API](https://developer.android.com/preview/features) ,并且每个版本官方都会提供很详细的[API差异报告](https://developer.android.com/sdk/api_diff/q-beta1/changes.html)这个报告将修改、新增的API都统计在一起我们可以在这个表里发现一些新功能。
![](https://static001.geekbang.org/resource/image/da/53/dae40528ad994a7e4637980f787bb153.png)
关于虚拟机方面的更新,我更多是参考官方的提交记录来查看。具体可以看[Android Gerrit](https://android-review.googlesource.com/q/project:platform/art+status:open)这里有每一条提交记录并且可以查看很详细的Code Diff提交记录的描述一般都很清晰所以可以很好的帮助我们理解代码也可以发现一些新的工具和功能。
![](https://static001.geekbang.org/resource/image/10/a0/10c64f71ea7507bffc3411815f486fa0.png)
## 专栏学习心得
我经常听到很多同学说一个技术很难其实我觉得大多时候不是技术难而是应该说复杂。技术大多都是演进而来其实这种演进和我们业务需求迭代的过程很类似。比如内存管理从固定分区、动态分区机制到分段机制然后发展成现在的分页机制硬件也随之演进都算是一个迭代过程。理解分页机制其实不难但这个知识点所涉及的内容就很繁琐和复杂了比如了解系统如何管理内存需要了解内存布局就会涉及内存划分内存划分又涉及CPU的运行模式然后是物理内存和虚拟内存如何映射会涉及页表的翻译、物理页面的分配和释放、伙伴系统算法为了解决伙伴系统的内存碎片化问题又衍生出迁移类型等。
这一系列涉及的内容就非常复杂,但每一项单拆出来去看,一层层去学习和补充,就会感觉容易很多。这一点其实在业务开发上也有体现,我们刚接手一个复杂的业务,代码庞大,注释和文档都很少,但在一段时间后你还是会对整个业务有或多或少的认识,在接到新的业务的时候也没有觉得难到无从下手,顶多是觉得复杂。底层的系统、框架也是如此,这是一个由点到面的过程。
**忙碌状态下的学习**
鸿洋写过一篇文章[《嗷嗷加班,如何保持学习能力》](https://mp.weixin.qq.com/s/gGOHF4-_tTHHGSbsX4Mptg),讲在繁忙的工作状态下如何保持学习,我看过之后也很有感触。在平时零散的时间里我们看到一篇技术文章,并不是阅读收藏后就结束了,这样你可能会在很短的时间里就忘掉了文章的内容。他将阅读一篇文章分成以下几个步骤:提取这篇文章要解决的问题;然后概括一下涉及的技术点;提取重点内容,比如问题发生的缘由、有哪几种解决方法。总体来说,这个方法是为了在短时间内提取出重点内容,然后记录下来后面再进行复习。所以我们都需要多记录、多复习,可以培养使用一些工具来帮助自己养成习惯。
**逃离舒适区**
并不是说换一个更忙碌的工作就是逃离舒适区,而是在平时工作和学习过程中保持一种焦虑感,但这种焦虑感不是迷茫和恐慌,而是清晰地认识到自己的不足,然后在工作和业余的时间里填补自己,当你集中注意力攻克一个难点的时候,你会发现这是一件有趣的事。我身边有很多同学都在持续地学习,每个人都有不同的目标,比如学到什么程度、应用到什么地方等,需要一定的压力才能产生比较好的效果,否则很容易迷失丢掉重点。我以前所在的团队有一个学习计划表,每个同学调研一个方向,每周周会的时候都会抽出一定时间去做技术分享,我觉得这是一个很好的方法,人在有一定紧张情绪的情况下注意力会相当集中,这个和考试前、面试前学习效率会很高的道理是一样的。不过我们也不能太过焦虑,我也经常会有焦虑感,我的解决方法是定制计划,半年或者一年,在一段时间专注完成一件事,你会看到自己成长了很多。
**刻意练习**
也许我们在公司里平时做的业务需求都是缝缝补补,并没有涉及很复杂的内容,大量重复的工作会让人觉得无法提升自己的技术。而平时自己学到的知识在一定时间之后可能就生疏了,而且有些技术可能从原理上看相对简单,但在实现的过程中会遇到各种问题,比如插件化和热修复,这样的技术如果不上手去实践就只能停留在理论层面。对于这种情况,可以采用一种刻意练习的方法,在知晓原理后自己尝试去实现一个类似的框架,在这个过程中你会得到比阅读源码和文章更多的实践经验,可以大大加深对一个知识的理解,也可以锻炼自己的框架设计能力。
**阅读源码**
别人写的源码分析文章我一般看得比较少除非是自己遇到了很难理解的部分大部分的内容都可以直接在代码里获取到。而且很多源码的分析文章就很少比如Inline Hook ,但是框架实现比较多,那么就只能从代码里获取相关内容。针对一个功能的框架可以去找一些相同功能的多个框架进行对比,看一下实现方式是否有不同之处,同时比较一下每个实现方式的优缺点,并记录一下每个框架所使用的技术。在理解一个框架的实现后,还是建议你去自己写一个类似的框架,因为在自己的实现过程中会遇到各种问题,可以从其他框架里寻找一下方案,然后自己总结一下,这样可以了解这个框架的优势之处,如果在面试的时候被问到一个框架的优缺点,这样也可以有自己的理解,而不是网上帖子的统一描述。
**全栈发展**
在所谓的互联网寒冬下需要持续关注其他方向的技术提升自身竞争力。在前端的趋势热度和各个公司的发展方向中“大前端”已经成为必要的技能这也可以从各大公司的招聘方向中看出来。因此我们在平时学习过程中可以更多关注一下大前端、跨平台、Flutter相关的内容。现在很多公司和部门讲究中台化和前后端闭环管理对于后台和前端的技术都要大概有所了解才能掌握整个业务的动态只关注一块技术在中国的互联网环境下不太利于自身的发展。换句话讲我们关注得越多机会也就更多一些。
**个人能力的提升**
这里的能力更多是指软实力的提升,一个是技术视野,也就是一个业务系统的全局把控,将一个自底向上的思维方式发展为从上到下的抽象能力;再有就是以技术价值为导向。以前我总是深入一些技术细节,只是觉得比较有趣,但很少考虑这个技术点能带来什么“价值”。其实在工作晋升和面试的过程中,通常关注更多的是“价值”,我们一般总说业务迭代、模块开发,但很少谈及所做功能的价值,只是觉得技术实现比较简单并没有什么可以讲的,其实我们可以从以下几个方面进行总结。
首先,我们开发了一个新功能、做了一些改进、引入了一些技术等,可能我们大多在做这些工作,也就是实现了一个业务需求,保证了业务功能的使用,这是功能产生的价值。在做这个需求功能的时候,我们有没有考虑过扩展性、重用性、维护性、性能、稳定性、高可用性等呢?性能的提升给用户带来体验上的价值;可扩展性、重用性带来开发效率的提升;稳定性减少了维护的成本等,这些都是技术产出的价值。我们可以更进一步从业务的角度上看,比如完成这个业务给用户体验提升了多少?促进了多少用户增长、提高了多少用户活跃度、降低了多少成本?由于我们在每个业务开发的时候,都会有一些数据统计的埋点,因此在平时的时候我们要多关注这种业务相关的数据。一般产品同学都会有各种数据报表,我们可以将他们总结起来作为自己完成一个业务所产出的价值。
## 写在最后
最后感谢各位同学能一直跟随“Android开发高手课”学习到最后相信你一定也从专栏里学到了对自己有价值的新知识。我同样也是从专栏上线随着专栏更新一点点学习到现在从专栏里学到了很多思路和方法也巩固了很多基础知识。但更多的基础知识专栏无法详细呈现所以还需要我们以此为起点自己在课下扩展开来多去思考、多做总结。
最最后我想说,每个人在突破自己技术瓶颈时都会经历一段痛苦的时光,只有我们具有坚定的信念,并努力坚持下去,相信我等你回过头来再看曾经认为难以理解的技术和知识时,你会有一种阔然开朗、融会贯通的感觉,这就是成长和进步所带来最大的成就感。
欢迎你点击“请朋友读”,把今天的内容分享给好友,邀请他一起学习。