acm-headergydF4y2Ba
登录gydF4y2Ba

ACM通信gydF4y2Ba

研究突出了gydF4y2Ba

我们又来了:为什么开发人员很难学习另一种编程语言?gydF4y2Ba


单词气球内的代码gydF4y2Ba

一旦程序员掌握了一种语言,他们就可以利用已经学过的概念和知识,轻松地学习另一种编程语言。但情况总是这样吗?为了了解程序员是否在学习其他编程语言方面有困难,我们对18种不同编程语言的Stack Overflow问题进行了实证研究。我们假设以前的知识可能会对学习一门新的编程语言产生潜在的干扰。从我们对450个Stack Overflow问题的检查中,我们发现了276个由于对不同语言的了解而产生的错误假设而产生的干扰实例。为了了解这些困难发生的原因,我们对16名专业程序员进行了半结构化的采访。访谈显示,程序员试图将一种新的编程语言与他们已经知道的知识联系起来的尝试失败了。我们的发现为技术作者、工具匠和语言设计者提供了设计启示,例如设计文档和自动化工具以减少干扰,在语言设计过程中预测不常见的语言转换,并欢迎程序员不仅仅使用一种语言,而是它的整个生态系统。gydF4y2Ba

回到顶部gydF4y2Ba

1.简介gydF4y2Ba

彼得·诺维格写了一本指南,gydF4y2Ba用于Lisp程序员的PythongydF4y2Ba,gydF4y2Ba13gydF4y2Ba从Lisp的角度教授Python。我们就这一转变采访了Peter,他描述了转换到Python的一些具有挑战性的方面,比如列表如何不被视为链表,以及需要重新考虑他以前使用宏的解决方案。当被问及切换编程语言的普遍问题时,他说:“大多数研究都是针对初学者学习语言。对专家来说,这是完全不同的,我们不知道这个过程。我们只是假设如果你是专家,你就不需要任何帮助。但我认为这不是真的!”彼得认为学习新语言是困难的,即使对专家来说也是如此,尽管他们以前有过与语言打交道的经验。彼得是正确的吗?gydF4y2Ba

许多关于语言转换的故事表明,即使是有经验的程序员也会遇到困难。例如,一个Java程序员过渡到KotlingydF4y2Ba24gydF4y2Ba报告指出,诸如反向类型表法以及默认情况下Kotlin中的类是final类等差异,使得过渡没有预期的那么顺利:“如果您认为您已经了解java,就可以快速学习Kotlin—那么您就错了。科特林会把你扔进深渊的。”类似地,一个有c++经验的程序员转而使用RustgydF4y2Ba4gydF4y2Ba发现Rust的借位检查器“迫使程序员以不同的方式思考”。在完全不同的语言之间转换尤其困难。例如,一个Java程序员切换到HaskellgydF4y2Ba10gydF4y2Ba并表示“在Haskell中,容易的事情往往有点难做”gydF4y2Ba16gydF4y2Ba有过程语言经验的人警告说:“[惰性求值]可能会让人有点困惑gydF4y2Ba如何gydF4y2Ba它在实践中是有效的,特别是如果你仍然像一个命令式程序员那样思考的话。”即使是共享相同运行时的语言也会有问题:“每当我拿起CoffeeScript时,我感觉我对JavaScript的大部分理解突然消失得无影无踪。”gydF4y2Ba14gydF4y2Ba从这些故事中,可以发现一个常见的问题:以前的编程知识有时没有预期的那么有用,而且会积极地干扰学习。这似乎是违反直觉的。为什么先前的知识会让学习变得更难而不是更容易?gydF4y2Ba

在心理学和神经科学中,干扰理论帮助解释了旧信息与新信息相互作用时可能发生的混淆。gydF4y2Ba23gydF4y2Ba为了举例说明,假设您最喜欢的商店的面包区最近被移动了。你可能会条件反射地开始往原来的位置走gydF4y2Ba干扰gydF4y2Ba当之前的知识打断了对新学信息的回忆。然而,如果你最近看到不可能的汉堡被添加到商店,使用冷冻食品可以在冷冻区找到的知识——而不是单独的健康通道——是一个例子gydF4y2Ba便利化gydF4y2Ba,你之前的知识有助于检索新信息。同样,当Java程序员学习Kotlin时,我们假设他们之前的Java知识要么促进了学习,要么妨碍了学习。Java是面向对象的并使用静态类型的知识有助于他们的学习,因为Kotlin具有类似的属性。Java类所没有的知识gydF4y2Ba最后gydF4y2Ba默认干扰他们的学习,因为Kotlin类是gydF4y2Ba最后gydF4y2Ba默认情况下。gydF4y2Ba

如果以前的编程知识可以被框定为新编程语言习得的干扰来源,那么干扰理论就可以解释为什么有经验的程序员很难学习编程语言。如果之前的编程知识与此无关,学习起来也会很困难,因为这些知识没有帮助。gydF4y2Ba

为了研究我们的假设,我们首先寻找证据,证明程序员可能因为之前的知识干扰而难以学习另一种语言。为此,我们进行了一项实证研究,研究了一个流行的问答网站Stack Overflow上发布的问题。gydF4y2Ba一个gydF4y2Ba我们分析了450篇关于18种不同编程语言的文章,并对每篇文章进行定性编码,根据程序员是否基于他们之前的编程知识做出了错误的假设来描述这些文章。然后,为了了解程序员在学习另一种语言时使用了什么学习策略——以及为什么之前的知识会干扰这个过程——我们采访了16名最近转向一种新的编程语言的专业程序员。gydF4y2Ba

我们发现:gydF4y2Ba

  • 跨语言干扰是一个问题:Stack Overflow上的276个(61%)跨语言帖子包含了错误的假设,这是由于之前的语言知识受到干扰。gydF4y2Ba
  • 根据我们的采访,专业程序员主要是自己学习新语言,使用一种机会策略,通常包括将新语言与之前的语言知识联系起来;然而,这导致了干扰,损害了他们的学习。gydF4y2Ba
  • 学习一门新语言需要打破旧的习惯,转变思维模式,处理很少甚至没有的与以前语言的映射,寻找合适的文档,以及在新环境中重新使用。总之,这些挑战让学习另一门语言变得困难。gydF4y2Ba

回到顶部gydF4y2Ba

2.方法gydF4y2Ba

为了探索程序员如何学习一门新语言,并了解他们潜在的困惑来源,我们进行了一项混合方法研究,通过实证调查Stack Overflow的各种语言帖子和通过半结构化访谈。我们通过以下研究问题来做到这一点:gydF4y2Ba

*gydF4y2Ba2.1.研究问题gydF4y2Ba

  • RQ1:会发生跨语言干扰吗?gydF4y2Ba我们检查了程序员在Stack Overflow上关于编程语言的问题,以寻找干扰之前编程知识的证据。gydF4y2Ba
  • RQ2:有经验的程序员如何学习新语言?gydF4y2Ba为了更好地理解为什么会发生跨语言干扰,我们采访了专业程序员,询问他们是如何学习新语言的。gydF4y2Ba
  • RQ3:有经验的程序员在新语言中会感到困惑的是什么?gydF4y2Ba为了研究程序员将一门新语言与他们之前的知识相结合的方式,我们询问了程序员在使用新语言时所面临的障碍和遇到的惊喜。gydF4y2Ba

*gydF4y2Ba2.2.第一阶段:Stack Overflow的研究设计gydF4y2Ba

为了回答RQ1,我们使用Stack Overflow的帖子进行了一项研究。gydF4y2Ba

数据收集。gydF4y2Ba为了收集Stack Overflow的问题,我们使用了SOTorrentgydF4y2Ba2gydF4y2Ba数据来自2019年MSR采矿挑战。我们查询了Erik以前使用的26种编程语言gydF4y2BabgydF4y2Ba和WarengydF4y2BacgydF4y2Ba他们基于谷歌搜索关键字和GitHub知识库对流行语言迁移进行了调查。我们为每一对收集了Stack Overflow问题。为了保持分析的可操作性,我们只考虑了两种语言之间的联系,而不考虑可能的干扰的方向。我们使用了一个停止规则标准来覆盖超过95%的全部帖子,结果是26对语言中的15对,如所示gydF4y2Ba表1gydF4y2Ba.这项研究的资料可以在网上找到。gydF4y2BadgydF4y2Ba

t1.jpggydF4y2Ba
表1。按语言对发帖。gydF4y2Ba

查询条件。gydF4y2Ba我们使用BigQuerygydF4y2BaegydF4y2Ba查询SOTorrent数据库,并使用以下过滤标准捕获潜在的帖子,其中程序员正在询问来自前一种语言(源)的关于新语言(目标)的问题:gydF4y2Ba

  1. 问题被标记为两种语言,或者gydF4y2Ba
  2. 问题用源语言标记,但在标题或主体中包含目标语言的文本,反之亦然。gydF4y2Ba

分析。gydF4y2Ba为了了解是否发生了跨语言干扰,我们对Stack Overflow帖子进行了手动检查(参见gydF4y2Ba表1gydF4y2Ba).我们随机抽样检查了每对30个帖子,以保持分类的可操作性,就像巴里克等人所做的那样。gydF4y2Ba3.gydF4y2Ba我们手动排除了那些在每对语言之间没有任何显式联系的帖子,并在必要时抽样另一个随机的帖子来替换它。由于纳入和排除标准可以有多种解释,前两位合作者随机抽取了30篇文章作为样本。这个标签在合著者之间有100%的一致性,并表明对如何分类文章有一个清晰的理解。这两位合著者继续使用两种分类对Stack Overflow的其余帖子进行了标记:gydF4y2Ba

  • 正确的:gydF4y2Ba这篇文章将之前的编程语言与被接受的答案所揭示的关于目标语言的正确假设联系起来,或者gydF4y2Ba
  • 不正确的:gydF4y2Ba这篇文章将以前的编程语言与被接受的答案所揭示的关于目标语言的错误假设联系起来。gydF4y2Ba

接下来,我们计算了两个合著者(Cohen’s)之间的评级者间信度(IRR)并达成了一致gydF4y2BakgydF4y2Ba= 0.89)。即使在讨论之后,对分类的分歧也被第一作者调和了。最后,我们计算了正确和错误帖子的百分比,使用正确和错误假设的实例作为跨语言干扰和促进的证据。gydF4y2Ba

*gydF4y2Ba2.3.第二阶段:专业程序员面试的研究设计gydF4y2Ba

为了回答RQ2和RQ3,我们对专业程序员进行了半结构化的访谈。gydF4y2Ba

参与者。gydF4y2Ba我们使用gydF4y2Ba立意抽样gydF4y2Ba21gydF4y2Ba招募16名在过去6个月内学习一门新的编程语言的专业程序员gydF4y2Ba表2gydF4y2Ba);这些参与者仍处于学习过程的早期,正在努力克服新语言的最初障碍。参与者(12男,4女,自我报告)来自大型软件、技术和数据分析公司,有5到31年的编程经验(μ = 12.8,gydF4y2BasdgydF4y2Ba= 6.6)。总共有14种独特的语言转换。在采访前,参与者完成了一份背景问卷,询问他们之前的语言以及在适应新语言时遇到的障碍。gydF4y2Ba

t2.jpggydF4y2Ba
表2。参与者。gydF4y2Ba

协议。gydF4y2Ba我们在60分钟的时间内进行了现场或远程的半结构化面试。两位作者分别进行并记录了采访。所有的会议都是由一名观察员和一名程序员就以下主题进行的:(1)参与者背景,(2)第一步,(3)障碍,(4)学习过程,(5)一般策略。问卷中的背景信息被用来为参与者量身定制问题。半结构化的面试形式可以灵活地提出即兴的问题,并深入挖掘更具体的障碍。录音后来被第一作者抄录下来进行分析。gydF4y2Ba

分析。gydF4y2BaRQ2:有经验的程序员如何学习新语言?gydF4y2Ba为了回答RQ2,我们进行了归纳主题分析gydF4y2Ba9gydF4y2Ba在多个阶段的采访记录上:记录采访,通过标记参与者重复发表的显著声明生成公开代码,确定代码之间的关系,并将它们组织成有意义的主题。gydF4y2Ba

RQ3:有经验的程序员在新语言中会感到困惑的是什么?gydF4y2Ba为了理解程序员如何混淆语言概念,我们从分析中选择了一些主题,这些主题强调了由于先前的编程知识而产生的干扰。gydF4y2Ba

回到顶部gydF4y2Ba

3.结果gydF4y2Ba

*gydF4y2Ba3.1.RQ1:会发生跨语言干扰吗?gydF4y2Ba

跨语言干扰在Stack Overflow上跨各种语言对发生。我们总共发现276个错误假设的例子gydF4y2Ba表1gydF4y2Ba),占调查的450个职位的61%左右。假设正确的职位共有174个,仅占全部职位的39%左右。值得注意的是,这提供了干扰发生的证据,但并不意味着程序员61%的情况下有错误的假设。这对组合的错误假设帖子数量最多,这反映了第1节中提到的Java程序员的困惑。接下来的两对和也包含大量的错误假设。然而,还有其他的组合,比如gydF4y2Ba,gydF4y2Ba,以及正确和错误假设的职位分布更为均匀;这意味着两种语言之间更容易过渡。尽管回顾了450篇Stack Overflow的文章,我们还是遇到了编程语言以令人惊讶的方式表现在程序员身上的实例。我们强调三个例子,其中两个涉及到语法和概念之间的干扰,一个涉及到便利——使使用类型推断更容易。gydF4y2Ba

干扰:R弟PythongydF4y2BafgydF4y2Ba

一个R程序员现在正在使用Python和它的数据处理库Pandas。他们无法成功地将之前关于R中的子设置的知识与Python联系起来:“我非常困惑。也许我在R方面想得太多了,无法理解Python中发生的事情。”gydF4y2Ba

他们给出了他们想要翻译的R表达式,以及几个尝试的Python翻译:gydF4y2Ba

# RgydF4y2Ba

Data [Data $x > value, y] <- 1gydF4y2Ba

# PythongydF4y2Ba

Data ['y'] [Data ['x'] > value] = 1gydF4y2Ba

R中的几个概念相互影响,但我们将强调最重要的一个:Python阻止对数据框架副本的赋值。在本例中,是索引操作gydF4y2Ba数据[y]gydF4y2Ba返回数据帧的副本,并将值设置为gydF4y2Ba[data ['y'] > value] = 1gydF4y2Ba不会像R程序员期望的那样工作。等效的R表达式将设置值为1而没有任何警告,这一知识干扰了Python的警告。gydF4y2Ba

干扰:PHP、JavaScriptgydF4y2BaggydF4y2Ba

转向JavaScript编程的PHP程序员询问如何存储临时信息(会话),例如关于用户的应用程序状态。通常,PHP使用服务器端会话变量gydF4y2Ba(_SESSION美元)gydF4y2Ba为这个目的。尽管存在相关的概念,如本地存储和基于浏览器的会话,但程序员被警告会话不能安全地直接存储在客户机上——程序员对服务器端会话的了解导致错误地假设它们在其他编程上下文中的适用性。gydF4y2Ba

干扰:爪哇玛科特林gydF4y2BahgydF4y2Ba

一个Java开发人员正在学习Kotlin。他们问下面的Kotlin表达式是否可以简化:gydF4y2Ba

val boundsBuilder: LatLngBounds。Builder = LatLngBounds.Builder ()gydF4y2Ba

考虑到开发人员对Java中的局部变量类型推断的了解,他们怀疑他们的声明比应该的更冗长。他们假设声明可以简化:gydF4y2Ba

val boundsBuilder = LatLngBounds.Builder()gydF4y2Ba

这是一个简化的例子——公认的答案证实了开发人员可以简化表达式,因为Kotlin支持类型推断,允许删除显式类型声明。gydF4y2Ba

这些例子说明了以前的语言语法和概念知识是如何与在新语言中学习的知识相互作用的。在某些情况下,这会导致干扰,损害程序员掌握新语言中的新语法和概念的能力。在其他情况下,这会产生促进作用,帮助程序员与以前的语言建立有意义的联系,并帮助他们学习新语言。gydF4y2Ba

在Stack Overflow的帖子中,跨语言干扰发生在各种语言转换之间。我们发现450个帖子中有61%包含对目标语言的错误假设,只有39%包含正确假设。gydF4y2Ba

*gydF4y2Ba3.2.RQ2:有经验的程序员如何学习新语言?gydF4y2Ba

在本节中,我们将介绍有经验的程序员如何学习新语言的主题。gydF4y2Ba

程序员靠自己学习语言。gydF4y2Ba转换团队的程序员缺乏对新语言及其相关技术堆栈的正式培训,把学习留给了自己。例如,当P1在一个新项目中从c#切换到Python时,并不涉及任何培训,而且入职过程就是,“嘿,我们想接触Python世界,开始吧!”尽管一些程序员在项目开始时接受了培训,“实际上,为了学习新语言[他们]几乎是靠[他们]自己”(P7)。这就迫使程序员们观看“Plural-sight语言教程视频”。gydF4y2Ba我gydF4y2Ba(P5)或阅读在线文档。一些程序员“从团队中的一些人那里得到了关于什么是什么的初步建议”(P6),当遇到复杂的问题时,他们会“联系团队成员,问他们以前是否有人碰到过这个问题?”(P1)。gydF4y2Ba

即时学习是一种主要的学习策略。gydF4y2Ba为了学习新的语言,我们采访的每个程序员都使用gydF4y2Ba及时学习gydF4y2Ba,gydF4y2Ba8gydF4y2Ba一种机会主义策略,只专注于学习需要的特性。由于时间的限制,程序员利用即时可用的资源,如在线文档、视频教程、在线搜索和可用的专家。传统资源,如编程语言书籍,只是作为参考,因为程序员“只是没有时间去做”(P5)。程序员主要关心的是在合理的时间内完成任务,并“弄清楚如何不把大量的时间浪费在单个问题上”(P1)。更快的资源,如备忘单,更适合语言转换。例如,P2做的第一件事是利用备忘单帮助他们从Python过渡到Julia。P15也是小抄的粉丝:gydF4y2Ba

看起来,如果你从一个框架到另一个框架,从一个技术栈到另一个技术栈——即使你不是从A到B,你只是从B开始——可能每个开发人员都需要知道一个内容小抄。gydF4y2Ba(P15)gydF4y2Ba

程序员相关,新语言与以前的语言。gydF4y2Ba为了帮助加速学习过程,程序员通常会尝试将新语言与以前的语言联系起来。程序员开始时“从另一种语言中松散地获取想法”(P14)或查看现有的代码,因为“它可能已经写好了,在某个地方或至少接近于它”(P1)。尽管这种学习策略对于引导很有用,但有些程序员还是从零开始。例如,当从c#迁移到Ruby时,P11描述道:“试着非常保守和谨慎,试着不映射任何东西,而只是把所有东西都当作全新的东西来对待。”类似地,P12解释说,他们在学习SAS时没有尝试从Python中映射东西,“主要是因为语法太新了,每次[他们]尝试做任何事情时,[他们]都不得不放弃语法。”P10在使用c#多年后学习如何在Rust中管理内存时表达了类似的问题:“对我来说,没有一种干净的方法来实现这个目标。我必须从头开始学习这些东西。”这些例子说明了程序员通常会尝试重用知识(简化),但有时会在更麻烦时避免这样做。gydF4y2Ba

程序员使用机会学习策略,将新语言的语法和概念与以前的语言联系起来。这提供了权宜之计,但当两种语言之间存在重大差异时,就会造成干扰。gydF4y2Ba

*gydF4y2Ba3.3.RQ3:有经验的程序员在新语言中会感到困惑的是什么?gydF4y2Ba

在本节中,我们将介绍解释程序员如何混淆语言概念的主题。gydF4y2Ba

旧习难改。gydF4y2Ba程序员必须不断地抑制从以前的语言中习得的旧习惯。例如,习惯于python的p3在适应PHP中的块分隔符方面遇到了困难,在PHP中,“一旦HTML/PHP变得非常复杂,就几乎不可能确切地知道要关闭哪个左大括号。”类似地,P15意识到“在Swift中,左花括号需要在方法声明的第一行,如果你把它放在下一行,方法可能不会以预期的方式执行。”Python和R等语言之间的列表索引为0和1的差异导致了P4的失败:“typing”gydF4y2Ba一个[1]gydF4y2Ba认为这是gydF4y2Ba一个[0]gydF4y2Ba然后浪费5分钟,像个十足的傻瓜一样,不明白为什么什么都说不通。”程序员能够解决这些微小的差异,但在学习一门新语言的开始阶段,它仍然会造成干扰。gydF4y2Ba

转换范式时需要思维转移。gydF4y2Ba有些语言转换需要思维模式的根本转变,或称“思维转变”。gydF4y2Ba1gydF4y2Ba例如,当P2从Python过渡到Julia时,他们不断尝试创建一个对象,然后意识到“没有对象,只有结构!”有了Julia,他们需要编写更多的函数式代码,这是他们在Python中习惯的面向对象编程的转变:“只是需要转变,并意识到我永远或很少会写‘某某。某某某某’。”由于内存安全的所有权特性,P10不得不完全重新考虑他们在c#中解决的问题:gydF4y2Ba

学习Rust的一个真正有趣的事情是,当我开始做这些事情时——我知道在c#中可以做到的事情,但Rust不允许这样做,因此我不得不重新思考这个问题,并以一种算法的所有权特征非常明确的方式重新实现它。gydF4y2Ba(P10)gydF4y2Ba

P5、P6和p13发生了很大的范式转变——从命令式或面向对象编码过渡到事件驱动和异步编码——迫使他们以不同的方式思考。程序员必须学习JavaScript中全新的概念,如异步编程或“影子和虚拟dom”(P13)。P6描述了理解异步代码是多么困难,因为“你有一大堆gydF4y2Ba“异步/等待gydF4y2Ba模式在你脑海中运作,你必须转换它。”更糟糕的是,“最令人困惑的部分是有两种方法来进行异步编程,使用可观察对象或承诺”(P13)。对于P5来说,TypeScript的前端编码是一个巨大的挑战,因为“对于后端,我认为代码更直接。你有逻辑,很可能你知道你可以处理的地方。这与UI不同。”在这里,干扰问题不是由于任何特定的语法或概念,而是由于人们用新语言解决问题的方式。gydF4y2Ba

当语言与以前的语言几乎没有映射时,学习一门语言是困难的。gydF4y2Ba当功能与以前的语言之间几乎没有映射时,程序员学习新语言的难度就更大了。例如,P12无法理解SAS在Python中很清楚的一些基本编程语言特性,例如语句与方法参数。他们无法理解“为什么有些东西是影响过程的语句,而不是参数”,“仍然对整体语法和什么是或不是语句感到困惑”——即使在学习了几周的语言之后。一个极端的例子是P5,他经历了从c++到TypeScript的巨大转变,导致了gydF4y2Ba技术冲击gydF4y2Ba“一切都不一样了!不只是编程语言——IDE、源代码控制,一切都不一样了。”类似地,P13发现JavaScript中的概念具有挑战性,因为它们“不能将其等同于c++”。gydF4y2Ba

在极端的情况下,程序员被迫学习完全陌生的语法或概念。例如,P9在学习Scala中的特征时遇到困难,因为他们“以前从未有过具有特征的语言。trait有一个默认的实现,理解什么可以执行,什么不能执行——以及什么时候使用什么——这是棘手的部分。”P7了解到,对于Python,“主要的区别是多重继承,Python从支持多重继承的c++世界继承。在c#中,你不能这样做。”在另一种情况下,困难是由于内存管理的差异,例如,当p10(之前使用c#)学习Rust时:gydF4y2Ba

Rust中有一个非常陌生的概念,那就是借用检查器,它的概念是让编译器验证更多的东西,它的方法有点深奥。这是非常陌生的,我认为这是非常酷的东西,但目前它也非常粗糙,所以这是学习Rust时最大的困难。gydF4y2Ba(P10)gydF4y2Ba

即使在相同的上下文中,映射的缺乏也造成了许多混乱。例如,P14从一种数据分析语言(R)切换到另一种数据分析语言(Python/Pandas),无法找到R的直接对应语言gydF4y2Ba传播gydF4y2Ba而且gydF4y2Ba收集gydF4y2Ba功能:“熊猫已经有了功能,但它更隐藏使用下降水平和unstack。这些在熊猫身上真的很难理解——这是一些非常奇怪的东西。”同样地,从c#切换到Swift的P15也非常惊讶地发现Xcode中的用户界面代码与其图形布局视图是如何联系在一起的:“知道你不能直接从代码中与UI对象进行交互是非常重要的。一旦绘制了视图和控制器之间的引用出口连接,就可以触发方法和gydF4y2Ba获取/设置gydF4y2Ba属性,正如您在。net世界中所期望的那样。”gydF4y2Ba

寻找正确的术语和代码示例非常困难。gydF4y2Ba我们发现,迁移到一种新的编程语言会使搜索有关该语言及其相关技术的信息变得困难。程序员甚至在执行搜索之前就很难获得词汇表。对于P12, Python中相同结构的名称与SAS略有不同,在SAS中,“dataframe是数据集,行是观察值,列是变量。”搜索是困难的,因为一方面,“通常是库的广度给你带来了麻烦,你甚至不知道存在什么,甚至不知道要找什么来看看是否已经有什么”(P1)。另一方面,不充分的搜索结果几乎没有提供任何便利。P4在搜索Python库信息时遇到困难gydF4y2BaseaborngydF4y2Ba-与等效的R库相比gydF4y2BaggplotgydF4y2Ba-因为“对于ggplot,如果你谷歌任何东西,你会得到大约100个点击,而且顶部的那些肯定是好的,因为谷歌选择的结果。而使用seaborn,你可以获得10个点击量。”gydF4y2Ba

即使程序员找到了文档和代码示例,它们要么不完整,要么缺乏细节。P2对Julia文档感到沮丧,因为“它对于计算导入是如此无用”。同样,P12表示SAS文档“只告诉您如何复制粘贴和运行一个简单的程序,让您完全不知道SAS程序的执行和控制流是如何工作的。”这就导致了挫折,特别是当之前的语言中存在更好的文档时:“Xcode文档样本已经足够好了。但是文档、MSDN和用于创建基于微软平台的应用程序的可用示例更深入、更丰富、更容易使用。”(P15)gydF4y2Ba

重组工具是必要且具有挑战性的第一步。gydF4y2Ba最后,在用新语言进行编程之前,程序员在新环境中重新调整自己时会遇到困难。这通常涉及适应用该语言进行编程的新集成开发环境(IDE)的差异。尽管程序员能够适应IDE的基本特性(简化),但当IDE的某些方面与他们以前的IDE不同时,就会产生干扰。例如,P15发现在Xcode中“构建目标在定义上不是‘通用的’(就像。net),当术语跨平台共享,但却没有实现相同的概念时,你会迷失好几天!”有趣的是,对于P9来说,当他们尝试在IntelliJ中构建Scala项目时遇到了干扰,因为IDE试图支持Scala,但仍然用之前的语言呈现对话框:gydF4y2Ba

部分问题是IntelliJ是针对Java开发人员的,而我使用的是来自Scala世界的SBT。它将SBT导入到IntelliJ的IDE中的概念中。因此,我正在查看对话框,这些对话框都是关于Java和哪个JDK的,它不映射到我用声明式SBT语言编写的内容。gydF4y2Ba(票数)gydF4y2Ba

其他的担忧是缺乏IDE特性或者学习新特性会分散人的注意力。P2“被Python和PyCharm宠坏了”,发现很难为Julia找到合适的IDE支持;他们只是想要“一个能做语法高亮显示和智能自动完成的IDE”。P1发现学习一个新特性——比如调试器——是适得其反的,“因为你是在同时学习和调试,而不是只在你熟练之后调试”。然而,有时向语言中的新工具的过渡也会使程序员受益:gydF4y2Ba

我认为现在的构建系统对我们来说更好,因为我们现在使用的是devops——一个构建代码的管道。我们甚至可以很容易地安排私有构建,也可以很容易地快速获取新内容,检入代码,测试它,甚至在它之上构建东西。gydF4y2Ba(P5)gydF4y2Ba

程序员会将一门新语言的语法和概念与以前的语言混淆,从而导致许多问题,如试图抑制旧的习惯、与映射问题作斗争、努力寻找和使用适当的文档、为新范式重组和转变思维方式。gydF4y2Ba

回到顶部gydF4y2Ba

4.限制gydF4y2Ba

我们调查Stack Overflow和进行访谈的混合方法引入了一定的权衡和限制。gydF4y2Ba

我们对Stack Overflow的抽样方法的目标是多样性(而不是代表性),以便识别跨许多不同编程语言的干扰证据。我们在Stack Overflow上查看的帖子以及我们的采访并没有完全覆盖所有语言转换的集合,因为语言转换的完整排列空间是难以处理的。我们的方法试图涵盖在实践中最可能发生的过渡,这意味着我们可能会错过其他干扰问题。gydF4y2Ba

我们使用正确和不正确的假设作为促进和干扰的代理构造。尽管这种方法为Stack Overflow的文章提供了有用的、高级的描述,但是开放编码——一种更复杂的定性编码技术——可能提供了更深入的见解。然而,开放编码的执行成本要高得多,我们对有经验的程序员进行了半结构化的访谈,以更深入地研究跨语言干扰。gydF4y2Ba

最后,定性研究不仅涉及调查中的定性数据,还涉及研究人员框架和综合结果的主观性和解释水平。为了支持解释的有效性,我们对我们的结果进行了单事件成员检查:6名参与者回答同意我们的结果演示,只希望对他们的报价进行微小的更改。其他理论如gydF4y2Ba名义上的机器gydF4y2Ba,也可以用来识别和解释学习编程语言时的困惑。gydF4y2Ba6gydF4y2Ba

回到顶部gydF4y2Ba

5.相关工作gydF4y2Ba

新手误解。gydF4y2Ba程序员在学习新的编程语言时经常会产生误解,但大多数研究都集中在新手身上。Swidan et al。gydF4y2Ba20.gydF4y2Ba提出“尽早消除这些误解的干预方法”,但这项工作主要针对新手。类似地,Kaczmarczyk等人。gydF4y2Ba12gydF4y2Ba已经检查了错误的概念和如何衡量他们的新手。相比之下,我们工作的新颖性是针对那些需要转换语言的有经验的程序员,并且需要不同于为新手设计的学习方法。我们的研究调查了有经验的程序员转换语言的情况,并研究了之前的语言知识是如何在学习另一种语言时产生干扰的。gydF4y2Ba

编程语言转换。gydF4y2Ba有一些关于编程语言之间转换的研究。Scholtz和WiedenbeckgydF4y2Ba15gydF4y2Ba我研究了有经验的Pascal或C程序员,他们用一种新的语言Icon编写程序,发现他们的知识对他们有很强的影响,这些知识适用于以前的语言。类似地,Uesbeck等人。gydF4y2Ba22gydF4y2Ba研究了在对照研究中使用多种语言(SQL和Java)的影响,虽然结果不确定,但作者认为随机对照试验方法可以有效地研究与混合语言相关的生产力成本。对于干预,Bower等人。gydF4y2Ba7gydF4y2Ba探索了一种名为“持续显式比较”(CAEC)的新教学方法,利用简易法向具有c++知识的学生教授Java。他们发现,学生们从不断比较c++和Java的概念中受益。Shrestha et al。gydF4y2Ba17gydF4y2Ba使用了类似的技术,使用一个叫做Transfer Tutor的工具从Python的角度教授R;使用该工具的程序员发现语言之间的比较很有用。我们用干扰理论的视角来揭示现代语境中的干扰问题,研究了大量的语言转换,并发现了其他尚未被探索的问题,如语言特征的映射很少或没有gydF4y2Ba当语言与以前的语言几乎没有映射时,学习一门语言是困难的gydF4y2Ba)和重组(分段gydF4y2Ba重组工具是必要且具有挑战性的第一步gydF4y2Ba).gydF4y2Ba

编程知识。gydF4y2Ba研究人员认为,编程计划可能不能在不同的语言之间泛化,计划也不能代表程序的底层深层结构。gydF4y2Ba编程计划gydF4y2Ba是模式,首先实例化,然后在程序员理解代码的过程中,用具体的值填充其槽。gydF4y2Ba19gydF4y2Ba例如,在贝拉米和吉尔摩的作品中,gydF4y2Ba5gydF4y2Ba作者检查了不同语言的专家在创建程序时生成的协议,不同的编程语言专家生成不同类型的表示。我们相信我们的结果提供了关于为什么计划不能跨语言泛化的进一步洞察:我们发现程序员倾向于将一种新语言与以前的语言联系起来(分段gydF4y2Ba程序员相关,新语言与以前的语言gydF4y2Ba)(重用以前的编程计划),但由于干扰问题,以前的计划可能需要进行重大修改gydF4y2Ba当语言与以前的语言几乎没有映射时,学习一门语言是困难的gydF4y2Ba)或被完全取代(本小节gydF4y2Ba转换范式时需要思维转移gydF4y2Ba),取决于这两种语言的密切程度。gydF4y2Ba

回到顶部gydF4y2Ba

6.讨论和影响gydF4y2Ba

我们的研究结果表明,干扰是一个普遍的现象,迫使程序员采用次优的机会学习策略。在Stack Overflow中,可以在我们研究的所有编程语言中找到干扰的实例。此外,在我们的访谈中,参与者报告说,在他们学习一门新语言的过程中,干扰经常出现——例如,必须抑制来自前一种语言的旧习惯gydF4y2Ba旧习难改gydF4y2Ba)或不得不“重新思考程序”(P10),因为有一个本质上不同的范式gydF4y2Ba

Baidu
map