利用代码搜索从您的企业代码库中获取更多价值
当大多数人想到公司的可重用资产时,源代码通常不会出现在列表上,即使每年在创建和维护代码上花费了数百万美元。大多数大型公司都在管理数亿行代码——其中大部分是为解决特定的应用程序问题而专门构建的。这些代码中的大部分被锁定在特定于应用程序或孤立组织的源代码管理系统 (SCM) 中。
此外,开源软件开发领域也存在类似数十亿行的代码,但源代码是公开共享并定期重用的——无论是整体重用还是通过派生。在这里,也花费了大量的努力和资源来编写和维护源代码。源代码由大量的开发人员维护、扩展和重用。并且,与企业代码一样,开源代码也存储在各种源代码存储库中。
总的来说,大型组织内部 SCM 中存在的代码,以及开源世界中存在的数十亿行代码,反映了数百万开发人员的实现成果。这些成果可以作为强大的资源,协助未来应用程序的设计、开发、分析和问题解决。
但是,我们如何利用这种庞大的资源呢?
代码搜索引擎代码搜索引擎是一种工具,可以帮助开发人员解锁隐藏在大型存储库内部的丰富多样的实现知识。代码搜索引擎有助于执行特定于源代码的搜索操作,并在处理、索引和检索源代码时应用特定于源代码的分析和启发式方法。与通用的基于文本的搜索引擎不同,源代码引擎是专门为满足开发人员与源代码相关的信息需求而设计和实现的。凭借这些功能,代码搜索引擎促进了源代码搜索。
代码搜索源代码搜索(或简称代码搜索)是一种在多个源代码存储库中查找相关源代码的技术。代码搜索可以帮助满足开发任务期间常见的搜索需求,例如查找 API 在不同项目中的使用情况,查找已知的的信息结构如何在代码中实现(例如 base 64 编码)等等。开发人员在代码搜索结果中发现有用的内容取决于手头的搜索需求。有效的代码搜索引擎通过提供相关的结果,并在需求模糊不清的情况下提供探索和缩小搜索结果范围的方法,来帮助满足此类搜索需求。鉴于结果中提供了替代选择,代码搜索引擎可以通过允许特定于代码的分面和过滤机制来充当选择引擎。
企业代码搜索企业代码搜索是在公司防火墙内部应用的代码搜索,搜索公司源代码存储库。企业代码搜索必须遵守额外的企业要求,例如关于源代码可见性的授权和访问策略。这在考虑企业的代码搜索引擎时提出了额外的要求和挑战,因为搜索工具必须满足公司的标准,并且需要适应现有的 IT、企业工具和部署程序。
代码搜索的用例开发人员经常使用代码搜索工具进行复制粘贴编程。最佳实践开发人员经常寻求重用现有解决方案,并且一旦实现,针对问题的通用解决方案(例如众所周知的算法)可以一次又一次地使用。当法律允许时,从现有解决方案复制和粘贴代码通常可能是最有效的方法,从而节省开发人员的时间和资源,让他们专注于更具挑战性的任务。代码搜索引擎可以是查找此类解决方案的理想工具。虽然肯定有人反对诸如复制粘贴编程之类的做法,其中一些是合理的(例如,人们可能无法盲目信任别人的代码),但在企业内部部署的代码搜索引擎可以将结果缩小到内部项目,从而揭示专家编写的代码,从而有助于缓解此类担忧,同时仍然允许广泛实践的复制粘贴编程。
开发人员并不总是寻找要复制和重用的确切代码行。他们更常寻求有用的模式,可以添加到他们的知识库中,以解决重复出现的任务。例如,在使用 API 时,开发人员需要学习 API 使用模式。今天的应用程序经常利用 API 调用其他内部或外部组件。典型的 API 文档很少,好的示例也很少,因此开发人员可能需要花费大量时间和精力才能弄清楚如何成功使用它们。解决此问题的两个简单方法是,要么让开发人员看到其他开发人员如何使用 API 的示例,要么提供 API 背后的代码的可见性。为了实现这一点,开发人员需要一种简单的方法来搜索和查看 API 调用或其他调用 API 的代码。代码搜索引擎使开发人员可以轻松完成此任务。代码示例和例子是开发人员重要的学习工具,他们经常会复制和修改现有示例以适应他们的目的。代码搜索引擎使开发人员可以将现有代码存储库用作示例来源——在上述情况下,是 API 使用示例的来源。
代码搜索引擎可以在各种其他场景中提供帮助。当开始使用新语言和框架的新项目时,开发人员将受益于研究和学习使用相同语言和框架的成熟项目的代码库。开源实现可能是开发人员学习复杂计算问题解决方案的好方法,例如实现分布式系统、搜索引擎、网络服务器等等。企业中的代码搜索引擎在正常的开发活动(例如维护、移植和处理遗留代码)期间也非常有帮助。代码搜索引擎可用于索引和交叉链接跨多种类型和语言的文件,从而支持搜索结果中的可追溯性。开发人员可以在维护期间使用代码搜索来查找与特定功能相关的源文件、单元测试和配置文件。
代码搜索中的挑战上面介绍的用例证明了代码搜索引擎的潜在好处,但是除非代码搜索引擎有效且高效,否则这些好处无法实现。代码搜索结果必须相关、全面并满足用户对工具的信息需求,才能有效。它的设计必须具有广泛的开发人员所需的功能和特性,这些开发人员始终面临着更高效、更经济地工作的压力。为了高效,代码搜索解决方案必须能够在可接受的响应时间内交付有效的结果,并且具有扩展到非常大型存储库的能力。
与纯文本或自然语言文本不同,源代码往往非常稀疏。如果仅采用适用于自然文本的技术,这会对构建有效的代码搜索引擎构成严重挑战。代码中缺乏丰富的词汇必须用可以利用的其他属性来弥补,这些属性只能在源代码中存在。一种这样的属性是源代码中存在的丰富的结构信息。与自然文本不同,源代码是高度结构化的,其中包含各种嵌套元素的定义以及这些元素之间的关系。例如,在典型的面向对象程序中,人们会发现类和方法,其中类扩展到其他类,方法调用其他方法。代码搜索引擎需要解析源代码以提取此类元素,以提供专门允许检索这些元素的搜索运算符。例如,当开发人员需要查找某个方法名称时,运算符(例如 ohloh.code 中的 mdef
)可以轻松地在这样的查询中提供有效的搜索结果。
这种丰富的互连结构将多个元素彼此关联,并且在词汇稀疏时可以作为积累相似术语的基础。与 Web 类似,代码本身的链接结构可以用来构建新的流行度和排名指标(如果使用得当)。在源代码编写中发现了一些在自然文本中不常见的约定(例如命名约定),这些约定使得特殊的标记化和处理适合源代码。(要了解有关这些主题的更多信息,请参阅作者的博士论文:促进互联网规模的代码检索,网址为 http://dl.acm.org/citation.cfm?id=2019966。)
为了正确提取源代码中的元素以及此类元素之间的关系,代码搜索引擎首先需要能够检测实现语言并对代码执行详细的解析,这对于复杂的语言以及存在错误或不完整代码的存储库来说可能并非易事。
除了词汇和结构属性之外,源代码还具有可执行属性,使其成为一种可执行的工件,其运行时行为随着代码的演进而变化。理解这种行为对于修复错误或提高性能等活动至关重要。代码搜索引擎可以利用存储的运行时行为表示形式(如测试覆盖率报告、调用跟踪、性能分析输出和日志中捕获的那样),并将它们与源代码中定义的适当元素相关联,以提供与代码中意外行为相关的答案。
最后,由于源代码是由协同工作的开发人员生成和维护的,因此源代码甚至具有以人为中心的属性。由于源代码上的大多数活动都记录在源代码存储库中,因此源代码引擎可以利用与此类活动相关的信息,在需要时提供与开发人员及其活动相关的答案。例如,它可以帮助找到某个功能的专家,或者当相关代码的某个部分发生更改时,可以通知负责管理特定项目的开发人员。
有效的代码搜索引擎允许开发人员提取、表示、存储、挖掘和使用这些特定于源代码的属性,而无论所有此类属性在应用于企业或互联网规模的源代码存储库时可以扩展到何种规模。
企业代码搜索的不同之处企业代码搜索和开源代码搜索之间存在一些重要的差异。开源代码搜索是在互联网上找到的代码存储库上完成的,可以看作是互联网代码搜索的一个实例——开发人员在互联网上搜索代码。当搜索自己的企业代码库与搜索开源存储库相比,结果可能会有很大差异。在企业内部,可能存在更严格的代码质量检查、更好的 API 使用实践和更严格的代码作者署名。这些只是在搜索企业代码库时开发人员可以找到的示例的影响因素中的一小部分。
从工具构建者的角度来看,企业代码搜索的其他好处包括与 ALM 工具更紧密的集成。工具构建者还可以使用代码搜索在索引期间进行更准确的分析,因为企业源代码存储库中的代码可以进行质量控制或自动化以防止错误的和不完整的提交。简而言之,我们有更多的机会来探索利用企业代码库的独特方面。
衡量企业代码搜索的益处企业代码搜索引擎的使用仍处于早期采用阶段,因此衡量其益处可能是一个挑战。在没有可靠的经验数据的情况下,这些好处难以量化,但并非不可能。以下是如何评估企业可以评估益处的示例
-
作为开发人员的生产力工具:每天在有关代码的问题上花费了多少时间和精力?开发人员必须等待多久才能得到答案?借助代码搜索工具,开发人员可以节省多少时间和精力,不仅是她自己,而且还为每天与她和彼此协作的开发团队的其他成员节省时间和精力?借助代码搜索工具,可以避免许多此类延迟,从而节省不仅一位而且许多开发人员的宝贵时间。
-
代码搜索引擎作为知识增强工具的价值:增强自己的知识无疑是无价的,如果代码搜索引擎可以作为开发人员的知识构建工具,那么它的价值已经得到证明。对于开发人员来说,源代码是他们的文学作品,代码搜索引擎可以充当导航和掌握此类文学作品的工具。
-
更定量的衡量标准:可以有更定量和长期的手段来衡量代码搜索引擎的益处。对代码搜索引擎中活动的详细跟踪和日志记录可以带来对代码重用的可量化发现。查看一段时间内的活动(在尊重隐私问题的前提下),例如搜索、下载和复制粘贴事件,企业可以获得对其代码库的宝贵见解,这些见解可以应用于主动提高开发人员效率和软件性能。
总的来说,作为一个团队或公司,人们可以制定一项策略来衡量代码搜索工具的益处,方法是查看可以量化的事物(例如日志),并通过询问最终用户、开发人员、经理和其他协作者分享这些工具如何让他们个人和作为一个群体受益,从而了解可能是定性的益处。
结论利用其他开发人员的代码成果可以为学习、代码重用以及降低软件开发和维护的时间和成本开辟新的机会。快速搜索大型代码存储库集合的能力是实现这些益处的基础。通过更加关注利用代码作为宝贵的学习资产,我们可以利用行业内的集体经验,以更有效率地作为新代码的创新者工作。