三年工作经验和月薪16k的java程序员应该如何学习框架源码?

2023-11-03

640?wx_fmt=jpeg


不管对于哪个段位的程序员来说,读源码都是一件好处颇多的事情,特别于初学者而言,这能迅速的吸纳优秀框架精华代码营养,迅速成长。不巧的是,晦涩难懂的源码,很容易让人心生怯意。今天分享一下读源码的方法。


一、了解框架解决了什么问题


这不光对读源码有帮助,对整个学习都很有帮助。思考一个问题:你学习 Vue\React 的原因,除了它们如日中天,再不学习都不好意思找工作了,还掺杂了一些它们的某些优秀特性能给我带来某些好处的思考么?

 

新潮的框架,开发者需要而且也应该去了解,相比之前的技术体系,这个框架到底解决了什么问题,优势在哪,怀着目的去学习才不至于迷茫。例如 Vue\React 最大的优点是什么呢?组件化吧,带着框架是如何解决这个问题的疑问去学习,定能事半功倍。


 
 

二、了解框架的设计思想


我们看不懂源码(或者看起来举步维艰),并不是因为不懂某一句语法,而是不明白作者的思路。举一个简单的例子:

 

1 //这个方法可以获得point2顶角的弧度值2    function getAngle(point1, point2, point3) {3        var bb = (point2.y - point1.y)*(point2.y - point1.y) + (point2.x - point1.x)*(point2.x - point1.x);4        var aa = (point3.y - point1.y)*(point3.y - point1.y) + (point3.x - point1.x)*(point3.x - point1.x);5        var cc = (point3.y - point2.y)*(point3.y - point2.y) + (point3.x - point2.x)*(point3.x - point2.x);6        var cosa = (bb + cc - aa)/(2*Math.sqrt(bb)*Math.sqrt(cc));7        return Math.acos(cosa);8    }//这个方法可以获得point2顶角的弧度值
2    function getAngle(point1, point2, point3{
3        var bb = (point2.y - point1.y)*(point2.y - point1.y) + (point2.x - point1.x)*(point2.x - point1.x);
4        var aa = (point3.y - point1.y)*(point3.y - point1.y) + (point3.x - point1.x)*(point3.x - point1.x);
5        var cc = (point3.y - point2.y)*(point3.y - point2.y) + (point3.x - point2.x)*(point3.x - point2.x);
6        var cosa = (bb + cc - aa)/(2*Math.sqrt(bb)*Math.sqrt(cc));
7        return Math.acos(cosa);
8    }


(左右滑动查看完整代码)


getAngle方法接收三个坐标参数,可以计算出 point2 顶角的弧度值,如果不告诉你这使用了运用三角形的余弦定理,恐怕你看半天也看不出来这是怎么算出来的。

 

了解框架的设计思想的方法:

 

  • 到框架的官网看文档。开源的框架,甭管详不详细,这肯定是第一手权威资料


  • 到网上搜别人的分析总结(源码分析也不会少),大多数情况下,都会有大神已经研究过了,站在巨人的肩膀上,能省不少事


另外,设计思想是整个框架层面的,对于每一个实现细节,又会使用不少设计模式,例如函数式编程(Js 中最为常用)、单例模式、代理模式、工厂模式等等,这就需要平时的积累了。有一定代码量的积累之后,建议阅读一些设计模式类的书籍,对自己的代码设计,以及阅读别人的源码,都很有益处。


三、搭建调试环境,摸清执行主脉络


细分到每个模块,要对模块功能有个整体的把握,如何去做到这个“把握”?除了官方文档和网上查阅的资料,最好的办法就是写一个简单的 Demo,搭建好测试环境,增加一些调试信息,自然能理清除框架的生命周期中,每一步需要调用那个模块(对于目录结构很清晰的优秀框架,有时候也可以凭直觉猜测,打印日志确认)

 

四、分清主次


框架源码就是一颗枝繁叶茂的参天大树,而你要做的事情是从根部往上爬。树要这么多分支,时间又是这么昂贵,阅读的策略很重要。我们的阅读路径,要以主要流程为主(也就是树的主驱赶,这样才能尽可能快的到达顶点),对于一些细枝末节,再这之后再来慢慢啃(或者有必要的时候)。


例如,要去阅读 Vue 的源码,有个目录是解析模板,生成语法树 AST 从而最终生成 Render Function 的, 其实这一步最关键的是这个 Render Function 的生成结果,对于如何去解析模板、生成语法树,可以先放一放,回头需要的时候再回头看。否则你很容易卡死在某个点上出不来,从而产生放弃的念头

 

五、坚持不放弃


技术策略得当,遇到棘手过不去的问题也很正常,这时考验的就是毅力了,继续调试、搜索资料、或者找个大神来问一问都行,只要不放弃就好。

 

六、学会向他人求助


无论你的自学能力有多强,无论你是P4还是P7,总会有遇到困难的时候。普通人遇到瓶颈只能自己默默的去一次次冲击,如果冲击成功还好,是另一片天地;倘若冲击失败,轻则灰心丧气迷失一阵子,重则一蹶不振。


如果有人领路呢?看过小说的都知道,冲关的时候如果有人指导,借鉴前人的经验,可以少走很多弯路。人生不过数十载,何不把时间节省出来去多学点东西,多做点有意义的事情。


为了帮大家尽快的提升自己,更有效率的进阶,我精心准备了框架源码系列资料,希望能帮你早日突破自己!


640?wx_fmt=png

扫一扫二维码,立即进阶java架构师

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三年工作经验和月薪16k的java程序员应该如何学习框架源码? 的相关文章

  • CSS线性渐变linear-gradient

    线性渐变是多种颜色沿着一条直线即渐变线过渡 发生渐变依靠渐变线和色标 其中渐变线来控制发生渐变的方向 色标包括颜色值和位置来控制渐变的色彩变化 创建一个线性渐变 需要指定两种颜色 还可以实现不同方向 指定为一个角度 的渐变效果 如果不指定方
  • 文件上传-.user.ini的妙用

    小伙伴们大家好 本期为大家带来的是 user ini在文件上传漏洞中的妙用 目录 user ini user ini的妙用原理 利用 user ini的环境 实战演示 1 先尝试直接上传webshell 2 看是否能够上传除php和png外
  • img标签和p标签是行内元素还是块级元素?以及p标签中可以放img标签吗?

    img标签 行内块元素 类似于 inline block 可以被p标签包裹 比如p是居中 图片也中了 p标签 块级元素 默认宽度占满一行 HTML p 是段落标签 除了可以添加文字内容外 完全可以添加其他html标签也包括IMG图片标签 其
  • 十大热门编程语言的介绍

    小编给大家分享一篇关于现阶段十大热门编程语言的文章 经过流行的搜索引擎 如谷歌 必应 雅虎 维基百科 亚马逊 YouTube和百度 用于计算评级 得出十大热门编程语言排行榜的榜单 根据百度百科以及网上查阅总结分析以上十大热门编程语言的介绍
  • 安全体系建立标准

    随着我国企业信息化的普及 信息化给我国企业带来积极影响的同时 也带来了信息安全方面的消极影响 一方面信息化在企业发展的过程中 对节约企业成本和达到有效管理起到了积极的推动作用 另一方面伴随着全球信息化和网络化进程的发展 与此相关的信息安全问
  • mysql中索引的null值问题

    在mysql中 对含有null值的索引列 以及is null is not null的查询条件是否会走索引这点 网上有很多说法 为此我自己单独做了个实验 首先创建两张表 一张表所有字段默认为null 另一张表所有字段默认为not null
  • QWidget(长文)

    一 描述 1 QWidget 是用户界面的原子 它从窗口系统接收鼠标 键盘和其他事件 并在屏幕上绘制自己的表示 每个小部件都是矩形的 它们按Z顺序排序 小部件由其父部件和它前面的小部件剪裁 2 未嵌入父窗口小部件的 QWidget 称为窗口
  • springboot发布dubbo服务注册到nacos

    目录 dubbo注册服务到nacos的pom依赖 使用dubbo发布rest服务报错 解决403 unknown user错误 如何把dubbo服务注册到nacos指定的命名空间 dubbo消费端 dubbo发布rest服务 启动报错 解决
  • 集合Set和List相互转换

    import java util public class Set3 public static void main String args Random rand new Random red 6 1 33 Set
  • 谷歌带来Cloud Spanner更新:查询自省、新可用区域和多区域配置

    在最近的一篇博文中 谷歌宣布了Cloud Spanner 一个全局分布式NewSQL数据库 的一些增强功能 谷歌基于用户要求进行了更新 带来了查询自省改进 新可用区域和新的多区域配置 谷歌Cloud Spanner是一种将关系数据库结构优势
  • 软件测试学习心得-3

    静态技术 一 静态技术与测试过程 静态测试和动态测试的区别 二 评审 正式评审过程 角色与职责 评审类型 三 静态分析和工具支持 编译器分析工具 规范标准一致性 数据流分析 控制流分析 圈复杂度 一 静态技术与测试过程 静态测试不以测试数据
  • 输入一维数组字符串,在输入一个字符串,获取字符串中,相同的字符,并且把相同的字符串输出

    package com qf day6 import java util Arrays public class Test5 public static void main String args String Names zs zl zs
  • laravel 学习记录

    1 安装 apache php mysql linux下安装lnmp lamp windows下可以安装xampp 2 安装composer 3 命令行下 转到网站目录后 执行下面的命令 composer create project la
  • 升级vim到8.2以及配置vimrc

    liuzhicheng Huaqin sudo add apt repository ppa jonathonf vim Unofficial package for Vim Packaging files are based on lat
  • 关于PCB模拟地和数字地的处理

    在PCB布线时板子上可能有几个地的情况 比较差的傻瓜式做法就是直接铺铜 这种对于低速板或者对干扰不敏感的板子来讲还是没问题的 但是高速或者要求精密的板子就不可取 这时候就需要把模拟地和数字地隔离好 通常楼主的做法是把模拟的元器件和数电的元器
  • msys2中导入window环境变量

    配置环境变量 MSYS2 PATH TYPE inherit
  • 1、Ubuntu16.04编译安装llvm+clang

    Ubuntu16 04编译安装llvm clang 一 环境介绍 操作系统 Ubuntu 16 04 不是虚拟机哦 在虚拟机上做过无数次尝试 均以失败告终 LLVM Clang版本 3 6 Cmake版本 3 6 二 下载安装 1 下载源码
  • java评论功能怎么实现_评论功能的简单实现

    最近在写一个问答功能 类似于评论 几番找资料才有点感觉 主要是太菜了 为了加深印象就单独抽出来记下笔记 然后这篇写完就开始SpringBoot的复习了 1 说明 网上看到有三种类型的评论 按照笔者的理解记下了过程 可能理解错了 望大神指出
  • 哈希算法题(砝码&数量得到种数)

    现有n种砝码 重量互不相等 分别为 m1 m2 m3 mn 每种砝码对应的数量为 x1 x2 x3 xn 现在要用这些砝码去称物体的重量 放在同一侧 问能称出多少种不同的重量 注 称重重量包括 0 include
  • MySQL【DQL查询数据(最重点)】

    DQL查询数据 最重点 4 1 DQL Data Query LANGUAGE 数据查询语言 所有的查询操作都用它 Select 简单的查询 复杂的查询它都能做 数据库中最核心的语言 最重要的语句 使用频率最高的语句 4 2 指定查询字段

随机推荐

  • HTML、CSS、JavaScript:网页开发的三大利器

    JavaScript 让网页更加生动有趣 JavaScript是一种广泛应用于网页开发的编程语言 它可以让网页更加生动有趣 在本文中 我们将介绍JavaScript的基本概念和应用 帮助读者更好地了解这个强大的编程语言 JavaScript
  • 一文读懂高速互联的阻抗及反射(中)

    一文读懂高速互联的阻抗及反射 中 勘误 上篇中 电感的电抗叫做感抗 表示为 X L j C
  • 2017网易游戏测试工程师-实习招聘在线笔试题

    网易游戏测试工程师 一 A游戏又要开新服了 为了在短时间内冲排名 你得尽可能多地完成游戏任务 通过事先查攻略我们知道了所有的游戏任务 以及每个任务的时间窗口 一旦选定了做某个任务 在所选定任务的整个持续时间内只能做这个任务 且只能等到当前任
  • SpringBoot整合多数据源Redis

    SpringBoot整合Redis 其实方法跟单数据差不多的 这里给大家写一下 文章目录 SpringBoot整合Redis 多数据源整合 多数据源整合 一 完成配置文件 Spring配置 spring 资源信息 messages 国际化资
  • python atexit模块的使用

    python atexit模块的使用 模块的简介 atexit模块主要的作用就是在程序即将结束之前执行的代码 atexit模块使用register函数用于注册程序退出时的回调函数 然后在回调函数中做一些资源清理的操作 该模块其实是一个对 s
  • 寻找峰值

    LeetCode 寻找峰值 峰值元素是指其值大于左右相邻值的元素 给定一个输入数组 nums 其中 nums i nums i 1 找到峰值元素并返回其索引 数组可能包含多个峰值 在这种情况下 返回任何一个峰值所在位置即可 你可以假设 nu
  • Eclipse、AndroidStudio

    Eclipse ADT SDK AndroidStudio Android Plugin for Gradle gradle SDK
  • 【自然语言处理】最大熵马尔可夫模型

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 由于这部分的参考资料比较少 网上大部分资料重复且不完整 对于一些关键计算没有推导 所以这里我主要讨论几篇论文和讲义 但是这些论文和讲义之间也有些许差别 讨论的过程中我会加入自己的理解
  • 百度网盘下载提速,推荐3种亲测有效的方法

    凉透的下载工具 自从PanDownload事件之后 陆续出了很多第三方的度盘不限速下载神器 但是最后都凉了 这些第三方下载神器 都是个人开发者 即便有盈利也承受不起巨大的风险 甚至有款下载神器 用爱发电 流程是这样的 1 用户提交下载链接
  • 34门课改变人生——牛人自学计算机总结

    转载说明 在人人网上看到一个在美国学生物的硕士通过MOOC学习最终找到IT工程师工作的故事 非常励志 而且每门课都有很有价值的点评 经过作者本人同意转载到MOOC学院 如果各位有后续问题可以把他本人拉来答疑 转载正文 首先这只是我个人的总结
  • Java小细节

    一 result null 和 result isEmpty 有什么区别 在 Java 中 result null 和 result isEmpty 是两个不同的检查 分别用于不同的目的 result null 这个检查用于确定变量 res
  • 最大平均值子数组

    最大平均值子数组
  • 企业级springboot项目架构模板V3.0,开箱即用

    此次 3 0 更新点 1 加入文件服务 quick storage 功能支持OSS FTP存储 该服务支持以SDK的方式引入 2 修复sentinel因path路径问题导致流控失效问题 3 修复word模板生成PDF文件工具类时首次生成时
  • 电子科技大学编译原理复习笔记(五):词法分析

    目录 前言 重点一览 词法分析概述 词法分析的功能 词法分析器的输出形式 词法分析器的结构 状态转换图 状态转换图的构造 词法分析器的设计 基本结构 内容 符号表 目的 组成 在词法分析中的作用 符号表的一般形式 常用的符号表结构 总结与补
  • 现有一个01串s,找出一个最长的连续子串。

    描述 如果一个01串任意两个相邻位置的字符都是不一样的我们就叫这个01串为交错01串 例如 1 10101 0101010 都是交错01串 现有一个01串s 找出一个最长的连续子串 并且这个字串是一个交错01串 求出最长的这样的子串的长度是
  • 华为CE6865交换机远程抓包

    一 背景 由于数据中心使用了VXLAN技术 导致在三层网络中查看不到原始的MAC数据帧 另外一个局限就是所有网络设备都不在本地 所以无法使用镜像技术进行抓包 最后决定使用交换机自带的抓包工具进行远程抓包 把抓包后的文件先保存在交换机上 然后
  • angularJS 报错: [ngModel:numfmt] http://errors.angularjs.org/1.4.1/ngModel/numfmt?p0=333

    pre stringToNumber2 指令中这么写没问题 但是html中调用也这么写 html解析会自动将标签和标签属性专为小写 即stringToNumber2变成了stringtonumber2 导致最终 Error ngModel
  • PandoraBox 端口映射设置

    http www right com cn forum forum php mod viewthread tid 161104
  • 【算法图解】散列表

    一 引入 如果我们需要查找一门课的学分 如 计算机算法设计与分析 简称 算法 这门课 如果教务做得很烂 所有课程都不是按照一定的顺序排列的 那么我们需要浏览每一行直到找到这门课 这将耗费我们O n 的时间 而如果教务系统的学分排序是按照汉语
  • 三年工作经验和月薪16k的java程序员应该如何学习框架源码?

    不管对于哪个段位的程序员来说 读源码都是一件好处颇多的事情 特别于初学者而言 这能迅速的吸纳优秀框架精华代码营养 迅速成长 不巧的是 晦涩难懂的源码 很容易让人心生怯意 今天分享一下读源码的方法 一 了解框架解决了什么问题 这不光对读源码有