也谈如何高效阅读源码

高效阅读嵌入式源码系列二:understand阅读linux、uboot等源码 当使用understand分析linux、uboot这类大型工程时,会因为无关源文件太多导致静态分析时卡死。故,如何精准地导入linux、uboot源码到understand,是值得探索的。如何精准地获取源码文件,主要使用tonyho大神的Generate_Kernel_Uboot_Project_forIDE工具,生成linux/uboot等源码所必须的源文件,导入到understand软件中便于精准分析。......... 阅读详情

源码阅读,自然是计算机学习的捷径之一,其重要性在此就不再赘述。

因项目需要,最近在读OpenSSH & OpenSSL 的源码库,一开始进展奇慢,龟速,后来掌握了一些技巧后,快了一些。在此,将我总结的所谓的“技巧”贴上来,我先扔出一块砖,大家拿玉的砸过来!!

读一份好的源码就像挖宝藏。

 

 

1.工欲善其事,必先利其器——铁锹?

源码阅工具推荐:
桌面软件或web开发推荐 ms vs 或eclipse+plugins,即相应的IDE即可;
linux项目相关推荐使用source insight(wine/samba)。
可以根据个人习惯确定。

2.选择好的项目——什么才算宝藏?

好的项目:质量过关的项目;
个人认为,质量过关的代码应该至少具备:
1)软件架构、模块接口设计良好,高内聚、低耦合;
2)代码书写规范、流程清晰;
3)注释、文档、及相关网络资料齐全;
具体到某个项目的优劣可以参考主流论坛对之的评价。
除此之外,好的项目,也必须是适合自己的项目。
根据自己的水平,兴趣,专业方向等做出选择,更多情况是因为一些限制条件,比如:工作或学习需要。
这样做的目的是,让我们能够有目标的去读,一则因为实际需要,易于端正态度、不会轻言放弃;二则于情景中阅读源码,更容易理解,事半功倍。
举例说明:
要学习 asp.net的架构设计、设计模式的相关内容,并且毕业设计想实现一个电子商务网站的,可以阅读一下 petshop;
如果要学习http协议的具体实现,可以阅读一些web server的源码,micro_httpd、shttpd、boa、apache……
如果学习龙芯或MIPs CPU架构,熟悉mips汇编,建议阅读mips模拟器源码,pcspim 、vmips、msim ……
……

3. 关注Doc——关于宝藏


很多开源项目中的readme、Q&A、buglist、manual等都会提供大量的信息,了解这些文档,显然会对整个项目的把握很大的帮助,然而这部分也是最容易被我们忽略的。
我们也可以通过 wiki & google扩展这些资料。

4.搭建环境——出发前的准备


一个可运行的环境对于代码阅读会有很大的帮助:
1)便于我们从功能面上了解项目;
2)通过调试、跟踪等手段,理解源码运行的流程。

5.分析项目架构——画地图


通过以上几步已经大体把握了项目的架构,我们再结合源码,即可分析出项目的架构,常用手段如下:
1)借助项目目录;
2)分析项目管理工具Makefile,分析模块的依赖关系;
3)浏览源码,这里不必具体到每个函数,遇到关键函数可以阅读注释即可;
4)阅读文档、借助google等
做到这里,我们已经对项目的架构应该有了七八分的了解,有些问题即使想不透彻也没关系,留到下面,咱们秋后算账。
在继续下一步之前,我们应该动手将项目的架构图画出来,和概要设计时的系统模块图类似,不清楚的地方空出来,可以借助visio、Rose、smartDraw等工具。
注:这一步是必须的,因为这是我们寻宝的地图,它可以使我们不至于迷失在茫茫的源码海洋之中。

6.深入源码——给我搜

根据上一步的地图,我们开始深入到各个模块,逐个歼灭,顺序大体如下:
1)自底向上的原则
这和我们在软件设计阶段自顶向下,逐步求精的思想相反;对模块内部的分析,我们需要从底部实现着手,结合地图,逐步cover此模块,蚕食之。这也是我们画地图的主要原因。

2)公共模块优先
公共模块基本上是一些通用性比较强的代码,可复用性比较高,例如一些工具性代码;
这些代码的模块接口通常比较清晰,这些代码基本上可以算是金子啦,这里的很多代码、甚至整个模块我们都可以直接用到其他项目中去。我们要将这些代码存入自己的代码库,这样还不行,我们还要加上这些代码的使用说明和可运行的实例代码。

3)虚拟数据,模拟接口,让每个模块都可以独立运行。
模拟这个概念比较重要,有点孤立敌军的意味。用虚拟数据包围当前模块、切断与其他模块的关系,将模块独立开来,歼灭之。
这一步需要的技巧比较多,难度通常和所选的项目有关,这也是前文中我们强调低耦合的原因。关于这些我们可以参考单元测试中的Mock原理,在书写大量伪装数据的同时,我们对模块间接口交互、数据流等有了更深层的了解。
这一步我们可以站在软件设计者的角度来思考,此时应该可以写出此模块的详细设计文档。

7.总结


一个源码项目阅读完了,我们再要回顾整个过程,把开始地图中留下的空填上。
我们不能满足于抽取了一些代码,对这个项目甚至类似的项目有了一些了解,这些仅仅是鱼;更重要的是要学会打渔的方法,正所谓:千金在手,不如一技傍身。
早期共产党为啥能够在如此艰苦的环境下存活甚至发展壮大,个人认为,主要是源于不断地思考和不断地总结!我们要时常猜测设计者的设计意图:
为什么这样做?为什么不那样做?
如果是我来设计,我应该怎么实现?应该避免什么,注意什么?
这样做真的最好吗?有没有其他更好的实现方法?

把这个将这些思路整理出来,可以称之为源码阅读心得。


就这样我们阅读一个项目基本上三遍就差不多了:
1)浏览,得出模块设计概要图;
2)细品,得出模块的详细设计,丰富了个人代码库;
3)回顾,得到此项目设计的精髓;

最后不要忘记在相关主流社区共享这些资料,留下联系方式,如有纰漏,会有人给你指出的,人人为我,我为人人。

 

 

欢迎转载,烦请注明来自see-see

高效阅读嵌入式源码系列三:understand阅读经keil MDK编译的源码 在嵌入式源码阅读中,除linux、uboot外还有很多工程,像工程比较复杂的有rt-thread源码,又该如何精准的找到工程中所必须的源文件与头文件了。 这里需要用到 鱼鹰Qsprey 大神写的脚本工具了,可以精准的收集所有Keil MDK源代码文件。......... 阅读详情

相关推荐

STL源码阅读高效指南

STL(Standard Template Library)作为C++标准库的核心组成部分,体现了最优秀的泛型编程思想和软件设计模式,深入理解其源码不仅能提升编程能力,还能显著增强对系统设计的认知。通过系统性地遵循本指南,你将能够高效地阅读和理解STL源码,不仅能够深入理解C++标准库的实现原理,还能显著提升自己的编程能力和软件设计水平。记住,阅读源码的最终目的是为了借鉴优秀的设计思想,从而编写出更高质量、更可维护的代码。STL的源码非常庞大,但有几个核心组件需要特别关注,理解它们是理解整个STL的关键。

2202_75382767的博客 1202

程序员如何高效读代码?

内容涉及如何像高效的软件工程师一样思考代码,如何编写读起来像一个结构良好的句子的函数,如何确保代码可靠且无错误,如何进行有效的。本书的指导原则很简单:缩减和简化,将精力投入到重要的工作上,省下大量的时间,卸下代码维护的重担。,如何识别可能导致问题的代码并对其进行改进,如何编写可重用并适应新需求的代码,如何提高读者的中长期生产力,同时还介绍了如何节省开发人员及团队的宝贵时间,等等。书中介绍的规则均来自作者多年的实践经验,涵盖从命名到重构的多个编程方面,虽为一“家”之言,然诚有可资借鉴的价值。

人邮异步社区 2348

如何进行高效的SpringBoot源码阅读

摘要 日常开发中,需要用到各种各样的框架来实现API、系统的构建。作为程序员,除了会使用框架还必须要了解框架工作的原理。这样可以便于我们排查问题,和自定义的扩展。那么如何去学习框架呢。通常我们通过阅读文档、查看源码,然后又很快忘记。始终不能融汇贯通。本文主要基于Spring Cache扩展为例,介绍如何进行高效的源码阅读。 SpringCache的介绍 为什么以Spring Cache为例呢,原因...

Q_2625289483的博客 839

如何快速看懂复杂代码

快速阅读代码

嵌入式与人工智能 5567

高效静音黑科技 —— 单相直流无刷电机驱动器

然而,传统的BLDC电机驱动通常依赖于三相架构,电路复杂,成本高昂,且在低功率应用中显得有些“大材小用”。单相直流无刷电机驱动器作为一项高效、静音、经济的技术,正逐渐改变着各个领域的电机驱动方式。其精巧的控制策略、显著的优势以及广阔的应用前景,都预示着这项技术将在未来扮演越来越重要的角色。它相较于传统的三相驱动,显著简化了电路结构,降低了成本,尤其适用于低功率、对静音要求极高的应用场景。通过这些模块的协同工作,单相直流无刷电机驱动器能够实现对电机速度、扭矩的精确控制,并最大程度地降低噪声和振动。

wen8789的博客 1764

大学生智能车竞赛初次尝试经验分享--1(硬件绘制电路,pcb部分)

本人机械电子专业大二暑假参加全国大学生智能车竞赛,之前参加过一些其他类型的比赛有一点基础,由于之前疫情影响所以做智能车比赛断代了,没有学长带也没有思路,从一开始的一头雾水逐渐摸索出我感觉比较实用的经验。 一.首先是硬件的准备工作: 1.硬件部分与要自己设计需要的电路制成pcb。推荐使用Altium Designer20,AD比较常用所以有多实用的教学视频,另外需要自己了解布线规则,包括信号线,电源线常用的宽度 一些电源电路,驱动电路建议用multisim仿真,没有问题再进行制版 单片机有关的需要仿真

weixin_52679034的博客 9834

如何阅读别人的源代码

网上搜到的一篇介绍阅读别人源代码的方法,放在这里,有空可以查看。         阅读别人的代码作为开发人员是一件经常要做的事情。一个是学习新的编程语言的时候通过阅读别人的代码是一个最好的学习方法,另外是积累编程经验。如果你有机会阅读一些操作系统的代码会帮助你理解一些基本的原理。还有就是在你作为一个质量保证人员或一个小领导的时候如果你要做白盒测试的时候没有阅读代码的能力是不能完成相应的任务。最后

天道酬勤 3万+

10位PWM能否满足电梯±5mm平层精度?4位扩展法让10位PWM达到14位精度

电梯平层精度直接关系乘坐舒适性与安全性,而PWM分辨率是决定精度的关键因素之一。10位PWM能否满足±5mm的平层精度要求?本文从分辨率与物理量的对应关系出发,结合工程精度需求与实战对比,给出明确的选型结论与解决方案,请参考优快云博客《4位扩展法:基于ATtiny816的高精度PWM软件扩展方法》和《低成本高精度PWM:4位扩展法原理、实现和工程实践》。10位PWM的分辨率为 $2^{10} = 1024$ 级。

m0_73354873的博客 244

代码 阅读器:SI (Source Insight)、vscode(Visual Studio Code)、code-server、Visual Studio、OpenGrok

代码 阅读器:IDE、SI (Source Insight)、OpenGrok

freeking101的博客 7549

《玩儿起来吧》MATLAB 实时图像处理系列(一二三四)

大家学了图像处理之后,是不是就想学以致用。而要用于生活中,最好的方式就是和摄像头搭配,实现实时图像处理。今天就给大家分享MATLAB实时图像处理的基础方法,希望能帮你快速入门。

HPC_ZY 1万+

【Segment Anything Model】十(1):利用SAM做分类任务,方法二,不放过SAM强大特征提取能力,将SAM提取到的ImageEmbedding插入到其他cnn网络中

直接黏贴复制就好'''该类定义了VGG-16的基本结构。features: 代表VGG网络的主体部分,即所有的卷积层和池化层。avgpool: 是自适应平均池化层,将特征图大小调整为7x7。classifier: 是VGG网络的分类部分,由全连接层组成。_initialize_weights(): 初始化权重的方法。

cvxiayixiao的博客 3561

如何快速,有效的阅读其他人的代码

博客地址 How to quickly and effectively read other people’s code 如何快速,有效的阅读其他人的代码 by Alex Coleman | Learning, Web Development Just the other day, a fellow STCer (Self-Taught Coder) asked me the following question: “How do you go about understanding someone

TROUBLE I AM IN 891

从零到一,打造你的无人机侦察兵!树莓派+Python+MQTT,实时目标检测全攻略

物联网、人工智能与计算机视觉三大前沿技术的深度融合。

u013558123的博客 1473

如何高效学习和阅读源码?

一、背景 作为Java开发工程师,想进阶,阅读别人项目的源码,尤其是开源的优秀核心技术栈的源码必不可少的步骤。 那么有什么高效的阅读源码的方法呢? 常见的比如买一些 《xxx源码解析》图书,但是存在一个问题,刚开始看的时候非常吃力,跟不上,显得很枯燥,而且很可能看完可能还是毫无头绪。 又不如直接拉源码下来,又不知道如何入手。 今天和好友探讨过这个问题,把我们认为比较好的阅读和学习源码的技......

悟鸣的技术博客 2万+

汇川Easy系列斜坡函数功能块(支持状态输出)

IN rSetValue REAL 0.000000 0.000000 不保持 目标值 1IN rMaxValue REAL 0.000000 0.000000 不保持 最大目标值 2IN rMinValue REAL 0.000000 0.000000 不保持 最小目标值 3IN rSmoothTime REAL 100.000000 100.0000 不保持 最小到最大值平滑时间 单位 秒 4IN diTs DINT 10 10 不保持 函数调用周期采样时间中断时间 5。

RXXW_Dor的博客 457

费雪的未来增长评估:预测颠覆性技术的影响

本文旨在提供一个系统性的框架,用于评估和预测颠覆性技术的增长轨迹。我们将重点关注费雪增长模型(Fisher-Pry Model)这一经典技术扩散理论,探讨其在现代技术预测中的应用价值。文章首先介绍费雪增长模型的基本概念,然后深入其数学原理和算法实现。随后展示实际应用案例,讨论工具资源,最后探讨未来发展趋势。每个部分都包含详细的技术实现和理论分析。费雪增长模型(Fisher-Pry Model):一种描述技术替代过程的S型增长模型,用于预测新技术取代旧技术的速率。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 928

如何高效阅读源码

阅读源码是一项非常重要的技能,可以帮助我们更好地理解代码的工作原理和实现细节,在遇到问题时,阅读源码也是一个非常有效的解决方式。

做兴趣使然的Hero 1398

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何高效的阅读开源项目源码?

技术提升最快、最有效的方法是阅读开源项目源码,本篇就来教你通透的源码学习方法

分享 Go、云原生、AI Infra 相关技术 1325

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

如何在 GitHub 上高效阅读源码?

原文链接: 如何在 GitHub 上高效阅读源码? 之前听说过一个故事,一个领导为了提高团队战斗力,把团队成员集中起来,搞封闭开发,重点还是在没有网的条件下。 结果就是一个月过去了,产出基本为零。 我发现,如果没有网,程序员基本上是写不出代码了。现在做什么功能之前,先到网上搜搜看,然后直接复制粘贴搞定。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yF8yyo4S-1639974598377)(https://cdn.jsdelivr.net/gh/yongxinz/pic

AlwaysBeta 的专栏 3340

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

如何更高效地阅读JDK源码

简介 阅读源码的几个问题: 为什么要看JDK源码 JDK源码的阅读顺序 JDK源码的阅读方法 为什么要看JDK源码 一,JDK源码是其它所有源码的基础,看懂了JDK源码再看其它的源码会达到事半功倍的效果。 二,JDK源码中包含大量的数据结构知识,是学习数据结构很好的资料,比如,链表、队列、散列表、红黑树、跳表、桶、堆、双端队列等。 三、JDK源码中包含大量的设...

每天叫醒自己的不是闹铃 是娟 是梦 是理想。 1370

借助AI助手如何高效阅读源码

总的来说,深入理解LlamaIndex中关于workflow的工作原理让我们更清楚地看到了这个框架的高效和灵活性。通过对EventStepWorkflow等核心类的分析,我们可以发现,LlamaIndex的设计思想与传统框架相比,确实更加简洁和模块化,尤其是在任务的处理和事件的传播方面,它将复杂的操作抽象化,使得开发者能够专注于业务逻辑的实现,而无需过多关注底层细节。通过结合AI助手的支持,我们能够更高效地获取关键信息,快速理解和调试代码,提升了开发效率。

努力的小雨,一个阳光向上的博客不仅仅给你知识更希望带给你快乐 1133

阅读源码和查看官方文档,是解决问题最高效的办法。

作为一个工作8年的老程序员告诉你:阅读源码和查看官方文档,是解决问题最高效的办法。不信你来看,这个困扰了读者半天的问题我查了源码和文档后瞬间解决。

王中阳讲编程 7428

大神如何阅读源码

以下是我搜集的各种方法,我将一一尝试,会根据尝试结果,做个总结,与大家一起分享: 1、腾讯IMWEB负责人说: 首先,搞清楚自己要读懂他们的原因和动机。 其次,可以先看下这些优秀框架或者库的设计文档和架构图,这样会让你宏观上对一些概念有些认识。  然后,从你最感兴趣的一个点,开始设置断点,跟进去看发生了哪些事情。 和架构设计哪一块是match的。 有人补充:最快,最易懂方法。

laokdidiao的专栏 1万+
上一篇: 日食照片【苏州】
下一篇: 关于 warning: implicit declaration of function ‘****’
0x16
博客等级 码龄20年 79粉丝 50原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值