首页>文章>新的代码库,谁dis? (如何加入团队和学习代码库)与实施AVL树相比,我更换团队的频率更高,而且您可以猜测这两个是在学校教过的。我希望有人教我如何加入新团队!虽然学习新的代码库可能会令人生畏,但我发现了一些对我有用的东西。
加入新团队时,您至少应该做三件事。这三个命令的顺序可以是您想要的,但是所有三个命令都应尽快完成。
首先,您可能会设置开发环境。执行此操作时,请注意您要设置的内容。例如,如果您需要让Redis在本地运行,那么这很好地暗示了某些地方发生了缓存。注意运行内部项目的顺序有助于您理解依赖性。如果在启动模型服务之前需要运行功能存储,则暗示该模型服务可能取决于功能存储。这种依赖性开始暗示整个体系结构。
记下您正在运行的确切命令和要安装的软件包。自编写设置文档以来,您肯定会遇到一些变化,并且能够对其进行更正是可以提供给新团队的捷径。另外,最好确切地知道如何破坏Python的系统安装。
理想情况下,您正在使用的代码应具有某种自动化测试套件。开始试验和理解代码的一个好方法是使该测试套件成功运行,然后完全随机地对代码库进行更改,看看有什么坏处。
您应该做的第二件事是获得体系结构的概述。有些团队会提供一份描述此文件的文件,如果该文件是对现实的准确描述,那么您当然应该努力理解它。无论如何,请团队中更高层次的人为您提供概述是一个好主意。他们应该知道该文档的最新信息(如果确实存在),并且能够为您描述和/或绘制架构。您可以考虑以下一些示例问题:
我们最常拥有和/或使用哪些存储库(或存储库的一部分)?他们每个人都做什么?
部署管道是什么样的?如何从笔记本电脑获取功能以投入生产?
我们是否有某些真正令人头疼的服务,软件包,类或文件?特别不可靠或容易出错的区域?
我们使用或依赖的外部API,供应商或产品吗? (例如,SendGrid,DataDog,MySQL)
与环境设置类似,帮助团队的一件简单的事情是记录该体系结构概述(或更新现有文档)。写下您学到的知识,对绘制的图表拍照,然后将这些信息张贴到团队可见的位置。请务必在日期后加上更改日期。即使是稳定的项目,在足够长的时间内也会显示出一些变化,因此该日期将有助于将来的读者知道他们是否可以信任此文档。
在组建新团队时,您应该做的第三件事是开始了解业务。如果您是公司的新手,请弄清公司的使命,产品和目标。然后努力了解您的团队如何适应这些事情。一些示例问题包括:
如果我们的代码遭到破坏,谁会生气?那会发生多快?
我们与哪些其他团队互动最多?他们拥有哪些服务/代码库?我们是否与其他团队共享部分代码库?
在不了解团队在公司中所处位置的情况下,您注定要失败。您将没有足够的背景信息来很好地执行工作。
我坚信学习新的代码库最好通过实现实际功能(即使刚开始时很小)来实现。作为一个独立的贡献者而组成这个团队的全部要点是积累东西,没有比花费大量时间做正确的事情更好地学习如何做某事的方法。随着技能和理解的积累,随着时间的推移,您可以从事越来越大的项目。
实现某些东西将需要您阅读代码。但是"读"在这里可能会引起误解,因为阅读代码与阅读小说有很大不同。代码通常是组织在一起的,而更多的相关代码则靠在一起(在同一目录,程序包,类或文件中)。您能想象这样写的小说吗?如果托尔金将两个角色的所有场景都放置在相邻的页面中,而其中所有带有魔术的场景都发生在另一本书中?真荒谬!
尽管学习编码教会了我阅读代码的基础知识,但是没有人教过我如何阅读大型代码库。为此,我们必须采取一定的心态。在理解每个复杂的细节与快速产生影响之间取得平衡。快速的影响力可以帮助您在团队中树立声誉,并且比尝试阅读所有内容更快地获得对准确/复杂的了解。
我使用的经验法则是仅了解某物以表达其作用,而不必确切知道其作用方式。此过程称为“分块”。并且它依赖于这样的事实,即一旦您对代码单元有了基本的了解,就不需要记住所有的底层细节了。 (奥克利)。如果您担心不了解每一个细节,那么不要害怕记笔记,以更全面地理解这一部分。
这种理解将递归地增长:首先,您了解各种服务的功能。然后,您确定需要修改的特定服务,并开始了解该服务中的各个模块。在您修改的模块中,您将开始了解其中包含的类。此递归过程的基本情况是单独的行。
请记住,不同的团队可能以不同的方式实施相同的概念或模式。了解当前团队为什么选择他们的工作方式是新队友可以为团队提供帮助的另一种方式。您的新团队很可能没有听说过实现自己喜欢的单例的好方法。同样,您的方式可能会以您不知道的某种方式变得更糟。无论哪种方式,有人都能学到东西!
在我们深入研究该过程之前,我将给出的最后一个心态建议是尝试从代码路径和数据流方面理解代码。考虑哪些对象知道什么信息以及该信息如何在系统各部分之间流动。
足够理解该代码,以构成关于您需要进行的更改的假设。
进行更改并检验您的假设。有时,最好的方法是在用户界面中单击或运行特定的脚本。有时,最简单的方法是编写描述您所遵循的行为的测试。
如果您的假设不正确,请返回步骤2。了解为什么该更改没有按照您的预期进行,并提出了新的假设。
一旦有了有效的代码,就可以提高其质量。编写一个(或几个)测试来记录您所做的行为更改。重构代码以获得清晰和样式。
这种科学的方法可以指导我们逐步走向正确的高质量代码,而不必了解更改前后的每一个代码。
尽管您当然可以只使用文本编辑器并获得一些耐心,但仍然存在各种各样的工具,可以帮助我们在上述过程中更有效地阅读代码。
随着我们逐渐熟悉代码的某些部分,随着时间的推移,第一步变得越来越容易,但我们常常开始完全迷失了第一步。这里有一些方法很有用:运行代码,项目搜索和代码搜索。
运行代码有助于您理解它。在开始更改之前,请了解已经存在的内容。这可能意味着在本地重现错误,在UI中找到新功能将要去的地方,或其他许多事情。当您这样做时,逐步调试器中的执行将为您提供一个良好的起点,让您了解正在发生的事情。
通过"项目搜索,"我的意思是搜索在软件开发生命周期中创建的工件。诸如JIRA / Asana / Pivotal Tracker之类的问题跟踪器,GitHub和GitLab之类的工具中的拉取请求和问题以及git历史记录本身特别有用。由于几乎没有什么任务是真正新颖的,因此我们经常可以通过寻找相似的过去工作来获得理解。尝试几个不同的关键字。有时,您会发现一个拉取请求,该请求实现了与您想要执行的操作非常相似的操作,您可以将其用作指导。试图从头开始判断某些东西,尽管有时是必要的,但与从示例中改编相比,需要付出更多的努力。
代码搜索就是它的声音。对于您在本地检出的代码,我强烈建议使用专门为递归搜索而构建的工具,例如ack,Silver Searcher(ag)或ripgrep。但是您不会总是在当地将公司的所有代码都检出,有时能够进行详尽的搜索很有用。对于此用例,像OpenGrok或Sourcegraph这样的工具非常有用。 GitHub和GitLab还提供了搜索特定组织内所有代码的方法。
无论您使用哪种工具,请尝试几个您认为可能相关的关键字。考虑更改大小写敏感性。筛选到特定的文件类型可能会有更好的结果。
使用这些各种搜索工具,我们得出了一组相关的位置。因此,我们进入了过程的第二步:充分理解代码以形成有关必要更改的假设。我们已经讨论过的搜索工具对此有帮助(如果您遇到不熟悉的类的用法,请进行搜索并阅读发现的内容)。
一个非常有用的工具是一个好的IDE。我喜欢JetBrains'产品(我与它们没有从属关系),尽管我确定竞争产品中存在类似的功能。通过直接将您链接到函数或类的定义,JetBrains IDE可以帮助您更有效地导航代码。在Mac上,默认情况下,按住Cmd并将鼠标悬停在函数或类名上,然后单击。能够立即跳转到定义是一个完整的游戏规则改变者。
另一个超级有用的JetBrains键盘快捷键是(默认情况下)轻按两次shift键。这会弹出一个搜索栏,几乎可以找到任何内容(类,函数,文件名)。
在阅读代码时,请始终尝试减少您的认知负担。记住创建块,在其中不需要记住所有细节的心理框。考虑做笔记,写下文件名和行号,画一些小图。读写代码是这项工作中最需要认知的部分,因此,请抓住一切机会使自己更轻松。
在此过程中,您可能会陷入困境或迷路。可以寻求帮助。使用git blame查看谁在处理一些令人困惑的代码,并询问他们。您还可以使用git blame查找相关的请求请求或JIRA票证,这可能会帮助您获取上下文。
有时,作为第三步的一部分,我们将需要使用外部库。在理想的世界中,所有库都具有出色的文档,可帮助您理解关键的抽象并快速提高生产力。 las,我们没有生活在理想的世界中!许多项目确实有好的文档。但是通过更广泛的社区可能更容易学习其他人。考虑使用DuckDuckGo或Google之类的工具搜索网络。查看StackOverflow上是否有示例。
对我来说,最近的一个灯泡时刻意识到GitHub允许用户搜索所有公共代码。因此,我们可以找到使用我们关心的库和API的人的真实示例。尝试搜索您要使用的特定方法名称。或搜索包的名称,然后在出现的各个存储库中搜索。考虑只过滤您关心的语言。
有趣的是,我发现按" recently indexed"对GitHub搜索进行排序。与默认搜索(一遍又一遍地为我提供相同的复制粘贴示例)相比,它为我提供了更多样化,更有用的结果。如果您对结果不满意,请尝试使用其他排序顺序。
当我们围绕实际票务学习时,我们不仅学习得更快,而且同时产生影响并开始在团队中建立声誉。通过利用先前的工作(并使用良好的工具来查找工作),我们可以加快学习速度和影响。要知道,加入新团队并非易事,但不必辛苦!使用科学的方法。请遵循这些做法。看看这些工具。您将对自己的能力充满信心,并在此过程中留下良好的第一印象。
如果您发现这个有趣,请考虑在Twitter上关注我。 感谢我的朋友本杰明·科迪为本帖子提供反馈。 奥克利(Oakley),芭芭拉(Barbara A)。数字意识:如何在数学和科学上表现出色(即使您对代数一无所知)。 杰里米·P·塔彻(Jeremy P.Tarcher)/企鹅,2014年。