作者:xybaby

www.cnblogs.com/xybaby/p/10794700.html

由于项目的需求,最近花了较多的时间来看开源项目的代码,在本文中,简单总结一下对为什么要看源码、如何看源码这两个问题的思考。

看源码的意义

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

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

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

一、解决问题(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这种动态类型代码,不跑起来很难知道到底在干啥。

加注释,做笔记

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

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

推荐去我的博客:

觉得不错,别忘了点赞+转发哦!

JAVA要不要看源码_为什么要看源码、如何看源码,高手进阶必看相关推荐

  1. 为什么要看源码、如何看源码,高手进阶必看

    由于项目的需求,最近花了较多的时间来看开源项目的代码,在本文中,简单总结一下对为什么要看源码.如何看源码这两个问题的思考. 看源码的意义 看源码只是一种方法.手段,而不是目的.我也曾经给自己制定过&q ...

  2. 自学python买什么教材-从入门到进阶必看,51本Python精品书籍免费送!

    原标题:从入门到进阶必看,51本Python精品书籍免费送! 源 /网络 Python是一种多功能语言.它经常用作Web应用程序的脚本语言,嵌入到软件产品中,以及人工智能和系统任务管理.它既简单又强大 ...

  3. 干货丨如何准确找到剪辑点?后期剪辑进阶必看

    干货丨如何准确找到剪辑点?后期剪辑进阶必看 初级剪辑师在剪辑时可能会聚焦在已有影视素材的整理,但优秀的剪辑师关注的点应该更加巧妙细致,要真正做好剪辑,知道"什么时候该剪"很重要. ...

  4. android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...

    适使用范围:  安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境:  Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...

  5. 合成分红游戏源码_旅行世界遛狗养狗恐龙源码,分红龙源码、红包龙、合成龙...

    我们团队已经对系统进行深度开发和优化,修复漏洞和负载能力. 超级经典系统,可以二次开发 本产品有演示,联系店主. 伴随着智能手机的普及,越来越多的互联网企业.电商平台将APP作为销售的主战场之一.越多 ...

  6. java绘图机器猫_用绘图语句画机器猫(初学 C 语言的同学必看)

    学编程最需要注意的就是多动手,多练习.不管你学了多少,学一点,就要练习一点.哪怕没有学习循环和判断,都可以写出一些不错的程序来. 所以,我写了这个范例程序给大家参考.希望可以抛砖引玉,给初学 C 语言 ...

  7. 阿里资深技术专家:在各阶段中,3年经验的程序员应具备哪些技术能力(进阶必看)...

    3年工作经验的Java程序员应该具备哪些技术能力,这可能是Java程序员们比较关心的内容.我这里要说明一下,以下列举的内容不是都要会的东西,但是你掌握得越多,最终能得到的评价.拿到的薪水势必也越高. ...

  8. Android开发者熬夜也要看完的25本中、高级工程师进阶必看书籍

    一本全程视频陪伴,贴心跟踪初学者学习效果的Kotlin开发书 赠送近70小时视频课程,包括Kotlin和Android开发,供读者学习使用 通过Kotlin开发题库提供大量的测试题以及过关系统,读者可 ...

  9. python 编程该看那些书籍_python编程入门书籍-零基础学习Python编程,这8本书必看!...

    作为一名程序员,你肯定知道Python语言,从2017年开始Python的热度就一路飙升,已经成为大量开发者推荐入门的编程语言和第二编程语言,而且Python还是人工智能的主要编程语言,受到大众的追捧 ...

最新文章

  1. git报错:remote: warning: Large files detected.
  2. linux去掉java路径_Java显示目录文件列表和删除目录
  3. 数据库以及表的基本操作
  4. leetcode1091. 二进制矩阵中的最短路径(bfs)
  5. 敏捷开发系列学习总结(15)——Spotify敏捷模式详解三部曲第三篇:工程文化
  6. 阿里内部平台VS火山引擎后端开发,拿头比?
  7. Android开发文摘集合1
  8. JDK8 官方下载地址
  9. Windows装机必备软件大全,全部支持Vista系统
  10. linux mint 安装ssh
  11. 《Axure RP 8 实战手册》pdf
  12. 单细胞转录组测序数据的可变剪接(alternative splicing)分析方法总结
  13. 【游记】CQOI2021
  14. 不到两小时教会你用JAVA制作超级玛丽小游戏
  15. 大数据文字游戏_什么是大数据?
  16. 盒子移动的问题,拖拽问题
  17. 机器学习sklearn之预估器(estimator)使用
  18. java开发工程师报名费多少_java开发工程师薪水有多少
  19. 计算机设置桌面三点,再见“电脑弹窗”:3个小设置,让电脑桌面干净如新机...
  20. Spring个人学习笔记

热门文章

  1. 北大AI公开课13讲全链接+最强干货盘点:视频+笔记+文字实录
  2. 解决FileReader读取文本文件中字乱码问题
  3. 全自动苹果CMS火车头采集器,苹果CMS火车头发布插件
  4. 高性能服务器设计[转自腾讯km,由qzhang同学翻译]
  5. 台服天堂2更新服务器无响应,天堂2台服被限制怎么回事?该怎么解决?
  6. No current assignment for partition 解决
  7. 7.1 Python中文件的读取和写入
  8. 冒险岛2无限服务器断开,冒险岛2无限龙无限命版
  9. 开源数库最佳实践-「3306π」社区北京站
  10. kubernetes中显示所有命名空间中的deployment、Pod以及所有的Pod对应的命名空间