我的技术学习方法论

作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。

热门文章推荐

热门:学长主导的新星计划2023【AI 助力软件开发】学习方向,旨在引导大家学习 AI 工具的使用、学习如何写出高质量的技术文章。引导学员借助 AI 工具更好地学习,更快地解决问题。活动火热报名中。学长会开一次直播讲解相关内容,并在群中答疑,优秀作品还有奖品。感兴趣快来报名吧!

一、背景

最近有个朋友问了一个比较有代表性的问题:
“我有个困惑,虽然有时间学习,但是碎片化的,学了以后自己的技术还是停留在 CURD 上,不是很系统。解决问题上一些思维逻辑,不能体现一个程序员应有的专业度,怎么办?希望你可以给我一点建议,如何系统学习?”
手绘风双十二课程促销PC端banner.png

二、建议

Xnip2023-03-17_08-36-55.png

2.1 夯实专业基础 -> 基石

比如一些考研四门课的视频,隔一两年偶尔翻一下,比如《操作系统》、《计算机网络》、《数据结构》、《编译原理》。

还有《深入理解计算机系统》这类讲解深入浅出的计算机专业知识的图书。
image.png
很多中间件的原理、很多技术方案设计思想,都和专业基础是通的。越是接近计算机底层的知识,越是最经典的,最具有借鉴意义的。
对我们学习和掌握其他知识大有裨益。如果能够熟练掌握专业基础,知识更容易融会贯通,触类旁通。

2.2 主动学习技术原理 -> 中间层

2.2.1 学什么

每隔一段时间,如每隔几个月,主动学习或温习下各种常见中间件(如 Es 、Hbase、Redis、Kafka 、Dobbo、Spring 等)的原理。

image.png
多都一些经典的图书。读一本经典的书,胜过多本普通的书,甚至几百上千篇水文。

可以去知识付费平台系统学习自己感兴趣的技术的专栏,技术专栏相对没那么枯燥,文章质量也比较高,经过作者的加工,更容易理解。

2.2.2 学习的思路

(1)以准备面试的方法来学习

单纯看某本书可能会有些枯燥,而且读完某本书后由于没有验证,也不知道自己掌握到什么程度。
image.png
而某个领域相关的面试题通常是重点,我们可以以面试题来验证自己的知识掌握程度,对于不能从容回答的问题,再加强学习。

(2)温故而知新 & PDCA

俗话说:“温故而知新,可以为师矣”!
温故而知新.png
通过复习旧知识,可以发现新的理解和领悟。
但是很多人,不愿意“温故”,更少的人愿意有计划有规律的“温故”,导致很难有新的认知。
然而,有时候知识的学习却非常需要这样的一个过程,
这就像挖井,之前挖了 1 米,然后停下啦,然后换个地方又挖了 1 米,很难能够挖深。
然而,学习的规律本身就需要从认识到实践,再从实践深化认识,一种螺旋式上升的过程。


这和经典的 PDCA 原则很相似:即是计划 (Plan)、实施 (Do)、检查 (Check)、行动 (Action)的首字母组合。它是一种科学的管理方法,无论哪一项工作都离不开 PDCA 的循环,每一项工作都需要经过计划、执行计划、检查计划、对计划进行调整并不断改善这样四个阶段。
image.png
通过不断地计划、实施、检查和调整,可以持续改进工作流程,提高效率和质量。

(3)横向和纵向寻找联系

我们可以将日常的系统设计、中间件的原理和计算机专业基础进行纵向类比;也可以将各种中间件进行横向对比,找到内在的联系,这样知识更容易融会贯通,更容易泛化。

横纵联系.png

比如我的 《性能优化方法论》 中介绍的内容就是将专业基础和各种中间件原理以及日常开发中的一些性能优化经验相结合,总结出来的。

比如《Pipeline 设计模式的优缺点和实践案例》 就是将设计模式和用过的某个推荐系统的源码、用过的 Java 相关 API 放在一起对比的思考。

比如 《编程技巧篇之特殊处理留痕迹》 就是我在工作中需要设计可以通过请求上下文中传入特殊参数,将 DEBUG 日志临时提升到 INFO 级别打印的功能,设计该功能时遇到如何将提升的日志和普通的日志区分开的问题,借鉴 Spring Factory Bean Prefix 为提升的日志加前缀,方便区分。

比如《Java 实现有限状态机的推荐方案》就是在学习了枚举类中可以定义抽象方法来实现更丰富的功能,状态又通常定义成枚举,因此突发奇想,是否可以用枚举做简单的状态机呢?因此就有了这个方案。

再如,下图是我对化整为零思想在多个地方运用的整理的局部截图:
image.png

再如:需要做一个不同版本的对比功能,就需要对不同的版本存储快照,原计划需要上线后刷数据,但是设计的时候借鉴了 ThreadLocal获取数据时清空过期数据的方案,采用执行版本对比时,如果没有快照就去存储的方案,就省去了刷数据的步骤,降低了复杂性。

(4) 专题学习

大家可以根据自己的兴趣和需要,可以在某个时段对某个技术进行专题学习。
黄色渐变教育培训PC端banner.png
比如对 DDD 、Spring 源码感兴趣,购买相关的经典图书、专栏、文章,观看相关视频,搜索相关开源框架等进行专题学习,效果比较好。

2.3 遇到问题是最佳的学习时机

2.3.1 为什么很多人工作五年只有一年的经验?

正如我在文章中无数次提到的:“每一个问题,都是我们彻底掌握某些知识的最佳机会”。
image.png
不管工作中遇到的简单的还是复杂的问题,我们一定不要简单止步于“解决问题”,而应该借机将背后的原因搞清楚,找到更合理的解决方案。

这也是很多人工作几年,依然知识掌握得不够深入,成长很慢的原因。

2.3.2 知其然,知其所然

这样每遇到一个问题,都能够将知识贯穿起来,能够夯实相关的基础和原理,这样成长更快。

示例1:比如使用 ConcurrentHashMapput方法时,不管是 key 还是 value 为 null 都会空指针异常。此时,我们决不能记住不能放 null 就完事,一定要了解为什么不允许为 null, 思考如何解决这个问题 。
我将该问题总结在: 《什么?你不知道 ConcurrentHashMap 的 kv 不能为 null?》 一文中。

示例2:比如使用 BeanUtilsgetProperty 获取属性时,出现 NoSuchMethodException,可以趁机到源码中分析学习。
我将该问题总结在:
《使用 BeanUtils.getProperty 获取属性时出现 NoSuchMethodException: Unknown property 问题分析》

2.3.3 a small step forward

我们不仅要在遇到问题时找到根本原因,寻找可行的已有解决方案,还需要努力思考是否有更好地解决方案,哪怕只是往前走一小步,也非常有意义。
往前一小步.png

示例1:在某个业务场景下,需要在 Map 的属性发生变化时,做一些额外的处理。借鉴包装器设计模式,借鉴 SynchronizedList代码的思想,对 Map 进行二次封装,即可实现写操作时自动触发某个特定动作。
我将问题总结在:《Map 有变动时触发特定行为实现》

示例2:在工作中某个特殊场景下需要前端以某个字符对数据拼接后传给后端,然后以 HTTP 的 GET 请求的方式传给后端,后端再根据分隔符进行拆分。最后参考 ASCII 码的特定不可见字符,更好地实现了这个功能。
我将问题总结在:《前端分隔符传递数据给后端的通用方案》

示例3:工作中看到有同事使用策略模式时,需要注入类型到对应 Bean 的 Map ,以便使用时可以根据类型获取对应的 Bean 执行业务操作。发现每次新增子类都需要修改配置,很容易遗忘,因此思考如何改进。
我将问题总结在:《巧用 Spring 自动注入实现策略模式升级版》

2.4 以教为学

大多数人是 Input 太多, output 太少,只有输出才能更好地理解。
以教为学.png
学习某个技术的时候,解决某个问题的时候,可以通过写博客、做技术分享、参与代码审查、参与探讨技术方案等手段,将自己所学教给别人。

尤其是积累到一定程度,可以尝试对某个问题或者专题进行写作,写作的时候又需要重新思考,需要查资料等,对知识的掌握又会更加系统。

也可以尝试进行一些投稿活动,主动讲自己所学提取整理,这样知识掌握更牢固。

如上面的性能优化,还有一些其他的文章(包括本文):
《如何写出高质量的文章:从战略到战术》
《我对“结构化思维”的理解 》
《猿创征文|弃文从工,从小白到蚂蚁工程师,我的 Java 成长之路》

2.5 探讨交流

我有时间时,喜欢在技术群里回答和探讨技术问题、也喜欢在工作中参与技术方案评审。
这是一种很好的学习方式。
image.png
因为一个人遇到的问题有限,帮助别人解决问题,既能发现并补足自己的不足,又能学习别人的思路和经验,加速成长。
在工作中多去吸收同事的技术方案设计中的巧妙之处,也对增长工作经验大有裨益。

2.6 善用思维模型

2.6.1 先猜想后验证

这种思维非常重要,这就像自己先做一遍题,再对照答案判断自己做的对不对,有没有更好的方案。
如果直接去看答案,容易眼高手低,以为自己都懂了,其实没有掌握,更没法做到活学活用。
image.png
我们阅读某个源码之前,学习某项技术之前,可以先思考“如果让我设计,我会如何实现”,然后再将自己设计和实际进行对比,这样印象更加深刻,学习效果更好。
如果猜想对了,对自己是一个很大的鼓励和肯定,如果猜想和实际不一致,正好可以借机学习。

通过前面讲到的遇到问题时,抓住机会掌握原理,甚至寻求改进方案。再通过猜想和验证的方法,就会有很多学习和验证自己所学的机会,通过不断的思考、训练,知识掌握的会越来越牢固。

2.6.2 本质思维

遇到任何问题时,需要找到根本原因,探寻问题的本质。
这样才不至于从表面上解决问题,自己对知识的掌握不深,也无法从根本上解决问题。

比如开发中,前端同学说某个查找员工的接口无法搜索到外包,问是否可以接受。很多人可能就得过且过直说可以。可以去了解为什么不支持搜索外包同学,是否还有其他接口可以支持。

2.6.3 Zoom In & Zoom Out

zoom in 和 zoom out 是摄像技术用语。zoom in 指(照相机等)用变焦距镜头使景物放大,即将景物推近;zoom out 刚好相反,表示用变焦距镜头使景物缩小,即将景物拉远。
image.png
我们学习某个技术时,可以主动的去采用类似的思维去思考,zoom in 的思维可以让我们关注问题的细节,找出具体的原因和解决方案;zoom out 的思维可以让我们从宏观的视角看待问题,把握问题的背景和影响,避免陷入局部的思维。

2.6.4 六顶思维帽

六顶思维帽能够让我们切换不同的视角更全面的思考问题,对我们进行技术方案设计、某项技术学习,进行技术写作都有很大帮助。

六顶思维帽是一种由爱德华·德·博诺博士开发的思维训练模式,或者说是一个全面思考问题的模型。它提供了“平行思维”的工具,避免将时间浪费在互相争执上。它使用六种不同颜色的帽子代表六种不同的思维模式,分别是白色、绿色、黄色、黑色、红色和蓝色。每种颜色的帽子有其特定的功能和意义,可以帮助人们从不同角度思考同一个问题,从而创造高效能的解决方案。

六顶思维帽每种颜色的含义如下:

  • 白色思考帽:中立而客观的,思考的是客观的事实和数据;
  • 绿色思考帽:创造力和想象力,创造性思考、头脑风暴、发散思维等;
  • 黄色思考帽:价值与肯定,从正面考虑问题,表达乐观的、满怀希望的、建设性的观点;
  • 黑色思考帽:否定、怀疑、质疑,合乎逻辑地进行批判,尽情发表负面的意见,找出逻辑上的错误;
  • 红色思考帽:情感和直觉,表现自己的情绪,也可以表达直觉、感受、预感等方面的看法;
  • 蓝色思考帽:控制和调节,负责控制各种思考帽的使用顺序,规划和管理整个思考过程,并负责做出结论。

image.png

变通一点执行的话,学习某个技术的时候,了解相关资料,了解优点和缺点,对比相似的技术,了解使用场景,思考改进方案等,让自己对某个技术的了解更全面。

2.7 利用好工具

比如微信公众号有很多质量较高的资料,可以借助 搜狗微信搜索 来搜索学习。
比如可以和 PDF聊天的 ChatPDF, 可以导入 PDF,直接对 PDF 进行提问,给出你所在的页码,可以大大提高学习效率。
image.png

image.png
最近 ChatGPT 和 New Bing 开始流行,对学习帮助很大。公司如果允许的情况下,不管是学习某个概念,还是寻找解决思路,还是帮你写个 Java 代码的 DEMO 等,都可以轻松胜任。
image.png
近期我也尝试通过对 New Bing 提问来更快地解决问题,技术写作时让 New Bing 帮我写一些基础代码的 DEMO ,让 New Bing 给出某个概念的解释等。

《Pipeline 设计模式的优缺点和实践案例》 中 Pipeline 推荐系统的代码示例,就是基于 New Bing 给的代码改造而来,提高了不少效率。

可以对一个问题进行提问,然后不断追问,就可以快速对某个问题进行系统学习,再结合前面提到的专业基础和中间件的原理,理解会更好。
image.png

总之,人工智能的时代来了,利用好 AI 工具,变革学习方式,提高学习效率。

三、总结

本文介绍了自己的学习方法论,如夯实专业基础、主动学习技术原理、把握遇到问题的时机来学习知识,以教为学,和善用工具等。
欲速则不达,想要走的更远,需要打好地基,需要掌握方法,需要耐得住寂寞,需要有足够的热爱。
在日常开发的同时,还要停下脚步夯实基础,将知识横向和纵向关联,加深对知识的理解,增强自己知识的泛化能力,以便更好地“学以致用”!
希望对大家有帮助。


创作不易,如果本文对你有帮助,欢迎点赞、收藏加关注,你的支持和鼓励,是我创作的最大动力。

猜你喜欢

转载自blog.csdn.net/w605283073/article/details/129605898