解释他人的源代码[关闭]


9

注意:我知道这个问题。但是,这个问题更加具体和深入,侧重于阅读实际代码,而不是调试或询问作者。

作为入门级计算机科学班的学生,我的朋友偶尔会请我帮助他们完成作业。编程是我引以为傲的事情,所以我总是很乐意为之。但是,我通常很难解释它们的源代码。

有时这是由于样式奇怪或不一致,有时是由于作业中指定了奇怪的设计要求,有时是由于我的愚蠢。无论如何,我最终看起来像个白痴,盯着屏幕看了几分钟,说:“呃...”

我通常会先检查常见错误-缺少分号或括号,使用逗号而不是提取运算符等。

当那失败时,麻烦就来了。我经常不能调试程序,因为这是一个语法错误,我常常不能问作者,因为他/她自己不理解设计决策。

您通常如何阅读他人的源代码?您是从上至下阅读代码,还是按照每个函数的名称进行操作?您怎么知道何时说“该重构了?”


1
我会说:即使在大学期间,也不要浪费时间在糟糕的程序员上...除非您为此付费。成功的诀窍是:在使他们看起来愚蠢的同时拿走他们的$。
Job

2
@Job:好吧,我们刚开始时都写了不好的代码。他们是否值得花费时间取决于他们是否愿意独自工作并提高自己。

@工作我正在上高中,我想适当地对待我的朋友。虽然我可以看到将其视为比赛的逻辑,但我正在努力成为一个更好的人。
Maxpm 2011年

5
这样一来,您实际上就能消除竞争,同时对他们友善。如果您为他们解决所有问题,您将学到很多东西,他们将变得无助。(另一方面,他们将获得学位,再加上他们缺乏知识,意味着他们可能会马上进入管理领域。:))
biziclop 2011年

Answers:


22

第一个技巧:使用IDE(或非常好的编辑器:))来发现语法错误,括号错误和其他琐碎的错误。

第二步:将所有代码自动格式化为您喜欢的格式。您可能认为这无关紧要,但确实如此。

如果局部变量命名不正确,请不要害怕对其重命名。(如果您有权访问整个系统,则可以重命名任何内容,您应该这样做。)

当发现某个功能/方法在做什么时,请向自己添加注释。

耐心一点。了解外来代码并不容易,但是总会有一个突破性的时刻,即大多数拼图都突然就位。到那时,恐怕都是辛苦和辛苦的事情。好消息是,随着练习,这个尤里卡的时刻会更快到来。


如何在仍然尊重原始作者的同时重新格式化/重命名?我是否应该留下评论说类似// Renamed to ABC for XYZ
Maxpm 2011年

3
@Maxpm直接的答案是您不必尊重原始作者。代码不是一件艺术品,如果它不起作用,那肯定不是。但是您可以在其中添加这样的注释,因此可以更轻松地向原始作者解释您所做的更改以及更改的原因。原因很重要,只要有可能,请记录您做事的原因。这是最有用的评论类型。
biziclop 2011年

6
@Maxpm-复制代码文件。做您想做的事,然后返回并帮助他们在该系统上解决问题。好吧,这就是我要做的。
艾琳(Erin)

@Maxpm复制代码并首先通过astyle(astyle.sourceforge.net)运行它。学习如何编程的人们很少具有一致的编码风格。在视觉上“解析”代码时,查看格式正确的代码有很大帮助。
Vitor Py

1
@Maxpm,最好在您的系统上复制并使用它,但是即使您必须在他们面前进行操作(例如,如果他们要求您过来帮助您),如果您需要重命名变量,只需告诉他们您没有不要写它,所以不知道一切在做什么,因此您需要重命名它。
Dominique McDonnell'3

20

我可以说我认为您对此采取了错误的方法。如果有人向您求助于他们的代码,我认为您有责任转身向他们说,带您逐步了解他们的代码。您可以为他们解决错误,他们可能会(死记硬背)学到一些东西,如果他们能够发现自己的错误(在您的帮助下),他们可能会学到更多。此外,您将获得有关不同人如何处理编码的更多经验(这反过来又使您可以阅读/理解更多的代码),这是一个良性循环...;)


2
为什么要投反对票?这似乎是个好主意。
马特·艾伦

我同意。似乎很奇怪。
Michael K

@马特广告迈克尔,路过式downvoters,没有什么可以做我猜...

一个好主意,但在现实生活中,您更有可能收到一个代码“八年前因观看色情作品而被解雇的支持者”,然后,没有人遇到。另外,可能在基础知识方面挣扎的人给出的解释的真正价值是什么?
biziclop 2011年

这是一个很好的答案。他们应该对他们认为自己的代码应该执行或至少希望执行的操作有所了解。
JeffO 2011年

3

我相信这种能力是经验的结合,只是拥有才能。如果我们要求员工从头开始做一些事情,而他们却完全无法在他们未编写的代码中发现明显的错误,那么我们的员工可以解决或多或少的问题。同时,我们拥有一些员工,他们对基本设计以外的任何东西都不信任,但他们可以立即深入研究其他代码并迅速查找问题。

也就是说,解决此问题的方法是更改​​代码。将其重新格式化为您惯用的格式,将变量名更改为对您有意义的名称,如果代码不清楚,则添加注释。如果他向您寻求帮助,您应该继续进行更改,直到发现问题为止。然后将其交给您的朋友,以更正原始代码还是使用您的原始代码。


+1-开发代码和跟踪他人编写的错误是2个非常不同的技能组。当雇主找到一个既能做得很好又能做的事情时,雇主就不会欣赏他们的能力。
Dunk

2

首先,如果存在语法错误,则只需要仔细阅读编译器错误即可。通常,一行被突出显示为错误,但实际上是一行存在错误。

请注意,对于入门学生而言,可能存在一些编辑工件,这些工件会阻止程序无法被编译。例如,我曾经看到一个学生(不是我的一个学生)使用空格键而不是返回:他的代码在编辑器上看起来很正常,该编辑器包裹了80列(该学生非常耐心),并且该代码甚至可以工作直到他添加“ //”样式的注释,它注释掉了程序的所有其余部分。同样,如果您从网站上复制代码示例,通常还会复制一些不可打印的字符(取决于网站格式化代码的方式)。如有疑问,请在一行中重新键入而不进行复制和粘贴。[这真是太神奇了,但我最近看到了它的发生。]

对于讨厌的编译器错误,您可能必须通过创建新文件并在执行过程中键入所有代码来扩展程序。确保在每个主要步骤之后进行编译,然后再继续进行下一个步骤。

好的,如果没有语法错误怎么办?然后是时候逐步执行代码了!您可以为此使用调试器,但是对printf整个代码进行调用也是非常有效的。例如,如果存在for循环,则为循环计数器添加打印语句。对于嵌套for循环,您可能会发现错误的变量正在递增。

使用printfs 的优点是它可以随时间/空间“压缩”您当前正在查看的内容。当您使用调试器进行调试时,您还会看到很多不相关的状态,这可能会更加乏味。另外,在看不到已打印到控制台的内容的历史记录的情况下,您可能会错过一些模式。这里的要点是,调试器和printfs是互补的技术,两者都不总是比对方更好。

最后,只需问你的朋友发生了什么事!而不是看着它说“呃”,而是问他们他们在做什么:“现在做n什么?” 通过启动对话框,他们可能最终会回答自己的问题,或者您可能意识到他们将程序概念化的方式存在缺陷,这可能会导致您找到解决方案。

正如其他地方所评论的那样,所有这些都随着经验的发展而变得更好。即使我已经编程了20年,但直到最近5年我一直在与学生一起工作,我才能更好地帮助他们解决错误。


1

我讨厌这样说,但是这里没有银弹。

坦白说,如果我足够机灵,即使在10%的案例中,我也能理解别人写的内容,这意味着什么,我无疑会成百万。

更实际的说,使用智能IDE是步骤1。

步骤2是运行doxygen或类似的方法来弄清楚源代码的层次结构。

第3步是找出锚定函数或对象,处理命令行或文件然后执行逻辑的东西。

与步骤3并行,如果正在使用全局变量,请跟踪它们。还要询问您的伴侣是否正在使用任何已知的特定算法-在查看代码之前阅读算法(如果存在)总是有好处的。


1

一言以蔽之:经验,您获得的经验越多,您对最佳实践的了解就越多,他们可以判断/理解他人的代码。它不是自动产生的,而是通常仅来自您自己执行相同的错误!

就是说,程序员必须学会正确地注释自己的代码,这是至关重要的,因为当您查看代码时,它通常只是主要的思考过程的结果,而这往往很难从代码中推断出来。简短的注释,一个带有设计思想的文本文件,可能会在理解代码和完全误解之间产生区别。


1

在学校的实验室里,我经常被问到同样的问题。通常,问题始于“如何解决此编译器错误?” 所以我很擅长发现悬挂else的,缺少分号之类的东西。(宏调试起来也很有趣-这#define CUBE(x) x * x * x是我们所有人注定要犯的错误。)我的一个优点是我和同一位老师一起上了相同的课,所以我已经熟悉了要求。

我发现最有效的过程是保持对话框运行。您不想为他们编写程序,因为它们是需要学习的程序。这意味着您必须与他们在同一台计算机上。在实验室里,我会去他们的电脑前。我会尝试从编译器消息开始,让他们发现错误。(我们使用C。)从行号开始,并指出消息和错误对应的位置。如果同一错误有多个,我会问他们两个错误的相似之处。

整个想法是帮助引导其他学生。为他们重写代码不会帮助他们学习。


#define CUBE(x) x * x * x除了类型不安全以外,还有什么问题?
乔布斯

当调用like时CUBE(3),就可以了。用调用它,CUBE(x + 1)可以得到x + 1 * x + 1 * x + 1C中的哪个值x + (1 * x) + (1 * x) + 1。这将计算出3x + 1哪个不是x <sup> 3 </ sup>!您可以通过声明修复它#define CUBE(x) (x) * (x) * (x)
Michael K

0

与逻辑错误相比,语法错误要容易得多。如果他们的大多数问题是语法,请找到一个IDE,将其代码复制并粘贴到其中,然后修复错误。逻辑错误要困难得多。我不确定为什么您说不能要求他们解释他们的代码。通过向其他人解释代码,我发现了许多逻辑错误。

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.