很有意思,如何把代码看成一个犯罪现场

以近些年来涌现出的工具和相关文献的数量来看,度量软件的复杂度是软件开发社区之中流行且常见的活动。Adam Tornhill 从其工程和心理学背景出发,在 QCon 伦敦上建议大家在版本控制工具的帮助下把代码当成一个犯罪现场看待。

Tornhill 认为目前对软件复杂度的度量是不完美的。于是他转向从心理学知识中寻找答案。地理罪犯分析(Geographical offender profiling)调查法基于了这样一个原则:罪犯的老窝往往就在他/她作案地点的边界之内。

在诸如 CodeCity 等工具的帮助下,Tornhill 将这一原则应用到代码上。其背后的思想是为代码创造地理呈现。区域和建筑物映射代码的结构,如包或类。代码属性(如代码行数或方法数量)决定区域和建筑物的尺寸。然后,Tornhill 借助于版本控制工具,将这些代码结构信息与代码中他所谓的空间运动进行了结合。

版本控制工具提供了大量取证细节,诸如何人、何时、在版本库的何处做了改变。将这一空间信息与代码结构相结合,则突出了热点。Tornhill
宣称在一个案例分析中(40 万行代码,89 名开发人员,18000+ 次提交)有 8 个缺陷集中区域,72% 的缺陷集中在4%
的代码中,用热点精确定位了其中的 7 个区域。

一个热点被高亮的代码城市。

使用版本控制信息可以做时空耦合分析。如果两个代码文件在同一时间发生改变,这意味着文件之间是物理耦合的,例如:一个类调用另一个。然而它们可能只是逻辑形式上的耦合,常见的拷贝-粘贴就会出现这样的结果。如果没有时空耦合分析的话,会很容易忽略掉这些问题。

时空耦合分析在其它方面也很有用。当来自于不同团队的人在同一时间改变不同组件时,它可以指出其变化模式。这个模式可以提示系统的体系结构和团队结构之间的不一致,而这种不一致会导致从提出变更请求到部署上线之间更长的周期时间。

版本控制信息也可以用于挖掘知识的所有者和组件的所有权。如果一个开发人员是一个给定代码文件或组件的主要提交者,那么我们可以有把握地认为他就是这个组件的知识所有者,哪怕他不在负责这个组件的团队中。这也意味着“撞车”将有迹可循并得以缓解。在更极端的案例中,知识所有者已经不在公司里了,那么就会出现知识的缺口。这些技术帮助发现这些缺口并弥合它们。

版本控制取证显示组件的有效所有权。

Tornhill 正就这一话题写一本书,目前在 Beta 状态。The Pragmatic Bookshelf 将于近期出版该书,预计出版日期是 2015 年 3 月 10 日。

作者:João Miranda

来源:51CTO

时间: 2025-01-27 05:18:02

很有意思,如何把代码看成一个犯罪现场的相关文章

代码即犯罪现场

以近些年来涌现出的工具和相关文献的数量来看,度量软件的复杂度是软件开发社区之中流行且常见的活动.Adam Tornhill 从其工程和心理学背景出发,在 QCon 伦敦上建议大家在版本控制工具的帮助下把代码当成一个犯罪现场看待. Tornhill 认为目前对软件复杂度的度量是不完美的.于是他转向从心理学知识中寻找答案.地理罪犯分析(Geographical offender profiling)调查法基于了这样一个原则:罪犯的老窝往往就在他/她作案地点的边界之内. 在诸如 CodeCity 等工

c++-Clist中包含Clist的变量,无法初始化 “很有意思的一个题目” 大侠路过请留步,谢谢

问题描述 Clist中包含Clist的变量,无法初始化 "很有意思的一个题目" 大侠路过请留步,谢谢 最外层:typedef Clist MOUDLE; structA{ type A; ... MAC mac; } MAC的定义为:typedef Clist MAC; 在全局或局部定义MOUDLE md:时报错: 1>D:Program Files (x86)Microsoft Visual Studio 10.0VCatlmfcincludeafxtempl.h(771):

代码-求一个很有难度的算法

问题描述 求一个很有难度的算法 给一个数组,长度为m,划分成n个子数组(每个数组起码有一个元素),比如 {1 2 3 4 5}划分成2个: 1, 2345 12,345 123,45 1234,5一共5个分法 {1234}分成3个 1,2,34 1,23,4 12,3,4,一共3个分法 求代码怎么写 解决方案 可以递归实现,如果你能采纳,可以再给你一些代码

12行javascript代码绘制一个八卦图

 一句话说明:用有限的代码构建一个1024*1024的颜色矩阵,秀出你的编程&艺术之美 起源于 stackexchange 上的一个问题, 这里稍微做了一下扩展,支持更多编程语言,并放宽了代码长度的限制. 规则 目标: 通过实现 模版 中的一个函数 get_color_at(x, y) ,在一个 1024*1024 的画布上画出尽可能 "有意思" 的图案. 参数: int x, int y ,取值均为 0 - 1023,对应画布上坐标点,左上角为起始点 (0,0) 返回: in

c语言-以下异或加密代码提示一个奇怪的问题,数字上的错误后缀

问题描述 以下异或加密代码提示一个奇怪的问题,数字上的错误后缀 void EncryptXOR (long s[8]) { char key[4] = { 'mque' }; int a[4],b[4]; for (int i= 0; i<= 3; i++) { a[i] = int(s[2i+1] * 16 + s[2i]); } for (int j = 0; j <= 3; j++) { b[j] = a[3-j] ^int( key[j]); printf("%c"

使用70行Python代码实现一个递归下降解析器的教程_python

 第一步:标记化 处理表达式的第一步就是将其转化为包含一个个独立符号的列表.这一步很简单,且不是本文的重点,因此在此处我省略了很多. 首先,我定义了一些标记(数字不在此中,它们是默认的标记)和一个标记类型:   token_map = {'+':'ADD', '-':'ADD', '*':'MUL', '/':'MUL', '(':'LPAR', ')':'RPAR'} Token = namedtuple('Token', ['name', 'value']) 下面就是我用来标记 `expr`

日历-两个js代码放在一个页面中冲突

问题描述 两个js代码放在一个页面中冲突 <script> $.fn.smartFloat = function() { var position = function(element) { var top = element.position().top, pos = element.css("position"); $(window).scroll(function() { var scrolls = $(this).scrollTop(); if (scrolls &

Kickstarter上有款名为Noke的众筹项目很有意思

摘要: 根据slashgear的报道,Kickstarter上有款名为Noke的众筹项目很有意思. Noke是一款 蓝牙智能挂锁 ,它的外部没有任何物理按键,解锁则是通过智能手机来实现的.Noke提供了适配的Android和 根据slashgear的报道,Kickstarter上有款名为Noke的众筹项目很有意思. Noke是一款蓝牙智能挂锁,它的外部没有任何物理按键,解锁则是通过智能手机来实现的.Noke提供了适配的Android和iOS应用,配对完成后用户就可以为每把门锁指定一个ID. 项目

招行前行长马蔚华:我也用余额宝 每天看收益很有意思

永隆银行董事长(招行前行长)马蔚华:我也用余额宝理财我也试了一下,放几千元在 里面.挺有意思的,每天都能看到你的钱增加了多少,确实是大家很喜欢的东西.利率管制不会太久,将来要放开,但余额宝的出现会倒逼银行提前进入状态.本报讯(记者王鹤.李婧暄.刘冉冉.廖靖文.贺涵甫)"我对互联网金融一向都很支持."昨日 下午, 全国政协委员.永隆银行董事长马蔚华接受本报记者专访谈起了最近大热的互联网金融.他说,他 看好互联网 金融发展,自己也用几千元尝试了余额宝理财,每天能看到收益很有意思.看好互联网