搜索
首页web前端前端问答初学者阅读源码的方法

初学者阅读源码的方法

Sep 17, 2020 pm 05:38 PM
源码

初学者阅读源码的方法

相关学习推荐:javascript

我喜欢编程,它也是我的工作,而且我很高兴能够将大部分的时间都花在开发软件上。像许多程序员一样,我既着迷但又困惑的是,我写的代码到底怎么样,以及如何写得更好。

多年来,我已经阅读了许多有关软件开发的文章和书籍。其中不乏有许多墨宝(书上的或者网上的)告诉你如何提高编程,并成为一个像忍者一样的受过专业训练的编程高手!这些建议大多有一些共性,其中之一就是阅读源码。然而相比于其它建议,阅读源码通常也就是简单的一句话来概括:找一些很棒的开源软件,或是任何你喜欢的软件,打开它们(或打印出来)然后阅读它们。虽然总的来说,这确实是个很好的建议,但纸上得来终觉浅,实际去实践的时候才发现问题多多。在这篇文章中,我会尝试给出一些阅读源码的实用建议,但在这之前,首先让我们列举一下都有哪些问题。

对阅读源码的误解

别人一说阅读源码,给你的一般印象似乎他们就像编程大师一样,可以单纯地坐在椅子上,然后像看小说一样读着手上的代码。好吧,我敢肯定,确实有一些精湛的程序员,他们可以很享受地一边喝着咖啡、一边看着一堆类似英语句子的神秘符号,并且还能够在脑海里构建整个类的层次和体系结构。显然这篇文章并不是给他们看的,它的受众是像我一样的,觉得盯着一堆源码看就好比看一些无聊没有意义的练习题的人。当然,有人会争辩说,可以从一个完整项目里一点一点地看单个类或者单个函数来学习,但在我看来,除非是最简单的问题,大多数软件内部都是相互依赖的。在不了解系统其余部分的情况下,通常不可能理解一个特定函数或者类背后的设计思想和原理。

下一个问题是从哪里获得可以读的源码(当然,在此之前,你得能够鉴别哪些源码值得一读)。优秀的软件很多,既有开源软件可以免费获得,也有闭源软件需要授权。开源仓库有譬如 Sourceforge 和 GitHub 。如果你在软件开发公司工作,那么可以访问源代码库中的专有代码。第三种常见途径是软件开发书籍附带的程序,或者作为教育资源而提供的程序( Minix 是典型的例子)。确实,众多的选项使我们难以抉择,因此从茫茫代码世界中找出适合我们阅读的是一项艰巨而必不可少的任务。

另一个问题是程序所用的编程语言,读他人的代码已经足够困难了,如果同时还需要去熟悉一门夹杂着奇葩语法的新语言,它所带来的负担,在我看来简直就是个会带来极大挫败感的灾难。所以你需要找到用你熟悉的语言所编写的代码。但如果你要看的代码是来自书本上或作为教育资源所提供的,那懂不懂这门新语言并无关紧要,因为有导师可以解释上下文。倘若你明知山有虎偏向虎山行,在没有书或者导师指引下,去阅读一门并不熟悉的编程语言,那我建议你至少需要学习,并达到可以写出自己的程序的程度(Hello World 就不算了哈)。

前文有关上下文的问题使我想到了下一个问题,如果你不熟悉软件本身,弄清楚代码在做什么就困难得多。例如,如果你不是每天都在使用 Linux 并知晓 Linux 启动顺序,那么就很难在看一边 Linux 代码后弄清楚运行级别是什么。使用某个软件获得的经验、知识能够帮助我们更好地阅读它的源码,这包括常用的术语、软件的功能和特性,甚至包括你遇到的各种错误本身。

理解源码

对我而言,我意识到 “阅读源码” 并不能准确描述我所从事的活动,用 “理解源码” 来表述会更合适。对我来说,坐在笔记本屏幕前(或打印成纸),只是单纯地读满屏的代码是非常困难的。我需要代码之外其它的东西,比如我喜欢翻一翻文档,玩一玩这个软件,单步运行代码甚至写测试代码去跑一跑,然后才能真正欣赏它。因为我会为此投入非常大的时间和精力,所以我必须要精挑细选,寻找我要 “阅读”(理解)的软件。

我的第一层过滤是通过编程语言进行筛选,对我来说,我只阅读由 C#、VB.NET、Python 和 Javascript 编写而成的程序的代码(尽管我也熟悉 C++、Ruby 和 F#,但我并不认为自己有水平来理解其他人的代码)。接下来是寻找我使用过的软件,这会让我有种已经上车的感觉,因为我知道代码的意图,以及它不能做的事情还有它的局限性(如果我足够熟悉的话)。每天都在使用的开源软件正是优秀的候选项(比如,我使用用 C# 编写的开源工具 Cruise Control.NET、NANT 和 NUnit)

碰巧我在一家软件产品公司(一家微软的公司)工作,所以我阅读的源码选择项之一是我们公司在源代码库中的代码。如果碰巧你也在一家软件公司工作,你可以查看其他的项目,甚至你着手项目的较早期版本。这样,除了可以获得更深层次的代码理解之外,你还可以很好地了解之前和之后都曾尝试过哪些东西。不过有一些警告需要注意:

  • 首先,如果你没有权限访问其他项目,则需要征得许可,因为一些公司对其 “知识产权” 非常看重。
  • 其次,这些软件的质量可能没有你想像的那么高,因为通常情况下,专有代码没有经过像开源代码那样严格的代码走查。需要注意的是,如果缺乏常规的代码审查,那么代码的质量可能不佳。
  • 第三(这一点是从我的朋友提供的反馈中得到启发的),如果你的公司开发的是商业软件(HR、财务、ERP 等),则需要首先理解很多业务关系。而且,由于大多数代码受业务功能因素的影响,因此通常模块化程度不如应用程序或 API 高。

寻找文档齐全的项目(这适用于开源以及专有代码)。我的意思是说,这样的文档应该突出总体设计,并说明代码背后的原理。如果只是简单地自动生成的 Java Doc 类型文档,则不能视之为我所描述的文档 :-)。其中一种寻找途径是利用为教育而创造的软件(例如 Minix)。由于它们的目的是通过软件进行教学,因此通常会有非常清晰的文档记录下来,并且有大量资料解释代码背后的设计原理。

总结

那么,现在你已经确定了要阅读源码的软件并下载了它的源代码和文档,让我们一步步阅读并理解它:

  • 浏览设计文档,并尝试了解代码的构建方式。好的软件项目遵循某些架构模式,这些决定了代码的组织。一旦掌握了这一点,理解代码就变得容易了很多。如果你还能画出类图,就能更好地了解整体布局。
  • 接下来要做的是编译并运行它。根据项目及其文档循序渐进,这可能很简单也可能很困难。
  • 现在是时候打开你喜欢的 IDE 并开始探索了。一个好的探索起点是,尝试一步步浏览你熟悉的功能的代码。这样一来,你可以遍历各个层和子系统,并了解它们之间的关联。例如,当我探索 NUnit 时,我首先编写了一个测试用例,然后查看涉及到的类。
  • 尝试确定代码中使用的设计模式。如果你还不知道什么是设计模式,那么立刻马上停止看本文,转去阅读设计模式的经典书籍。熟悉设计模式,它们是识别和理解优秀代码中所包含的设计的好方法。熟悉之后就可以更轻松地在阅读代码时将其牢记在心。它还可以帮助你更轻松地识别代码作者在原有设计模式上所做的细微调整和魔改。
  • 尝试为代码编写测试用例以完全理解它,这是理解代码不同部分之间的依赖关系的一种非常有用的方法。写测试用例之前,首先需要满足所有的依赖。接下来,了解代码的可能的入口点和返回值。这可以增进你对代码的理解,助你更上一层楼。
  • 最后,尝试重构代码。在这一步,你已经从单纯地理解代码迈向足够熟悉以能够对其进行修改。随着重构复杂程度的提高,你的理解也将随之增加。此时,如果需要,你可以为项目贡献自己的代码。

“源码阅读”在我看来,不仅仅是阅读,它是一组独特的活动,共同帮助人们理解代码。这似乎比简单的 “阅读代码” 更令人生畏,但它值得付出努力。

现在,你可以更加轻松,快乐地“阅读源码”了吗?

想了解更多编程学习,敬请关注php培训栏目!

以上是初学者阅读源码的方法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:juejin。如有侵权,请联系admin@php.cn删除
usestate()与用户ducer():为您的状态需求选择正确的挂钩usestate()与用户ducer():为您的状态需求选择正确的挂钩Apr 24, 2025 pm 05:13 PM

selectUsestate()forsimple,独立的StateVariables; useusereducer()forcomplexstateLogicorWhenStatedIppedsonPreviousState.1)usestate()isidealForsImpleUpdatesLikeTogGlikeTogGlikGlingaBglingAboolAboolAupDatingAcount.2)

使用usestate()管理状态:实用教程使用usestate()管理状态:实用教程Apr 24, 2025 pm 05:05 PM

useState优于类组件和其它状态管理方案,因为它简化了状态管理,使代码更清晰、更易读,并与React的声明性本质一致。1)useState允许在函数组件中直接声明状态变量,2)它通过钩子机制在重新渲染间记住状态,3)使用useState可以利用React的优化如备忘录化,提升性能,4)但需注意只能在组件顶层或自定义钩子中调用,避免在循环、条件或嵌套函数中使用。

何时使用usestate()以及何时考虑替代状态管理解决方案何时使用usestate()以及何时考虑替代状态管理解决方案Apr 24, 2025 pm 04:49 PM

useUsestate()forlocalComponentStateMangementighatighation; 1)usestate()isidealforsimple,localforsimple.2)useglobalstate.2)useglobalstateSolutionsLikErcontExtforsharedState.3)

React的可重复使用的组件:增强代码可维护性和效率React的可重复使用的组件:增强代码可维护性和效率Apr 24, 2025 pm 04:45 PM

ReusableComponentsInrectenHanceCodainainability and效率byallowingDevelostEsteSeTheseTheseThesAmeCompOntionComponcontRossDifferentPartsofanApplicationorprojects.1)heSredunceReDunceNundSimplifyUpdates.2)yessistensistencyInusErexperience.3)

反应中的虚拟DOM:通过有效更新来提高性能反应中的虚拟DOM:通过有效更新来提高性能Apr 24, 2025 pm 04:41 PM

TheVirtualDOMisalightweightin-memorycopyoftherealDOMusedbyReacttooptimizeUIupdates.ItboostsperformancebyminimizingdirectDOMmanipulationthroughaprocessofupdatingtheVirtualDOMfirst,thenapplyingonlynecessarychangestotheactualDOM.

HTML和React的集成:实用指南HTML和React的集成:实用指南Apr 21, 2025 am 12:16 AM

HTML与React可以通过JSX无缝整合,构建高效的用户界面。1)使用JSX嵌入HTML元素,2)利用虚拟DOM优化渲染性能,3)通过组件化管理和渲染HTML结构。这种整合方式不仅直观,还能提升应用性能。

React和HTML:渲染数据和处理事件React和HTML:渲染数据和处理事件Apr 20, 2025 am 12:21 AM

React通过state和props高效渲染数据,并通过合成事件系统处理用户事件。1)使用useState管理状态,如计数器示例。2)事件处理通过在JSX中添加函数实现,如按钮点击。3)渲染列表需使用key属性,如TodoList组件。4)表单处理需使用useState和e.preventDefault(),如Form组件。

后端连接:反应如何与服务器互动后端连接:反应如何与服务器互动Apr 20, 2025 am 12:19 AM

React通过HTTP请求与服务器交互,实现数据的获取、发送、更新和删除。1)用户操作触发事件,2)发起HTTP请求,3)处理服务器响应,4)更新组件状态并重新渲染。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能