我们一起看看 jsonchao 是如何学习的吧!
本文作者
链接:
https://juejin.im/post/5eb168e9f265da7bb65fb27a
本文由作者授权发布。
作为程序员,我们几乎每天都在接收非常大量的信息,其中不乏有很多的知识,当然学习不是一味的灌输,确实是由一些不错的方法可以辅助我们学的更好。
相信大家都好奇 jsonchao 为何如此高产,而且每篇文章既有深度,又不缺广度,我之前也好奇 jsonchao 的学习方式,在星球还提过一次,太好了,现在他终于分享出来了。感谢~
成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。
https://github.com/JsonChao/Awesome-Android-Exercise
在学习一个技术之前,判断一个技术是不是真正有价值?
一个技术是不是值得我们花费足够的精力去深挖?是非常重要的,关键就在于在未来几年甚至十几年,它是否能真正地解决项目研发过程中的一些痛点,让企业的收益最大化。而且,「个人的技术成长(硬实力)与软技能(软实力)是密切相关的」,可以这么说,「要想保持长久的技术提升效能与持续成长,就必须有全面、强大的软实力做支撑」。
从我们认知的整个思维结构上来说,软技能是比数据结构与算法、计算机基础更加底层的东西。「越底层的东西它的持久力、生命力以及带给我们的收益就越大」,并且,从某种程度上来说,软技能的学习比算法、计算机基础这些底层知识的学习难度要低不少,所以,这就是我为什么一直要在每周坚持抽出20%的时间去系统地学习软实力方面的内容。
在软技能的知识体系中,对于我们程序员来说最重要的莫过于学习方法了。我们应该如何释放自己的内在潜力去像海绵一样地吸收知识呢?
在本篇文章中我们将深入探讨如何成为一个顶尖的学习者。
1、建构式的学习模式
❝对问题的好奇、对答案的渴望,是驱动我们学习和探索的主要动力。
❞
「知识不是简单的记忆,而是由我们主动地去建构而来的」。
我们必须充分利用现有的知识,在主动性目标或核心问题的引导下去积极地进行探索,只有这样,我们才能够把得到的新知识与旧知识糅合在一起,并在头脑中建构出新的知识体系。
「一个好的长时程问题,能让我们成为“构建者”,因为我们不仅在学习知识,还在“建构答案”,在努力回答问题的过程中,我们筛选、评判与整合新旧知识,并把它们融汇而成一个知识体系。」
「一个好的长时程问题,能让我们成为“探索者”,主动地去探求未知的领域,扩宽“未知的未知”的边界,而不是仅仅满足于对现成的、边界明晰的知识的掌握。」
因此,「提出一个深入的探索性问题是一种学习效果非常好的方法」。在问题牵引下的学习,会帮助我们连续不断地构筑着知识之间的联系,最终便会形成针对于该问题的思维导图之解。
「提问是将我们引向深度学习的起点。一位优秀的学习者,一定同时也是一个优秀的提问者,他会从阅读、观察、思考的过程中产生问题,先解答表层的、容易的那部分,留下深度的、探索式的问题给自己,并在由此问题招致的持续困扰和折磨中开启卓越的心智旅程。」
2、通过解码,深入事物的深层
我们不要只做信息的搬运工,而应该通过解码,去深入事物的深层。
一个高段位的学习者,通常都是一个适应性专家,他们可以有意识地构筑一个信息解码与知识扩展的良性循环—不断地从一些高质量的学习资料中通过 「学习、思考、实践」 去获取深度知识以扩展与修正我们现有的知识体系。最常见的一些高效的解码方式有如下三种:
-
「不仅要去寻结论,更要去寻过程」:不言而喻,过程比结论更加重要。 -
「不仅要去做归纳,更要去做扩展」:归纳的同时,我们应当注重保留其中的核心知识与关键细节。 -
「不仅要去比较相似,更要去比较不同」:不同才有知识,才有新意,才有新的发现,才能实现真正地自我提升,在差别中我们首先应当选择最受强调的东西,这不仅仅是因为它们最引人注目,而且是因为它们也最富有启发性。
而这,大概就是解码的要法了。
3、技能—才是学习的终点
只有最后能够作用于现实的学习,才是唯一有效的学习。最有效的学习方式,即「做中学」,它是学习真正为我所用的关键一步。
目前「最有效的两种通用学习方式」:
-
「不断地测试练习」:即高频次的重复练习。 -
「分散练习」:分散练习即在一个较长的时期内使用较长时间间隔的分布式训练,,例如「1小时、1天、1周、1个月、3个月」的时间间隔。
获得技能也就意味着我们拥有了改变世界的能力,哪怕一开始这种能力非常弱小。「高效实践的方式有三种」,如下所示:
1)、写作式练习
写作是一种「典型的知识建构或重构活动」。
一篇文章如果要被人读懂、要把人说服,需要缜密的思维、清晰的表达和翔实的依据,这些都需要我们对知识的编码与组织达到一个相对较高的水准。
而写作的另一个优势在于能「获得外界的反馈」,我们可以「根据读者的评论去提取出对我们有用的信息,以此来完善或修正我们的知识体系」。
2)、游戏式练习
我们可以「使用“思想实验”来实现一个虚拟的游戏式练习」,思想实验就是构造一个现实中并不存在的假想情境,然后运用所学的知识,来设想事物在这个情境中的变化。在这样的练习中,我们往往可以得到比原先更为深刻的洞见。
3)、设计式练习
调用已有的知识,「设计某一种解决方案,来解决某个特定的问题」。这种练习我们通常会在架构与系统设计方面应用的比较多。
可以看出,「知识的练习迫使我们对现有的知识进行更加深入的审视,对现实的情境和问题进行更加细微的观察,并且致力于创造两者之间的关联。它使我们不再固守书本,不再去做僵化的记忆,而是让我们赋予知识以灵性,以更好地适应这个变化莫测的世界」。
4、调整努力的姿势
具备成长性心智的人,会比平常人成长地更快,他们都坚信——「只要够努力,就能变得更好」。以大多数人的努力程度之低,根本轮不到拼天赋。根据当前的神经科学的研究表明,「人的大脑具有相当大的可塑性,因此后天的努力对人的改造作用可以是惊人的」。
我们在不断地学习和思考的过程中,其大脑内部会产生剧烈的神经活动,这迫使脑神经之间建立了更多的连接。随着神经元之间连接越来越多,我们对问题的认识也就越来越深刻,遇到类似的问题反应也会越来越快。不仅如此,甚至还能触类旁通,举一反三,乃至和其他的领域结合,产生创新性的想法。
「努力,不是一场意志力的较量,而是一种需要学习的策略」。努力本身是一种具有策略性的活动,这体现在如下「三个方面」:
-
1)「个人资源的调配。」 -
2)「行动方向的选择。」 -
3)「执行进度的把控和调适。」
而这种策略是需要我们不断地学习与优化的。
5、专注在一个领域走到最后
在这个互联网上,信息是爆炸的,知识是过载的,观点是鼓噪的,热点是速朽的。而反过来,「专注在一件事上,精益求精、持之以恒的态度和行动,则是最为稀少与珍贵的。」
我一直都相信一句话——「具备突出的优点比没有明显的弱点要重要的多」。
对此,我自然而然地就想到了业界常说的“T”型人才,要高效地成长为“T”型人才,我们得先做出那一竖,即「应先在某一领域深入钻研后再去涉猎其他领域,这样更能触类旁通,对提升那一横的含金量也很有好处。」
而不少事实也证明了,「浅尝辄止的人很可能将一无所获,而专注投入走到最后的人将会获得超额收益。并且,每个人的精力都是有限的,如果你不专注,就很有可能永远在多个“缓慢起步期”徘徊。」
并且,人是无法做到十全十美的,因为可提升的方面实在太多,在有限的精力与时间之下,我们只能竭力发挥自己的优势,将其发挥到淋漓尽致。对此,我们需要「学习齐白石先生那种长期专注和一丝不苟的精神,去把一件事情做到极致。」
6、花费20%的时间去涉猎不同领域的知识
「学习高手通常都会有意识地把不同领域甚至不同学科的知识摆放在一起,然后尝试去分析、比对它们之间的潜在关联,甚至当那异质的素材堆叠在一起时,仅仅是潜意识的推动,就可以让这种隐藏的关系浮出水面。」
在当今,有很多医学的难题长期无法解决或者没有进展的一个主要原因就由于大多数的医学研究者因为多年专业教育塑造的知识壁垒导致缺乏足够的知识广度而造成的。
因此,我们需要需要去花费20%的时间去涉猎不同领域的知识。在学习时间的分配上,我通常会采用「二八分配」的原则,即把80%的时间专注在主业上,把剩余的20%的时间用来去接触各种不同领域的知识或补足自己的知识短板。
知识短板会严重阻碍我们进步。准确识别它们的最佳方式之一就是「看看自己在哪些工作上花费了大量时间,或者一直进行重复性的劳动」。例如没有掌握键盘快捷键可能就是一个知识短板。
7、构建呈阶梯式难度的关卡
人是需要一些挫折、失败或者高难度的挑战来刺激的。如果总是一帆风顺,就会一直待在自己的“舒适区”里不肯出来,潜能就无法被充分地激发。
因此,我们应该「为自己的学习适当地增加必要的难度,例如在学完知识后延迟一段时间再做练习,而这种稍难的考验正好能强化我们对这些知识的存储和构建。」
我们应该学会去「构建适合自己的“个人挑战阶梯”」,拿学英语来说,一个比较好的”英语学习挑战阶段“如下所示:
背单词 => 考托福 => 考 GRE => 听英语电台(VOA、BBC)=> 听各种地方口音的英文 => 英语脱口秀
遇到的挑战越大,获得的快感也越强。好的挑战阶梯的设计能够给与我们足够的挫折与失败,而这将会大大加速我们的成长速度。
「我们应该做一个主动探索的学习者,不断地为自己设计出有难度的”非标准动作“,在挑战中获得才能的提升与飞跃。」
8、如何更加高效地读书?
要想真正掌握一本书的核心内容,需要读三遍。
第一遍:「细读,目的在于完整阅读全书,并且划出重点,写上读书笔记。」
一个月后读第二遍:「扫读,主要快速翻阅第一遍阅读时做的笔记和划的重点,目的在于加深记忆。」
半年后第三遍:「忆读,读的时候只看目录,然后去回想内容,如果回想不起来,再去进行扫读。这样三遍下来,基本上一本书的核心内容就能够很好的吸收。」
9、切忌完美主义
学习不是要么0分,要么100分的。80分是收获,60分是收获,20分也是收获,「有收获才是最重要」。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的0分了。
「不完美其实是常态,根本不会影响我们学习更多更深入的内容」。但是在自学过程中,很多同学却要求自己在自己制定的每一步计划中都达到“完美”,才进行下一步。最终结果,通常都是“放弃”。
而不要“完美主义”,不代表学习可以草率前行。「每个人都必须要找到适合自己的学习节奏」。如果在自己又因为自己的学习进度而沮丧的时候,问自己一句:是不是自己又犯“完美主义”的毛病了。
10、不要过度“学习路径依赖”,学习要冲着自己的目标去。
例如想学机器学习,就去直接学习机器学习。学习过程中发现自己的数学不够用,再回头补数学即可。例如我之前在写 深入探索 Android 内存优化(炼狱级别) 与 时,发现有不少优化方式都使用到了「编译插桩 + Gradle 自动化构建」相关的技术,因此,我又回过头去系统学习了编译插桩与 Gradle 自动化构建的知识。
11、不要迷信权威的“好”教材、不要看不起“薄薄”的“傻”教材
每个人必须要去探索学习如何寻找适合自己的学习材料。适合你的教材不一定是权威的,「可能有一些你看不起的学习材料,就是是你入门某个领域的关键。」
「先用薄教材入门,再找“厚”教材,是我百试不爽的学习方法。因为“薄”的教材能让你以最快的速度看完,对整个学科有一个全盘的认识,薄会将你入门这个领域的难度降至最低,短期学习完之后会让你产生更多的兴趣与成就感。这一点往往更加重要,因为学习,不是100m短跑,而是加长版的马拉松。」
12、不要迷信单一教材。
在大多数情况下,学习不是一本固定教材可以搞定的。非要找到一本“最适合自己的”教材,然后就一头扎进去,其实是不科学的。
建议每一个技术点都需要「筛选多个优秀资源去进行 学习、实践、思考、总结。因为不同的作者对同一个事物会从不同的角度做解读,这能够帮助你更深刻的认识一个概念。」
13、学会复盘
「在每天晚上睡觉的前半小时之内,我们需要复盘当天的学习情况,哪些完成哪些没完成的需要记录,为明天做一个衔接的准备,以确保当前的学习进度是可控的。」
14、量变到质变
仅仅对着一个问题思考,很多时候都是死胡同。因为我们见识的还不够多,就不足以帮助我们去总结出更加“普遍”问题解决的规律。
我们不要企图通过一个问题就理解问题的本质,这其实和企图通过一本教材就精通一个领域的想法是一样的,是不现实的。
其实大多数问题,都是需要“回头看”的。对一个领域理解的越深入,回头再去看那些曾经的问题,都会产生新的视角,对于很多曾经想不明白的问题也豁然开朗。这也是“进步”的根源。「很多时候,你发现对一些问题“百思不得其解”,或许不是因为自己“笨”,而是因为“还不够努力”。」
1、分析问题的重要性
只有「挖掘出问题的核心和根本」,才能针对性地提出改进或者完善流程,来避免类似的问题再次出现。
2、5WHY 分析法
核心是「追究根本原因」。例如针对线上的屏幕适配问题,我们可以提出五种对应的改进方案:
-
1)、开发者要吸取经验,尽量采用普适性较强的写法。 -
2)、对一些组件进行封装,避免类似的适配问题。 -
3)、有新设备上市,要尽早采购。 -
4)、QA 的测试用例要多人评审,尽量保证用例覆盖全面。 -
5)、通过一些自动化检测手段,对适配问题进行检测。
3、第一性原理
有问题时,运用第一性原理,多读官方文档或源码。阅读源码的本质:优秀框架背后的「设计模式与架构」。
此外,对于一些难以用技术解决的问题,可以从需求的角度去解决。
对技术人成长最重要的三个因素通常都包含如下三个要点:
-
1)、「学习-不断提升自身深度与广度的能力」。 -
2)、「思考-即解决问题的能力」。 -
3)、「实践-大量的实践能让我们真正地理解一个技术的本质」。
而学习十步法的精髓就在于「学习-实践-(思考出问题-学习-实践)-掌握-教授」这一系列过程。注意()内的过程(这个过程也被称为探索)通常需要多次反复进行直到最终掌握这个技术点。
「学习十步法充分利用了人天生的好奇心来帮助我们吸收更多的知识,这将会持续不断的激励我们通过实践向着目标前进,而不仅仅是读书或者听教学视频。」
在开始使用学习十步法之前,首先需要明确的是,「学习计划最好能结合工作计划,理论结合实际,快速学以致用」。因此我们应该「优先学习的是工作中会用到的或将会用到的技能」。
在完成了自己的本职工作之后,我们应该去尽量地考量公司中各个系统和业务模块,看看有哪些不合理和可以改进的地方,然后尽力地提升自己相关方面的技术,并去识别和优化它们,在优化的过程中我们可以优先参考其它公司的技术方案。
1、了解全局
了解全局的作用在于我们可以「快速甄别,决定哪些事情值得花费时间」,例如「做一些基础性的研究,例如网络搜索、查阅一下该主题的书的介绍性章节。」
2、确定范围
我们应该「聚焦学习范围,关注重点内容」。这儿需要充分利用自己在第1步中收集到的信息,找出自己的学习范围,也可以借助自己的学习理由来决定学习的范围。
选择一个专注而聚焦的范围,「明确学习范围的时候需要尽可能地充分考虑时间因素与衡量时间成本的性价比。」
那么,如何衡量时间成本的性价比呢?
-
1)「评估掌握一项技能在短期和长期内对我们的重要性。」 -
2)「我们应该对需求和时间成本评估,决定需不需要学,以此确定学习的目标。」 -
3)「一些简单、仅仅需要了解的知识点利用碎片时间去完成即可,但如果是需要掌握甚至“精通”的一些知识点,我们需要为它划分出一整段的时间。」
此外,在这一步中,有两个点需要注意:
-
1)有些知识的获取是需要「循环渐进」的,除非你已经有了非常扎实的基础,否则跳级进阶只能是吃力不讨好。 2)有些知识点例如「源码、晦涩的一些概念」等等,只要它们是足够「重要」的,弄明白它们就是「非常值得」的。
3、定义目标
好的成功目标应该是「具体的、无二义性」的。例如在学习 ASM + Gradle 时,我定义的目标是:使用 ASM + Gradle 完成一个全局的 Bitmap 监控组件。
https://juejin.im/post/5e780257f265da575209652c#heading-70
4、寻找资源
目前,我学习的主要信息来源包括如下 「九个渠道」:
-
1、「官方文档」:第一手资料。 -
2、「源码」:第一手资料。 -
3、「Github 开源项目」:定期查看 GitHub 的热门榜,看有没有需要的优质项目(至少每周一次)。 -
4、「Awesome-Android-NoteBook && 豆瓣读书 - 计算机科学经典书籍」。 -
5、「开源的权威资料」:例如《On Java8》即 Java 编程思想 (第五版) https://lingcoder.github.io/OnJava8/#/book/01-What-is-an-Object -
6、「极客时间」 -
7、「慕课网」 -
8、「百度云盘」 -
9、「WanAndroid 优秀文章」
鸿洋注:开心,提到了 wanandroid.
在这一步,记得也要寻求一些好的薄教材/入门文章,在我们刚开始学习这个主题时,便会从它们开始。
5、创建学习计划
我们需要「根据自己个人的时间去制定适合自己的学习计划」。这一步我们可以把它看作自己写书时候的大纲,这里通常可以通过查阅图书的目录进行。
6、筛选资源
计划学习前要考虑清楚,一旦开始执行学习计划,就应尽量保持少的变更,除非后续发现计划有问题。因此这里我们需要多加一步去「选取品质最高的资源覆盖学习计划,对于一些购买性的资源可以通过查看评论的方式进行评估。」
7、开始学习,浅尝辄止
这一步的关键在于「过犹不及」。你会很容易就失去自控力,开始消化计划学习中列出的所有资源。但是,你会发现,如果你能经受住这样的诱惑,你会取得更大的成就。我们应该要「专注于掌握自己所需的、能在下一步动手操作的最小量的知识。」
「好记性不如烂笔头」,在学习的过程中,学习的东西至少要做好笔记(印象笔记、有道云笔记),并且后续需要「按照一定的间隔时间去反复复习」。
8、动手操作,边玩边学
❝万事无他,唯手熟尔。教育的首要目标,并不在于”知“,而在于”行“。
❞
对于计算机领域的学习来说,教材的意义其实远远小于实践的意义。
真正动手实践去编程是异常重要的。这就好比学游泳,必须下水去游泳;或者学开车,必须亲自上路。否则你说的再头头是道,一个小学生文化水平的人,只要他开过车,游过泳,都能在这两个领域瞬间秒杀你。
真正的学习上的提高,就发生在实践的过程之中。例如,「debug 就是一种高效的实践方式。它不仅仅是找到代码错误,解决错误的手段,其实更是一个重要的学习手段。」
因此,我们应该「通过探索和实践进行学习,在实践中碰到的问题会引导着我们走向真正重要的方向。当回过头寻找问题的答案时,不只是这些问题迎刃而解,而且你记得的东西比你学习到的东西多得多,因为你所学到的都是对你很重要的东西。」
此外,在实践中,「在某些关键动作上刻意练习,也会取得事半功倍的效果」。因为不停的练习和思考可以改变大脑结构,大脑像肌肉一样,挑战越大,影响越大,学习更高效,并且也会产生突破性。
9、全面掌握,学以致用
我们「没有必要把收集到的所有资源全部仔细看一遍,而应该以解决在动手操作中发现的问题为主要目的」。试着把自己正在学习的内容与最终目标关联起来。「你掌握的每个模块,都应该以某种方式推动着你向着终极目标前进。」
在这一步中,我们可以将测试练习与分散练习这两种学习方式结合起来使用,以达到最佳的学习效果。同时,我们最好能给自己设置一系列的挑战阶梯,例如对于学习音视频的同学可以给自己设置如下的挑战阶梯:
使用 Android 音视频 API实现一个播放器
=> 使用 FFmpeg 与 OpenGL 实现一个播放器
=> 定制 FFmpeg 的源码、掌握 OpenGL/Vulkan 的高阶用法实现功能更加强大的播放器
学习某一个技术其实到最后会形成一颗「技术树」,我们可以使用「思维导图 => XMind || 幕布」进行描述。而对于一些涉及「流程」相关的技术点,我们可以使用「ProcessOn」来画流程图。
10、乐为人师,融合贯通
❝如果你能将自己所学的东西都教给别人,那么你不仅能够记住,而且还能够理解得更加深刻。
❞
重点在于,我们需要花时间将自己所学到的东西从大脑中提取出来,以别人能够理解的方式组织起来。「在经历了这整个过程之后你会发现,有很多你以为自己明白了的知识点,其实并没有摸透。这一步对保持信息以及深入理解知识而不仅仅只是流于表面至关重要。」
在教学的过程中,有一些内容是必不可少的,例如:
「是什么?」
「为什么?即它解决了什么问题。」
「优缺点。」
「对比同类技术的不同/相同点。」
「如何使用?」
「如何解决问题的?即内部的实现原理。」
「归纳时注重核心知识与关键细节,并尝试去类比不同领域或不同学科之间的知识。」
「重要的过程、结论。」
分享就是一种很好的教学方式,而且它的时间成本也相对较低,目前常见的有「三种分享方式」:
-
1)、「博文文章/专栏」 -
2)、「慕课网技术视频」 -
3)、「部门/社区内的技术分享」
技术分享的真正意义在于,「总有一部分知识我们并没有真正理解透彻到可以向别人解释,而”教“的过程能够迫使你面对这一部分。在教别人的时候,我们迫使自己面对课题中的难点,深入探索,从只知皮毛变成完全理解。学习知识暂时的,而理解是永久性的。」
「在我们试图教别人的时候,会强迫自己重新组织大脑中的资料」。最好的思维方法就是解释某样东西并将其记录在纸上,或者记录到 Word 文件或者幻灯片中,使你可以将这些互不连贯的碎片信息收集起来,并以一种有效的方法重新组织起来。「要想教人,我们得先把自己教会。」
而在教别人的过程中,最好的教学方式就是「心态谦卑,信心满满——以谦虚的视角来观察问题,以权威的口吻去诠释问题。」
最后,不要忘记进行隔期复习,对于一篇文章来说,可以「先扩展出它的知识树,然后再尝试去描述其中每一个知识节点的核心内容与关键细节。」
❝开源自己造的轮子也是一种很好的分享方式,我们应该学会造轮子,去写一些框架或组件,建议设置简单到复杂的挑战阶梯。
❞
最后,我就以最近正在学习的 Android 网络优化为例来实践一下十步学习法,其思维导图如下所示:
1、怎样由浅入深地学习一个技术点?
建议大家先选定一个自己最感兴趣的方向,后面一段时间就专攻这一个方向,拿 Flutter 做例子,可以先将所有 Flutter 相关的专业文档、优秀书籍、视频教程、文章等搜集起来,将其中涉及的知识大纲列出来,对其中涉及到的每一个知识点(如今天或这几天要学的是布局类组件)需要的对应资料列出来。
然后去学习、实践它的基本用法,接着可以再深入一层看这个知识点涉及到的内部原理(如 Flutter 中常用布局的实现原理),最后总结出对应的学习笔记(供以后复习)。这样学习起来就比较有效果,而且刚开始可以根据自身的状态去调节计划时间的长短,建议开始计划定松一点,确保每天都能完成。
养成习惯并完全适应后,可以加大学习量。这就跟健身的原理一样,刚开始锻炼的人一般都体质比较差,所以需要从最基础的动作开始练,等将基础打好了,体质提升上来了,才能去适当地做一些力量训练,增加肌肉。
2、怎样才能很好地把安卓零碎的知识点串起来?
这可能说明学习的时候没有注重体系化地学习与思考,而是东学一点西学一点,那这些知识自然而然地会零散地遍布在我们脑海的各处。
为了解决这个问题,我们需要首先需要把目前所学的知识列出来,然后可尽可能地找到这些知识点的联系,把它做成思维导图。
由于可能有很多联系点我们之前学习的疏漏而没有把它纳入我们的脑海中,但是,这并无大碍,后面我们可以围绕这张 1.0版本的安卓知识思维导图 不断迭代,最终,它就会日渐完善,发挥出想象不到的威力~
3、对未来很迷茫,天天都在学习但是技术就是提升不上去?
其实,对于大家来说,最重要的事情就是 如何去从最本质、最底层的层面去打磨自己?
如何培养兴趣、深入钻研某一个领域从而成为专家?如何具备快速、高效、不断深挖某一技术的核心能力(即一通百通的能力)?
这些问题的答案很难在短时间让大家去明白、理解。其实,我「今年的整个文章路线」就是围绕这些内容而定制的,其共分为几个核心路线:
「软技能、高效构建算法知识地图、性能优化领域专家、NDK 高手之路(偏向于 Native 层的性能优化、Hook 实现)、Flutter(从最重要的核心点 自上而下打通 Flutter 的整个架构体系)」 ,明年上半年的路线:架构师成长之路(从易到难具备强大的架构设计能力) 。
可能有的同学认为我学的好像很杂,其实不然,我一直都专注于一条路线,就是「基础架构研发」,它涉及的主要工作内容就是「架构设计、性能优化、前沿新技术预研(Flutter、JetPack」)。
建议大家选定一条路线,也不一定要是上面的路线,专注于音视频、图形处理 或 AI 移动、大前端 的路线都可以,今年大家一起加油,希望年底能给自己一份满意的答卷~
4、如何更高效地学习技术视频?
学习视频的时候建议「开 2 倍速看,对于 不熟悉/偏难 的知识,每看一个小的技术点之后,就实践一遍,然后把实践的成果写入 笔记/你的初稿博客 中,对于 比较熟悉/简单 的知识,一般是看一小节/两三个技术点之后再实践、写入 笔记/你的初稿博客。」
5、如何选择第三方库?
-
确定这个库是否是必需的。 -
这个库能否带来开发效率的提升,降低代码的维护成本。 -
这个库的学习成本如何 比如 rxjava 其实学习成本会相对高一些。 -
这个库的质量如何,不要仅仅看 star,更要看 issue 的处理情况。
6、怎样练习算法题?
每道算法题都先自己去实现,理清思路后自己去实现一遍。(超过5分钟没思路跳下一步)
然后再看看答案,记住答案的思路,手写一遍。
第二天再重新按照答案的思路再手写一遍。
等到要面试的时候再系统地将所有的题型按类别进行手写即可。
7、如何阅读源码?
1)、准备
-
1、Java设计模式(模板方法,单例,观察者,工厂方法,代理,策略,装饰者)。 -
2、Java高级相关(泛型、反射、IO)。 -
3、在官方文档上了解软件的整体架构设计、主要功能。 -
4、熟练掌握这个库。 -
5、搭建系统,把源码跑起来。
2)、开始阅读
-
1、根据你对系统的理解,设计几个主要的测试案例,定义好输入,输出。(Debug一 遍肯定是不行的,需要Debug很多遍) -
2、第一篇抛弃细节,抓住主要流程,第二篇,第三篇,再去看各个部分的细节。 -
3、阅读的时候同时使用 UML 画出系统的类图。主要的测试案例明白了,丰富测试案例,考虑一些分支。 -
4、这一步会非常非常地花费时间,但是你做完了,对系统的理解绝对有质的飞跃。
3)、流程小结
-
1、准备。 -
2、网上搜索针对该开源项目进行分析的优秀文章。 -
3、对开源项目提出自己的疑问,并带着疑问阅读源码。 -
4、阅读源码过程中多添加注释、笔记. -
5、做阅读总结/写文章,吸收和再创造
8、新技术频繁出现,我们应该采取有效的针对性措施?
一项新技术的出现,我们应该先去了解它,看它是否对自身的技术成长有比较大的帮助,有的话按优先级加入学习计划表,而不是立马去学习或否定它。
对于大多数人来说,可能关键不在于学习方式的优劣,而在于「如何不痛苦地坚持下去」。而要解决这个问题,最大的利器便是兴趣。
「只有真正深入到一个领域,才能培养出对其的真正兴趣。如果对一件事的了解不深、不透,总是浅尝辄止,那自然体会不到这件事的妙处,也自然不会产生持久的兴趣。这让人容易滑入一个死循环:了解不够导致兴趣不足,而兴趣不足又无法加深对它的了解。」
「如果我能长期地坚持去做一件事,一定是这件事带给我的丰盈感和满足感超过了我的所有付出,一定是这件事日日夜夜萦绕在我的心头让我欲罢不能,一定是这件事唤起了我内心深处最强烈的兴趣」。
也就是说,赐予我力量的,是激情的驱动,而不是意志力的鞭策。但是,热情很难一直存在,因此,在热情黯淡的时期,需要我们有一定的自控力去做支撑过渡。因此,如何练就强大的自控力也是需要我们去不断深入探索的一个问题。
参考链接:
1、《软技能 代码之外的生存指南》
2、《精进 如何成为一个很厉害的人》
3、《跃迁 从技术到管理的硅谷路径》
4、
推荐阅读:
如果你想要跟大家分享你的文章,欢迎投稿~
┏(^0^)┛明天见!