第一讲
中上:收集数据(比如挖掘数据,etc)。
右中:分析数据:收集了数据自然要分析。定量:计算 定性:理解人们在说什么。
中下:解释数据:从数据科学的分析结果到软件工程方面的信息,我们需要知道某个特定的变量对整个软件工程的影响。
左中:干预、推荐:通过软件工程方面的信息给出建议,如何改进工程。
我们通过软件开发中观察到的现象及对其进行的分析来改进软件开发过程,我们希望通过数据科学的角度获得软件工程中什么有效,什么无效的经验证据。我们的研究基于软件工程,但我们的工具来自于数据科学。
我们为什么需要证据?什么是经验证据?
许多程序基于开发人员的想法。我们很多时候是基于“这个问题理想情况下应该如何解决”,而不是“实际上来说,这个问题在当前环境下应该如何解决”。
1. Rationalism vs Empiricism
在计算机中,Rationalism 直觉、推理
Empiricism 观察
经验主义认为观察是知识的唯一明确来源。推理、直觉可以是想法的来源,但必须要通过观察验证。
在软件工程中,这是指,研究者更侧重于描述当前这个工程是如何开发的,并就此提出更好的建议(开发过程和结果)。而不是直接去描绘最理想的状态下工程是如何进行的。
理性主义
理性主义认为知识只能靠推理和直觉获得。一些理性主义者也认为知识可以通过观察获得,但这种观察获得的知识要明显差于推理获得的知识。
V模型:软件应该如何开发。不是基于观察的结果,而是基于推理应该如何做。
经验主义者会认为开发人员很少按照预期一般使用方法。经验主义者会认为没有问题,有的只是某个环境下某些人认为有问题的东西。
理性主义者会使用规范的做法,而经验主义者会讨论软件是如何开发的。
……不过即便如此,我们问出的问题也不一定可以通过理性主义或是经验主义范式来回答。
这是一个合适的经验主义问题吗?——第一课。
如果我们需要推理,而不是只从观察角度就能解决问题,那么就不是一个实证研究的问题。
如果我们需要“设计”某种东西,那么这就不是一个关于知识的问题,而是如何正确创造事物的问题。
在本课程中,我们会主要讨论经验主义。只有吃了布丁才能知道布丁怎么改进。
经验主义研究者不会提供解决方案,而是会提出问题,收集信息,分析信息。
我们会主要研究如何收集数据、如何分析数据。
最常见的问题往往很好由开发者解决。
而最有影响力的问题往往并不好由开发者解决。
软件存储库并不一定总是issues、软件这样的,也可以是应用商店。
自我报告是不可靠的,需要与数据对比。
民族志:研究者全身心地投入到某一个地方,并识别出某种东西。
open coding:分析任意格式文本的含义。
任何经验研究需要记住的:你的受益人是谁、你想提供怎样的建议、基于这两点你要使用怎样的数据、你要如何收集数据、你要如何分析数据。
数据分析方法:仓库调研、采访、实地调查、民族志……
数据分析:统计分析、可视化、机器学习、开放式编码
第二讲
探讨我们如何制定研究问题,研究问题应被如何制定,包含什么,用什么研究方法进行研究。
理解批评者为什么会批评,并找到证据支持自己想法。
减少模糊的假设。如何衡量?人们如何感知?metric是否合适?
我们如何提出研究问题?
模糊性是我们关心的问题之一,但是我们还有很多别的东西要关心。
探索性问题
1. 那里的东西是否存在?
2. 那里的东西是什么样的?
3. 它和我们之前知道的东西有什么不一样?
(1). 在文件导航中,效率是否是一个问题?
(2). 我们如何衡量文件导航中的效率?
(3). 鱼类视图导航和传统文件导航有什么区别?(我们在这里并不是讨论效率,而是两件事‘本质’上的区别)
如果我们对软件做经验研究/实证研究,我们需要知道新工具和旧工具具体有什么不一样。
(base rate:对于fish eyes viewer这个问题,我们比较的是新工具和旧工具本身之间的区别,还是新工具和对旧工具解决方案的问题?这里有细微的区别,比如可能已经有人提出了某种对于旧工具的新方法,这显然也是一种新的解决方案?)
(明希豪森三难困境?——我们怎么确定一个问题是良定义的?)
我们也可以注重变量之间的关系。(可视化类型和效率)、(海拔与地震概率的关系)。
相关性不代表因果性。在软件工程中我们需要非常小心地区分相关性和因果性。
我们还需要常常考虑基准率,特别是对于那些没有说明基准率的提升问题而言。
不同的问题需要不同的研究策略——什么是研究策略?
问题(是否存在,有什么影响……)->策略->方法(采访、仓库挖掘、调查问卷……)
基本上来说,只要我们试图回答一个问题,我们就总得先选择一个策略。对于每个策略,你有若干个方法可以使用。
但在我们探讨具体的策略之前,我们先看看我们希望得到什么样的答案。
如果我们对一种非常一般的模型得到一些结论,我们可以期望这些结论大体上适用于许多具体、符合模型的事物。但同时这种结论会很浅薄,而且不一定有用。
对于更具体的东西,我们可以获得更具体的结论。但这也会意味着我们得到的结论只适合这辆汽车,我们无法进行泛化。
模拟器——我们能够控制一些我们在现实中无法控制的参数,但不够拟真。
警察检查司机的行为——我们无法控制参数,但我们能够观察到特定的行为。
natural:自然情况,具象但不可控(实地研究、实地实验)
contrived:受控情况,可控但不现实(实验模拟、实验室实验)
neutral:汽车之间的区别被忽视的情况,通用但不缺少具体细节(判断研究、样本研究)
non-empirical:现实,但并不一定基于观察的情况(形式理论、计算机模拟)
Natural/自然情况
区别:是否刻意的改变了环境中的一些情况(变量)。
Field Study/实地研究
主要目标:在保证引入研究人员尽量不影响环境的情况下,对现实情况进行研究。主要优势是基于现实。
可以容忍收集数据不得不进行的环境扰乱,但不能更多。可以促进对自然环境下的现象和物体的研究。主要基于观察。
常见相关研究方法:人群志、观察性研究、部分案例研究。
例子:加入一个公司并体验员工生活。
大部分情况下收集到的数据是定性的。
实地研究给我们提供了最大限度的真实性和大量的数据。但是,没有统计学意义上的普遍性,没有对研究中事件的任何控制,测量的精度很低。
通常在研究的探究(exploratory)阶段进行,形成关于正在发生事情的第一批假设。
如果有通过某种实验进行研究而非单纯的收集数据,那么就已经影响到了环境,要排除这一项。
Field Experiment/实地实验
主要目标:在允许研究人员在一定程度上影响环境的情况下,在真实世界、已经存在的环境中进行研究,通常是比较性研究。
实地实验给了我们最大限度的真实性和大量的数据。但是,还是没有统计学意义上的普遍性,测量的精度很低。
常见相关研究方法:案例研究、研究实验和行动研究。
Contrived/人为情况或受控情况
Experimental simulation/实验模拟
环境可以是虚拟的或是真实存在的,但是往往是专门为了研究目的而创建的,并非真实的环境。
其主要目的在于创建某种类似真实环境的环境,研究参与者在能在一定程度上代表现实的受控环境中的行为。
常见相关研究方法:模拟游戏、管理游戏都是实验模拟环境。
(1)采访+观察研究了解决策是如何做出的 (2)创建模拟环境,验证是否与观察/采访结果符合
实验模拟给了我们一定程度的真实性,环境几乎与现实相同,而允许研究人员影响感兴趣变量的因素。但是,由于试图模拟某一特定的情况,所以普遍性要低许多,此外,由于毕竟是人工的受控环境,所以并不那么贴合现实情况,而且研究人员本身也会相比起前面的两种方法更多的影响模拟。
Labortory Experiment/实验室实验
一个完全是为了给研究人员实验创建出来的环境,完全受控,对所有变量的控制都很强。与实验模拟的区别在于,实验模拟试图模拟一个类似于真实的环境,但实验室实验并非如此——所有参与者都清楚实验室内发生的事情并非真实情境下对应的情况。通常用来证明观测到的变量之间确实存在相关性,甚至可能可以建立因果关系。
Krieger的实验——实验室实验,我们对实验有最大程度的控制,学生是精心挑选的,尽可能多的变量被确保相同,以保证只有某一个方面(在本例中是写代码和写句子)之间不同。
实验室实验可以用于建立因果性,我们在实验的过程中尽可能地排除所有其他可能造成影响的变量,只研究两个感兴趣变量之间的关系。但是,实验室实验是由人工控制的,因此其做出的环境是高度人为、非现实的环境,因此完全不贴合现实,我们之前有的所有好因素,比如能收集丰富的数据、贴合实际等等,都在此不存在;此外,这个方法是非常简化的,我们在降低现实世界情景的复杂性,直至只剩下两个我们感兴趣变量之间的关系;此外,经常没有什么统计学上的普遍性。
常见相关研究方法:随机对照实验、准实验。
(针对这个实验,其对应的实地实验的版本是什么?在这个问题中,环境是什么?)
题目中没有给出真实的工具的应用环境,而是通过实验的方法进行比较。
Neutral/中立情况
Judgement Study/判断研究
从我们的研究主题中获取信息,评估或研究一个对象。这通常涉及从一组对相关主题有足够了解的人们(我们称为专家)那里收集数据,并要求他们评判、评分某种行为或者软件。
我们尽量真的选取专家,听取他们有理有据的意见,而非任意的听取随机的声音。而且,我们通常会希望听取相同领域下不同专家的意见,以中和背景中的噪音,中立化环境。(比如,如果我们采访飞利浦的员工和小型初创公司的员工,即便他们都是编程方面的专家,但是他们的观点可能很不一样,但我们希望获取能达成一致的那部分意见)
德尔菲法:选取一部分专家,询问意见,整理意见,要求专家给所有意见打分,根据打分再次整理意见,再次询问专家的反思并了解他们是否会改变意见。整个过程中可以重复多次询问专家的意见。
试图找到专家们了解的通用规则,而不是某个特定的人的看法。
判断研究是一种评估式研究:我们在评估某种东西,不管是行为、问题、对象……
判断研究具有普遍性,但不是统计学上的普遍性也不是所有人群的普遍性。我们关心的是专家们的普遍意见,而且它能得到专家们、有影响力人们的意见。但是,这种研究方法完全没有考虑特定的情况,所以对于任何通用结论是否在某一特定情况下成立的担忧都可能被用来攻击你的策略,此外,我们只有有限的控制力,我们只能收集意见,我们无法影响、创造、操纵这些意见或是这些人。
常见相关研究方法:德尔菲法、访谈、焦点小组(如果无法一对一的对每个人进行访谈,可以组织小组会议)。
Sample Study/样本研究
从我们的研究主题中获取信息,评估或研究一个对象。不过,在样本研究中,我们希望听到所有的声音,而非仅仅专家的声音。我们希望了解到我们研究的问题中的总体模式。
样本观察和调查本质上都是样本研究:希望从中得到某种可以推广到总体的结论。
样本研究具有对所有人群的普遍性;统计人员容易获取大量样本进行研究。但是,我们获得的数据就只是数据,我们无法对其进行任何控制;对于样本的研究,我们要对深入研究某些样本和对所有样本进行总体的研究之间取舍。
常见相关研究方法:调查、访谈、仓库挖掘。
可以将样本研究视作一种试图抹除环境,以得出能推广结论的策略。
Non-empirical/非经验情况
Formal Theory/形式化理论(方法)
并非经验策略。
希望我们就某一个主题开发概念、框架和理论。重点在于制定概念和解释之间的关系以适用于各种状态。
可以基于经验研究,但其本身并不是经验研究。它试图将观察结果和观察结果中蕴含的内部信息提升到更高的抽象层次。
通常形式化理论的真实性比较低,因为他们并不是基于具体的背景,而且我们通常不会去操纵任何东西,所以并非经验性的研究。
形式化理论具有高度的普遍性(可推广性),注重于从理论中能够得到的假设,并在后续步骤中验证是否正确。但是,由于高度的抽象性,策略本身与实际情况往往没什么关系,特别是因为其不涉及什么具体的情况,只涉及抽象的概念,此外,也没有对变量的控制。
常见相关研究方法:概念推理、构造假设。
Computer Simulation/计算机模拟
并非经验方法。在计算机模拟中,没有真实的环境、没有真实的参与者、没有对真实世界的记录(即便我们在计算机模拟前做了记录也如此)。
通常来说,计算机模拟被用来模拟某种,含有大量复杂场景需要进行评估,的某种现象。
与实验模拟情况类似,数据来源于之前的观察,但是实验模拟最终会有真实世界发生的事情,而计算机模拟并没有真实世界发生的事情。
计算机模拟可以很容易的评估许多复杂的场景。但是,结果取决于我们的模型如何,结果没有普遍性(因为是模拟的,我们不知道模拟和现实之间的界限在哪里),此外我们也没有办法对(希望模拟的)变量进行操纵。
常见相关研究方法:软件开发过程本身。
如果我们需要进行贴近现实的观察,进行实地研究。如果我们需要得到某种非常有推广性的结论,进行取样研究和形式化理论。如果我们需要测量变量之间的关系,进行实验室实验。
一种策略很可能包含多种研究方法,一般是希望我们能抵消某些研究方法的缺点。
调查问卷定性+仓库挖掘确认,顺序探索策略。
仓库挖掘观察问题+调查问卷解释问题的原因/解释,顺序解释策略。
从多个方法研究某个问题,三角校验策略。
第三讲
讨论数据收集技术。减少数据、人数、项目的规模到一个我们可以管理的程度,这种方法我们称之为抽样。
更正式的定义:抽样是指我们从一个大的、我们感兴趣的集合中选择一个较小的集合的过程。较小的集合称为样本,原集合称为总体。
所有研究策略都可以使用抽样。
三种概念:总体(Population)、抽样框(Sampling frame)和样本(Sample)。总体就是指整个群体。整个群体通常可以由某种不完美的列表来表示,这个列表就被称为抽样框架。最后,样本就是基于列表选择的一些实际的人们。
但是在软件工程方面,定义这三个东西是很困难的:假设我们想要研究开源项目,总体可以是一个特别大的数据库,但是我们在抽样框一步就止步不前了——我们并没有一个能够涵盖所有开源项目。而且,即便我们能够有抽样框,考虑github的情况——可能有很多人有小号,有很多项目被forked了,有很多仓库里面其实包含多个项目。在这种情况下即便有抽样框,做抽样依然不容易。
抽样策略:
Non-probabilistic sampling/非概率抽样
convenience sampling/方便抽样(便利抽样)
最易于理解的抽样方式。抽样基于便利、方便、可用性(availability)或经验。比如我们出门在街边找五个普通人做五个访谈就是方便抽样。
优点:不需要抽样框架;‘快、简单。
缺点:没有统计普遍性,很容易得到有偏见的结果。
对于探索性研究来说很常用。在进行方便抽样时,应当考虑要研究的东西是否有普遍性,能用方便抽样将其暴露出来。如果我们要研究认知偏差,那么我们去用方便抽样去抽样一些在临近学校内进行的工程是可以的,即便这些样本可能会涉及更具体的知识。但是如果我们希望探讨某些工程内特有的东西,那么在临近学校内进行的抽样可能就不再合适了。
purposive sampling/立意抽样(有目的抽样)
样本基于可用性以外(不是基于便利性)的某种特征、通常是能让其与研究目的相关的某种特征,选择的。一般是我们选择一个目标,并从中推导出几个可以用来抽样的特征。
特征的选择可以涉及一些逻辑或策略,但是这些逻辑、策略不应该是随机的。目标依然是找到富含信息且比较容易获取的案例。
如果我们需要说明一个抽样是立意抽样,那么我们往往需要说明我们选取特征的逻辑/标准。不过,如果我们有一个标准,但是作者并没有解释标准的选择(比如选择最高的,etc),也算是立意抽样。如果我们期望选取尽量多样化的样本,我们的标准就不再适用于对于单个项目的特征选择而是对于整个数据集的特征的选择。我们称之为异质性抽样(heterogeneity sampling)。特别的,对专家选择的过程也是一种立意抽样,这被称作专家抽样(expert sampling)。
优点:可以让研究人员运用他们的专家判断——因为研究人员了解他们希望研究的项目。研究人员可以保证样本在某些维度的代表性。不需要抽样框架(我们只需要解释理由即可)。
缺点:没有统计学上的普遍性,得到的结论不通用。立意抽样明显有主观性,很多时候取决于研究人员地客观性而非客观情况。
与便利抽样一样,常用于探索性研究和对普遍现象的研究。
snowball sampling/雪球抽样
样本基于它们与之前被选样本之间关系选择。从一个小样本集内开始,然后根据关联性一步一步取得更多的样本。
“将雪球滚大”/“你能否推荐几个你认为合适的受访者?”
常见于文献研究中,常用于补充基于查询的抽样。forward-snowballing: 检查引用已有文献的文献,从中找到与我们感兴趣话题有关的文献,取样。backwards snowballing: 检查被已有文献引用的文献,并从中找到与我们感兴趣话题有关的文献,取样。
停止:只要我们在一轮里通过forward-snowballing和backwards snowballing都找不到相关论文,我们就可以停止。
优点:允许我们超越抽样框架的限制:我们不需要(完美的/不完美的)抽样框告诉我们哪些东西属于总体,能够找到不在抽样框里的样本。 违反了“抽样”的原则,样本应该是随机获取的,而不是滚雪球获得的,因此经典的统计分析技术不适用。
缺点:雪球抽样倾向于选择“万用”的样本,在图中为D1。这会使得我们先滚雪球得到的样本会在至少是一开始主导对现象的普遍看法。
respondent-driven sampling/受访者推动抽样
需要保证每个项目只能被选择一次,以避免让“万用”的样本多次被抽样;同时在多个集合内开始雪球抽样,以避免最早的一个样本集主导对现象的普遍看法。限制每个人招募的人数个数,但增加迭代次数,尽量保证整个拓扑图都被遍历到。最后,让受访者,而非研究人员(减少研究人员的偏见),去招募其他人。
优点:允许我们超越抽样框架的限制:能够找到不在抽样框里的样本。 解决了一般滚雪球抽样的两个缺点。
缺点:违反了“抽样”的原则,样本应该是随机获取的,而不是滚雪球获得的,因此经典的统计分析技术不适用。
注意:如果是受访者推动抽样,那么必须要明确说限制推荐人的个数、限制每个人只会被访谈一次等等。
Probability sampling/概率抽样
基于我们可以从一个列表中随机选择项目这一想法。
我们需要先有一个列表(抽样框),如果没有这个列表我们是不可能做概率抽样的。
我们需要进行随机选择,需要有一个随机数生成器。在街边选择随机路人访谈并不随机,因为你会对行人做访谈,而不是坐汽车的。即便你可以采访到所有路人,你的采访还是会受一天内的时间、一周内的时间、天气等等等等影响。因此,在社交网站上做广告,给人发邮件并不是随机的,比如我们会选择不到不用这些平台的人。
在实验条件而非控制条件下做抽样并不是随机的。
whole frame/全抽样框(作为样本、抽样)
整个框作为样本能否看作一种概率抽样显然有争议。但对于小的抽样框的情况来说,整个抽样还是很有用的。
优点:信息很完全。
缺点:不适用样本很大的情况、不适用于抽样框不可靠的情况。
较差的抽样框为不完整的抽样框,我们不知道缺了什么,但我们怀疑就是缺了点什么、或者不合适的框架,我们知道缺了什么,抽样框和总体差的很大。
如果我们想要得到某种关于全部github库的结论,我们不能只用公开的github库来得到结论,抽样框不合适。
simple random sampling/简单随机抽样
每个抽样框内的项目以均等的概率被选择,项目完全是以平均概率随机选择的。
比如,我们对某个公司做士气调查,在经历了一轮简单的访谈问卷调查后我们没有得到我们想调查的结果,这种情况下显然对每个人做访谈是不太可能的,于是我们给每个人一个编号,比如1-10000,然后我们用随机数产生器产生20个编号,选择20个对应的人进行访谈。
研究人员没有做选择随机样本之外的任何事。
简单随机抽样的一大问题:抽样个数是否足够。
统计学上我们常常需要用总体、置信区间和置信度三个指标来论证抽样个数是否足够。
如果你按照随机做了抽样,那么真实的结果与你的样本之间相差不会超过一个置信度区间。
置信度,有多大把握能说,真实的结果与你的样本之间相差不会超过一个置信度区间。
优点:统计学上有代表性(如果我们做的是对的情况下)。
缺点:当抽样框没有代表性时不能使用(与全框架取样原因一样)。
此外,应当注意概率抽样并不能保证代表性,因为有随机性因素在其中。
比如,可能数据集里没有我们想要的
systematic random sampling/系统随机抽样
抽样分为两个阶段:第一阶段随机选择一个样本,接着我们根据第一阶段的样本通过某种等距方式选择剩下的样本。
常见于时间序列分析。
第一次抽样是随机选择的,剩下的都是系统抽样的。
优点:每个元素被选择几率还是完全相同。
缺点:一致的取样间隔可能与项目本身的间隔过于相似。
“我们每隔若干若干个xxx就抽取一个样本……”
Multi-stage Sampling/多阶段抽样
结合多个抽样策略的策略。
stratified/quota sampling/分层抽样/配额抽样
抽样框会被按比例分为子框架。
如果我们需要研究群体差异,那么我们最好将抽样框分为两个子抽样框,在对子抽样框做抽样。
如果每一个子抽样里是随机简单抽样,那么就是分层随机简单抽样。如果每一个子抽样里是立意抽样,那么就是配额抽样。
如果在每个子抽样中样本有同质性,但是子抽样间不同,那么分层/配额抽样就是很有用的。
优点:小的组也会有机会被展示。
缺点:抽样不具有统计代表性——我们希望听到少数人的声音,我们是刻意让其没有代表性的。
cluster sampling/聚类抽样(整群抽样)
抽样框按组分成子抽样框。与分层抽样刚好相反,群体内不同,但是两个群体总体而言相似。
注意,与分层抽样的区别:分层抽样第一阶段希望我们涵盖所有组,而聚类抽样只随机选择若干个组(如果不是,那么叫自适应的聚类中心,即我们可能在某个子组里抽更多样本)。
优点:我们可以平衡更广和更深抽样之间的矛盾。
缺点:两个群体整体上相似在实践上是很难的。
Panel sampling/面板抽样(固定样本调查)
对固定的调查者进行的长期调查(严格来说不算是“抽”样了)。这个样本第一次如何被选择的则是随便的,可以是任何方法。
Non standard sampling/非标准抽样
各种奇怪的以上皆非的情况。
最常用立意抽样。
第四讲
如何与开发人员交谈,如何进行访谈?
我们为什么想要和人交流?——探索新现象。(exploratory)解释为什么。(explanatory)
如何进行访谈?
最重要的:我们想要问什么?
根据问题种类,采访可以分为结构化访谈、半结构化访谈和非结构化访谈。
结构化访谈
非常明确的目标。
问题几乎完全按照书写下的问题询问,不会出现任何偏差。
定量(是/否、多少、高/中/低)。
分析:适合数据分析、可视化。
但是结构化访谈实际上并不常见,因为如果按照书写下的问题提问,且定量,那么调查问卷会是更合适的方法。
半结构化访谈
一个足够广泛的目标,有目标,但是目标通常是比较广泛的。
会按照书写下的问题询问,但是如果需要,可以问更多的问题。
封闭和开放式问题混合出现。
分析:适合数据分析(封闭式问题)、文本分析(开放式问题)。
经验软件工程中最常见的访谈。
“你认为你遇到的最困难的问题是什么?”不是一个结构化访谈中会出现的问题。
非结构化访谈
没有目标,从一个话题开始。(在极端情况下,甚至不会问任何问题。)
往往是受访者想怎么谈这个话题就怎么谈。偶尔会有一些开放性问题。
分析:适合文本分析。
不常见:代价高昂。
如何提出访谈问题?
访谈问题应该以某种方式从研究问题中推导而出。
可以使用以前的文献提出新的问题。
避免引导性问题。避免不相关的问题。
试点访谈中的信息不能用于最后的结果,因为问题会发生改变。
如何进行访谈?
首先,不可以对同一个人做两次访谈,理想情况下,一切应该从一开始就准确无误。
你想对多少人进行访谈?一般是25-35人。
(类似雪球抽样)
迭代的过程。
选择受访者
我们需要他们的同意。
1. 道德义务。
2. 法律要求。(GDPR)
GDPR六条合法处理数据的基础:
1. 同意(分享个人数据,这也包括代码等等)。 2. 合同(要么是要和你签订的合同,要么是和雇主之间的合同)。3. 法律义务(必须有法律要求)。 4. 切身利益/重大利益(现在立刻保护个人生命)。 5. 公共任务(你需要为公共利益、公共机构执行任务,常用于完全无法取得同意的情况)。 6. 合法权益(对于我们或第三方的合法权益是必要的)。
谁会进行采访?
1个还是2个?具体哪一位研究人员要进行采访?面试者和受访者之间是否相似?
匿名性。感到安全可以分享更多信息。
采访记录
视频、音频、笔记。
一些人不愿意展示自己的真实外表——音频。
这些信息应该如何处理?如何储存?
更丰富的信息——视频。
伦理委员会应当评估总体情况。
1. 逐字转录。
2. 分块转录。
3. 半自动转录。
记住,访谈不仅仅是访谈的问题,更是访谈的整个过程——人、记录……。
第五讲
与访谈一样,调查问卷也是一种和人交谈的方式。
最常用于sample study/样本研究。
survey指的是调查,我们可以调查人或者调查物。调查人的话就是调查问卷。调查物的话就是数据挖掘等等的了。
理想上我们希望听到所有声音……
但实际上不太可能能做到,所以实践上我们希望听到尽可能多的声音。
我们不仅可以对人做调查问卷得到某群人的共性,也可以通过数据挖掘、观察等等得到某群东西的共性。
在做调查问卷时,我们会失去答案的深度和可调整性。1. 我们无法了解到原因、上下文。 2. 问题是预先定义的,我们无法根据人调整问题。
调查可以用于探索性(Exploratory)问题和确认性(Confirmtory)问题。可以先做探索性问题(你想做什么?为什么?)总结,再做确认性问题(是否)进行评估。
由于涉及调查问卷和涉及访谈问题本质上都是对人进行采访,因此设计调查问卷的过程与设计访谈问题的过程类似。
调查问卷里可以有开放式问题(无固定答案),也可以有封闭式问题(有固定答案)。通过开放问题可以一定程度上弥补调查问卷的可调整性不足问题,而封闭式问题更节省人们的时间,更容易获得可比较的答案。
我们要问什么?
需要注意,信念式问题往往不是事实性问题,因为并不是完全基于真实的事实回答的问题,也不是态度式问题,因为没有声明让你反思并表示同意或不同意,也不是经验问题,我们不是在找受访者分享给我们的一个故事。
在提出你自己的问题,请先检查一下已有文献,看看类似的问题是否已经被提出过了。./
人口统计学问题的表述往往是相似的。
先问人口统计学问题的好与坏:易于回答、建立信任。
后问人口统计学问题的好与坏:“他们为什么要在问题后问这些?”、可能导致不满意这些话题的人们不退出(因为已经回答了核心问题)、可能被受访者认为助长刻板印象。
调查问卷应该还是相对较短:5分钟、10分钟、15分钟。除非你能提供某种证据,不然你应该做一份较短的调查问卷。
如何评估调查问卷的质量?
好的问卷应当:
1. 应当清晰。受访者应当理解问题在问什么。
2. 应当全面。问题能够捕捉与问题相关的信息,答案选项应当尽可能完整——对受访者完整,而不是对研究人员完整。
3. 应当可以接受。如果不可接受,受访者就不会被回答问题:调查问卷过长、过度涉及个人隐私、过度不相关。
4. 应当可靠。如果我们让两组相似但不一样的群体做同一份调查问卷,我们应当收到两组相似但不完全一样的结果。(测试-重测、评估者间一致性、编码者间一致性)
5. 应当有效。调查工具应该调查其应该测量的东西,function as it is,你需要论证为什么按照这样调查有效。
如果我们要测的变量会按照(在重测之前的这段时间里)时间变化、会根据仪器变化,那么重测往往不是一个好主意。
如何招募受试者?
你想要招募多少受试者?
置信区间:假设我们根据样本得到的均值是a,但是用样本均值去拟合整个数据集的均值显然很冒失,我们就引入一个范围[a-b, a+b]去估计整个数据集的均值是否在这个区间内,这个区间就叫做置信区间。
置信度就是均值真的在这个区间里的百分比。
回复率。软件工程领域往往要偏低,只有10%-20%。
在做招募时,我们要考虑渠道不同是否会导致不同回复。比如可能reddit招募的人群总体和mailist招募的人群总体不同。
最后,调查问卷是基于人的,因此我们需要获得伦理委员会的批准。
研究策略:顺序解释、顺序探索和三角测量。调查问卷常与数据挖掘结合。
第六讲
调查软件/文物。
经典的研究工作流程:
1. 形成对某个现象的假设(探索性或确认性研究)。
2. 数据收集(数据源->数据选择、数据抽取->数据清洗)。
3. 数据分析。
4. 形成结论。
探索性研究:没有预先假设,做数据挖掘更多的聚焦于观察所有现象。
确认性研究:有预先假设,做数据挖掘更多的聚焦于观察某些特定现象,以验证假设。
数据源
我们有各种各样的存储库、代码库、开放问答网站……
用什么数据源取决于你想做什么。
源代码库
当我们提到源代码库时,我们实际上谈的是版本控制系统,存储源代码并捕捉其演变的版本控制系统。
Bug追溯系统
存储、检查bug的系统。
Github issues、BugZilla……
开发人员交流的网站
人们如何交流的。
Github、邮件列表、IRC、Slack……
代码检查库
当我们对代码做更改的时候,会有其他开发者检查代码质量和问题,或者有自动化软件检查代码。
Gerrit、Github……
问答网站
StackExchange、Stackoverflow。
虽然我们常常说的是代码挖掘,但我们实际上挖掘的可以是各种平台的信息。具体挖什么主要取决于我们的研究目标。
数据选择及抽取
我们想开始收集数据,但我们要先知道我们要研究什么类别的东西。
最右侧如果依然是No,那么我们就有大麻烦了……
Github awesome lists msr。
PyDriller。
GrimoireLab——泛用挖掘器。
如果我们没有办法获取数据?
可能不是你寻找的数据?——重新考虑你的方法,你的研究问题。
如果确实是我们想要的数据,联系相关社区,进行采访、调查和受控实验以收集数据。
我们需要检查已有的数据集、工具,确保我们能够收集到我们需要的所有信息以完成研究目标。我们还需要考虑是否要调整已有工具甚至自行搭建工具。
数据清洗
数据清洗是检查、纠正和消除噪音和有问题数据的过程。
进行数据清洗能让我们消除噪音,消除误差,以免出现不正确的结论。
1. 根据众所周知的文献清除掉众所周知的噪音。
2. 自行调查我们的数据集消除掉独有的噪音。
此外,以Github为例,我们可能会在仓库中发现学生项目、个人存储库……
有一些噪音可能我们无法处理,此时我们需要引入偏差并报告。不过如果我们能处理噪音,那么应该尽量处理。
机器人动作可能是噪音。
我们需要验证我们的方法是否可信。
数据永远只是一部分,记得也要看人的那部分。
第七讲
实验室实验——受控实验。
independent 独立变量、自变量。
dependent 因变量。
参数(parameters):可以在实验过程中固定值的变量。
我们固定参数就意味着损失一部分普遍性。
A/B测试:通过产生随机数A、B将用户分成两组进行实验。
A/B测试对人做而不是通过人对项目做:人会积累疲劳、耗时,人在过程中可能会学会一些模式导致结果不准。
第八讲
数据分析:定量分析。核心在于度量、指标。从软件工程领域到众所周知领域的某种映射。
1. 名目域(nominal domain):标签,(本身)只能用来辨别是否一致。
2. 次序域(ordinal domain):顺序,(本身)无法谈论更具体的定量。
3. 等距域(interval domain)、等比域(ratio domain)、绝对值域(absolute domain):值域。
当人们探讨名目域时,人们通常使用频率和百分比。
当人们探讨次序域时,我们还是可以用饼图和表格,不过我们还可以用条形图,因为条形图可以指示顺序。
需要区分观察到的一致性与偶然性相关——比如投两个硬币一致性也很高。我们需要探讨两个变量是否是完全独立的。(为什么?)
最后结果就是预期一致性(两个变量完全独立的情况下产生的一致结果)和计算一致性之间的差值,这个差值越大越说明我们的结果越好。硬币κ。加权κ。
平均值很容易受到大值的影响,更合适的衡量方法是中位数。同样,四分位距也要比标准差要好。
描述多个变量的情况:散点图。
散点图可能会出现重叠的情况。
改良:六边形图,分块。
我们可以尝试用某种度量表示两个变量之间的一致性,这种度量被称为相关性,皮尔逊积矩相关系数,衡量两个变量之间的线性相关性。
在经过了变换之后,我们也可以计算对应的变量相关性系数。
为什么我们有系数,却不只是报告系数以求简洁呢?为什么我们还要画图呢?
推断性统计:基于样本推测总体的情况。我们需要根据之前的文献、观察数据作出假设,检验假设。
名目域
零假设:$H_0$,默认假设,假设选择的样本不能反映总体的情况。
备择假设:$H_a$,备择假设与零假设形成对比。
例子:
零假设:对emoji的解释与性别无关。
备择假设:对emoji的解释与性别有关。
卡方检验。
假设零假设为真,我们知道此时数据应该的分布。
在零假设为真时,卡方以上的面积与p相比。在本例中,有4.6%(小于p=5%)的概率,零假设在目前的统计数据下为真,故我们选择备择假设。
p的意义是,若零假设为真,我们有p的概率获得当前(或更极端的)结果。
卡方检验的一个假设是每个格子的值应当不小于10,且期望值应当不小于5。如果违反了假设,结果会不准确。
Fisher检验——昂贵。
Fisher检验和卡方检验结果应该近似。
p的阈值是怎么来的?经验概率。通过不同的方法得到同一个结论是很重要的。
序数域:
一般数据来自于调查。“很同意”、“不同意也不反对”算是一种序数而不是绝对值。这源于李克特量表。
Wilcoxon精确值检验。Wilcoxon检验也可以用于值的检验。
尽量避免同时计算多个p值,并根据多个p值做出结论。
这是因为p值的推断是累乘的。如果我们考虑p值为5%,我们依然有5%的可能得到一个两个群体数据并无差异,但在某一例中有差异的情况。
如果我们连做14次,我们就会有大概一半的几率其中至少有一次推断是错的。
要记住,如果我们从多个角度比较同几个群体,我们是增加了推断错误结论的可能性。
等距域、等比域、绝对值域:
平衡假设的强度和结论效力。
参数统计:参数统计法假设样本数据来自一个总体,而这个总体可以用一个具有固定参数的概率分布来充分建模。这是最受限制的选择,假设是最有力的,我们可以推断出最有力的结论。然而,这些假设并不总是有效的。
非参数统计:不做上述假设,但是得到的结论也较弱。
半参数统计:做一些假设,不做一些假设。
学生t检验、Wilcoxson检验。
学生t检验只有在两个分布都是正态分布时才可用。
Shapiro-Wilk正态检验。正态检验我们往往期盼p值大一些,以此我们可以使用带参数的检验。
时间的影响:
什么是干预?从一个情况突然转到了另一个情况。引入bot、push->pull request……
这些干预是否对我们的软件开发是否有效?
t检验不再有效。
时间序列:回归不连续设计。
第九讲
客座讲座,不具体记了。
第十讲
定量很有意思,定性也很有必要。
一个大问题:不结构化。
定性分析:将定量分析得到的数据映射到一个域内。
开放式编码(open coding)。开放式编码试图对观察到的现象进行编码、命名或分类,方法是将数据分割成有意义的表达式,并用单个单词或短序列的单词描述该数据。然后将相关的注释和概念附加到这些表达式上。
我们会倾向于解释数据。这导致即便两个人使用了一样的方法论,也可能会得到不同的结果。
实证主义
本体论(什么是现实):现实主义,存在一个真实可理解的现实。
认识论(什么是知识):通过将研究对象与研究人员分开,来客观地认识世界。
方法论:主要是实验,控制各种变量以验证理论。在物理学或生物学等传统科学中很常见。
后实证主义
本体论:批判现实主义,存在真实的现实,但容易犯错的人类头脑无法理解。
认识论:完全的客观性是无法达到的,而是一个目标。调查结果可能是真实的,但一定要是可证伪的。
方法论:批判性的使用多个方法。更自然的环境,可能使用定性方法。
建构主义-解释主义
本体论:相对主义:现实是建立在那些经历它的人的解释之上的。可能存在多个,且同样有效的现实。
认识论:知识建立在研究人员和研究对象之间的互动之上。
方法论:解释学和辩证法。主要基于研究人员和受试者之间的互动。强调定性方法的重要性。
这一思想认为只有通过研究者和受访者之间的互动,才能引出和完善个体结构。
批判理论-行动研究
本体论:存在真正的现实,但基于社会中不同参与者之间的权力关系。
认识论:知识基于解释,以价值观为中介。
方法论:本质上是辩证法的。研究人员是一个变革者,应该让受试者了解权力结构,以便他们能够与之抗争。
实证主义者和后实证主义者扮演着无私科学家的角色,创造对政策制定者或变革推动者等其他行为者有用的知识,而解释主义者为了理解而寻求知识,而批判理论家是“变革性的知识分子”,他们的工作应该推动变革。这一原则影响了所采用的辩证法方法。除了构建知识外,它还通知研究目标,以便他们能够改变结构。
实用主义
本体论:存在一个真正的现实,但世界上的一些元素是由个人创造的。
认识论:知识的创造基于人的行动。
方法论:不受方法的约束。研究人员应使用最适合手头问题的方法。
实用主义者特别注重行动。
扎根理论
一种社会逻辑学研究方法。致力于研究某种社会现象。
通过归纳法构造基于实证的理论。
经典扎根理论。施特劳斯-科尔宾扎根理论。建构主义扎根理论。
基于实证,输出理论。输出数据中的关键模式、模式之间的关系。
最后会产生某种图表。
为什么要用扎根理论?
1. 允许我们去解决有意义的、基础的、复杂的问题。
2. 允许我们研究软件工程的人类和社会方面的因素。
3. 允许我们进行多方面、深入的经验研究。
4. 允许利用多种数据类型和来源。
5. 允许进行多层定性分析。
6. 产出高质量结果。
7. 平衡严谨性和工业相关性。
8. 允许我们建立问题的理论基础,以应用解决方法、工具等等。
9. 发展了扎根理论自身。
10. 推荐了影响实践的方针。
传统扎根理论:由社会学家撰写。假设有一定的背景。有三种版本,需要研究人员选取。本身设计是为了产生理论,而不是分析数据。本身是设计用于研究社会现象的。本身设计使用传统的数据、数据收集方法和分析方法。
方法、步骤和程序
不过要记住,这里的每一步都需要花大量的时间去处理。
文献精读回顾:轻量级,找出文献中的区别,查找文献中没有研究的东西。
针对性文献回顾:在高级阶段做,比较现有文献中理论和得到的理论之间的区别。
一些额外的名词解释
开放式编码是定性研究分析中常见的第一步,通常用作基础理论的初始编码。此时,您已经开始收集定性数据,如访谈记录。通过开放式编码,可以将数据分解成离散的部分,并创建“标志”对其进行标记。这种标志的设计很大程度上取决于我们的研究目标。
轴向编码在标志之间建立联系,是一种结构化编码。在定性研究中使用轴向编码时,需要仔细阅读编码和基础数据,以确定如何将其归类。card sorting。只对小样例好用。
选择性编码是指通过围绕一个核心类别把所有类别联系在一起的过程。就形成了一个统一的理论。选择性编码将之前的得到的标签连接起来,并导出最后的中心理论。
备忘(memoing)是指是研究人员将想法、观点、对新出现概念和(子)类别的反思以及对它们之间可能联系的基于证据的猜想记录下来的过程。
理论抽样是一种立意抽样,以理论为基础进行一些抽样并进行理论分析。
第十一讲
对有效性的威胁是任何研究的重点,特别是实证研究。
对有效性威胁的分析并不是在实验做完了之后才做,在设计阶段和执行阶段进行考量同样很重要。
结果应当对感兴趣的人有效。
讨论这些威胁并不会降低我们研究的价值,反而还会增加研究的价值,因为能够明确我们结果适用的范围。
我们可以去抱希望,我们取样得到的结果不仅对全体有效(比如,我们从开源项目样本得到的结论不仅对所有开源项目有效),也可能对一些其他的软件开发模型或者其他开发模型有效。
充分的有效性并不代表着某种究极的统计学上的普遍性。
当讨论对有效性的威胁时,我们需要了解哪里可能出错。
几种可能的情况:
1. 基于样本的结论无效。
2. 样本可能没有代表性。
3. 我们无法推广结论到,我们研究的总体之外。
内部有效性威胁和外部有效性威胁
粗略地说,内部有效性与研究本身得出的结论有关,外部有效性与研究结果的普遍性有关。比如,我们使用了错误的统计方法,就与对内部有效性的威胁有关;如果我们研究只研究了学生,这个结果无法推广,就与外部有效性的威胁有关。
构筑有效性及威胁
举例:我们有一个理论,说维护复杂的源代码需要更多的努力。
概念:源代码的复杂度,努力程度。
cause construct:源代码的复杂度,effect construct:维护的努力程度。
由于所有东西都需要从经验方面、观察方面进行论证,我们需要通过某种方法构建这两个概念的某种经验表示使得我们能观察到结果。比如,对于源代码的复杂度,我们可以用圈复杂度、ck指标、标识符的复杂性等等等等;对于维护的努力程度,我们可以考虑测量参与者执行某种维护任务需要的时间。
通过上述方式,我们将源代码复杂度的操作程度作为cause construct的指标,称为treatment;受试者执行维护任务需要的时间作为effect construct的指标,即为输出。
于是这里有很多能出错的地方:
我们在将概念性的东西转换成实际能够观察到的东西时可能出错。我们需要保证我们转换后的结果确实能体现概念。
如果定义不够明确,那么导致的不良结果属于对构筑有效性的威胁,而非对结论有效性的威胁。
一些构筑有效性威胁的例子
设计威胁
与实验设计有关的问题。也就是说,我们实验设计是否能够反应我们想测量的东西。
1. 对于概念如何被构筑的解释的不明确(Inadequate pre-operational explication of constructs)。——定义不明确造成的转化不清。
2. 混淆构筑及其层次。——构筑不应该过于简单,不应该仅仅只有两三个类别,只探讨有和没有。比如说,“缺乏编程语言方面的先验知识可能导致实验中的结果”,然而实际上是问题是有多少年的经验,而不是缺乏或充分,我们可以进一步进行区分。
3. 测试与treatment之间的交互。——测试可能会让我们的受试者对treatment更敏感。比如说,如果我们在测试中告诉受试者他们需要在某个时间前完成某项任务,给他们压力,他们可能会牺牲正确性来满足这种额外的测试。这可能会导致我们混淆,我们具体进行评估的方式(要求受试者在30分钟内完成某项任务),和treatment(受试者实际上需要的时间作为一种度量)。
4. 不同treatment之间的交互。——一般发生在受试者同时参与多个研究的情况。在分析数据时,我们需要意识到可能存在的额外treatment。我们需要小心选择数据。
5. 单一操作偏差。——如果实验只包含了一种自变量、一种受试者等等,实验可能不代表构筑,没有构筑好理论。
6. 单方法偏差。——如果实验只包含了一种结果等等,实验结果可能不代表构筑的结果。
7. 构筑之间的普遍性受限。——treatment可能对我们研究的构筑产生积极的影响,但是对其他部分产生消极影响,使得结果难以推广。举个例子,有个实验结论时我们利用新的软件开发方法可以提高生产力,但同时降低了可维护性。如果我们不提及这一点,从长远来看,可能会导致我们提高的生产力被损耗掉。
社会威胁
与研究受试者行为有关的问题。也就是说,受试者有自己的自由意志,他们总是可以因为在参与科学实验而表现得不同。
1. 受试者猜测假设。——受试者是人,他们可能会猜我们的目的和预期结果是什么。
2. 受试者的评估忧虑。——有些人本质上害怕被评估,受试者可能会觉得如果他们不能按某种方式完成任务,就辜负了对研究者的期望。
3. 研究者的预期。——我们可能会有意无意地由于预期结果影响实际结果。我们可能会诱导受试者进行某种行为。我们可以招代理参与实验,代理会不知道我们的预期;或者使用一些机制补偿,比如使用某种预定义的脚本,降低我们对受试者的影响。
外部有效性及威胁
与普遍性有关。如果我们在理论上证明了cause能够造成effect,那么我们能否就说这个结果能够推广到我们研究的范围之外?比如说,我们证明了源代码的复杂度确实需要更多努力,但这能否证明源代码复杂度的操作程度就会导致更多的维护时间?
更具体的例子:如果我们只研究了几个小开源系统,但是想要推广结论到任何开源系统上,那么外部有效性就会受到威胁。
一些外部有效性威胁的例子
1. 选取样本和treatment之间的交互。——受试者人群不是我们想要推广结论的人群。
2. 环境设置与treatment之间的交互。——环境设置错误,比如用的不是最新的工具,在实验中添加额外的多余子实验。
3. 历史与treatment之间的交互。——实验一定是在某个特定时间段内进行的,这可能会影响结果,比如我们在某个重大事件后进行相关的调查,但并非直接针对该事件。具体来说,我们在代码泄露后进行仓库安全性的总体调查等等。
结论有效性及威胁
与treatment->output的过程有关,即我们对treatment进行统计学方法是否能够得到output/是否能对treatment使用某种统计学方法。主要与统计学方法及相关概念有关。
如果我们在应用统计学方法前,忽略了这些统计学方法的假设或是我们的数据可能违反了这些假设,就会对结论有效性造成威胁。
一些结论有效性威胁的例子
1. 统计方法有问题:统计方法效力弱、违反统计方法的假设、挑证据支持我们的结论并忽视其他数据或错误的计算p值。
2. 有效性有问题:测量的有效性、treatment具体实践的有效性(对不同样本进行了同样的处理,或者在不同时间对同一样本进行了相同的处理造成的误差)。
3. 随机性导致的问题:环境中随机的噪音、受试者本身并不完全相同(即便他们有很多相同点)。
内部有效性及威胁
还是与treatment->output的过程有关,即两者之间是否确实有因果性,而不是相关性。比如说是否有可能是C->A&B而不是A->B?
更多的是关于实验的设计。如何选择的受试者、如何将受试者分组、是否发生了一些和实验无关的事项。
一些内部有效性威胁的例子
设计威胁
1. Single group
1.1. 历史——我们在不同的时间对受试者进行一系列的实验,这些实验的时间顺序可能会影响内部有效性。
1.2 受试者的变化——我们在不同的时间对受试者进行一系列的实验,在这期间受试者会变化,会影响内部有效性(比如受试者会疲劳)。
1.3. 测试(testing)——如果我们问一个人同一个问题两遍,他们可能会回答不同,而且受试者在这个过程中可能会学习。
1.4. 工具(instrumentation)——我们使用的工具,比如调查问卷,可能其中会有一些误导、鼓励或是贬低受试者的内容。
1.5. 统计回归效应(statistical regression)——如果我们告知最差的十个人他们是最差的,他们可能潜意识里就会付出更多努力,从而向中位数/平均数回归。
1.6. 选择——选择本身也是一种激励。
1.7. 某个研究组的人大量离开——显然会导致结论有偏。
1.8. 因果性的方向模糊——因果性的模糊会导致我们做出错误的判断。
典型方法:设置对照组(control group)。
2. Multiple groups
不同组之间的交互——两个组之间的不同可能是由一些与实验无关因素导致的,比如,两个组之间整体会写的代码就是不一样,所以最后产出的代码也不一样。
社会威胁
1. 对treatment的扩散和模仿——人们会交流、会学习,会造成和他们最初的想法不一样从而导致内部有效性被威胁。
2. 对treatment的补偿——对treatment的奖励(只要他们知道这个treatment他们应该表现好些,会得到某种奖励)会影响人们的表现。
3. 补偿对抗(compensatory rivalry)——比如如果对照组知道有一个实验组,对照组可能会更勤劳。
4. 因实验导致的失望——比如如果对照组知道有一个实验组,对照组可能会认为他们的工作不重要,反而更不积极地参与实验。
我们需要考虑哪些对我们的研究的威胁最大。
我们为什么要讨论这些?
1. 我们在设计阶段反思我们的工作,调整我们的设计减少威胁。
2. 我们尝试理解我们工作的局限性。
这些局限性不是我们不尽可能改进实验设计的借口。
不同的策略有不同的效果:
最好的内部有效性:最好的测量精度,实验室实验。
最好的外部有效性:最好的普遍性,形式化理论/样本研究。
对于定性研究,我们要考虑的东西会有不同。
定性研究的内部有效性:延长参与时间、持续观察、三角校验、同行简报、负面案例分析、指代充分性、成员核对。
定性研究的外部有效性——可转移性。
定性研究的结论有效性——依赖性:需要我们具体分析意图、工具等等的有效性,特别是需要我们记录我们的过程。