通过阅读源代码成为更好的开发人员

 

嗨,朋友们!在这篇文章中,我将分享一些有关自觉阅读和研究源代码的想法。我认为,阅读代码是可以帮助您成为更加熟练的软件开发人员的过程。毫无疑问,它提高了我的软件开发技能并影响了我的软件开发技能。

我应该阅读源代码吗?

是的你应该!好消息是,开发软件时,您已经日复一日地这样做了。多年来,我已经看到各种统计数据,这些数据表明,我们作为开发人员的大部分时间都花在阅读代码而不是编写代码上。

当您开始使用新功能或错误修复时,必须首先了解现有代码的工作方式。您可以从单元测试中解决这个问题,该单元测试应该清楚地描述现有代码的期望行为,但是通常您最终还会深入研究实现代码。

对于这篇文章,我认为这种形式的阅读既定。我在这里建议您使阅读代码成为一个更加自觉的过程,最重要的是阅读从未见过的代码。与将自己暴露于以前看不见的代码相比,阅读原始编写的代码或过去使用过的代码不太可能影响和告知将来的编码技能。

精通阅读和解释代码将在您解决新功能或错误时为您提供帮助。您将能够扫描相关代码,以获取更快地开始工作所需的信息。尽管我们可以训练自己更快地阅读书籍,但我们可以更快地阅读和理解软件代码。

为什么要花时间阅读源代码?

让我们思考一下幼儿如何学习读写。在卡罗琳·林斯(Caroline Linse)的著作《年轻学习者》(Young Learners)中,她指出,您必须先阅读一个单词才能写出来。这对我来说听起来很合逻辑。通过首先阅读上下文中的单词,您将开始理解它们的含义和适当的用法。

通过阅读书籍,您可以扩展词汇量并掌握以后可用于写作的技巧。这只是我们在学校成长的过程中学习文学的原因之一。最终,当我们阅读更多内容时,我们将了解哪些有效,哪些无效。

那么对于软件代码来说肯定是相同的。我是C#开发人员,但是无论选择哪种编程语言,都可以使用许多语法和关键字规则。一些简单的关键字和概念可以组合为您生成的代码带来无限可能。达成相同结果的方法有很多,就像说或写同一件事的方法有很多。尽管所有人在技术上都可以实现相同的目标,但有些人比其他人更合适,更容易理解。在代码中,某些技术可能也比其他技术更有效。

您是否遇到过同事甚至您自己编写的难以阅读的代码?我知道我有!难以阅读的代码难以维护,并且会阻碍开发过程。就像在语言中一样,构造不良的段落可能令人困惑且难以理解,代码也可能遭受同样的命运。那些棘手的代码段或代码块需要多次通读才能解析其含义和意图。通过学习阅读更多的代码,我们还可以提高写作技巧,从而避免产生难以理解的代码。

要提高自己的技能,需要付出一些努力。学习比自己更有经验的人们的工作,将来会影响您自己的代码。仅举一个例子,医生即使经过资格执业也要接受多年的培训。他们与经验丰富的医生一起工作,首先是看病,然后自己尝试手术。优秀的医生还将研究其专业人士的论文,以学习新技术和方法。

我觉得这在软件开发中我们做得不太一致。有些团队可能会比其他团队更好地进行管理。配对或暴民编程只是在开发人员之间共享技能的一种方法。我的理论是,提高自身技能的另一项至关重要的技术是,在健康的持续学习周期中,定期将自己暴露于新代码中。

一个特别相关的报价总结了我在本节中要说的内容,摘自伟大的作者斯蒂芬·金。

“我可以在这个问题上直言不讳吗?如果您没有时间阅读,则没有时间(或工具)编写。就那么简单。”

-斯蒂芬·金(Stephen King),《写作:手工艺品的回忆录》

我应该阅读什么源代码?

如果您仍然在我身边,我希望您将阅读代码的概念作为日常工作的一部分而得到销售,以帮助您不断提高软件开发人员的水平。那么,下一个逻辑问题是您应该阅读什么代码?

从广义上讲,我认为这并不重要。您正在阅读代码的绝对事实是重要的。请记住,尽管并非所有软件代码都是相同的。您阅读的某些源代码将比其他代码明显更好。很好 好的代码和坏的代码都可以帮助您完善自己的方法。

您不必为了阅读代码而同意代码。读取“错误的”代码可能具有巨大的影响力和信息量。如果您阅读了一些代码而又不喜欢该样式,或者发现了功能缺陷,那很好。这样做时,您已经确定了不喜欢的模式或方法,或者那是行不通的。这样可以节省您编写代码的时间,因为您希望避免重复相同的错误。

也就是说,您还希望阅读能为编码词汇添加新的,更可靠的技术或方法的代码。我将在下一节中讨论一些代码源。

从多个来源读取代码至关重要,因为您将有意识地(和下意识地)学习在各个来源重复的模式。当您看到许多地方使用的相同技术,模式和代码趋势时,这很可能是一种行之有效的方法。

我专注于研究一些我最常使用的C#库的内部结构。这不仅意味着我可以通过阅读一般代码来提高自己的技能,而且还可以了解这些库的内部运作方式,从而进一步了解我的用法。这是双赢。

我做得不太频繁,但是我打算尝试的事情就是读取用我很少或从未使用过的语言编写的代码。极其熟悉一种软件语言无疑是有用的,但是扩展语言范围也将带来好处。如果您考虑一下,我们中的许多人都会看到学习第二种甚至第三种口头语言的好处。这使与其他国家/地区的人们的交流变得更加容易,并且通常会进一步增加我们的知识和对我们自己母语的使用。

第二种编程语言不仅会扩展您的职业选择,而且还将使您欣赏与主要语言的异同。我们经常看到一种语言的功能会影响另一种语言。例如,C#在每个版本的F#中首先具有越来越多的功能语法。某些.NET功能(例如Channels)受到Go的影响。我们可以通过只关注第二种语言来为这些功能做准备。

在哪里可以找到好的源代码?

有许多潜在的代码来源。仅举几例……

的GITHUB

这是使用几乎每种语言编写的大量代码资源。哪里有更好的起点?影响我的C#代码的我个人最喜欢的是 Microsoft 的ASP.NET Core  和CoreFx库。我发现从框架团队深入学习高质量且经过考虑的代码是学习的好方法。

由于这些代码具有很高的标准,并且它们本身是由Microsoft使用的编码模式提供的,因此,此类框架是检查的极佳资源。通过阅读和学习团队如何构建可扩展的框架代码,我个人获得了极大的学习。就在最近,我花了一些时间思考任务并行库,并在我编写的某些代码中发现了更多有关CancellationTokenSource的用法。通过研究Microsoft使用这种类型的地方,我能够体会到他们在代码中使用的常规方法。

GitHub具有合理的搜索功能,因此,即使不下载代码,您也可以浏览存储库并直接在浏览器中学习。对于更深入的了解,我更喜欢克隆存储库,以便可以更详细地浏览代码。

我还希望通过研究我使用的库的来源(例如PollyMediatR)来扩大编码词汇量。这使我接触到其他编码样式,这进一步加深了我对如何编写代码的认识。我不一定喜欢或不同意我阅读的所有代码的结构,但是即使那样,我仍然更加自觉地认识到自己的代码首选项是什么。在编写代码时,我更加有能力躲避潜在的陷阱和糟糕的设计决策。

博客文章

互联网上充斥着许多有关软件开发的优秀博客文章。您一定会找到许多有用的技术博客,其中包括示例代码段。这些代码非常好,因为它们通常是一小段代码,在短暂的坐姿中可能更容易消化。通常,在博客文章中对代码进行注释或解释,以便您可以根据作者的意图验证对代码的分析。

图书

有很多很棒的技术书籍,既有电子书又有物理印刷格式。这两部分将包含代码,并明确说明其工作方式/原因。去年,通过阅读Konrad Kokosa的“ Pro .NET内存管理 ” ,我学到了很多有关编写高性能代码的知识。

堆栈溢出

您一定会在StackOverflow上找到一些很棒的代码示例,而并不是那么出色的代码示例。在这里,当您观察不同编码风格的多种观点时,问题和答案的格式可能很方便。要更具体地专注于代码,请同时在StackExchange上查看“ 代码审查”区域

内部源控制

之前,我说过有意通过阅读代码来学习的一个重要部分就是使自己接触以前从未见过的代码。我认为这非常重要,但是我想补充一点,您也可以学到很多有关工作代码库的知识。肯定会有一些您很少使用的项目和存储库。通过花一些时间来了解它们,您可以了解它们的工作原理。如果最终支持他们,那么您将拥有真正的领先优势,并且甚至比原始作者都更加熟悉代码。

作为团队中的新成员或加入新组织时,您可以通过研究现有代码来快速掌握内部编码标准和通用模式。这将加快您的入职时间并指导您的个人发展。

这绝不是详尽的清单。无论您在哪里找到代码,都需要花一些时间阅读和欣赏它,比平时更深入。您不会后悔花费时间来以这种方式提高软件开发技能。

我应该如何阅读源代码?

我相信每个人在本节中都会有自己的偏好。最终做适合自己的事情!我将在这里分享一些我自己的方法,您可以将它们用于启动代码阅读冒险。

我通常喜欢专注于代码,这些代码要么做一些我想复制的样式,要么加深了我每天使用的代码知识。正如我之前所说,这将使我投入的时间获得两倍的回报。

我倾向于在GitHub上开始工作。这使我摆脱了通常使用的工具,将注意力集中在真正理解代码中正在发生的事情上。我尝试找到一个高层次的抽象作为起点,然后逐步深入研究内部。我喜欢在学习代码时在OneNote中做笔记,描述流程和代码的工作方式。这些是简短的说明。尽管这可能有用,但与其说是将知识嵌入我的记忆中,不如说是提供参考。通过书面描述,我发现它在我身上的保存时间更长。

导航代码并形成逻辑流程的思路是一个方便的技能。如果您可以通过阅读代码来学习这些知识,那么当您下次尝试在压力下修复一个严重的错误时,它会有所作为。

一旦形成概述,下一步便是更深入。为此,我倾向于克隆存储库,以便可以将其带入IDE或VS代码中。在这里,我可以使用代码导航功能更快地移动并真正深入研究代码的行为。在这一点上,我试图理解为什么要按原样编写代码。我想考虑如何选择解决问题并将其与实际实现进行对比。作者的方法更好或更有效吗?我下次面对类似要求时是否应该将其归档?

通常,代码可能会使用编写代码时从未发现过的API。我发现在编码时,我会倾向于使用我更熟悉的那些API。这些可能不是调用或依赖类的最佳方法,但是据我所知,我一直在使用它们。阅读一些代码之后,如果有我以前从未使用过的API,我将研究描述和方法签名以了解其设计用途。这扩展了我的代码词汇。

第二阶段还提高了我使用IDE等工具的技能。我发现在浏览代码时可以节省时间的技巧和捷径。我经常做的事情是将一个类拉到第二个监视器的窗口中,这样我可以更快地跟踪代码流。现在,我也在编写代码时经常这样做。

我还在寻找我不认识的语言功能或模式。可以这么说,我很快了解了C#最新版本的功能,很快就了解了它们。

如果我不懂守则怎么办?

绝对好!刚开始时,您不会理解所读的一切,这实际上是我们的目标。您想在阅读的代码中使用新的API或新语法,以便进一步发展自己的代码词汇。像阅读一本简单的书一样,阅读容易理解的代码不会扩展您的写作技巧。

尝试将事情分解成较小的块,以便在您的头脑中发挥作用。代码在做什么,为什么还要这样写?作者是否使用一种方法来解决您以前未曾考虑过的问题?当您遇到不了解的语言语法或关键字时,请停止搜索文档。有了一个实际的用例,文档通常在您使用它的上下文中才有意义。

同样,如果遇到以前从未使用过的框架API,请访问代码文档(如果有)。对于Microsoft库,所有公共方法都包括XML注释。您可以直接阅读这些内容,也可以访问.NET API浏览器  以获取有关类或方法的信息。

有意识地阅读代码的重要意义在于,这是您自己的时间,并且您正在投资于自己的技能。将此与您在代码库中(在截止期限之前)尝试完成错误修复或功能的时间进行对比。您几乎没有时间扩展到直接使用的代码范围之外。这种情况不利于学习。 

我从阅读源代码中学到了什么

我从学习代码中学到了很多东西,这就是为什么我如此热衷于推广这种做法。现代手工艺者通常会研究手工艺大师的作品。通过这样做,他们希望有一天达到自己的技能水平。开发人员也可以通过向各自领域的专家学习来提高自己的技能。

对于我个人而言,作为C#.NET开发人员,我发现在研究.NET Core框架和ASP.NET Core的Microsoft源代码方面有很多价值。Microsoft有许多出色的开发人员,他们对语言或运行时的特定元素有全面的专业知识。

我是一个自学成才的开发人员,或者如我最近看到有人在Twitter上称呼它(不幸的是,我不记得是谁),一个社区自学的开发人员。我已经通过反复试验与有意识地学习代码一起学习了C#。就像学者们研究伟大的文学作品一样,阅读伟大的密码也有许多秘密可以破解。

我向那些对软件设计感兴趣并希望更好地了解.NET Core框架的人推荐一个相关资源,该资源可从YouTube上获得。.NET团队每周发布大部分.NET设计评论在YouTube上。在这些会议上,团队将审查有关将API更改为.NET Core的建议。虽然我可以体会到在自己的时间选择观看会议的想法对某些人来说可能太怪异了,但它是学习的一种好方法。这些电话的团队由真正的专家组成,他们深know语言,运行时和框架的知识,因此观察起来非常令人吃惊。通过听取他们讨论建议的API的讨论,您会对在如此广泛和广泛使用的框架中必须考虑的因素有真正的赞赏。仅仅通过观看这些信息流,我通常收集的洞察力很少。

摘要

我写这篇文章的目的是激发一些读者考虑进行更有意识的研究和阅读代码。老实说,我相信这有助于我成为一名更好的开发人员,并进一步了解C#语言和.NET(核心)框架。定期投资几个小时可以为您带来回报。您将对编码样式和技术有更多不同的意见。您将更深入地了解您日常依赖的框架是如何工作的,从而可以为您提供使用的依据。您将更快地阅读代码,因此,您接下来必须进行的那些代码更改将使您从需求到完成代码的时间减少。