这篇文章介绍了一个名为 SACS 的新项目,它的核心任务是制造一份“代码坏味道”的教科书,用来训练人工智能(AI)去自动发现软件中的问题。
为了让你更容易理解,我们可以把写软件比作盖房子,把“代码坏味道”(Code Smell)比作建筑里的隐患(比如承重墙没砌好、房间布局太乱、或者把厨房建在了卧室里)。
以下是这篇论文的通俗解读:
1. 为什么要造这个数据集?(痛点)
- 现状:软件用久了,里面会积累很多“坏味道”(比如一段代码太长、一个类太复杂)。这些隐患会让软件很难维护,就像老房子容易塌一样。
- 难题:现在大家都想用 AI(机器学习)来自动发现这些隐患。但是,AI 需要大量的“教材”来学习。
- 困境:
- 人工造教材太慢太贵:让资深程序员像挑刺一样,一个个去检查代码,既费时间又费钱,而且不同人挑刺的标准可能不一样(有人觉得是病,有人觉得没事)。
- 机器自动造教材太假:如果让机器随便改代码来制造“坏味道”,虽然快,但造出来的东西可能不像真的“病”,AI 学了之后会学歪。
2. 他们是怎么解决的?(SACS 的半自动魔法)
作者想出了一个"半自动 + 人工把关"的聪明办法,就像开了一家"代码体检中心":
第一步:机器“故意搞破坏”(自动生成)
- 做法:他们写了一套规则,让机器在原本健康的代码里“故意”制造坏味道。
- 比喻:就像为了教医生识别“骨折”,故意把几根健康的骨头(代码)用胶水粘在一起(合并方法),或者把两个房间(类)强行打通。
- 针对三种“病”:
- 长方法 (Long Method):把好几个小功能强行塞进一个函数里,让它变得像一条超长面条。
- 大类 (Large Class):把几个小类合并成一个超级大胖子类。
- 特征依恋 (Feature Envy):把一个本该在 A 房间做的事,硬塞到 B 房间去做(比如把“计算折扣”的逻辑硬塞进“用户”类,而不是“订单”类)。
第二步:机器“快速初筛”(分组策略)
- 做法:机器造出来的东西,不一定都是“真病”。他们用了几个简单的尺子(代码指标,比如代码行数)来把样本分成两堆:
- A 组(自动通过组):机器一看,这代码行数多得像座山,或者少得像根针,毫无疑问是“病”或“健康”的。这部分直接入库,不用人看。
- M 组(人工复核组):机器拿不准的,比如代码长度在“尴尬区”的。这部分被挑出来,交给人类专家。
- 比喻:就像安检机。行李里全是水的(明显安全)和全是铁块的(明显危险)直接放行或扣留;只有那些形状奇怪、看不清楚的,才需要安检员人工开包检查。
第三步:专家“精准诊断”(人工审核)
- 做法:人类专家只盯着那部分“拿不准”的 M 组样本。
- 他们使用作者专门开发的一个IDE 插件工具(就像给程序员装了个“透视眼镜”),在写代码的软件里直接打勾或打叉。
- 专家不仅确认这是不是“病”,还要指出“怎么治”(比如:哪几行代码该切出来?)。
- 比喻:老医生只负责看那些 X 光片上模棱两可的病例,确诊后开出“手术方案”(重构建议)。
3. 成果是什么?(SACS 数据集)
通过这个方法,他们造出了一份巨大的开源数据集,叫 SACS:
- 规模大:包含超过 10,000 个标记好的“坏味道”样本(针对三种主要类型)。
- 质量高:既有机器的大规模生产,又有人类的精准把关,比纯人工快,比纯机器准。
- 公开:就像把这本“坏味道教科书”免费发给了全世界,让其他研究者可以用它来训练更聪明的 AI。
4. 总结与比喻
想象一下,以前我们要教 AI 识别“坏苹果”:
- 纯人工:雇 100 个人,一个一个拿起来闻、摸、看,累死且慢。
- 纯机器:拿个机器把苹果捏扁,说“看,这是烂苹果”,但捏扁的苹果和真的烂苹果不一样,AI 学傻了。
- SACS 方法:
- 机器先把苹果捏得特别扁(明显烂)和特别圆(明显好)的挑出来。
- 把那些“有点扁但又不像烂”的苹果,交给几个老果农(专家)快速看一眼。
- 最后,我们得到了一大筐既多又准的“坏苹果样本”,用来训练 AI 成为“苹果质检员”。
一句话总结:
这篇论文发明了一套"机器制造 + 人工精修"的流水线,高效地制造了大量高质量的“代码坏味道”样本,让 AI 能更好地学会如何发现并修复软件中的隐患。
以下是基于论文《SACS: A Code Smell Dataset using Semi-automatic Generation Approach》的详细技术总结:
1. 研究背景与问题 (Problem)
- 核心挑战:代码异味(Code Smell)是软件重构中的关键挑战,指示潜在的设计或实现缺陷,会降低软件的可维护性和演化能力。近年来,基于机器学习(尤其是深度学习)的代码异味检测研究日益流行,但缺乏高质量、大规模的数据集是主要瓶颈。
- 现有方法的局限性:
- 纯人工构建:虽然标签质量高,但极度依赖开发者的经验和时间,成本高昂,难以扩展至大规模数据集,且不同标注者之间可能存在不一致性。
- 纯自动生成:虽然效率高、规模大,但生成的样本标签可靠性低,数据质量无法保证(例如,自动生成的“坏”代码可能并不真正符合异味特征,或从高质量开源项目中提取的“好”代码可能仍包含未被发现的异味)。
- 研究目标:解决上述矛盾,探索一种**半自动(Semi-automatic)**生成方法,以构建大规模、高质量的代码异味数据集。
2. 方法论 (Methodology)
论文提出了一种名为 SACS 的半自动数据集生成框架,主要包含三个核心步骤:
3.1 数据样本自动生成 (Step 1: Automatic Generation)
利用预定义的规则,从开源代码库中故意制造(Intentionally Create)带有代码异味的软件实体,作为正样本:
- 长方法 (Long Method):识别三种方法调用模式(直接调用、赋值调用、表达式内调用),将子方法合并到父方法中,从而生成过长的方法。
- 大类 (Large Class):基于重构策略(如提取类、提取超类),将父类合并到子类,或将被引用的类合并到宿主类,从而生成过大的类。
- 特征依恋 (Feature Envy):识别相关类(父类、属性所属类、参数类),将方法移动到相关类中,制造“方法过度依赖外部类数据”的现象。
3.2 数据样本分组 (Step 2: Data Sample Grouping)
为了减少人工标注的工作量,利用软件指标将生成的样本和原始样本分为两组:
- A_Group (自动接受组):根据指标判定为“极大概率是异味”或“极大概率不是异味”的样本,直接纳入最终数据集,无需人工干预。
- M_Group (人工审核组):指标处于“模糊区间”的样本,需要人工进行验证。
- 分组规则示例:
- 长方法:基于代码行数(LOC)设定阈值(如 15 和 30 行)。超过 30 行的合并方法直接接受,15-30 行之间的合并方法或原始长代码进入人工审核。
- 大类:基于 LOC、方法数(NOM)、属性数(NOA)设定阈值。
- 特征依恋:基于自定义指标 NFDI(外部数据调用次数)设定阈值。
3.3 人工检查与标注 (Step 3: Manual Checking)
针对 M_Group 中的样本进行人工验证:
- 审核内容:确认样本是否确实存在代码异味;如果存在,确定具体的重构操作(如提取哪些行、移动到哪个类)。
- 工具支持:开发了一个基于 JetBrains IDE 的插件作为标注工具,提供结构化的审核指南,提高标注效率和一致性。
- 人员:由具有 8 年以上经验的 Java 开发者进行标注。
3. 关键贡献 (Key Contributions)
- 提出半自动生成框架:结合了自动生成的效率(大规模数据)和人工验证的质量(高可靠性),有效平衡了数据集的规模与质量。
- 构建 SACS 数据集:
- 发布了开源数据集 SACS,涵盖三种广泛研究的代码异味:Long Method(长方法)、Large Class(大类)、Feature Envy(特征依恋)。
- 每个类别包含超过 10,000 个标注样本(正样本 + 负样本)。
- 数据集基于 16 个开源 Java 项目构建(10 个用于训练,6 个用于评估)。
- 工具与流程升级:
- 改进了生成算法,支持更多类型的异味生成。
- 开发了专用的 IDE 标注插件,支持远程协作和高效标注。
- 建立了结构化的审核指南,规范了人工验证过程。
4. 实验结果与数据集概况 (Results)
- 数据规模:
- 训练集:包含约 20,000 个样本(通过半自动方法生成并经过人工筛选)。
- 评估集:包含约 20,000 个样本(完全通过人工检查构建,用于验证)。
- 总体分布:
- 长方法:正样本 5,120,负样本 49,991,总计 55,111。
- 大类:正样本 3,376,负样本 9,722,总计 13,098。
- 特征依恋:正样本 4,726,负样本 12,578,总计 17,304。
- 数据来源:包括 JEdit, RxJava, Junit4, Mybatis3, Netty 等 16 个知名开源项目。
- 可用性:数据集已开源发布(GitHub:
Bankzhy/GCSM_Dataset),标注工具也已开源。
5. 意义与未来展望 (Significance & Future Work)
- 学术价值:SACS 提供了一个大规模、公开可用的基准(Benchmark),填补了当前深度学习模型在代码异味检测领域缺乏高质量训练数据的空白。
- 实际应用:该数据集将促进代码异味自动检测和自动化重构工具的研究与发展。
- 局限性:
- 分组规则可能导致少量错误样本混入。
- 人工标注过程中仍存在一定的主观不一致性(未采用交叉验证以节省时间成本)。
- 未来方向:
- 引入更多开发者参与标注以扩大规模并减少偏差。
- 将半自动生成方法推广到更多类型的代码异味。
- 进一步优化阈值设定和分组规则以提高数据可靠性。
总结:该论文通过创新的半自动策略,成功解决了代码异味数据集构建中“规模”与“质量”难以兼得的难题,为软件工程和机器学习领域的交叉研究提供了重要的基础设施。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。