用我不知道的语言查看代码是否有效?


108

我是一位经验丰富的开发人员,但是没有做过很多代码审查。我被要求检查用Python编写的代码,但我不知道Python。

用我不知道的语言来检查代码有任何意义吗?


62
切线地,考虑转到CodeReview.SE并浏览python标签。仅查看问题,请考虑将对代码提供什么建议,然后查看答案中是否包含该建议。


14
听起来,这是了解Python的绝佳方法。对任何看起来很有趣的问题提出疑问-其中有些是您不了解该语言,有些是合法的代码审阅项目。
Dan Pichelman '16

9
@RobbieDee绝对!即使只是泰迪熊,向某人解释您的代码通常也是值得
Kilian Foth,

34
您说您被要求这样做。问您的人认为您执行此任务将为您的组织增加价值。如果您想知道该价值的本质是什么,请问那个人,而不是互联网上的陌生人!我们不知道那个人的脑袋里正在发生什么。也许代码质量太低,甚至新手都可以发现问题。也许代码的质量如此之高,以至于您将从中学习到良好的习惯。谁能说?有人认为这很有价值。问那个人是什么价值。
埃里克·利珀特

Answers:


120

什么感觉吗 是。即使您对编程语言的语义一无所知,您仍然可以读取字符并注意到格式不一致,注释缺失,标识符选择不当,明显重复等。

有多少意义或足够的意义来偿还您的时间成本?我不确定。这取决于您的职位,代码审查在团队工作流程中的重要性以及其他一些我们无法充分量化的因素。


50
进行一些代码审查是了解模块,框架甚至语言的好方法,因此无论如何都值得您花费时间(也许您会得到提示...)。但是,我不会批准这样的评论,而不是让熟悉语言和代码的人来审阅它。
Ordous

8
同样,如果您具有良好的领域知识,并且代码的名称得到了很好的命名/注释,您仍然可以在较高的层次上发现错误/误解/遗漏的功能(不过,由于语法问题,您可能不会发现错误)
Dan

4
作为局外人,您甚至更有可能发现栅栏错误或应用正确数量的等号的错误,以及类似的情况。
KlaymenDK '16

2
布尔上下文中的@KlaymenDK分配是(至少通常是)Python中的语法错误。Fencepost错误的可能性较小,因为编写良好的Python几乎从来没有使您直接使用数组/列表索引。(即使您这样做,通常也是如此enumerate。)我认为您的评论是一个很好的例子,说明了为什么尝试复习您不熟悉的语言最多应该对自己有教育意义。
jpmc26 2016年

1
@Mawg-我倾向于说这就是自动化测试的目的。即使掌握了该语言的专业知识,也很难仅通过查看代码/不执行代码并观察结果可以说出代码是否真正符合设计规范(除非您的设计规范如此详细,以至于它本质上就是代码本身) 。答案列举的方面涵盖了进行代码审查的许多(尽管不是全部)有效原因。代码检查通常不包括执行正在检查的代码。
aroth

59

作为Code Review Stack Exchange的定期撰稿人,我遇到许多与语言无关的问题,例如:

  • 格式,缩进
  • 范围
  • 循环
  • 类型操作

而这样的例子不胜枚举。但是,尽管我不需要了解该语言,但是我仍然可以查看这些问题/要点。

我们的一些顶级用户在他们不积极使用或不知道的语言中获得了最佳答案。在我的前十名中,甚至有两种语言是我既不知道,也无法在我的机器上编译/运行的语言。

我什至会说这与审查某人的伪代码相同。只要您可以观察和评论与您了解的事物相关的事物,就可以了,而且也很有意义。


2
我什至写了一个PHP程序的答案。这不是最好的答案,但是我仍然认为原始的循环声明很丑陋。
Hosch250

4
我通过复习,编写和复习了C#来学习C#。
RubberDuck

5
如果您不懂Python,那么您不太可能会意识到缩进在该语言中的重要性……
Floris

2
关于2/10的最佳答案是使用您不知道的语言。谁说选民对他们也一无所知?
马丁·史密斯

虽然我不懂这些语言,但我仍然会核对我的陈述,如果我搞砸了…相信我,我会听说的
Quill

44

一般建议

我认为这是底线:

  • 如果您对语言的了解不够深,不了解功能和常见习语,那么您可能不会对审查做出太大贡献。
  • 如果您想学习该语言的功能和惯用语,则可以参加复习。您的重点应该是观察习惯用法,并询问对您没有意义的模式和组织问题。这可能有助于确定问题区域,但仅在某种意义上,您可能会迫使开发人员捍卫他们所做的工作。提出问题的方式会为您的知识空白留下空间。请注意,这可能最终成为评论本身的净成本,但是该成本是对您的知识的投资。
  • 在您熟悉该语言的功能,惯用语和标准之前,您的贡献能力将受到限制。在您实际该语言编写了大量代码之前,我不希望这种情况会改变。

Python特定的注意事项和示例

对于不了解Python的特定情况,我会特别警惕。Python有许多习语和标准实践,最终使好的Python看起来与您在其他语言中可能期望的完全不同。(实际上,我认为Python强调的内容使我的代码在其他语言中看起来更好,而在其他语言中却没有得到改善。)除PEP8之外,还有一个很好的例子说明了您可能会完全错过Python鼓励的思维方式。

让我们看一个简单的例子。采取以下代码:

f = open('/home/me/something.txt')
try:
    content = f.read()
finally:
    f.close()

看到此代码有问题吗?如果您尚未使用Python,则可能不会。问题在于,Python 中有一种受欢迎的样式可以完成完全相同的操作:

with open('/home/me/something.txt') as f:
    content = f.read()

这是一个上下文管理器。你知道他们有什么用吗?您知道什么时候才适合使用它吗?您知道什么时候适合自己创建吗?没有?然后,您可能还没有准备好审查Python。

让我们看另一个例子。

def add_fifty(other_list):
   result = list()
   for i in other_list:
       result.append(i + 50)
   return result

x = range(10)
y = add_fifty(x)

看到问题了吗?问题是这种方法是完全没有必要的。当操作很简单时,您可能应该只使用一个理解:

x = range(10)
y = [i + 50 for i in x]

如果没有看到,则说明您不熟悉Python的功能和习惯用法。


1
在您的最后一个示例中,如果我看到了最终代码,我可能会知道它可能会做什么(不了解Python),并且我可能会开始怀疑我是否可以用自己喜欢的语言做类似的事情,这是我以前从未考虑过的。
gnasher729

1
@ gnasher729“的确,我认为Python强调的内容使我的代码在其他语言中看起来更好,而不是相反。” =)我所知道的其他语言中唯一甚至与远程相似的是.NET的LINQ和Java 8的Stream。Ruby可能有一些东西,我敢肯定函数式语言会有些东西。我对示例的观点是,即使您不熟悉Python,您甚至可能都不知道这样做,所以您甚至都不知道挑战“不良”版本。
jpmc26 2016年

@x = 1 .. 10; @y =地图{$ _ + 50} @x;

2
代码审查更多是关于逻辑错误,而不是用某种特定语言(对于外部程序员)实施一些晦涩的语法。这是关于查找逻辑错误的方法,例如完全错误地实现算法(例如在应加法时使用除法)。因此,代码将不完全符合规范。只要结果输出正确,那并不重要。至少,如果您担心像这样的特定优化,则团队代码审查会更好。
phyrfox

3
@phyrfox这根本不是真的。可能会发现逻辑错误,但是代码审查也(或主要是)关于最佳实践,安全性,性能,可靠性,可读性/可维护性等的。在进行检查之前,确实应该对其进行测试。imo上有StackExchange 对代码审查定义。在Python中,我提到的示例不是“小的优化”。不使用这些模式的Python开发人员非常缺乏经验,与时俱进或无能。这些是语言的基本要素。
jpmc26 2016年

21

他们可能正是因为您不知道Python而要求您审查Python代码。 有一种管理理论,团队中有一个“傻瓜”很有用。我并不是在给您起一个坏名字:)这个想法是团队可能会遭受小组思考并发展隧道愿景。打破这种局面的一种方法是在团队中邀请其他团队成员认为是“傻瓜”的人,即不了解主题的人。您将提出问题以告知自己,这些问题将来自其他团队成员可能从未考虑过的观点。

您不了解Python,因此Python编码人员看似普通的东西对您来说似乎很奇怪。您可能会建议团队从未考虑过的改进。


1
这是我的答案。我要补充一点,在任何给定的一天中,使用任何给定的Python例程和任何给定的Python专家组...代码是垃圾。
dwoz

通常,仅仅向“傻瓜”解释某些事情就会引出“ Doh!”。从“专家”的那一刻起,他们突然意识到代码没有按照其意图行事,或者错过了一些关键的情况。这也是开始传播知识的一种体面的方式。
TripeHound

21

代码审查与搜索拼写无效和格式错误的变量无关。如果您使用代码查看来查找此类内容,请不要浪费时间并使用工具。

代码审查是关于改进设计并检测新手程序员的常见错误。

由于我使用C ++进行编程,而且我对Python不够了解,所以我不敢复习Python代码。但是我可以帮助进行Java代码审查。

您没有说您使用哪种语言编写程序,但是,如果您不知道使用哪种语言编写程序,我看不出您可以在代码审查中做出什么贡献。


23
确实,您有一个工具可以区分名称错误的变量和名称正确的变量?我会很感兴趣地看到一个。
DavorŽdralo16年

1
@DavorŽdralo我知道Java具有Checkstyle。对于许多语言来说,更正式的静态分析工具是通用的,并且使它们强制执行编码标准通常是其最少的职责。
Shaz

9
我觉得这里的Code Review定义之间有些差异,有点让我想起了CR Meta上的这个问题:什么是Code Review?。我不会排除特定内容,而是说“代码审查与XYZ无关”。听起来您好像在说经验丰富的程序员不需要审查他们的代码,这是我非常不同意的。
西蒙·佛斯伯格

3
@SimonForsberg我不是这个意思。即使是高级程序员,也可以通过良好的代码审查学到一些东西。但是,如果仅有的注释是“您在此处拼写了一个变量”之类的注释,那么它们就是在浪费时间。
BЈовић

2
@BЈовић不,这不是您能找到的最糟糕的情况,但是它非常接近“发现的最小的东西仍然值得”。
Vatine

11

代码审查(除了实际查找缺陷之外)是一个团队成员向他人介绍正在添加或更改的代码的很好的介绍。如果您是一位经验丰富的开发人员,那么您应该能够通读足够的内容,以大致了解正在发生的事情。

从团队负责人的角度来看代码审查:那里有人了解应用程序该做什么(业务逻辑),那里有人了解应用程序该做什么(实现逻辑),可能还有其他人那里的人需要知道所有这些如何组合在一起。


7

你绝对不应该是唯一的评审,但也有很多很好的理由让你成为一个评审的。对于很多需要在代码审查中回答的问题,不了解该语言并没有太大的障碍。举例来说,我是该网站C#标记中排名前20位的回答者之一,而我还没有C#中的已编译hello世界。

您可以在不了解语言的情况下共享一些专业知识:

  • 领域知识。
  • 通用的面向对象设计。
  • 通用编程实践:命名,清晰度等。

这也是加快新产品开发速度的好方法。我刚刚加入了一个新团队,在那里我知道使用的语言很好,但是却不了解领域。参加代码评审使我更好地了解了领域方面,即使我还不能在这些方面做出很大贡献。

对于您而言,这是学习新语言成语的好方法,因为您会看到其他审阅者留下的评论。这些都是很难以其他方式学习的事情,因为您的解释器并不关心您的代码是否为pythonic。


5

这可能是双赢的局面。我要说的是,您可能是一位特别有价值的审阅者,因为您是Python的处女,没有被知识诅咒所污染。

可以这样考虑:如果代码足够清晰,即使是Python初学者也可以理解它,那么它一定是好的代码。您难以理解的部分可能是返工或更好的评论的对象。

显然,这对您也将是有益的,因为您将在使用过程中选择一种新语言。(希望您提供的代码是一个很好的学习示例。)这种安排对于Python(一种享有“可执行伪代码”的声誉)的语言特别有效。如果您是一位经验丰富的开发人员,那么您就不难理解Python程序的要旨。

需要警告的是,您将不会发现由特定语言的陷阱引起的错误。但是,查找错误并不是代码审查的唯一目的。如果没有其他要求,您只要知道同事代码中发生了什么事情,便可以参与知识转移。


2

曾经有人要求我审核一个分包商正在进行的项目,该项目似乎存在严重的性能问题。我很快就确定了关键因素是单个Perl模块。我以前从未见过Perl,并且在组织中没有一个人知道它,所以我着手尝试自己理解它。我从不了解细节,但是很清楚,它使用的算法的数据大小是二次方的,这就是所有麻烦的原因。所以是的,用您不完全理解的语言阅读代码绝对可以提高工作效率。好处是您可以在学习新技巧的同时学习。


1

一些观察:

1)如果您是一位经验丰富的开发人员,那么您将通过使用Python来学习Python(或至少需要了解的知识)。这将是“边做边学”的情况。一开始会很困难,但是当您选择语言时会变得更加容易。将此视为学习另一种语言的机会(人们经常通过“沉浸式”学习“外国”语言)。

2)SE网站上有很多有价值的人,这些人是“非技术”的,但是精通语法,沟通和逻辑。这样的人对主题产生了“新鲜的眼光”,并进行了一些其他人错过的“毫无头脑”的修复,因为他们太“束缚”了材料。大概正在向您咨询您的非“技术”(即非Python)技能,例如逻辑和整体编程知识。

而且,如果您没有进行过多的代码审查,那么几乎任何代码审查经验都将对您作为开发人员有所帮助。这看起来像您的技能和需求与团队的完美匹配。


1
我质疑复习代码是否在有意义的程度上构成了“边做边学”。也许我的审查经验与您的审查经验有所不同,但是很少有有意义的或实质性的代码编写,几乎从未执行过。
深奥的屏幕名称

@EsotericScreenName-我认为这取决于您从编写或知道代码的人那里得到的反馈多少。它也很可能位于您正在使用另一种语言的领域中,因此与典型的代码示例相比,它更加熟悉。大多数编码示例仅显示了如何制作图钉的小片段,很少将其显示为大型项目的一部分。
JeffO

0

这取决于审查的目标。即你是指有效的意思。

您仍然可能能够检测到一些问题。如果您只是他们的全部回顾对象,并且他们只是希望您对它有所了解,那么它们肯定会对您有所帮助。语言之间的许多结构概念相似。其中一项特别是能够查看评论。应该充分说明一下,不是那种特定语言的程序员仍然应该能够很好地了解正在发生的事情。如果没有,那么您可以告诉他们缺少评论的地方。如果评论得那么好……那么您应该能够仅通过正在发生的事件的注释来复习它们的结构,而不必真正阅读正在发生的代码。

但是您将不可能发现许多其他问题。因此,如果他们打算让您进行彻底的确定,以确定它是否是一个做得好/可行的程序,那么他们将感到失望。

该结果是否值得您花时间去做,在很大程度上取决于项目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.