其实我觉得大多时候不是技术难,而是应该说复杂。技术大多都是演进而来,其实这种演进和我们业务需求迭代的过程很类似。比如内存管理,从固定分区、动态分区机制到分段机制,然后发展成现在的分页机制,硬件也随之演进,都算是一个迭代过程。理解分页机制其实不难,但这个知识点所涉及的内容就很繁琐和复杂了,比如了解系统如何管理内存需要了解内存布局,就会涉及内存划分;内存划分又涉及 CPU 的运行模式,然后是物理内存和虚拟内存如何映射,会涉及页表的翻译、物理页面的分配和释放、伙伴系统算法;为了解决伙伴系统的内存碎片化问题,又衍生出迁移类型等。
这一系列涉及的内容就非常复杂,但每一项单拆出来去看,一层层的去学习和补充,就会感觉容易很多。这一点其实在业务开发上也有体现,我们刚接手一个复杂的业务,代码庞大,注释和文档都很少,但在一段时间后你还是会对整个业务有或多或少的认识,在接到新的业务的时候也没有觉得难到无从下手,顶多是觉得复杂。底层的系统、框架也是如此,这是一个由点到面的过程。
忙碌状态下的学习
鸿洋写过一篇文章《嗷嗷加班,如何保持学习能力》,讲在繁忙的工作状态下如何保持学习,我看过之后也很有感触。在平时零散的时间里我们看到一篇技术文章,并不是阅读收藏后就结束了,这样你可能会在很短的时间里就忘掉了文章的内容。他将阅读一篇文章分成以下几个步骤:提取这篇文章要解决的问题;然后概括一下涉及的技术点;提取重点内容,比如问题发生的缘由、有哪几种解决方法。总体来说,这个方法是为了在短时间内提取出重点内容,然后记录下来后面再进行复习。所以我们都需要多记录、多复习,可以培养使用一些工具来帮助自己养成习惯。
逃离舒适区
并不是说换一个更忙碌的工作就是逃离舒适区,而是在平时工作和学习过程中保持一种焦虑感,这种焦虑感不是迷茫和恐慌,而是清晰的认识到自己的不足,然后在工作和业余的时间里填补自己,当你集中注意力攻克一个难点的时候,你会发现这是一件有趣的事。我身边有很多同学都在持续的学习,每个人都有不同的目标,比如学到什么程度、应用到什么地方等,需要一定的压力才能产生比较好的效果,否则很容易迷失丢掉重点。我以前所在的团队有一个学习计划表,每个同学调研一个方向,每周周会的时候都会抽出一定时间去做技术分享,我觉的这是一个很好的方法,人在有一定紧张情绪的情况下注意力会相当集中,这个和考试前、面试前学习效率会很高的道理是一样的。不过我们也不能太过焦虑,我经常会有焦虑感,我的解决方法是定制计划,半年或者一年,在一段时间专注完成一件事,你会看到自己成长了很多。
刻意练习
也许我们在公司里平时做的业务需求都是缝缝补补,并没有涉及很复杂的内容,大量重复的工作会让人觉得无法提升自己的技术。而自己平时自己学到的知识在一定时间之后可能就生疏了,而且有些技术可能从原理上看相对简单,但在实现的过程中会遇到各种问题,比如插件化和热修复,这样的技术如果不上手去实践就只能停留在理论层面。对于这种情况,可以采用一种刻意练习的方法,在知晓原理后自己尝试去实现一个类似的框架,在这个过程中你会得到比阅读源码和文章更多的实践经验,可以大大加深对一个知识的理解,也可以锻炼自己的框架设计能力。
阅读源码
别人写的源码分析文章我一般看的比较少,除非是自己遇到了很难理解的部分,大部分的内容都可以直接在代码里获取到。而且很多分析的文章很少,比如 Inline Hook ,但是框架实现的比较多,那么就只能从代码里获取相关内容。针对一个功能的框架可以去找一些相同功能的多个框架进行对比,看一下实现方式是否有不同之处,同时比较一下每个实现方式的优缺点,并记录一下每个框架所使用的技术。在理解一个框架的实现后,还是建议你去自己写一个类似的框架,因为在自己的实现过程中会遇到各种问题,可以从其他框架里寻找一下方案,然后自己总结一下,这样可以了解这个框架的优势之处,如果在面试的时候被问到一个框架的优缺点,这样也可以有自己的理解,而不是网上帖子的统一描述。
全栈发展
在所谓的互联网寒冬下,需要持续关注其他方向的技术,提升自身竞争力。在大前端的趋势热度和各个公司的发展方向中,大前端已经成为必要的技能,这也可以从各大公司的招聘方向中看出来。因此我们在平时学习过程中,可以更多的关注一下前端、跨平台、Flutter 相关的内容。现在很多公司和部门讲究中台化和前后端闭环管理,对于后台和前端的技术都要大概有所了解才能掌握整个业务的动态,只关注一块技术在中国的互联网环境下不太利于自身的发展。换句话讲,我们关注的越多,机会也就更多一些。
个人能力的提升
这里的能力更多是指软实力的提升,一个是技术视野,也就是一个业务系统的全局把控,将一个自底向上的思维方式发展为从上到下的抽象能力。再有就是以技术价值为导向。以前我总是深入一些技术细节,只是觉得比较有趣,但很少考虑这个技术点能带来什么“价值”。其实在工作晋升和面试的过程中,通常关注更多的是“价值“,我们一般总说业务迭代、模块开发,但很少谈及所做功能的价值,只是觉得技术实现比较简单并没有什么可以讲的,其实我们可以从以下几个方面进行总结。
首先,我们开发了一个新功能、做了一些改进、引入了一些技术等,可能我们大多在做这些工作,也就是实现了一个业务需求,保证了业务功能的使用,这是功能产生的价值。在做这个需求功能的时候,我们有没有考虑过扩展性、重用性、维护性、性能、稳定性、高可用性等呢?性能的提升给用户带来体验上的价值;可扩展性、重用性带来开发效率的提升;稳定性减少了维护的成本等,这些都是技术产出的价值。我们可以更进一步从业务的角度上看,比如完成这个业务给用户体验提升了多少?促进了多少用户增长、提高了多少用户活跃度、降低了多少成本?由于我们在每个业务开发的时候,都会有一些数据统计的埋点,因此在平时的时候我们要多关注这种业务相关的数据。一般产品同学都会有各种数据报表,我们可以将他们总结起来作为自己完成一个业务所产出的价值。
我们还要思考技术带来的“价值”,没有万能的技术方案,都要结合具体使用场景和业务。我们需要的是掌握更多的“解题方案”,这样才能更好的衡量优缺点来实现当前的最高价值。将学到的技术落地才是对技术的最大尊重!