看源码的意义

看源码只是一种方法、手段,而不是目的。我也曾经给自己制定过“阅读xxx源码”的目标,现在看起来真的很蠢,一点不smart(specific、measurable、attainable、relevant、time-bound)。

只有搞清楚了阅读代码的目标,才能有的放矢,抓住重点,高效达成任务。

这里也给大家分享一下我们的专栏《Java 进阶集中营》,每天都会给大家分享一个最新的java技术内容,有优秀的技术讯息,也欢迎分享在我的专栏里。

JAVA 进阶集中营​zhuanlan.zhihu.com

看源码的意义总结起来包含但不限于以下几点:

一、解决问题(BUG)

只要是代码,就会有bug,只是说bug的多与少、深与浅罢了。现在大家都喜欢发布、使用开源项目,不同的开源项目社区成熟度、代码质量又会有较大的差异,遇到bug就不足为奇了。

当然,遇到bug肯定是先在网上搜索是否有类似的问题,一般可以在google、Stack Overflow、项目的issues里面有对应的关键词搜索。如果搜不到,那么就只能看源码解决了

二、知其所以然

我在[如何学习新技术、团队技术选型时要注意些什么][Link 1]里面提到过,如果我们需要将一个开源项目用到自己的项目中,那么就必须了解这项项目的优缺点,并深知原理,对部分细节(尤其是项目的优势、feature)进行深入研究。

如果是成熟的开源项目,遇到问题也许能google到很多答案;但如果是一个处于快速发展中的开源项目,多了解其架构、核心原理,也能帮助快速定位问题。

另外,有的项目文档可能不那么丰富,但又不得不使用,那么如何以正确的姿势使用呢?也得参考源码

三、学习

看源码也是一种不错的学习方式(虽然不一定不是最佳的方式),尤其对于比较优秀的开源项目,能让人大开眼界。

即使是出于学习的目的,也是有很多侧重的,比如

学习语言:代码风格、规范、惯用法、高级语法。对于某个语言的新手,找一个熟悉领域的开源项目来深入掌握这门语言,也是一个不错的注意。

学习设计:数据接口、框架、整体架构

学习理论:算法、协议。比如我之前写过的[raft协议][raft],光看论文是很枯燥的,而且算法理论到工程实践还是有一定的差距,这个时候结合开源项目([mongodb][])实现往往更事半功倍。

四、改造

一般来说,我们刚开始仅仅是使用一个开源项目,但随着使用的深入,会发现一些自己需要的功能并没有很好的支持,向项目组提的issues也可能得不到快速的响应,这个时候就要自己开分支,改代码,加功能了。

当然,比较好的是将自己分支比较好的新feature 给原项目提merge request,反哺开源项目,比如阿里的[Blink][]

五、借鉴

他山之石可以攻玉,如果有需要重新开始自己造轮子,那么参考一些已有的、优秀的轮子肯定是有好处的。

六、副产品

这一点,不应该作为我们阅读源码的出发点,但是确实能在实际中对找工作、面试有加成,算是副产品吧。

应该如何看源码:

看源码的目的很大程度上影响了看源码的方式、需要阅读的代码的范围。比如说,如果是为了修一个线上bug,那么阅读代码的范围就紧紧围绕bug本身;而如果是为了了解某个分布式算法,那就需要按大量的、可能运行在不同节点(进程)上的代码,了解其交互原理、工作流程。

下面说一些通用的方法。

先看文档,整体把握

一般来说,文档是对代码的高度凝练,一个高质量的开源一般会包含tutorial、specification、API reference等documents,通过选择性的略读、精读这些文档,就能大致了解项目的整体架构、设计原则。6 大设计原则,你知道吗?

正确的路线是通过文档去认识这个项目,然乎通过阅读代码去验证文档、深入细节,而不是通过直接啃源码来了解这个项目,以偏概全。

理解代码组织,文件名,类名

当需要看代码的时候,不要找到一个文件就开始,先看看代码组织,粗略看看文件名、类名,基本就能猜测到每一部分。比如redis的源码就组织得很好,基本上看文件名就可以快速定位每一个command的实现位置。

关注一个问题,从问题追踪代码

看源码的目标决定了此时此刻的关注点,不管是解决遇到的bug还是学习某个算法,都让我们聚焦到一个具体的问题,从这个具体的问题去追踪代码,忽略掉当前无需关注的细枝末节,步步深入,直达目标。

当然在解决一个问题的时候,有可能会引发新的问题,尤其是学习的时候,此时只需记录新问题(放到收集篮,不要立即发散),待之前追踪的问题解决之后,再来看新发现的问题。

解决一个issue

如果自己没有问题,那么就帮忙解决别人的问题,通常来说,开源项目都有许多待解决的issue,从中选择一个入手即可。

调试

只要可以,一定先让代码编译通过、跑起来,这样不管是加log、打印调用栈还是断点调试都方便很多。尤其是对于像python这种动态类型代码,不跑起来很难知道到底在干啥。

加注释,做笔记

如果某份源代码的阅读并不是一锤子买卖,日后还可能回顾、重新阅读,那么就一定要做好代码注释和笔记。笔记主要是框架图、类图、流程图,目标是建立索引,方便日后快速回忆。

而注释就是阅读代码时的细节,重新阅读的时候看注释(特别是函数的注释)能节省很多时间。

如何看注解的源码_我们为什么要看源码、应该如何看源码?相关推荐

  1. dll 源码_【技术分享】 | 一个JAVA内存马的源码分析

    前言 偶然接触到了这样一个JAVA内存马,其作者也是冰蝎的作者,项目地址: https://github.com/rebeyond/memShell 正好最近在接触JAVA,借此机会学习下大佬的代码, ...

  2. python爬虫技术源码_实战|手把手教你用Python爬虫(附详细源码)

    大家好,我是J哥,专注原创,致力于用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.最近J哥做了个爬虫小项目,感觉还挺适合新手入门的,于是迫不及待想分享给大家. 什么是爬虫? ...

  3. 哔哩哔哩网站前端源码_分享一个仿制哔哩哔哩镜子网站源码

    我老婆非常喜欢看哔哩哔哩,前些天她兴奋地和我说哔哩哔哩网站有个隐藏的彩蛋,传送门http://www.ilidilid.com/,我看了下,相当于把镜子中的网站样子弄出来了. 于是,我寻思着,把自己的 ...

  4. kdj买卖指标公式源码_“点金主图+副图+KDJ排序指标”公式源码

    在技术软件中的指标,都有其背后的公式在进行支撑,特别的指标更能帮助我们进行投资!知道一些股票技术指标公式源码,是有必要的!有两种指标源码,是可以让短线朋友的投资变得更加简化,他们就是点金主图+副图+K ...

  5. springcloud断点续传源码_两套SpringCloud版的开源项目,项目源码和教程齐全

    最近很多粉丝问我有没有新的完整的项目,因为现在很多流传的项目都太老了,实战意义不是很强.很多程序员每项技术单独拿出来有可能很厉害,例如:springcloud.springboot.redis.ngi ...

  6. java web开源项目源码_超赞!推荐一个专注于Java后端源码分析的Github项目!

    大家好,最近有小伙伴们建议我把源码分析文章及源码分析项目(带注释版)放到github上,这样小伙伴们就可以把带中文注释的源码项目下载到自己本地电脑,结合源码分析文章自己本地调试,总之对于学习开源项目源 ...

  7. 生鲜配送小程序源码_生鲜配送小程序系统功能开发介绍(附带源码)

    生鲜配送系统开发找吴经理189微4800电*2702,生鲜配送软件开发,生鲜配送APP开发,生鲜配送模式开发,生鲜配送平台开发,生鲜配送小程序开发,生鲜配送源码开发,生鲜配送管理系统开发,生鲜配送管理 ...

  8. java微博源码_基于jsp的微博-JavaEE实现微博 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的微博, 该项目可用各类java课程设计大作业中, 微博的系统架构分为前后台两部分, 最终实现在线上进行微博各项功能 ...

  9. 药店java源码_基于jsp的药店-JavaEE实现药店 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的药店, 该项目可用各类java课程设计大作业中, 药店的系统架构分为前后台两部分, 最终实现在线上进行药店各项功能 ...

  10. java spring源码_剑指Java自研框架,决胜Spring源码

    无论是Spring框架源码的学习,还是框架设计,入门门槛都太高,理解起来晦涩.课程想抓住这两个痛点,在自研框架和Spring框架的穿插讲解中让大家逐渐熟悉Spring框架的脉络.通过从0搭建一个较为完 ...

最新文章

  1. python中x=x+1的读法-python中a=a+1与a+=1的区别
  2. 【Linux网络编程】网络字节序和地址转换
  3. 7-25 念数字 (15 分)
  4. 扫描仪 pfu_行业案例:扫描仪高效加持下的艺术工作室
  5. 用python的pandas打开csv文件_使用CSV模块和Pandas在Python中读取和写入CSV文件
  6. 新手如何快速入门软件测试?你还缺这几样...
  7. 360胡宁:通往CTO的道路上就是四个字
  8. 580刷590bios_AMD rx470/480/570/580/590高端技术公版/非公强刷BIOS教程教学-没差老师出品...
  9. 联发科MT6763芯片设计,MT6763参考设计,MT6763处理器资料
  10. 管家婆软件显示服务器连接失败,管家婆软件提示“连接服务器失败”怎么办
  11. 企业提供下载链接的安全解决方案
  12. 牛客网--14405--齐齐录成绩
  13. 数据分析的同比和环比以及其在excel中的应用
  14. macbook air未能与服务器,少量2018款Macbook Air存在问题:苹果已通知维修但并未告知详细情况...
  15. 中国科学研成都计算机,中国科学院成都分院
  16. JavaScript基础教程
  17. 物联网之IP Camera解决方案简介
  18. 碰壁记录(持续更新)
  19. Millumin 3 for mac(专业视频编辑软件)
  20. 股票数据的获取(tushare)

热门文章

  1. SENDMAIL引发的血案
  2. python 生孩子朋友圈_生娃报喜朋友圈文案 孩子出生发朋友圈的话
  3. 深圳瑞光康泰RBP-9000C血压仪对接
  4. ABP vnext框架 返回JSON时间带T格式转换解决方案
  5. .net core判断当前访问源是PC端还是移动端
  6. C# Lamda中类似于SQL 中的 In 功能
  7. OpenJDK8:只有x86和sparcv9才能出32位的版本
  8. 全网首发:There is an incompatible JNA native library installed on this system/6.1.2/4.0.1
  9. 手机应用只清理不够,还要卸载
  10. 围棋选手不到30岁就下坡,最大因素是什么?