关于看源码的心得体会

前段时间面试,经常遇到面试官在结束的时候问我看过什么开源源码?然后网上对于看源码这块的说法也有各种不同的意见,我进行了总结如下:

不看源码说法:

  • 平常的工作需求、业务忙的一批,哪有时间空下来看源码
  • 看源码只是为了面试,也就是应付那句话:面试造火箭、入职拧螺丝
  • 浪费时间,又不是做框架组件研发的大牛,没必要,把公司产品+业务完善就好了
  • 看不下去,好不容易看到了自己能了解的,结果再往里深入就出不来了
  • 吃青春饭的职业,迟早要转行,没必要一条路走到黑,有多的时间不如研究其他的行业

看源码说法:

  • 丰富自己的经验、扩宽思维,避免写烂代码
  • 项目中和框架打交道比较多,熟悉源码能快速定位问题
  • 设计更加复杂的系统的时候,能更加深入到底层去分析问题,从而减少事故
  • 本身就很爱好这个行业,对代码有很高的追求
  • 程序员到了一定的年限,要有自己的知识储备

自己的经历

笔者从事了5年的Java开发,当初从事Java那1-3年基本都是想着如何把需求实现,最简单的无非是一堆crud+各种if,在2年后会结合思考如何优化代码,比如看一些规范文档+设计模式并运用到项目上;那时候对源码还是没有概念,比如遇到报错问题直接百度解决(不可否认最笨但是是效率最快的)。随着年限的增长、经历跳槽、行业变动、新技术不断出新等等,慢慢的意识到自己的一个职业规划发展,比如瓶颈期如何突破、如何改变一直写crud、技术的广度深度如何抉择….. 在第三年的时候开始改变了原有的观念(不再做一些重复的劳动),也可能是受到周边同事的影响,一些做了比较久的开发,写的代码明显和自己的有区别,比如人家会抽象出接口、抽象类,各种分包、解耦等等;再比如应用一些组件,只需要一个注解就能搞定我们原来重复的工作,所以怀着这些因素不断去摸索,也慢慢的去了解了一些底层的原理和实现机制,在以后的开发过程中,也会更多地时间去思考和学习以及总结。

我看过的源码

我自己也尝试看过Spring、JDK集合、Dubbo、Mybatis框架的源码,但是都不是很深入那种,可能只是说某几个感兴趣的模块会去深入看看,不会细节到某方法的某个属性;之所以看源码也是因为自己平时工作中或多或少都接触到这些框架,然后也会去思考一些问题:比如我用了Spring为什么配置一个注解就能做到自动注入?Dubbo是如何做到一个注解就能把我的服务暴露到zk? Mybatis写一个Mapper接口就能执行Sql语句原理?也许会有人问,你看这些有什么作用,你的工作又用不到,这个我会在下面再去描述。

我是如何看源码

和大多数人一样,去github上下载源码到本地,打开idea导入后,大概看下有哪些包哪些模块,写一下每个模块的作用,结合网上的架构图+时序图找到自己想看的那块,再搭配文档(一般都是英文,本人英文比较差,所以都是看国人翻译的,虽然可能不是很全或者全对,但是这不是主要的,主要的是思想和流程是对的)进行debug,debug的时候肯定会遇到一些不太清楚为什么要这么做的点,这时候通过xmind记录,然后后期可以找这种源码社区去提问(如果你身边有牛逼的人也可以)

看了这些源码有哪些感想

  • 摸清了本质,不再局限于表面,举个例子,ArrayList add一个元素,但是add之后里面做了什么操作?存储到哪里了?size满了之后怎么办?有线程安全和并发问题吗?然后自己在使用这些集合的时候会更加注意细节,不再是为了new一个ArrayList而去new
  • 源码的作者一般对注释比较重视,我记得看过一个类,注释比代码还多,反而参照下我自己经历过的这段工作经历,注释基本可以说很随意。
  • 源码的作者在设计的时候考虑到很多场景,所以站在巨人的肩膀上再去思考的话会有新的体会

看完源码我自己做了什么事情

  • 参考源码作者的一些思想,自己沉淀出一些组件和工具,并根据不同的业务场景封装后提供给组内其他开发使用,解决一些重复的工作
  • 某些框架的特性不符合我们项目需求,进行了二开,能快速响应我们项目需求

推荐看什么源码

最近的一段时间,我个人比较喜欢看一些偏向业务的框架源码,而非纯技术上的源码。因为经历了这几年工作会发现国内的公司都更加偏向业务型公司,这个也正常,因为公司没有业务就不能正常发展;所以我在对业务这块的一些场景下的解决方案会有一定的学习,比如数据批量处理如何快速高效、分布式事务如何实现等等,所以我个人是推荐多看一些业务上的解决方案和相关源码

看源码误区

  • 不要为了看源码而看源码,而不做知识输出,最好能自己手动实现一个方案或者有自己的思想
  • 能运用到项目上最好,否则一切都是自娱自乐,没有实际意义,给人就是纸上谈兵,夸夸其谈
  • 大部分公司都是结果导向,不要为了看源码而耽误了项目进度,否则一切都没意义

看源码是一个非常辛苦而且费时间脑力的过程,必须要不断坚持才能有很好的效果。本人这篇博客只是代表自己的观点,并不全对,大家看完参考下就可以。

Original: https://www.cnblogs.com/zdd-java/p/15650125.html
Author: 达兔哥
Title: 关于看源码的心得体会

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576114/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 第15章 存储过程与函数

    MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即…

    数据库 2023年6月6日
    092
  • Java关键字总结(一)

    static总结: 1、修饰静态变量,通过类名.变量名,不需要实例化对象,属于静态资源,所有类实例共享 2、修饰静态方法,通过类名.方法,不需要实例化对象,属于静态资源,所有类实例…

    数据库 2023年6月6日
    0117
  • ASP.NET CORE WEB项目介绍

    首先创建一个asp.net core web应用程序 第二步 目前官方预置了7种模板项目供我们选择。从中我们可以看出,既有我们熟悉的MVC、WebAPI,又新添加了Razor Pa…

    数据库 2023年6月14日
    091
  • Linux–>磁盘分区,挂载

    对于IDE硬盘,驱动器标识符为 “hdx~”,其中”hd”表明分区所在设备类型,这里是指IDE硬盘 “x”为…

    数据库 2023年6月14日
    098
  • Golang并发编程——goroutine、channel、sync

    并发与并行 并发和并行是有区别的,并发不等于并行。 两个或多个事件在同一时间不同时间间隔发生。对应在Go中,就是指多个 goroutine 在单个CPU上的交替运行。 两个或者多个…

    数据库 2023年6月16日
    056
  • MySQL之连接查询和子查询

    多表连接的基本语法 多表连接,即将多个表拼接成一个表,然后进行查询 [En] Multi-table join, that is, several tables are splic…

    数据库 2023年5月24日
    0141
  • Vue插件

    Vue插件 插件作用 插件通常用来为 Vue 添加全局功能 例如:1、添加全局资源:指令/过滤器/过渡等。如 vue-touch2、通过全局混入来添加一些组件选项。3、添加 Vue…

    数据库 2023年6月11日
    069
  • 数据库

    建库操作 #创建数据库(默认字符集编码) create database test20210420 #创建数据库的时候指定字符集编码以及字符校验规则 create database…

    数据库 2023年5月24日
    066
  • logstash写入文件慢的问题排查记录

    终于找到根本原因了!!!!! logstash部署到k8s集群内部的,当所在节点的CPU资源被其他应用抢占时,logstash的处理速度就会降低 问题现象 logstash从kaf…

    数据库 2023年6月9日
    087
  • haproxy

    haproxy 一.haproxy简介 二.负载均衡 三.haproxy安装 1.yum安装 2.源码安装 2.1 配置文件解析 2.2时间格式 2.3 全局global 2.4 …

    数据库 2023年6月14日
    073
  • Test post from Metablog Api

    This is the body of the post posted on2011-02-06 17:25 迷你软件 阅读(328 ) 评论() 编辑 本网站绝大部分资源来源于I…

    数据库 2023年6月11日
    089
  • Docker Maven构建缓存spring boot依赖包

    背景 每次通过 docker build ‘xxx’ 的时候,总是会去maven镜像下载一大堆Jar包,平均每次build都要在3分钟左右,效率非常低下,于…

    数据库 2023年6月6日
    095
  • 使用mybatis-plus转换枚举值

    1. 使用mybatis-plus转换枚举值 枚举值转换方式有很多,有以下方式: 后端写一个通用方法,只要前端传枚举类型,后端返回相应的枚举值前端去匹配 优点:能够实时保持数据一致…

    数据库 2023年6月11日
    0150
  • Pisa-Proxy 之 SQL 解析实践

    SQL 语句解析是一个重要且复杂的技术,数据库流量相关的 SQL 审计、读写分离、分片等功能都依赖于 SQL 解析,而 Pisa-Proxy 作为 Database Mesh 理念…

    数据库 2023年6月16日
    0120
  • Question09-查询学过编号为”01″并且也学过编号为”02″的课程的同学的信息

    * — 学过01,且学过02 — 学过01 SELECT sc.SID FROM SC sc WHERE sc.CID = ’01’; — 学过02 SELECT sc.SI…

    数据库 2023年6月16日
    069
  • 设计模式之简单工厂

    一、简单工厂:为了客户类和服务类之间的解耦,把对象的创建任务交给第三方类,这个第三方类就充当工厂的作用,严格来说简单工厂不属于23种设计模式之一。 二、实现思路 :创建一个简单工厂…

    数据库 2023年6月14日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球