学习方法-读书笔记
学习方法
背景
不知道你是不是也有这样的感受:
光是上班累得要死,还要陪对象吃饭逛街看电影,或者送孩子去上培训班,根本就没什么时间学习;
等到哪天好不容易有点空余时间,又因为没有计划,只能随便找本书或者上网水水论坛看看;
就算知道要针对某个技能专门提升一 下,也不知道怎么学才能达到精通水平;
过段时间回头一看,前几周学的东西又忘得差不多了;
跟别人交流一下子就暴露了水平……
源码不是万能的,不同技术维度要用不同的学习方法。
期望用最少的时间实现最好的学习效果。
学习方法大纲
- 总原则:10000小时定律,在专业领域不断地提升能力,必须投入足够的时间;
- 找时间:海绵学习法,10000小时≈10年*365天*3小时/天,需要时间管理方法;
- 学什么:确定学习目标,三段式分解法,规划学习目标和计划,拆分为可实施的行动;
- 怎么学
- 提升技术深度:链式学习法,自顶向下深入知识点,掌握关联技术;
- 提升技术宽度:比较学习法,比较相似知识/技能,掌握单个领域技术;
- 提升技术广度:环式学习法,依据业务闭环流程,掌握多个领域技术;
- 高效学
- 学以致玩:Play学习法,通过示例掌握基本使用;
- 教学相长:Teach学习法,通过教学强化深入理解;
- 组合使用
- 三段分解法;
- 海绵学习法;
- 根据学习目的采取学习方式
- P5/P6/P7:链式学习法;
- P7/P8:比较学习法;
- P8/P9:环式学习法;
- 采取“Play & Teach学习法”增强学习效果;
加餐三|10000小时定律
10000小时定律为成为专家的必要条件,而不是充分条件。
因素:
- 环境;
- 文化;
- 时机;
关键:
- 精深练习,设定目标->挑战极限->更高目标->更高极限;
- 激情,短期可以外在控制,长期需要内在驱动,从中获取喜悦和满足;
- 伯乐,专家经验的针对性指导;
互联网技术领域落地
- 寻找伯乐
- 团队同事,方案设计->代码Review;
- 书籍/专栏/课程;
- 业界技术会议;
- 线下训练营;
- 技术迭代
- 基本原理和基础技术是稳固的,例如计算机基础、操作系统、计算机网络和数据结构;
- 新技术由老技术演化而来,例如
jQuery解决JavaScript DOM编程太复杂
,Vue等前端框架解决jQuery在大型项目中难以协同和维护
;
20小时学习法
10000小时定律适用于成为顶尖领域专家的资源投入,但大部分情况下仅想快速掌握一门技能,可以考虑20小时学习法,详见TED演讲:别不信,你只需20个小时,就能学会任何事情!。
- 分解步骤:把技能最大程度地细分,分成若干小步骤。
- 充分学习:基于分解步骤得到的小步骤,逐一练习。
- 克服困难:克服练习过程中的各种困难,包括生理、心理、情绪、工具、环境等。
- 集中练习:至少用 20 小时集中学习最重要的小步骤。
海绵学习法:找到10000小时
10000小时的含义
-
成为专家需要10年
- 10000小时≈10年*365天*3小时/天,成为某个领域的专家,需要花费10年时间
- 越早开始,越容易成为天才;
-
5000+5000!=10000
-
专注单个领域,不同领域的投入不能代替单个领域的深入;
-
领域划分取决于面对的问题和采取的思维方式,而不是工具;
-
互联网行业的领域划分,建议在三级领域级别投入,例如客户端、服务端
-
-
工作时间外也要主动提升
- 工作时间主要在重复做事,提高掌握技能的熟练度,工作1天≈有效提升2小时;
- 保证每天有1小时主动提升;
海绵学习法
“时间就像海绵里的水,只要愿挤,总还是有的”
- 早起30分钟;
- 通勤往1小时;
- 上班第1个30分钟;
- 通勤返1小时;
- 睡前30分钟;
- 周六/周日2小时;
关键在于坚持学习、养成习惯、积累规模
领域内学习会加速,参照专栏作者,一年阅读技术书籍20本+、非技术技术80本+互联网领域
三段分解法:10年成为大牛
坚持的动力
- 事业激情支撑;
- 持续正反馈激励;
三段分解法
将“10年成为大牛”的宏大目标分解为按周执行的具体事项
- 分解等级
- 中间的等级为关键的里程碑,参照阿里职级;
- 知识和技能存在迭代;
- 升级需要2~3年;
- 分解技能
- 针对职级要求,选择专项提升的技能,详见职级详解;
- 对照招聘职位要求,例如哈啰普惠-Java资深/专家研发;
- 根据工作内容,调整技术间的提升顺序;
- 掌握一门技能的周期为6个月;
- 分解行动
- 将技能提升目标分解为具体要做的事情;
- 通过网上搜索/请教他人,细化为3~5个阶段目标,为期1~2个月
- 按月计划,按周执行;
后端分解示例
岗位 | Java后端开发 |
---|---|
等级 | P5->P6,2024.01~2026.01 |
技能 | 数据库:2024.01~2024.06 Linux:2024.01~2024.06 网络编程:2024.07~2024.12 |
阶段目标 | 提升Linux 1.《UNIX环境高级编程》,1.5个月 2.《Linux系统编程》,1.5个月 3.《UNIX网络编程卷1》,2个月 4. Linux常用命令实战,包括tcpdump、ps和top,1个月 |
链式&比较&环式学习法:多维度提升技术能力
根据学习目的采取学习方式
- P5/P6/P7提升技术深度,链式学习法;
- P7/P8提升技术宽度,比较学习法;
- P8/P9提升技术广度,环式学习法;
链式学习法:提升技术深度
应对面试连环炮/晋升连环问中的技术原理,例如Netty技术->Reactor网络模型->Java Nio->Linux epoll/select
链式学习法应用步骤
-
明确技术深度划分:
- 根据个人的理解画出领域分层图;
Netty领域分层 关联知识与技能 编程框架 Netty(Java) Netty参数(ChannelOption.SO_BACKLOG、TCP_NODELAY、SO_REUSEADDR等) 编程语言 Java网络编程 Java网络编程API 操作系统 Linux网络编程 计算机网络 TCP/UDP、IP 工具&配置 Linux网络调优、Linux网络工具 网络问题定位 操作系统内核 Linux内核实现 net.ipv4.tcp_tw_reuse和tcp_keepalive_time - 根据固定套路画出细节分层图;
Netty细节分层 接口设计 EventLoopGroup、ServerBootstrap、ChannelHandler 设计原理 Reactor、IO多路复用 设计方案 Pipeline、Zero-Copy、内存池 实现源码 EventLoopGroup/ServerBootstrap/ChannelHandler等源码实现 -
明确学习层数
- 领域分层学习3~5层,
- 细节分层全学;
-
明确每层学习方式:
- 领域上层偏应用,关注细节和熟练使用;
- 领域下层偏原理,关注原理和简单应用;
- 细节上3层详细学习;
- 细节-实现源码层掌握设计原理和设计方案的关键实现;
比较学习法:提升技术宽度
应对面试连环炮/晋升连环问中的技术选型,例如Redis VS Memcached、MySQL VS Redis、Flink VS Spark VS Storm
比较学习法应用步骤
-
用链式学习法掌握一项技术,整理关键技术点表格;
Memcached技术点 说明 集群方案 数据分片,一致性哈希 并发模型 多Reactor,多线程 持久化 无持久化,掉电即失 高可用 数据分片,丢失部分数据 数据结构 KV结构,Value为String 性能 网络IO可以并行,大缓存数据读写效率高 -
基于关键技术点,学习另一项同型技术,整理差异思维导图(暂用表格表示);
缓存技术点 Memcached Redis 集群方案 数据分片,一致性哈希 主备复制、哨兵模式、Redis Cluster 并发模型 多Reactor,多线程,libevent 单Reactor,单进程,epoll 持久化 无持久化,掉电即失 AOF、RDB 高可用 数据分片,丢失部分数据 主备复制、Cluster分片 数据结构 KV结构,Value为String KV结构,Value有5种基本数据类型 性能 网络IO可以并行,大缓存数据读写效率高 网络IO可以并发,小缓存数据读写效率高 -
对于差异较大的技术点,整理背后原理及应用场景表格;
差异点 原理 应用场景 并发模型 Redis基于单进程无锁设计
Memcached多线程基于CAS锁
Redis读写大缓存数据会影响其他缓存操作大缓存数据读写:Memcached
小缓存数据读写:Redis持久化/高可用 Memcached为缓存系统
Redis为结构化的KV存储系统短时间丢失缓存影响较小:Memcached
缓存生成代价高,丢失导致严重问题:Redis数据结构 Memcached Value为String
Redis Value支持String、List、Set、Hash、Zset简单缓存方案:Memcached
复杂缓存操作:Redis
环式学习法:提升技术广度
基于闭环的多领域学习
- 最常见功能环,提升技术广度;例如用户登录的功能环
前端(Vue)->客户端(JsBridge、OkHttp)->网络层(HTTP、TCP/IP、DNS)->机房入口(机房部署、F5)->Nginx(负载均衡、反向代理)->用户中心(微服务、MySQL、Redis)->安全中心(微服务、MySQL、机器学习)->数据中心(HBase、Flink)->用户中心->机房出口->网络层->客户端->前端
- 业务环:业务的处理步骤,提升业务能力;例如用户登录的业务环
用户输入手机号->手机号检查->前端安全验证->发送验证码->用户输入验证码进行登录->验证码校验->判断手机号是否注册->安全检测->登陆成功进入主页
- 流程环:流程的处理步骤,提升管理能力;
环式学习法应用步骤
- 画出闭环,标注关键环节和关键内容;
- 由自己所在节点向外拓展;
- 相关节点细节分层仅学习接口设计、设计原理、设计方案,关键源码必须或者空闲时才看;
Play & Teach:保证学习效果
Play学习法:提升实践能力
Play 学习法通过主动模拟场景,提升对新技能的记忆和理解。
- 用链式学习法掌握一项技术;
- 列举常见场景,搭建模拟环境;
- 在模拟环境中演练常见场景;
场景 | 任务 | 作用 | 备注 |
---|---|---|---|
入门使用 | 搭建环境,包括安装、配置、运行 编写Demo |
熟悉基本的使用 | 适用所有技术 |
核心功能 | 使用核心功能 | 熟悉常见的API、工具、SDK | 适用所有技术 |
性能测试 | 测试核心功能的性能 | 了解性能表现 | 适用中间件系统(例如Nginx)、存储系统(例如MySQL)和计算系统(例如Flink) 框架类和业务代码混合,场景复杂,demo测试结果仅供参考(例如SpringBoot、Netty) |
异常测试 | 测试异常场景 | 全面了解系统边界 | 更适合独立运行的中间件系统 |
工作中的应用场景可能出乎意料,而模拟实践是工作实践的预备阶段,更好地应对突发复杂情况。
Teach学习法:提高理解程度
每个人的知识和技能是有限的,关注点不同,因此存在认识盲区,通过教别人来提高理解程度。
写作
- 指导原则:工作强相关的核心技术,投入时间写作;
- 重点:讲清楚,讲正确;
- 步骤:掌握技术整体架构,完善技术点内容;
培训
-
前置要求:掌握技术主题,归纳技术内容;
-
时间有限 + 现场压力;
-
积累现场经验;
加餐四|基础技术的理解
基础能力是指工作任务相关的基础能力,不是整个计算机技术的基础能力。
- 基础≠底层;
- 基础≠源码;
- 基础≠不变;
使用技能图谱提升基础
维度 | Java后端开发 |
---|---|
工具 | Java、InterlliJ IDEA、Postman、Maven |
生态 | Spring、MyBatis、MySQL |
容器 | Linux |
原理 | 计算机基础、计算机组成原理、数据库原理 |
提升基础技术的技巧:
- 根据工作内容来决定基础技术的学习深度;
- 通过链式学习法将基础技术和实际用到的技术系统串起来;
- 跨领域转岗要慎重,要转的话就尽早转;