从访谈定性编码到 GitHub 数据挖掘:CMU 17-803 软件工程实证研究方法论入门
在计算机自学指南(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 方向)论文的常见范式,也解释了为什么课程难度被定为三星但信息密度极高。
为什么实证研究对软件工程师不可或缺
仓库文档用一段论述解释了这门课存在的根本理由:计算机领域在传统上更注重工程技术,但对于工具、技术的设计、评估及其可能的社会价值来说,实证研究是必需的。
这段论述指向三个具体应用场景:
- 评估新算法或新技术框架:新工具声称"更好",但好在哪里、对谁好、在什么场景下好?这需要设计对照实验或分析真实使用数据来回答;
- 对某个领域做相关数据分析:例如通过挖掘开源仓库数据了解某类缺陷的分布规律,或量化某项实践的普及程度;
- 理解从业者面临的真实挑战:很多技术选型失败并非技术不行,而是没有理解使用者的工作流与约束——这恰恰是访谈与调查方法最能发力的地方。
也就是说,这门课补的是传统 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 资源仓库,本课程用到的全部资源与作业资料都汇总其中,可作为自学的统一入口。
说明:上述站点均为课程教师公开维护的免费学术资源,自学时建议以"课程网站 + 官方资源仓库 + 每讲阅读清单"为主线自行按周推进。
给自学者的三条可执行建议
基于文档信息与课程研究方法特征,给出可落地的自学路径:
- 善用公开学期回放:Spring 2024 的视频播放列表与课程页面同步度最高,建议以此为时间线主线,遇到特定主题(如调查设计、统计建模)再回溯早期学期页面补充;
- 把每讲阅读材料当教材精读:这门课没有正式教材,"读论文 + 听讲 + 动手分析数据"是唯一通道。对每篇阅读材料,至少回答"它用了什么方法、数据从哪来、结论如何被验证"三个问题;
- 用真实仓库练手:自学虽拿不到官方作业,但可以自选 GitHub 上的中大型开源项目,用文档所述的方法链(定性编码 issue 讨论 → 调 API 采数据 → 统计建模 → 社交网络分析)完整走一遍小型实证研究,100 小时的预算足以覆盖这样一个 mini project。
小结
CMU 17-803 是一扇面向"软件工程研究者"的大门:它以访谈、定性编码、调查设计覆盖定性一端,以 GitHub/Stack Overflow 数据挖掘、统计建模、社交网络分析覆盖定量一端,补齐了纯工程视角之外"如何设计与评估"的方法论短板。对于自学计算机的进阶者,它适合在完成 docs/CS学习规划.md 中的系统类课程后作为科研向的延伸选择;其全部课程网站与视频均免费公开,配合官方资源汇总仓库即可低成本启动。
更多关于该模块其他课程的选择建议,可继续阅读 docs/软件工程/6031.md 与 docs/软件工程/CS169.md。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00