9

我已经意识到,作为一名编程学生,我最大的弱点是我理解他人代码的能力很差。

我对“教科书”代码或明确注释的代码没有任何问题,但是当给定一个几百行的程序时,包含十几个不同的功能并且没有注释,我什至发现很难开始。

我知道这种类型的代码在我的职业生涯中可能更可能遇到,我认为代码理解能力差对我来说是一个很大的障碍,所以我想专注于提高我的技能在这个领域。

在您的体验中,哪些工具/技术有助于提高对代码的理解?

您倾向于如何处理不熟悉的、未注释的代码?为什么?你觉得你的技术有什么帮助?

谢谢

4

5 回答 5

4

熟悉外国代码

如果代码库足够小,您可以立即开始阅读。在某些时候,这些碎片将开始一起落下。

在这种情况下,“足够小”会有所不同,随着经验的增加,它会变得更大。您还将开始从这里的“作弊”中受益:您可以跳过您从经验中识别为“实现模式 X”的代码片段。

您可能会发现在阅读代码时少走些弯路很有帮助,例如,在您看到一个函数被调用时查找它,然后花一点时间浏览它。在了解被调用函数的作用之前,不要走这些弯路;这不是重点,它会让你觉得你在跳来跳去,毫无进展。绕道时的目标是在不到半分钟的时间内了解新功能的作用。如果不能,则说明功能太复杂。中止绕道并接受这样一个事实,即在没有这些额外帮助的情况下您将不得不了解您的“当前”功能。

如果代码库太大,你不能直接开始阅读它。在这种情况下,您可以从在高抽象级别识别程序的逻辑组件开始。您的目标是将源代码中的类型(类)与这些组件相关联,然后确定每个类在其组件中所扮演的角色。将有在组件内部使用的类和用于与其他组件或框架进行通信的类。在这里分而治之:首先将课程分成相关的组,然后专注于一个组并了解其部分如何组合在一起。

为了帮助您完成这项任务,您可以使用源代码的结构作为指导(不是作为终极法则;由于人为错误,有时可能会产生误导)。您还可以使用函数或类型的“查找用法”等工具来查看每个函数或类型的引用位置。同样,如果您不能合理地快速完成,请不要尝试完全消化 IDE 告诉您的内容。发生这种情况时,这意味着您从不太了解的机器中挑选了一块复杂的金属。把它放回去尝试别的东西,直到你找到你理解的东西。

调试外来代码

这完全是另一回事。我会骗一点说,除非你积累了大量的经验,否则你不可能成功地调试代码,只要它对你来说是陌生的。

于 2010-12-02T15:12:27.573 回答
2

我发现绘制调用图和继承树通常对我有用。您可以使用任何手边的工具;我通常只使用白板。

通常,代码单元/功能本身很容易理解,我可以清楚地看到每个单元是如何运作的,但我经常无法看到更大的图景,这就是发生故障的地方,我得到了这个“我”我迷路了”的感觉。

从小处着手。对自己说:“我想完成x,那么它是如何在代码中完成的?” 其中x是您可以跟踪的一些小操作。然后,只需跟踪代码,制作一些可视化的东西,您可以在跟踪后回顾一下。

然后,选择另一个x并重复该过程。每次执行此操作时,您应该对代码有更好的感觉。

当需要实现某些东西时,请选择与您跟踪的事物之一相似(但不几乎相同)的东西。通过这样做,您可以从跟踪级别的理解转变为实现级别的理解。

与第一次编写代码的人交谈也很有帮助。

于 2010-12-02T15:01:49.090 回答
2

我尝试做的第一件事是从高层次上弄清楚代码的目的是什么——在您对问题域有所了解之前,细节是无关紧要的。弄清楚这一点的好方法包括查看标识符的名称,但考虑上下文通常更有帮助——你从哪里得到这个代码?谁写的?它是具有已知目的的某些应用程序的一部分吗?一旦你弄清楚了代码应该做什么,你就可以复制一份并开始重新格式化它,以便你个人更容易理解。这可能包括在必要时更改标识符的名称,整理任何奇怪的缩进,添加空格来分解事物,一旦你弄清楚它们做了什么就评论位等等。无论如何,这是一个开始...... :)

另外——一旦你弄清楚了代码的用途,通过调试器对一些简单的例子进行单步调试,有时也可以让你更清楚地了解 FWIW 发生了什么......

于 2010-12-02T15:03:59.560 回答
1

我理解你的沮丧,但请记住,那里有很多糟糕的代码,所以请保持警惕。并非所有代码都是坏的:)

这是我倾向于遵循的过程:

  1. 寻找任何单元测试,因为它们应该记录代码应该做什么......
  2. 使用 code rush / resharper / visual studio 快捷方式浏览代码 - 这应该会给你一些关于所涉及的逻辑和物理层的想法......
  3. 首先扫描代码,寻找常见的模式、命名约定和代码样式——这应该让您深入了解团队的标准,也许是原始编码人员的思维定势......
  4. 当我浏览代码层次结构时,我会记下正在使用的对象......通常用笔和纸绘制一个简单的活动图
  5. 我倾向于从一个共同的入口点开始,所以如果它是一个 UI,那么从视图开始并一直工作到数据访问代码,如果它是一个服务从服务边界开始并一直工作到数据访问代码...
  6. 寻找可以重构的代码——如果你能看到可以重构的代码,你已经学会了如何在不改变其行为的情况下简化它……
  7. 练习构建您正在查看的相同内容,但以不同的方式...
  8. 当您阅读未经测试的代码时,请考虑使其可测试的方法...
  9. 使用 code rush 诊断工具来查找具有高维护复杂性或圈复杂性的方法,并特别注意这些区域,因为很有可能,这是最多 bug 的地方......

祝你好运

于 2010-12-02T15:30:31.883 回答
0

理解是一个了不起的代码分析工具。我以前的雇主 (L-3) 广泛使用它,所以我在我目前工作的地方购买了它。

于 2010-12-02T15:12:47.383 回答