热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何真正读懂开源代码?

用拼图、搭积木的心态来学习源码,如果你想了解它们是怎么组装在一起的,那你就需要把它分解成每一小块,再去弄清楚每一个模块是如何实现的,整体架构是怎样的。关于源码阅读的

用拼图、搭积木的心态来学习源码,如果你想了解它们是怎么组装在一起的,那你就需要把它分解成每一小块,再去弄清楚每一个模块是如何实现的,整体架构是怎样的。

关于源码阅读的三层境界:

初级:记流水账——初期的源码阅读文章基本上是记流水账,例如对源码一行行加注释,只关注底层实现细节,但并未形成更高层次认知,对其设计理念没有提炼与深度领悟。
中级:能提问、思考、提炼——要求我们在阅读源码的时候多思考,并反问自己如果自己实现的话该如何着手,如何设计,带着疑问去研究源码。通过对比,思考,会对其背后的理念有了更深刻的理解。
高级:思考、质疑、验证——不管是什么代码,都会存在BUG或者实现并不合理的地方,如果大家在阅读源码的时候能够深入思考, 合理质疑,并能通过验证证明自己的观点,说明我们的能力、思考得到了极大的提升。

第一:阅读前的准备

为了有效地阅读源码,你可以准备好下面这些工具:

  • 编辑器:你需要一个可以熟练使用的编辑器,这能让你拥有快速搜索关键字或变量名、、查找函数的引用和定义等
  • Git工具:掌握基本的Git或其他版本控制工具的技能,这样你就能比较代码在版本间的差异
  • 相关文档:阅读官方源码文档可以帮助你快速了解项目,如设计文档、编码规范等文档

第二:从最简单的源码开始

不知道如何下手,就先从最简单的源码开始阅读。

开源项目有很多种,有数据库连接池,还有Spring框架类的,当然还有特别重型的中间件类的,比如Kafka、Redis,更有上百万行的大数据类的,比如Hadoop、Spark。

很多人还没掌握阅读源码的顺序、技巧和方法,所以看过一些源码但依旧不懂。所以大家先要明白一个前提,Kafka的作者,Hadoop的作者,他们本身就是有很多经验、技术功底很扎实的技术大牛,他们本身站在一个很高的角度去设计和开发出来了这些极为出色的分布式系统。

如果你还达不到他们的水平,你是无法直接去阅读他们写出来的代码的,因为其中蕴含的各种底层技术细节,分布式架构设计思想,还有复杂的算法和机制,这些都不是能简单理解的。

所以,建议大家可以挑一些简单的,适合自己水平的去看。

第三:先让项目跑起来

阅读项目源码的第一步,是先让项目能够通过你自己编译通过并且顺利跑起来。

有的项目很复杂,依赖的组件很多,搭建起一个调试环境并不容易,所以不见得所有项目都能顺利的跑起来。

第四:明确阅读方向

在开始阅读一个项目时候,需要明确自己的目的,是需要了解其中的一个模块实现,还是要了解这个框架的大结构,还是需要具体熟悉其中的一个算法的实现等。

代码阅读过程中,大家可以分成这两个方向来看:

  • 纵向——顺着代码的顺序阅读,了解清楚流程、算法
  • 横向——区分不同的模块进行阅读,梳理项目整体框架

建议大家两个方向进行交替阅读,以整体为首,先了解清楚脉络,暂时先不要纠结某个函数、数据结构这些,不影响整体的阅读就可以。

第五:带着问题阅读

如果阅读代码只是输入(Input),那么还需要有输出(Output)。只有你能真正输出的时候,就是你彻底掌握的时候。

比如在阅读代码的时候,大家可以带着问题去阅读,多问自己一些问题,如:

  • 1.如果我来做一个,会如何去做?
  • 2.如果能够对这个项目做减法,我可以去掉那些模块和代码?真的能够去掉吗?
  • 3.通过阅读单元测试,理解开发者的设计思路。
  • 4.尝试做一些破坏或者修改,来理解项目中的那些做法。

越是主动积极的思考,就越有助于大家的学习,输出质量和学习质量是成正比的。

第六:学习源码风格

不管是学习新技术还是代码风格,看源码都是一种不错的学习方式,尤其是优秀的开源代码,总是能有我们值得借鉴的地方。

比如,大家可以侧重学习这几方面内容:

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

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

学习理论:算法、协议。光看论文是很枯燥的,而且算法理论到工程实践还是有一定的差距,这个时候结合开源项目实现往往更事半功倍。


小结:

上面分享了几点源码阅读的方法,但其实源码阅读没有统一的标准。大家可以自己不断练习,找到适合自己的方法和工具,慢慢的就会形成一套自己源码阅读方式。


推荐阅读
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • FreeBSD环境下PHP GD库安装问题的详细解决方案
    在 FreeBSD 环境下,安装 PHP GD 库时可能会遇到一些常见的问题。本文详细介绍了从配置到编译的完整步骤,包括解决依赖关系、配置选项以及常见错误的处理方法。通过这些详细的指导,开发者可以顺利地在 FreeBSD 上完成 PHP GD 库的安装,确保其正常运行。此外,本文还提供了一些优化建议,帮助提高安装过程的效率和稳定性。 ... [详细]
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • Linux基础知识:Vi与Vim编辑器详解
    Linux基础知识:Vi与Vim编辑器详解 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
  • Vi编辑器的工作模式有哪些?如何在不同模式间切换?
    Vi编辑器是Linux系统中常用的文本编辑工具,具备三种主要工作模式:命令模式、插入模式和底行模式。用户可以通过特定的按键组合在这些模式之间进行切换,以实现不同的编辑功能。例如,在命令模式下,用户可以执行移动光标、删除文本等操作;而在插入模式下,则可以输入或修改文本内容。底行模式则用于执行保存文件、退出编辑器等命令。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • PHP与MySQL的Web应用开发技术深入解析
    PHP与MySQL的Web应用开发技术深入解析 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
author-avatar
手机用户2502933795
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有