看源码的意义

看源码只是一种方法、手段,而不是目的。我也曾经给自己制定过“阅读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这种动态类型代码,不跑起来很难知道到底在干啥。

加注释,做笔记

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

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

11没有源码注释_我们为什么要看源码、应该如何看源码?相关推荐

  1. mysql外码内码定义_刨根究底字符编码之六——简体汉字编码中区位码、国标码、内码、外码、字形码的区别及关系...

    简体汉字编码中区位码.国标码.内码.外码.字形码的区别及关系 GB2312.GBK.GB18030等GB类汉字编码方案的具体实现方式是怎样的?区位码是什么?国标码是什么?内码.外码.字形码又是什么意思 ...

  2. python 字节码 汇编器_基础系列1-python解释器、PVM、源代码、字节码理解

    大家都会听到这么一种说法,python是脚本语言,一门解释型语言,那么什么是解释型语言呢? 为了回答这个问题,我们从头撸起 语言又大致分为3类:机器语言.汇编语言.高级语言,简单的解释来说: 机器语言 ...

  3. java探针 字节码增强_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  4. Robotium测试没有源码的apk--需重签名apk

    Robotium是基于Instrumentation框架的,其编写的测试脚本与被测程序运行在同一个进程里面,所以这需要测试程序与被测程序拥有相同的签名,否则无法进行通讯. 在只有apk的情况下可以采用 ...

  5. Eclipse中查看没有源码的Class文件的方法

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/18798473 本文作者:sushengmiyan 我们在使用Eclipse的时候,经常 ...

  6. 为没有源码的DLL文件添加强名称

    如果项目中引用了其他没有源码的dll文件,并且此dll文件是没有强名称的程序集,则编译时会出现类似 "Assembly generation failed -- 引用的程序集 'xxxxxx ...

  7. 在没有源码的情况下修改.class文件

    写这个博文是因为我自己遇到了问题,不打算大包大揽的详细解释,没有这个能力,也没有这意愿.理由很简单,只是因为害怕遗忘... 类似的经历不知是否是常见的情况,总之说说的我的问题: 先发发牢骚,诺记这个公 ...

  8. linux0.11多任务管理程序阅读注释笔记

    [ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...

  9. python flask源码解析_用尽洪荒之力学习Flask源码

    [TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...

最新文章

  1. python中的zip()函数和map()函数
  2. CodeForces - 1408E Avoid Rainbow Cycles(思维+最大生成树)
  3. sql每个月每个人的花销占比_星座月运(2020年12月),每个人开支花费大,得精打细算...
  4. 打造史上最小尺寸.Net Core单文件应用程序
  5. 复化梯形公式matlab程序_【HPC】高性能数值计算-梯形面积法
  6. JSON与XML优缺点对比分析
  7. MySQL error(2014) Commands out of sync; you can't run this command now(情形2)
  8. arm汇编—str,mov等指令
  9. windows graphics - DXGI 介绍(DirectX Graphics Infrastructure)
  10. 亚马逊卖家培训返校季爆单技巧
  11. adb 切换默认桌面,OPPO默认桌面替换教程
  12. scoop bucket add 后仍然报错 Couldn‘t find manifest for
  13. 远程控制工具哪个好?向日葵VS ToDesk,安卓移动设备远程操控哪个更好用?
  14. 电脑硬件知识入门之内存篇
  15. Oracle中文排序 NLSSORT
  16. 【MindSpore】【数据集】数据集内数据获取失败导致迭代器退出
  17. eclipse启动慢解决方法
  18. latex数学公式(行内(间)公式标注/希腊字母/数学函数/配对括号/定理环境
  19. 国际浏览器市场分析报告
  20. [业内传闻]今天,7月25日是全世界系统网络管理员的节日

热门文章

  1. Azure 物联网开发者体验 7 月更新:边缘计算开发工具,ARM64 设备开发,VS Code 容器化开发工具...
  2. RedLock 实现分布式锁
  3. 官博翻译 | .NET Core 即 .NET 的未来
  4. CefSharp中c#和JavaScript交互读取电脑信息
  5. Stack Overflow 监控系统内部架构初探
  6. ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界
  7. ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot
  8. .NET Framework 4.7发布,支持Windows 10创作者更新
  9. ASP.NET Core 导入导出Excel xlsx 文件
  10. django07: 模板语言(旧笔记)