鼓励非专业程序员的良好开发实践?

时间:2009-08-05 19:31:49

标签: version-control open-source bioinformatics

在我丰富的空闲时间里,我与许多科学家(主要是生物学家)合作,他们开发软件,数据库和其他与他们所做工作相关的工具。

通常这些项目是一次性构建的,内部使用,最终有人决定“哦,这对其他人有用”,所以他们发布二进制文件或将一个PHP接口打到它上面并推它到网上。但是,他们通常不会为其他开发人员提供他们的源代码或数据库转储而烦恼,因此在实践中,这些项目通常在编写代码的项目即将结束或失去资金时死亡。几个月(或几年)之后,其他一些实验室需要使用相同类型的工具,他们必须重复第一个实验室所做的工作, 项目最终会死亡,泡沫,冲洗,重复。

有没有人建议如何说服那些主要工作不是编程的人,这对他们的社区有利,因为他们对他们建立的工具更加开放?

同样,关于如何传达版本控制,错误跟踪,重构,自动化测试,持续集成以及我们专业开发人员认为理所当然的其他常见做法这一想法的任何建议都是值得花时间的好主意吗?

不幸的是,很多科学家似乎都认为编程是一种枯燥乏味,制作工作必不可少的恶事,他们的研究更重要,而不是意识到现在,软件开发是部分科学研究,如果整个社会要提高发展标准,每个人都会受益。

你曾经遇到过这样的情况吗?什么对你有用?

15 个答案:

答案 0 :(得分:17)

Software Carpentry听起来像是符合您的要求:

  

<强>概述

     

许多科学家和工程师花钱   他们的大部分时间都是编程,但是   只有少数人被教过   怎么做得好。结果,他们   花时间摔跤   软件,而不是做研究,   但不知道多么可靠或   有效的他们的节目。

     

本课程是强化课程   基础软件介绍   科学家的发展实践   和工程师可以减少时间   他们花了20-25%的编程。所有   材料是开源的:它可能   被任何人自由使用   教育或商业目的,   学术界和学术界的研究小组   积极鼓励行业   使其适应他们的需要。

答案 1 :(得分:9)

让我先说一下我是一名生物信息学家,所以我一直在看你所谈论的事情。有一些事实是,这些人中很多人都是生物学家,他们只是没有接触过最佳实践的编码员。

那就是说,核心问题不是这些人不了解良好做法,也不关心。问题在于他们没有动力花更多的时间学习软件工程,或者清理代码并将其发布。

在学术研究环境中,您的声誉(以及您未来的就业前景)几乎完全取决于您所贡献的出版物的数量和质量。关于方法或新算法的出版物没有像报告新的生物学发现那样受到尊重。因此,在对数据集进行快速分析之后,我很少有动力花大量时间来清理代码并发布代码,这时我可以继续使用下一个数据集并进行更多的生物学发现。

我还要注意,计算机开发的资金可用性比生物学的可用资源低几个数量级。在一个只有10%的提交资助得到资助的环境中,科学家们没有时间来清理和发布他们的代码,这样做无助于他们保持实验室的资助。

所以,简而言之就是问题所在。作为一名生物信息学家,我认为这是有悖常理的,往往令人沮丧。

尽管如此,未来仍有希望。特别是第二代和第三代测序,生物学正在进入高通量发现领域,数据挖掘和固体计算管道成为科学成功不可或缺的一部分。当这种情况发生时,您会看到越来越多的计算项目资金,以及越来越多真正的软件工程正在发生。

答案 2 :(得分:7)

这并不是很简单,但通过示例演示可能会最有效地推动这一点 - 找到研究人员需要完成的任务,找到做过的人花时间制作工具来源可用,并指出研究人员可以节省多少时间,因为有可用的工具 - 然后指出他们可以以同样的方式回馈社区。

答案 3 :(得分:5)

实际上,除了他们选择的职业之外,你要求他们做的是成为专业开发人员(他们的丰富的空闲时间)。他们的不情愿是可以理解的。

答案 4 :(得分:5)

  

有没有人建议如何说服那些主要工作不是编程的人,这对他们的社区有利,因为他们对他们建立的工具更加开放?

放弃。说真的,这就像教猪唱歌一样。 (我可以说这是因为我曾经是一名物理学家所以我知道他们的样子。)

真正的问题是,你的同事因出版物而非软件测量的科学成果而获得奖励。计算机科学很难获得建筑软件的认可;在其他科学中,这几乎是不可能的。

您不能以“对您有益”为理由向您的生物朋友出售良好的开发实践。他们会问“我应该努力学习好的软件实践,还是应该投入相同的努力来发表另一篇生物学论文?”没有比赛。

答案 5 :(得分:3)

实际上,要求任何繁忙的项目团队在他们的日程安排中包含使他们的软件适合其他团队采用的时间,这在我的经历中是非常困难的。

为公益事业做额外的工作是一个很大的问题。

在项目完成后,我已经看到了一种常见的“收获”模式,反映出即时编码的重用往往会在当天的紧迫性中迷失。

我能想到的唯一途径是,如果重复使用是在一个有“猎人采集者”预算的组织内,那么他的理由就是IT。

对于单元测试这样的事情,您可能会获得更多的胜利,因为他们可以立即获得开发回报。

答案 6 :(得分:3)

在学术/知识责任方面构建它可能有助于在某种程度上 - 在许多方面分享您的来源,例如正确引用您的来源或详细说明您的研究方法。对于您希望鼓励的某些“专业软件开发人员”行为,也有类似的论点,但我认为发布代码可能比其他可能需要更多工作的事情更容易出售。

答案 7 :(得分:3)

首先,我们可以停止教授生物学家Perl吗?对非专业程序员进行教学时,实际上只保证使用只写语言会导致无法维护的丢弃代码。 Python填充相同的利基,同样易于学习(它甚至用于教孩子编程!),并且更具可读性。

答案 8 :(得分:3)

与统计数据相提并论。统计数据是科学研究的重要组成部分,也是唯一明智的建议:要么学会正确地做,要么让专家为你做。错误完成的统计数据可能会完全破坏论文,就像编写错误的代码可能会完全破坏公共数据库或Web资源一样。

PS:这个博客非常好,但让他们阅读它将是一场艰难的斗争:Programming for Scientists

答案 9 :(得分:3)

克里斯,

我同意你的学位,但根据我的经验,最终发生的事情是,他们急于发布你最终会得到太多“我也是”的代码和方法,这些并没有真正增加科学。如果对开源采购代码有更多的考虑并鼓励其他人做出贡献(不一定要从中获取出版物),那么每个人都会受益。

绝对同意科学程序员和软件工程师之间的分离是一件好事,特别是对于生产应用程序。但即使对于科学编程,如果我当时遵循良好实践,我的代码质量也会好得多。

答案 10 :(得分:3)

根据我的经验,让人们干净地编程的最好方法是在你使用它们时展示一个很好的例子。 例如:“我从来没有花费无望的日子来调试我的代码,因为我编写的第一件事就是自动化单元测试,当它们很小并且容易检测到时会发现问题” 或者:“我很难跟踪事物的版本,但有时我的新代码确实破坏了以前的工作。所以我使用svn / git / dropbox来跟踪我的事情”

根据我的经验,这种陈述可以引起“学习如何编写脚本”的生物学家的兴趣。 如果您需要在更大的项目上进行合作,请明确表示您拥有更多的经验,并且如果事情按照您的方式完成,一切都会顺利进行。


关于代码的发布,目前的做法确实令人沮丧。我希望看到像生物学和医学源代码这样的新期刊,其中代码经过同行评审并可以发布,但是没有(或非常低)的出版成本。将代码放在sourceforge或其他方面确实不具有“科学价值”,因为它没有在您的出版物清单上排成一行,并且大多数代码都没有足够的革命性,无法支付1000美元用于生物学和医学源代码或PLoS One的出版物...

答案 11 :(得分:1)

你可以让他们使用像Joomla这样的内容管理系统。这样他们只推送内容而不是代码。

答案 12 :(得分:1)

我不会那么说服,因为我会精简这个过程。清楚地记录它,制作视频教程并捆绑某种工具链,使得设置源存储库变得非常容易,而不需要它们成为不是主要领域的专家。

答案 13 :(得分:1)

选择一位已经了解最佳实践的优秀程序员,让科学家教他们需要什么以及他们做什么,最终程序员将拥有最少的领域知识(我怀疑它需要1到3年,具体取决于领域)做科学家要求的事。

开发人员总是学习另一个能力领域,因为他们的大部分程序都不适合开发人员,所以他们需要知道“客户”的行为。

答案 14 :(得分:1)

成为魔鬼的倡导者,教科学家成为优秀的软件工程师是正确的事吗?研究中的软件通常是非常特定的 - 有时候一段代码只需要在一个数据集上成功运行一次。然后将结果输入出版物并实现目标。而且您的技术或算法很快就会被短期内更好的技术或算法所取代。因此,制造闪亮代码所花费的努力将会被浪费掉。

如果你因为涉及到格式错误的perl代码而感到沮丧,那就认为你所看到的代码是罕见的幸存者之一。这些代码的山脉已被编写,使用了几次,然后丢弃,再也看不到日光了。

我想我只是说在研究臭臭的一次性原型代码方面有一个很大的地方。这些代码存在的原因很充分。它可能不是很漂亮,但如果它完成了工作,谁在乎呢?我们总是可以雇用一名软件工程师来编写生产就绪版本,如果它证明是合理的,那就让我们的科学家继续前进。