学术界的代码审查
我是机械工程博士学位,但没有计算机科学的广泛背景。我们编写代码是我们研究的一部分,但通常是高级代码(例如Matlab),并且经常是临时的。
听起来这里的学者进行代码审查对于(a)向其他人学习技术,以及(b)发现代码中的不足之处非常有价值。 (有时,我认为有些论文被人以代码形式实例化了该理论,而作者却没有看到过,这使我感到恐惧!)学者们应该对同行进行强制性的代码审查吗? (以前有人见过这样的事吗?)
更重要的是,在这种情况下进行有效的代码审查需要多长时间?当特定资源总是非常稀缺时,似乎很难证明有多余的时间是合理的。
附录:几个人问"出版物"是否构成足够的评论。一点也不,在我的领域。结果是很重要的部分,因此,如果我们使用无法理解的代码编写算法和/或者数据分析,这些代码在经过数小时的处理后就会吐出图形,这与干净,可共享,快速的代码没有什么不同。
我们可能会编写错误的代码,以产生看起来正确的结果,却永远不知道其中存在错误!
但是我认为,以电子方式发布出版物以及用于产生稿件结果的代码是一个好主意。问题又是时间:每个人的代码都是丑陋且难以维护的(概括地说,毕竟我们是工程师,而不是程序员),因此清理它以进行发布将花费很长时间。代码审查可能会帮助解决这种情况。
解决方案
代码审查的时间长度取决于:
- 代码长度
- 代码复杂度
- 审稿人技能
因此很难准确量化所需的时间。我认识一些在我工作的人可以复查〜400loc / h,但是有几个项目已将最大loc / h速率限制为200,因为他们觉得执行速度更快会降低代码复查的质量。
另外,代码检查最经常针对编码标准进行,因为检查是为了确保代码符合标准。代码审查不是重新设计代码的地方,因此,如果我们缺乏编码标准,那么代码审查就很难实现。
我的建议是举行1或者2场会议,看看团队/同龄人如何处理它。 "有效"的答案是,它基本上取决于人民。
我去过很多评论,这些评论的人实际上并没有花时间坐下来跟踪代码。很多时候,人们会简单地掩盖来源,并写下拼写错误和"此处需要注释"的"缺陷"类型。虽然获得此信息很好,但并不能真正上面列出的a,b原因。
请注意,我也曾参加过非常有成效的评论。
我的最后建议是一次回顾一小段代码。发送整个项目的评论不会产生我们期望的结果。大多数人在查看大量代码时都会感到厌倦,并开始略过一遍,以使它贯穿所有内容。
在我的最新职位上,最有效的方法是即兴代码审查。因此,如果我刚刚完成了一段代码,那么我会请另一位开发人员进行检查,然后再检查任何内容到我们的源代码控制分支中。没什么正式的,只是快速浏览一下,以便其他人知道代码决定了什么。
在发表之前,不是所有同行都审查过研究论文吗?研究本身是否存在某种形式的导师? (不知道合适的用语,我不在学术界...)
那么,为什么还不包括代码审查呢?研究论文上的同行评审也应该是代码评审。 (真相,很少有人知道如何执行有效的代码审查,但这是一个不同的问题...)
为了明确起见,我假设同行评审(在发表之前?)将验证所有假设,确认结论,验证数据跟踪等。
验证数据跟踪的一部分(以及由此得出的结论的有效性)必须在检查处理或者生成该数据的程序。因此,必须进行代码审查...
假设一组审阅者知道我们正在使用的语言,并且了解我们所使用的数学/公式,则通常不会花费太长时间。已经发表了一些研究和报价,例如每小时要检查的代码行数以及其他此类统计信息,但是对执行一堆数学运算的代码进行审查要比对数学强度较低的事情进行审查花费的时间更长,特别是如果要将自己的函数滚动到X或者Y。
当我在学校时,我们没有进行代码审查(除非被困住了,然后才发现错误),但是让我关注更多代码当然是件好事。
在进行代码审查时,我的团队通常会提前两天将代码提供给审查者(取决于代码量,如果有很多代码,则将其分解为若干逻辑上分组在一起的块)并让审阅者将其签出。然后我们开会约一个小时,然后逐步浏览发现的内容。有很多方法可以做到这一点,但是对我们来说效果很好。
我想这让我有些惊讶,因为现在还没有这样的东西。
在学术界度过了一段时间之后,我注意到生成的许多代码只是完成工作的代码。
通常,一个人将代码砍在一起,以测试正在测试的任何假设。在行业中,代码是由小型团队制定的,而可维护性是一个重要因素。
除非审阅者熟悉代码库,并且代码量很小(几千行?),否则代码审阅将非常耗时或者不太严格。
我花了一天的代码来回顾一位同事编写的5000行程序,是的,我发现了很多问题,但是我会说我不愿意这样做。以我的经验,代码审查最能评估功能项,而不是评估整个应用程序。
坦白地说,是的,如果代码审查得当,将对学术界大有裨益,但是,由于每个人都在尝试尽快完成自己的项目,因此在学术界中找到足够的时间来审查代码的机会很小。从本质上讲,学术界的环境并不真正有利于代码审查。
而且让本科生实习生很愚蠢,理想情况下,应该由比一般本科生有更多软件开发经验的人来进行代码审查。因此,除非本科生非常有天赋,否则我们不太可能从他们的代码审查中获得很多收益。
与其直接进行代码审查,不如尝试某种代码分析器,这是一个好主意。诸如FindBugs之类的东西可以很好地指出"概念验证"代码中往往存在的公然问题。
我想有一个很大的不同:学者和软件开发人员以非常不同的方式一起工作。
代码审查通常作为具有共同议程的团队的一部分进行。如果应用程序销售,我们将获得报酬。他们理解所有代码并且代码尽可能的好,这符合每个人的利益。
学术界的议程截然不同,我敢肯定,我们知道至少有一位博士生因其20年前的论文与他们的论文相矛盾而被资深人士不断挫败(大多数研究人员似乎做得很多)。
作为一名学生,我们可能需要仔细选择与谁一起审阅,而他们不会自动对改进代码感兴趣。
代码审查不会(通常)修复错误或者真正地验证代码。他们只是分享对它的理解并提供反馈。
如果代码有效,但效率很低,这是一个问题吗?如果这是一场噩梦,那么如果它确实有效,那么记载不充分和不可行的事情就不重要了吗?
在某种程度上,我认为,即席代码不是专业的软件开发人员,它可能是该工作的正确工具。我曾经在Matlab上做过一些事情(在我的数学学位期间),现在我梦dream以求,但是我现在编写的代码已由我的团队共享并定期重新访问,自那时以来,我一直没有看过我编写的代码毕业了。
第一次编写更好的代码,仅仅是为了让我们在几个月后重新访问自己的代码更容易。与志同道合的科学家和工程师合作,他们相信编写好的代码。以代码为傲,请记住,我们远离机器代码并发明高级语言的原因之一是为了更好地与其他人进行交流。如果其他人无法理解方法,这并没有多大用处,尤其是在学术界,而其他研究人员的研究结果的可重复性非常重要。
我的背景是非计算密集领域的物理学学者。
学术编程中的心态是经过同行评审的论文提供了用于处理数据的算法的描述。这可能是纯粹的建模,以某种功能形式或者某种其他类型的处理来拟合数据。假设作者已经熟练地实现了他们所描述的算法。敏锐的审阅者可能会尝试重复某些分析(但我想这很少见)。
通常,我希望通过使用合成数据进行测试,或者与已知(简单)分析结果进行比较,来验证论文在程序中的作用,如果该程序对于作品或者小说来说很重要的话。
回想我曾经在他们工作过的小组中,不会有很多人(有些人接近一个人)能够进行有用的代码审查。在模拟小组中,几个人将使用相同的代码工作,并且很可能会随着他们的发展而开发新的方法。
在学术界,代码质量通常不是什么大问题。通常,代码的唯一使用者是研究人员,因此稳定性和易用性之类的事情比简单地完成工作并不重要。此外,研究代码必定是实验性的,并且规范比其他类型的代码越来越多,因此最终的代码将具有大量的更改。
但是我认为最重要的因素仅仅是学者们不认为自己是专业的程序员,编程只是他们工作的一小部分。结果,根本没有能够维持代码审查过程的关心或者热情水平。