高效学习方法——知识关联性
这篇文章写的是我对知识关联性的理解,以及用知识体系实现知识关联性。
引言
科学研究显示,大脑并不是简单地记忆信息,而是通过神经元之间的连接来组织和管理知识。关于大脑的研究,Eric Kandel(2000 年诺贝尔生理学或医学奖获得者)通过对神经元及突触机制的研究发现,学习和记忆的形成依赖于神经元之间的突触可塑性:当我们学习新知识时,神经元之间的连接会得到强化,这种突触的变化决定了信息能否从短期记忆转化为长期记忆,从而在大脑中被持久存储。
(神经元的卡通图,显示了由每个突触内的数百个机械开关产生的二进制编码)
关于**突触可塑性,**知乎上有一位神经生物学博士对此发表过一篇文章:https://zhuanlan.zhihu.com/p/29948671
条件反射实验表明,单独的刺激可能效果有限,但与已有重要信息关联后,学习效果显著增强,本质上可以作为关联性增强记忆的生物学证据。
所以得出结论: 知识在已有知识网络的基础上进行关联学习,会显著提高理解力和记忆效果,即: 知识的关联性学习,是一种科学的高效学习方法。
知识关联性的实现方式可以有很多种,用对比的方式学习,会越学越快。
本篇文章用知识体系来做知识关联性,是我认为比较全面性关联的一种方式。
知识体系的作用和意义
- 让原本知识的关联性更清晰
可能你已经学习了很多知识,但脑海没有对知识点进行过整理,有些零碎,将相关联的知识建立一个知识体系正是对知识的梳理,这个过程你会对知识点的定位更加清晰,增强你对原有知识的记忆。
- 对新知识的快速学习
当我遇到新的知识,当我问自己这是什么的时候,我会尝试给知识定位,尝试放入到知识体系中,用原有的知识帮我快速认识新的知识,并建立知识关联性。这便是高效学习法之一。
比如:
单个知识都不难理解,比如各种Spring入门,讲的并没有多难,不用什么关联性也能懂,但是到了Spring IOC 体系讲解、AOP 实现原理, 就非常需要前面入门知识的理解,否则就会有特别吃力、跟不上的感觉,此时你会怀疑自己脑子笨?其实并不是,仅仅是前面学的太随意了,认为以后没什么用,走马观花看了一遍,到了Spring进阶, 缺乏Spring入门的知识,学习便会带给你挫败感,不再是入门时听懂知识的成就感。
下面分享我的知识体系例子,没写全,也写不全。
技术层面的知识体系
从大学开始计算机学习,随着学习时间推移,知识广度不断扩展,知识点经常会遗忘或者混乱。我知道 AI 可以一键输出知识体系,但那缺乏一个一个知识点思考的过程,有点这知识体系不是自己的感觉,如果是自己写的知识体系,每个知识在哪个分类、哪个位置都是自己思考过后的结果,完全属于自己的产物。
前端
前端三件套,vue, vite , Echarts 。
后端
核心知识:java, javaweb, spring ,OS 操作系统,juc, jvm, 数据结构和算法,网络协议 等。
框架:spring boot , mybatis-plus , sa-token。
中间件:mysql ,redis,rabbitMQ ,tomcat , Elasticserch
中间件组件:数据库连接池
后端开发库: hutool, lombok , logback , grava , apach josn。
-
性能优化工具
-
- JVM分析工具: jconsole , jstat , jmap , jcmd
- 数据库性能分析工具:explain,慢查询日志
协议:http 协议,websocket 协议, TCP 协议,UPD 协议。
监控: prometheus ,ARMS , grafa, clariry , sentry。
部署
原生,宝塔,1panel , docker , docker compose , k8s ,nginx 等
云服务
serverless ,云服务器,对象存储,云数据库,edgeone pages , cdn 。
软件工程
为了保持代码的整洁、可扩展、可重复使用,和工程化开发,需要软件工程的知识
- 项目管理:
maven管理项目,git 版本管理。
- 一套开发流程:
需求分析,数据建模,方案调研,方案设计(架构、模块、详细),技术调研,编码实施,单元测试,性能优化,监控告警, 部署上线,持续迭代
- 面向对象开发规范:
原则(SOLID)单一职责,扩展开放修改关闭,依赖倒置,接口隔离等 。 还有设计模式等等
- 架构设计原则:
三层架构,主从架构,分布式,微服务。为了达到高内聚、低耦合,可维护,提升扩展性、稳定性、可用性。
- 编码风格:
阿里巴巴java开发手册,《重构》
文章分类
另外还需要经常编写文档,可分类:
博客:技术科普文档,bug解决文档,个人技术笔记。
开发文档:需求文档,技术方案,调研文档,readme 。
产品/功能知识体系
上面的技术是为了开发出产品或者功能,产品和功能有很多,也进行分类:
web产品,BI产品,移动端产品,小程序产品,SaaS产品,基础系统类产品,工具产品
基础功能
- 登录/注册/注销
- 验证码
- 权限管理
- 用户个人资料
- 日志管理
- 文件上传/下载
- 通知/消息推送
业务功能
- 数据的增删改查
- 审批
- 导入导出(excel)
安全与认证
- 单点登录
- Token /JWT 校验
- 接口签名
- 接口防刷
系统基础类功能
- 数据存储 :Mysql , postgre , H2 , MongeDB
- 对象存储:MinIO , COS , OSS
- 缓存功能:redis
- 消息队列:RabbiteMQ
- Elasticsearch :全文检索,结构化搜索,聚合分析。
学习维度知识体系
上面是按技术维度划分的知识体系,我还会建立另一种学习深度的维度,用来判断对知识掌握的深度,我不会细致的分类,只会对需要耗时的技术思考一下,得出我应该为这个技术花多少时间学习是值得的。
重要性排名主要依据自身业务需求和目标,决定某项技术是“只需会用即可”,还是“必须理解原理”,或者“需要掌握设计思想”。
- 使用层面
使用层面是对知识的入门级掌握,不需要深入到原理,会用即可,大部分知识点工具都是这个层面。比如:工具库,监控工具,部署工具,我的前端。。 这些对我来说目前会用就行。
- 原理层面
有些技术不能满足于使用,要深入到技术内部结构和工作原理,才能满足开发需求,否则自己开发的软件真的用的安心吗?比如仅仅会使用 mysql,对于mysql B+树结构一概不知,是很难开发出高效查询的数据。
类似的技术:spring 原理,消息队列,juc, 网络协议,操作系统,jvm等。
- 设计思想层面
设计思想指的是一类抽象的软件设计方法论和架构理念,强调如何组织系统、分配职责、管理模块之间的依赖关系。 在我看来,设计思想是设计复杂系统时,作为参考使用,普通开发者设计复杂方案时,也会看到设计思想的影子,这是一套指导思想,并非具体实现,开发时会更注重符合设计思想的编码,比如高内聚、低耦合。
比如:控制反转(Spring IOC , 回调函数),AOP 设计思想 , MVC 架构思想。
小结
最好是画一个思维导图,但是我懒的切换到画图平台,能让我使用最频繁,经常迭代更新的,还是文档。
本篇文章是对高效学习方法的理解——知识关联性,知识体系是知识关联性的体现,如果有别的方式替代知识体现也是完全可以的,另外知识体系不是关键,不用追求归纳百分百准确,或者恨不得把自己脑海中的全部知识写出来,这不太可能。