首页
/ 从访谈定性编码到 GitHub 数据挖掘:CMU 17-803 软件工程实证研究方法论入门

从访谈定性编码到 GitHub 数据挖掘:CMU 17-803 软件工程实证研究方法论入门

2026-09-07 17:17:31作者:翟萌耘Ralph

在计算机自学指南(README.md)的「软件工程」分类下,绝大多数课程都在教你"如何把系统造出来",而 CMU 17-803: Empirical Methods 反其道而行之——它教你如何用科学方法去研究"造软件的人与过程"。这篇技术指南将以仓库文档 docs/软件工程/17803.md 为主线,完整还原这门 CMU 博士生实证研究课程的教学定位、方法与工具全貌、资源获取方式,并结合其在自学规划中的位置给出选课与学习建议,帮助你判断这门课是否适合纳入自己的自学路线。

课程档案:定位、先修与投入

先从课程档案入手,快速建立整体认知:

  • 所属大学:CMU(卡内基梅隆大学)
  • 先修要求:面向从事软件工程实证研究的博士生开设,没有硬性先修要求,但最好具备一定的计算机基础
  • 编程语言:不限
  • 课程难度:🌟🌟🌟(三星,中等偏上)
  • 预计学时:100 小时

两个需要特别留意的信息点:

第一,课程目标人群是"博士生"。这意味着它不以某个具体编程技术栈为纲,而是以"做研究"为纲,对学习者的抽象思维、统计素养和文献阅读能力有隐性要求,不是一门给初学者的保姆式课程。

第二,编程语言不限。因为课程重心在研究方法本身,而不是实现某个系统;无论你惯用 Python、R 还是 Java,都能参与到数据采集、统计分析和可视化的作业中。

这门课到底在教什么:软件工程实证研究的完整方法链

仓库文档对课程内容给出了明确的概括:涵盖定性方法定量方法两大阵营,包括访谈、定性编码、调查设计以及多种统计数据分析方法。展开来看,这是一条从"人类行为"到"可验证结论"的完整研究方法链:

定性研究:访谈、定性编码与调查设计

软件工程研究的研究对象往往是"人"——开发者如何协作、为什么采用或弃用某项技术、开源社区的治理规则如何形成。回答这类问题不能只靠跑实验,需要定性方法:

  • 访谈(Interviews):通过半结构化访谈从从业者处采集一手经验,理解其面临的真实挑战与决策动机;
  • 定性编码(Qualitative Coding):将访谈记录、issue 讨论、邮件列表等非结构化文本按主题逐级编码归纳,从原始材料中提炼出可复用的概念框架,这是扎根理论类研究的基本功;
  • 调查设计(Survey Design):在访谈结论的基础上设计大规模问卷,需要注意题项措辞、量表选择、抽样偏差与回收率控制等直接影响结论效度的细节。

定量研究:软件仓库挖掘与统计分析

当研究对象是"代码与协作痕迹"时,课程引入以 GitHub 和 Stack Overflow 为代表的软件存储库数据挖掘

  • 仓库数据挖掘(Mining Software Repositories):利用 GitHub API 采集 commit、PR、issue、star 等开发行为数据,从 Stack Overflow 采集问答文本,进而整合成研究数据集;
  • 统计建模(Statistical Modeling):对采集到的观测数据建立统计模型,控制混杂变量,检验变量间的相关乃至因果关系;
  • 社交网络分析(Social Network Analysis):将开发者之间的协作、依赖与沟通关系建模为网络图,分析其中的结构特征(如中心性、社区划分),回答"协作结构如何影响软件质量与开发效率"这类问题。

一个典型的课程项目路径可以是这样:先通过访谈识别开源维护者流失的候选原因 → 用定性编码把访谈材料结构化 → 基于 GitHub API 采集跨项目的贡献者行为数据 → 用统计模型检验假设 → 用社交网络分析刻画项目内部的协作结构。这条链路正是当今软件工程顶会(如 FSE、ICSE、MSR 方向)论文的常见范式,也解释了为什么课程难度被定为三星但信息密度极高。

为什么实证研究对软件工程师不可或缺

仓库文档用一段论述解释了这门课存在的根本理由:计算机领域在传统上更注重工程技术,但对于工具、技术的设计、评估及其可能的社会价值来说,实证研究是必需的。

这段论述指向三个具体应用场景:

  1. 评估新算法或新技术框架:新工具声称"更好",但好在哪里、对谁好、在什么场景下好?这需要设计对照实验或分析真实使用数据来回答;
  2. 对某个领域做相关数据分析:例如通过挖掘开源仓库数据了解某类缺陷的分布规律,或量化某项实践的普及程度;
  3. 理解从业者面临的真实挑战:很多技术选型失败并非技术不行,而是没有理解使用者的工作流与约束——这恰恰是访谈与调查方法最能发力的地方。

也就是说,这门课补的是传统 CS 教育中最容易被忽视的一环:"造出东西之后,如何严谨地证明它有价值"。它扩展并补充了纯技术视角的不足,对于计划从事软件工程相关科研方向的学习者,是一个很好的入门切口。

在自学指南中定位:与同目录课程的互补关系

docs/CS学习规划.md 的「软件工程」模块中,作者把该分类下的课程划分为"入门课"与"专业课"。本文主题课程位于 mkdocs.yml 的「软件工程」导航分组中,与该模块另外两门课程形成互补:

课程 文档 核心关注点
MIT 6.031: Software Construction docs/软件工程/6031.md 以 Java 为载体的高质量代码构造:写不易出 bug、易懂、易维护的代码
UCB CS169: Software Engineering docs/软件工程/CS169.md 敏捷开发 + Software as a Service,用 Ruby/Rails 实践云上软件交付
CMU 17-803: Empirical Methods docs/软件工程/17803.md 用定性与定量方法研究软件工程本身,是研究方法论而非工程技法

三者的关系可以这样理解:6.031 解决"单兵怎么写好代码",CS169 解决"团队怎么高效交付软件",而 17-803 解决"怎么严谨地研究上面两件事中的现象与规律"。如果你计划走科研路线,建议在具备一定的代码量与系统课程基础后,再学习实证方法课,避免因缺少对"研究对象"的直接经验而难以理解方法适用场景。

资源获取与自学实操建议

仓库文档给出资源清单,整理如下:

  • 课程网站:Spring 2024、Fall 2022、Spring 2021、Fall 2018 等各学期页面均已开放,可直接访问对应学期的 syllabus、每讲主题与作业安排;
  • 课程视频:Spring 2024 有完整的 YouTube 播放列表,Fall 2022 亦提供录像,完全免费;
  • 课程教材:未公开正式教材,但每节课前都会布置阅读材料——这是本课程学习的最核心输入,需要认真研读;
  • 课程作业:未对外开源;
  • 资源汇总仓库:授课教师 Bogdan Vasilescu(实证研究与开源软件研究方向的知名学者)维护了 empirical-methods 资源仓库,本课程用到的全部资源与作业资料都汇总其中,可作为自学的统一入口。

说明:上述站点均为课程教师公开维护的免费学术资源,自学时建议以"课程网站 + 官方资源仓库 + 每讲阅读清单"为主线自行按周推进。

给自学者的三条可执行建议

基于文档信息与课程研究方法特征,给出可落地的自学路径:

  1. 善用公开学期回放:Spring 2024 的视频播放列表与课程页面同步度最高,建议以此为时间线主线,遇到特定主题(如调查设计、统计建模)再回溯早期学期页面补充;
  2. 把每讲阅读材料当教材精读:这门课没有正式教材,"读论文 + 听讲 + 动手分析数据"是唯一通道。对每篇阅读材料,至少回答"它用了什么方法、数据从哪来、结论如何被验证"三个问题;
  3. 用真实仓库练手:自学虽拿不到官方作业,但可以自选 GitHub 上的中大型开源项目,用文档所述的方法链(定性编码 issue 讨论 → 调 API 采数据 → 统计建模 → 社交网络分析)完整走一遍小型实证研究,100 小时的预算足以覆盖这样一个 mini project。

小结

CMU 17-803 是一扇面向"软件工程研究者"的大门:它以访谈、定性编码、调查设计覆盖定性一端,以 GitHub/Stack Overflow 数据挖掘、统计建模、社交网络分析覆盖定量一端,补齐了纯工程视角之外"如何设计与评估"的方法论短板。对于自学计算机的进阶者,它适合在完成 docs/CS学习规划.md 中的系统类课程后作为科研向的延伸选择;其全部课程网站与视频均免费公开,配合官方资源汇总仓库即可低成本启动。

更多关于该模块其他课程的选择建议,可继续阅读 docs/软件工程/6031.mddocs/软件工程/CS169.md

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388