一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

用于评估软件开发者的代码贡献的系统和方法与流程

2022-04-16 16:21:40 来源:中国专利 TAG:


1.本公开内容涉及微控制器,并且更具体地,涉及用于评估不同软件开发者对软件项目的相应代码贡献的系统和方法。


背景技术:

2.在典型的软件开发环境中,开发者将代码贡献给软件项目存储库。每个开发者的代码贡献通常通过简单的度量来表征,所述度量例如可归因于每个开发者的提交数量(noc)或代码行(loc)数。例如,github使用noc对软件项目的开发者进行排序。作为另一示例,expertise browser——用于识别开发者专业知识的经典工具——使用更改的loc的数量作为每个开发者的贡献的指标。这样的度量衡量每个开发者的代码贡献量,而不是代码贡献的价值。例如,位于应用逻辑核心的函数通常比辅助脚本更有价值,但常规的代码贡献度量无法捕获这种区别。
3.在许多情况下,除了常规的基于数量的度量之外,识别和比较不同开发者的贡献的价值是有用的。虽然传统的基于价值的软件工程通常聚焦于创造经济价值作为优先考虑资源分配和调度的一种方式,但在某些情况下,其他价值衡量更为相关。例如,(除了非代码贡献之外),编程教师可能想要评估各个学生对小组项目的代码贡献,尽管这样的代码贡献通常与经济回报无关。作为另一示例,工程经理可能需要对各个团队成员的相应表现执行定量衡量。另外,软件工程研究人员通常观察开发活动本身,但不一定观察其经济回报。作为又一示例,对于自由开源软件(foss)项目,不同开发者的贡献极大地影响了相关项目的协作、协调和领导方面。
4.因此,存在一个目的是提供用于分析软件开发者的代码贡献的工具,所述工具捕获代码贡献的内在价值——例如贡献代码对开发活动的影响,而不仅仅是对代码行或提交进行计数,例如以对各个开发者进行更有效的评估和/或排序并且提高对软件开发过程的理解。


技术实现要素:

5.一般而言,并且在一个方面,提供了一种用于评估多个软件开发者中的每一个对软件项目的代码贡献的系统,该系统考虑每个开发者的贡献的结构价值和非结构价值二者。该系统可以包括至少一个存储器设备和与所述存储器设备通信地耦接的至少一个处理器。存储器设备可以存储包括代码集合的代码存储库,该代码集合包括由多个软件开发者中的每一个开发的代码部分,该代码部分包括多个函数。存储器设备还可以存储用于根据提交的影响对提交进行分类的定义的代码影响类别的列表。
6.处理器可以被配置成从代码存储库访问代码集合,并且在软件项目期间的多个不同时间处解析代码集合以生成表示代码集合或其部分的抽象语法树(ast)。处理器可以对每个软件开发者的代码贡献执行结构价值分析和非结构价值分析二者。对每个软件开发者的结构价值分析可以包括(a)从ast生成至少一个调用-提交图表,(b)对至少一个调用-提
交图表执行调用-提交分析以分析可归因于每个软件开发者的函数调用和提交,以及(c)至少基于调用-提交分析来计算每个软件开发者的结构价值分数。对每个软件开发者的非结构价值分析可以包括(a)分析ast以识别可归因于每个软件开发者的提交,(b)基于定义的代码影响类别的列表执行提交分类以对每个所识别的提交进行分类,以及(c)至少基于对可归因于每个软件开发者的提交的提交分类来计算该软件开发者的非结构代码影响分数。
7.处理器然后可以至少基于(a)每个软件开发者的结构价值分数和(b)每个软件开发者的非结构代码影响分数来针对每个软件开发者计算开发价值分数。处理器可以例如通过生成曲线图、图表或其他可显示的视觉资料来显示针对每个软件开发者计算的开发价值分数的表示。
8.本发明的一个基本方面是提供基于以下的组合来自动量化开发者对项目的代码贡献的价值的系统和方法:(a)每个开发者的代码贡献的结构价值,例如每个开发者的代码的结构影响,以及(b)每个开发者的代码贡献的非结构价值,例如每个开发者的代码对软件项目开发的影响。计算并且组合这两个分量以针对每个开发者计算整体开发价值。发明人已经发现,根据本发明对软件开发者的评估提供了比通过人员评定或通过简单的常规计数方法例如仅对代码行或提交进行计数而获得的结果更好且更有用的结果。
9.在另一方面,提供了一种用于评估多个软件开发者中的每一个的代码贡献的方法,该方法考虑每个开发者的贡献的结构价值和非结构价值二者。代码存储库可以存储代码集合,该代码集合包括由多个软件开发者中的每一个开发的代码部分,该代码部分包括多个函数。还可以存储用于根据提交的影响对提交进行分类的定义的代码影响类别的列表。可以从代码存储库访问代码集合,并且在软件项目期间的多个不同时间处解析代码集合以生成表示代码集合或其部分的抽象语法树(ast)。
10.可以基于ast来执行对每个软件开发者的代码贡献的结构价值分析和非结构价值分析二者。对每个软件开发者的结构价值分析可以包括:从ast生成至少一个调用-提交图表,对至少一个调用-提交图表执行调用-提交分析以分析可归因于每个软件开发者的函数调用和提交,以及至少基于调用-提交分析来计算每个软件开发者的结构价值分数。对每个软件开发者的非结构价值分析可以包括:分析ast以识别可归因于每个软件开发者的提交,基于定义的代码影响类别的列表执行提交分类以对每个所识别的提交进行分类,以及至少基于对可归因于每个软件开发者的提交的提交分类来计算该软件开发者的非结构代码影响分数。可以基于多个开发价值分数输入针对每个软件开发者计算开发价值分数,多个开发价值分数输入包括(a)每个软件开发者的结构价值分数和(b)每个软件开发者的非结构代码影响分数。然后可以显示或以其他方式输出针对每个软件开发者计算的开发价值分数的表示。
附图说明
11.通过以下结合附图的详细描述将容易地理解本发明,其中,相似的附图标记表示相似的结构元素。
12.图1是根据本发明的实施方式的用于评估软件开发者的代码贡献的示例系统的图,该系统考虑每个开发者的贡献的结构价值和非结构价值二者;
13.图2示出了根据本发明的一个示例实施方式的由图1所示的系统执行的示例方法,
该方法用于评估多个软件开发者中的每一个对软件项目的代码贡献。
14.图3表示具有两个代码提交的示例文件;
15.图4和图5表示针对图3所示的示例文件中的两个提交的抽象语法树(ast);
16.图6-1和图6-2表示从图4和图5中所示的ast生成的示例调用-提交图表;
17.图7示出了根据本发明的一个实施方式的示例可显示视图,其包括指示软件项目随时间的开发进度的示例开发历史图;
18.图8示出了根据本发明的一个实施方式的指示每个相应开发者的技能集的开发者技能集图形的示例可显示视图;
19.图9示出了根据本发明的一个实施方式的针对所选开发者的、指示开发价值分数及其分量的开发价值分数图形的示例可显示视图;以及
20.图10a至图10c示出了根据本发明的一个实施方式的示例人力分配图形的示例可显示视图,其提供了与软件项目相关联的开发者与技术类别(或任务)之间的关系的视觉指示。
具体实施方式
21.下面详细描述本发明的具体实施方式。在以下对本发明的实施方式的描述中,描述具体细节以提供对本发明的透彻理解。然而,对于本领域普通技术人员来说明显的是,可以在没有这些具体细节的情况下实践本发明。在其他情况下,没有详细描述众所周知的特征以避免不必要地使本说明书复杂化。
22.存在一个目的是提供用于分析软件开发者的代码贡献的工具,所述工具捕获代码贡献的内在价值——例如贡献代码对开发活动的影响,而不仅仅是对代码行或提交进行计数,例如以对各个开发者进行更有效的评估和/或排序并且提高对软件开发过程的理解。因此,本发明提供了基于以下的组合来评估软件开发者的代码贡献的系统和方法:(a)每个开发者的代码贡献的结构价值,例如每个开发者的代码的结构影响,和(b)每个开发者的代码贡献的非结构价值,例如每个开发者的代码对软件项目开发的影响。发明人已经发现,对软件开发者的这样的评估提供了与使用常规评估技术而获得的结果相比更好且更有用的结果。
23.在一个方面,提供了一种用于评估多个软件开发者中的每一个对软件项目的代码贡献的系统,该系统考虑每个开发者的贡献的结构价值和非结构价值。例如,系统可以针对每个开发者计算开发价值分数,该开发价值分数结合了(a)表示相应开发者的代码贡献的结构价值的至少一个结构价值分数和(b)表示相应开发者的代码贡献的非结构价值的至少一个非结构价值分数。
24.该系统可以包括存储器设备和连接至存储器设备的处理器。存储器设备可以存储包括软件项目的源代码集合的代码存储库,源代码集合包括由不同开发者中的每一个开发的代码部分。归因于每个开发者的代码部分可以包括称为函数的各种代码段。归因于每个开发者的每个函数可以与归因于同一开发者或其他开发者的其他函数具有依赖关系或其他关系。
25.在一些实施方式中,存储器设备还可以存储用于评估每个开发者的代码贡献的算法、规则和/或其他数据,如本文所公开的。例如,在一些实施方式中,存储器设备可以存储
用于根据归因于每个开发者的提交的影响对这样的提交进行分类和评分的定义的代码影响类别的列表,如下文所说明的。
26.作为另一示例,存储器设备可以存储规则和/或权重,规则和/或权重用于例如通过评估可归因于每个开发者的函数和提交之间的关系来评估可归因于每个开发者的代码的结构价值,如下面讨论的。
27.作为另一示例,存储器设备可以存储用于评估可归因于每个开发者的代码的质量的一组代码质量规则。
28.作为另一示例,存储器设备可以存储用于针对每个开发者计算开发价值分数的算法和/或一组权重,该组权重包括例如:针对表示相应开发者的代码贡献的结构价值的每个结构价值分数的权重和针对表示相应开发者的代码贡献的非结构价值的每个非结构价值分数的权重。
29.在一些实施方式中,系统可以存储和利用上面列出的各种类型的数据中的每一种。在其他实施方式中,系统可以仅存储和利用上面列出的数据中的一些数据。例如,系统可以存储和利用用于对可归因于每个开发者的提交进行分类的定义的代码影响类别的列表以及用于评估可归因于每个开发者的代码的质量的一组代码质量规则,但可以不存储或利用用于针对每个开发者计算开发价值分数的权重。
30.该系统可以包括源代码解析器,该源代码解析器被配置成从代码存储库访问软件项目源代码,并且在软件项目期间的多个不同时间处将源代码转换成表示代码或其部分的一组抽象语法树(ast)。每个ast包括表示相应代码的逻辑的树结构。解析器可以包括或利用本领域已知的用于从源代码生成ast的任何合适的工具和技术。典型地,不同的编程语言例如c 、javascript等具有不同的ast表达。因此,在一些实施方式中,解析器被配置成生成表示多个特定于语言的ast的抽象版本的通用的、独立于语言的ast。
31.该系统还可以包括(a)用于对每个开发者的代码贡献的结构方面进行分析和评分的结构价值分析工具以及(b)用于对每个开发者的代码贡献的非结构方面进行分析和评分的非结构价值分析工具二者。在一些实施方式中,结构价值分析工具和非结构价值分析工具二者均可以基于由解析器生成的ast来执行其相应的分析和评分。
32.在一些实施方式中,结构价值分析工具可以包括(a)工作负荷计算器以及(b)结构价值评分单元中的一个或两个,该工作负荷计算器被配置成基于归因于每个开发者的代码来计算表示归因于该开发者的工作量或劳动量的开发等效分数,该结构价值评分单元被配置成针对每个开发者计算结构价值分数。
33.工作负荷计算器可以被配置成衡量由ast反映的编码的劳动。在一个实施方式中,工作负荷计算器被配置成对由可归因于每个开发者的代码表达或执行的逻辑操作的数量进行计数,并且基于逻辑操作的数量针对相应开发者计算开发等效分数。由代码表达的逻辑操作的数量表示由相应开发者开发的代码的复杂程度,并且因此表示该开发者的劳动量。开发等效分数总体上类似于对代码行(loc)进行计数,但提供了对由每个开发者执行的工作量的更准确且有用的衡量。例如,loc通常是任意的(例如,由于代码中返回的数量或其他格式类型的详细信息),并且也可能被开发者钻空子。相比之下,通过开发等效分数计算的开发等效分数可以避免loc和其他常规工作估计技术常见的这样的问题(issue)。
34.结构价值评分单元可以被配置成针对每个开发者计算结构价值分数。结构价值评
分单元可以被配置成从相关的ast针对每个开发者生成“调用-提交”图表,对这样的调用-提交图表执行调用-提交分析以分析可归因于每个开发者的函数调用和提交,并且至少基于调用-提交分析来针对每个软件开发者计算结构价值分数。
35.在一个实施方式中,结构价值评分单元包括图表构建器,该图表构建器被配置成从所选ast生成调用-提交图表。调用-提交图表可以包括两种类型的节点:(1)表示函数(代码段)的函数节点和(2)表示代码提交的提交节点。代码中的每个提交可能引入新函数或者对现有函数进行更改。调用-提交图表还可以定义各种节点之间的两种类型的节点关系:(1)函数节点(代码段)之间的函数调用关系,其中,一个函数调用另一个函数(或多个其他函数)以实现某些功能,(2)提交节点与函数节点之间的提交更改关系,表示更改了现有函数的提交;每个这样的关系可以由从相应提交节点到由相应提交更改的函数的函数节点的边缘来定义。
36.结构价值评分单元还可以包括结构价值计算器,该结构价值计算器被配置成基于由图表构建器生成的调用-提交图表中的节点和/或节点关系来针对每个开发者计算结构价值分数。在一个实施方式中,结构价值计算器包括开发排序算法,该开发排序算法被配置成以类似于已知页面排序算法的方式计算结构价值分数,结构价值分数在本文中也称为“开发排序”分数。该算法假设访问者访问了调用-提交图表,并且将规则应用于访问者行为。该算法计算访问者到达每个节点(包括函数节点和提交节点)处的概率,其表示该节点的重要性。因此,该算法将由所确定的到达每个节点处的概率定义的或者基于所确定的到达每个节点处的概率的结构价值分配给每个节点。然后,该算法将图表中归因于每个开发者的所有节点的结构价值相加,从而针对相应开发者计算结构价值分数。在另一个实施方式中,该算法仅对归因于每个开发者的提交节点的结构价值求和,以针对相应开发者计算结构价值分数。
37.如上面描述的,除了上面讨论的示例结构价值分析工具之外,该系统还包括用于对每个开发者的代码贡献的非结构方面进行分析和评分的非结构价值分析工具。在一些实施方式中,非结构价值分析工具可以包括(a)影响编码分析单元、(b)代码质量分析器和/或(c)项目质量分析器中的任何一个、两个或全部三个,该影响编码分析单元被配置成基于开发者的提交的类型对归因于每个开发者的提交进行分类和评分,该代码质量分析器被配置成计算表示归因于每个开发者的代码的质量的代码质量分数,该项目质量分析器被配置成基于一组软件工程度量来针对每个开发者计算项目质量分数。
38.影响编码分析单元被配置成对代码中的提交进行分类和评分。代码中的每个提交(包括创建新函数的提交和更改现有函数的提交)会更改代码库,其被转换成ast。每个代码提交产生两个ast版本,一个是提交之前的ast版本,一个是提交之后的ast版本。影响编码分析单元可以包括提交差异生成器,该提交差异生成器被配置成比较ast版本以识别代表代码提交的差异。提交差异生成器可以被配置成识别可归因于每个开发者的代码提交。
39.影响编码分析单元还可以包括提交分类器,该提交分类器被配置成基于定义的代码影响类别的列表来对归因于每个开发者的每个提交进行分类。代码影响类别可以定义通常对软件项目具有不同水平的影响的代码类别。例如,代码影响类别可以包括以下类别:(a)特征提交,(b)改进提交,(c)错误修复提交以及(d)维护提交。
40.影响编码分析单元还可以包括影响编码计算器,该影响编码计算器被配置成基于
归因于每个开发者的提交的分类类别来针对该开发者计算影响编码分数。影响编码计算器可以对每个提交类别应用加权分数并且将归因于每个开发者的所有提交的加权分数相加,以针对每个开发者计算影响编码分数。每个提交类别的加权分数可以表示该类提交对软件项目的典型影响水平。
41.代码质量分析器可以被配置成计算代码质量分数,该代码质量分数表示归因于每个开发者的代码的质量。代码质量分析单元可以基于向归因于开发者的代码应用的一组定义的代码质量规则来针对每个相应开发者计算代码质量分数。代码质量规则可以包括定义代码的质量的任何规则。一个示例代码质量规则检查是否在代码中实际使用在代码中定义的每个变量。另一示例代码质量规则检查打开文件(例如,以读取某些数据)的每段代码是否具有随后关闭文件例如以释放处理资源的对应代码段。在一个实施方式中,代码质量分析器被配置成对每个开发者违反代码质量规则的次数进行识别和计数,并且基于违反次数对每个开发者评分。
42.项目质量分析器可以被配置成基于一组定义的软件工程度量来针对每个开发者计算项目质量分数。例如,项目质量分析器可以确定和量化归因于每个开发者的提交影响每个软件工程度量的程度,并且基于他们对整组软件工程度量的影响来针对每个开发者计算分数。在一些实施方式中,项目质量分析器可以(通过将软件工程度量应用于源代码)分析源代码本身,或者可以分析表示源代码的ast,或者可以分析源代码和ast二者,以确定每个开发者的代码贡献对每个相应软件工程度量的影响。该组定义的软件工程度量可以包括用于分析归因于每个开发者的代码的任何可量化度量。
43.示例软件工程度量可以包括:
44.■
模块性:表示将代码划分成内聚的、分离的分量有多容易。该度量被计算为代码的调用-提交图表的最佳划分的模块性分数。
45.■
文档覆盖率:指示具有格式化注释的函数的百分比。
46.■
速度:指示开发团队在上一定义的时间段内(例如,上个月)进展得有多快。该度量被计算为上一定义的时间段(例如,上个月)内开发价值曲线的斜率。
47.■
测试覆盖率:指示由测试用例覆盖的函数的百分比。
48.■
稳健性:指示开发价值低于被分析的开发者的平均价值的开发者的百分比。
49.■
干度:指示不重复的代码的百分比。
50.该系统还可以包括开发价值计算单元,该开发价值计算单元被配置成基于相应开发者的(a)由结构价值分析工具输出的分数和(b)由非结构价值分析工具输出的分数来针对每个开发者计算开发价值分数。例如,在一个实施方式中,开发价值计算单元可以基于以下开发价值分数输入的任何组合来针对每个开发者计算开发价值分数:(a)由工作负荷计算器计算的开发者的开发等效分数(结构价值输入),(b)由结构价值评分单元计算的结构价值分数(结构价值输入),(c)由影响编码分析单元产生的开发者的影响编码分数(非结构价值输入),以及(d)由代码质量分析单元计算的开发者的代码质量分数。
51.在一些实施方式中,该系统还包括开发价值加权单元,该开发价值加权单元被配置成对用于针对每个相应开发者计算开发价值分数的各种开发价值分数输入的权重进行评分和/或动态调整。开发价值加权单元可以包括权重学习单元,该权重学习单元被配置成实现排序学习算法,以例如基于指示代码中的提交的比较或排序的用户输入来随时间动态
地确定和调整不同开发价值分数输入的权重。
52.由于结构分析和非结构分析捕获了开发价值的两个基本方面,因此开发价值加权单元将两者组合以计算总体开发价值。假设提交具有结构价值d和非结构价值t。在一些实施方式中,目标是找到对两者进行组合的函数d可以表示每个结构分数或结构分数(例如,开发等效分数和/或结构价值分数)的组合,而t可以表示每个非结构分数或非结构分数(例如,代码影响分数、代码质量分数和/或项目质量分数)的组合。
53.如果可靠的基础事实——即,具有已知整体开发价值的大量提交——可用,则任务可以作为优化问题提出:从数据集确定以下中的权重向量w:
[0054][0055]
使得每个提交的真实值与之间的平均误差最小化。
[0056]
不幸的是,开发者发现很难以自由形式直接对代码价值进行评分,例如,向一个提交赋予0.17并且向另一个提交赋予0.06,因此难以以这种形式获得可靠的基础事实。因此,在一个实施方式中,开发者被要求比较同一开发者的提交对并且识别每一对中的哪一个更有价值,并且这样的人工输入用于权重学习。这种技术有助于消除个人兴趣和人际关系的影响。基于此“成对基础事实”,可以使用排序学习(l2r)算法来确定示例算法使用d和t作为排序svm的输入特征。训练后,将svm的权重向量视为中的w。这种方法允许将每个提交的结构价值分数和非结构价值分数组合,从而针对每个开发者确定整体开发价值分数。
[0057]
在针对每个开发者计算开发价值分数之后,系统可以例如通过生成曲线图、图表或用于在任何合适的显示设备上显示的其他视觉资料来显示或以其他方式输出开发价值分数的表示。
[0058]
上述系统的每个部件——包括至少源代码解析器、工作负荷计算器、结构价值评分单元、调用-提交图表构建器、结构价值计算器、影响编码分析单元、提交差异生成器、提交分类器、影响编码计算器、代码质量分析单元、代码质量检查器、开发价值计算单元和开发价值加权单元——包括或可以访问用于执行相应系统部件的功能的任何合适的硬件、软件和/或固件元件。在一些实施方式中,系统部件中的一个、一些或全部以存储在存储器中并且可由一个或更多个处理器执行以执行相应系统部件的功能的软件来实施。
[0059]
图1示出了根据本发明的一个示例实施方式的用于评估多个软件开发者中的每一个对软件项目的代码贡献的示例系统100,系统100考虑每个开发者的贡献的结构价值和非结构价值二者。示例系统100包括存储器102、开发者分析工具104和用户接口106。存储器102可以由一个或更多个数据存储设备实施,一个或更多个数据存储设备例如硬盘驱动器、ram、rom、eeprom、闪存、可移除存储器设备(例如,usb驱动器)等中的任何一个或其组合。存储器102可以存储代码存储库110,该代码存储库110存储软件项目的源代码112,该源代码112包括由多个不同软件开发者开发的函数114即代码段的集合。存储器102还可以在软件项目期间的多个不同时间处存储表示源代码或其部分的一组抽象语法树(ast)120。存储器102还可以存储一组调用-提交图表122,该组调用-提交图表122包括并定义函数节点与代
码提交节点之间的关系,如本文所讨论的。
[0060]
存储器102还可以存储用于针对每个开发者计算结构价值分数的开发排序算法124。开发排序算法124可以被配置成计算访问者到达调用-提交图表122中的每个节点的概率,并且通过将与由相应开发者开发的代码对应的概率相加来针对每个开发者计算分数。
[0061]
存储器102还可以存储用于对代码提交进行分类的代码影响类别130的列表或集合以及用于相应代码影响类别130的一组影响类别权重132,其中,权重132可以指示提交的每个类别130对软件项目的重要性或影响。
[0062]
存储器102还可以存储一组代码质量规则136和软件工程度量138,用于分析由每个开发者贡献的代码的质量。最后,存储器102还可以存储开发价值权重学习算法140,该开发价值权重学习算法140被配置成动态地确定和/或调整一组权重142以将各种输入加权到每个开发者的总体开发价值分数,并且存储器102还可以存储由权重学习算法140用于调整权重142的开发价值用户输入144。开发价值用户输入144可以包括例如关于被分析的代码中的不同提交或不同类型的提交的相对价值的人工输入。
[0063]
开发者分析工具104包括用于分析源项目代码112以针对每个开发者计算开发价值分数的任何合适的工具,该开发价值分数表示每个相应开发者的代码贡献的价值。开发者分析工具104被配置成访问、利用存储器102中的任何相关数据和/或算法以及在存储器102中存储任何相关数据和/或算法。在该示例实施方式中,开发者分析工具104包括源代码解析器150、工作负荷计算器152、结构价值评分单元160、影响编码分析单元170、代码质量检查器180、项目质量检查器182、开发价值加权单元190和开发价值计算单元192。结构价值评分单元160可以包括调用-提交图表构建器162以及结构价值计算器164。影响编码分析单元170可以包括提交差异生成器172、提交分类器174和影响编码计算器176。参考下面讨论的图2所示的处理流程详细描述图1中所示的开发者分析工具104中的每一个的功能操作。
[0064]
用户接口106可以包括一个或更多个用户输入设备194和一个或更多个显示设备196。输入设备194可以包括被配置成允许用户与开发者分析工具104接口的任何设备,例如至少一个键盘、小键盘、鼠标、触摸板、触摸屏、基于语音的输入设备等。显示设备196可以包括用于显示由系统100生成的或与系统100有关的信息的任何设备,例如至少一个监视器、触摸屏或其他显示屏等。
[0065]
图2示出了根据本发明的一个示例实施方式的用于评估多个软件开发者中的每一个对软件项目的代码贡献的示例方法200,方法200考虑每个开发者的贡献的结构价值和非结构价值二者。示例方法200可以由图1所示的示例系统100执行。因此,方法200示出了系统100的各个部件的操作关系。
[0066]
首先,源代码解析器150可以从代码存储库110访问软件项目的源代码112,并且在软件项目期间的多个不同时间处将源代码转换成表示代码或其部分的一组ast 120。每个ast包括表示相应代码的逻辑的树结构。解析器150可以生成表示多种语言特定的ast格式的抽象版本的语言无关的ast。
[0067]
系统可以基于生成的ast 120执行各种不同的分析。可以以任何顺序或者完全或部分地同时执行各种分析。如210所示,可以执行结构工作负荷分析以分析由相应开发者付出的工作量或劳动量。在该示例中,工作负荷计算器152可以对由可归因于每个开发者的代码表达或执行的逻辑操作的数量进行计数,并且基于所计数的逻辑操作的数量来针对开发
者计算开发等效分数212。
[0068]
如220所示,可以执行对可归因于每个开发者的函数(代码段)和提交的结构价值分析,以针对每个开发者计算结构价值分数。图表构建器162可以从所选ast 120生成调用-提交图表122。如上面描述的,每个调用-提交图表122可以包括两种类型的节点:(1)表示函数(代码段)的函数节点和(2)表示代码提交的提交节点,并且可以定义两种类型的节点关系:(1)函数节点之间的函数调用关系,以及(2)提交节点与函数节点之间的提交更改关系。
[0069]
图中提供了示例来说明上面讨论的一些概念。
[0070]
首先,图3表示具有两个提交310和320的示例文件“patent.py”。在第一提交中,patent.py具有四个函数:“fibonacci”、“bubble_sort”、“reverse_array”和“main”。在第二提交中,“fibonacci”和“bubble_sort”二者均被重命名并修改;“reverse_array”被完全移除;“main”被修改,使得其不再调用“reverse_array”。
[0071]
接下来,图4和图5分别表示图3所示的patent.py中的两个示例提交310和320的ast。在ast中,“term(项)”指定节点的类型;“lhs”/“rhs”是指左侧/右侧。
[0072]
最后,图6-1和图6-2表示从图4和图5中所示的ast生成的示例调用-提交图表500。调用-提交图表500由“提交”、作为函数的“节点”和节点之间的“链接”构成。每个提交可以由它的“id”例如“ff6f447c7d8a0a97d0ea472b4ca6b3f5edc59d93”表示。每个节点可以由函数路径、名称和位置例如“patent.py::fibonacci((n)::《global》::3::11::186”表示;它还包含修改函数的所有提交的“history(历史)”。
[0073]
返回到图1进行参考,结构价值计算器164可以基于调用-提交图表112中的节点和/或节点关系来针对每个开发者计算结构价值分数222。例如,结构价值计算器164可以执行开发排序算法124来以类似于已知页面排序算法的方式计算结构价值分数222。一般而言,算法124假设访问者访问调用-提交图表,并且将规则应用于访问者行为。该算法计算访问者到达每个节点(包括函数节点和提交节点)的概率,所述概率表示该节点的重要性。因此,该算法向每个节点分配通过或基于所确定的到达该节点的概率定义的结构价值。然后,该算法将图表中归因于每个开发者的所有节点的结构价值相加,从而针对相应开发者计算结构价值分数222。
[0074]
如下说明开发排序算法124的具体示例。在大多数命令式编程语言中,函数(过程、方法)是程序结构的基本单元。函数的开发价值不仅基于创建函数所花费的劳动,还基于当其他代码调用该函数时节省的劳动。开发价值的结构分量(结构价值)由示例开发排序算法捕获,示例开发排序算法在本文称为“devrank算法”,其是本领域已知的原始pagerank(页面排序)算法的扩展。
[0075]
pagerank是google web search(谷歌网页搜索)的基础,并且可以在各个领域中找到应用。该算法在网页的有向图上运行。它假设网络冲浪者具有假定的访问行为,并且迭代计算冲浪者访问每个页面的概率。计算出的概率的含义取决于冲浪者的行为。在原始的pagerank中,冲浪者从事两个随机动作:(1)到达页面后,冲浪者以概率α随机选择该页面上的链接并访问链接页面;(2)冲浪者以概率1-α转移至随机页面并继续。阻尼因子α是预先选择的固定概率。基于行为,所产生的概率反映了根据页面的链接结构访问页面的可能性。直观地,反映的是页面在网络上的受欢迎程度或重要性。
[0076]
为了计算每个函数的结构价值,示例devrank算法构建了代码的静态函数-调用图
120。
[0084]
可以基于如上面描述地计算的各种开发价值分数输入来针对每个开发者计算开发价值分数270,各种开发价值分数输入包括以下开发等效分数212(结构)、结构价值分数222(结构),影响编码分数232(非结构)、代码质量分数242(非结构)和项目质量分数252(非结构)中的一个、一些或全部。
[0085]
在一些实施方式中,例如,如方法200中所示,可以在260处执行分数输入加权。例如,开发价值加权单元190可以至少基于用户输入144来执行权重学习算法140,以确定并动态地调整各种开发价值分数输入的一组权重142(例如,分数212、222、232、242和252的相应权重)。用户输入144可以包括随时间指示代码中的提交或提交类型的比较或排序的人工输入。
[0086]
开发价值计算单元192然后可以基于开发价值分数输入(例如,分数212、222、232、242和252)和在260处确定的分数输入权重142来针对每个开发者计算开发价值分数270。因此,每个开发者的开发价值分数270考虑由该开发者提供的贡献的结构方面和非结构方面二者,并且因此提供了优于常规开发者分析技术的各种优势。
[0087]
在针对每个开发者计算开发价值分数270之后,系统100可以例如通过生成曲线图、图表或用于在任何合适的显示设备196上显示的其他视觉资料来显示或以其他方式输出开发价值分数的表示。
[0088]
图7至图10c示出了可以由系统100生成并且显示在任何合适的显示设备196上的示例图形和视图。图7示出了示例视图,其包括(a)指示软件项目随时间的开发进度的示例开发历史图表700,以及(b)指示应用于软件项目代码的六个示例软件工程度量138的测量的示例蜘蛛图(或雷达图)702。项目质量分析器182可以针对每个不同的开发者生成蜘蛛图702,其指示例如该开发者的提交对总体项目代码的影响。在一个实施方式中,项目质量分析器182允许用户针对特定开发者选择(例如,点击)蜘蛛图702中的每个软件工程度量138,并且自动显示用于改进与所选度量138有关的开发者的代码的建议。例如,用户可以点击蜘蛛图702中的“干度”度量,并且项目质量分析器182可以自动显示影响干度度量的重复或冗余代码段的实例。
[0089]
图8示出了由系统100生成的开发者技能集图形800的示例视图。系统可以基于由开发者在编写代码时添加的一组定义的标签来将项目代码分类成不同的技术类别,并且基于标记有相应技术类别标签的该开发者的代码的量来确定每个开发者在每个技术类别上的技术水平。如图所示,图形800可以以任何合适的方式显示所选开发者的各种技能水平。
[0090]
图9示出了由系统100生成的开发价值分数图形900的示例视图。开发价值分数图形900可以针对所选开发者显示开发价值分数270和/或其所选分量。在所示示例中,开发价值分数图形900显示了具有最高开发价值分数270以及以下分量分数的开发者:开发等效分数212、影响编码分数236和代码质量分数242。
[0091]
图10a至图10c示出了由系统100生成的示例人力分配图形的示例视图。图10a示出了示例人力分配图形1000a,其提供与项目相关联的各个开发者与各种技术类别(或任务)之间的关系的视觉指示,视觉指示通过各种宽度的线指示。如图所示,每个开发者可能与一个或更多个技术类别有关,并且每个技术类别可能与一个或更多个开发者有关。在一个实施方式中,所述关系可以由每个开发者代码中的技术类别标签来确定,例如,如以上关于图
8所讨论的。因此,人力分配图形1000a可以表示针对每个相应开发者在开发者技能集图形800中指示的开发者技能数据的汇编。人力分配图形1000a中每条线的宽度可以指示针对每个相应技术类别归因于每个开发者的代码量或提交价值。
[0092]
在一个实施方式中,用户可以选择单独的开发者或单独的技术类别以突出显示与该开发者或技术类别有关的数据。图10b示出了由于选择特定开发者而产生的示例图形1000b,其示出了该开发者的技能集,而图10c示出了由于选择特定技术类别而产生的示例图形1000c,其示出了对该技术类别做出贡献的开发者以及来自每个开发者的相对贡献量(由线宽度指示)。例如,人力分配图形1000a至1000c可以用于管理和调整向软件项目的各个方面的人力分配。
[0093]
虽然本文描述和示出了本发明的示例性实施方式,但是应当理解,它们仅是说明性的,并且可以在不脱离本发明的精神和范围的情况下对这些实施方式进行修改。本文描述的动作可以是可以由一个或更多个处理器实现并存储在计算机可读存储器或物品上的计算机可读和可执行指令。计算机可读和可执行指令可以包括例如应用程序、程序模块、例程和子例程、执行线程等。在某些情况下,并非所有动作都需要实现在本文描述的方法中。
[0094]
诸如“部件”、“模块”、“单元”和“系统”的术语旨在涵盖硬件、软件、固件或其任何组合。例如,系统或部件可以是过程、在处理器上执行的过程或处理器。此外,功能、部件或系统可以位于单个设备上或分布在若干设备上。所描述的主题可以被实现为使用标准编程或工程技术来产生软件、固件、硬件或其任何组合以控制一个或更多个计算设备的装置、方法或制品。
[0095]
因此,本发明的范围旨在仅根据可以修改的所附权利要求来限定,其中每个权利要求明确地并入本具体实施方式的该描述中作为本发明的实施方式。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献