我意识到,作为一名编程学生,我最大的弱点就是我很难理解其他人的代码。
我对“教科书”代码或明确注释的代码没有任何问题,但是当给出一个包含十几个不同函数且没有注释的几百行程序时,我发现很难开始。
我知道这种类型的代码是我在职业生涯中可能遇到的更多代码,而且我认为代码理解能力差对我来说是一个很大的障碍,所以我想专注于提高我在这方面的技能。
哪些工具/技术有助于提高您的体验中的代码理解力?
您如何处理不熟悉的,未注释的代码?为什么?你认为你的技术有用吗?
谢谢
答案 0 :(得分:4)
熟悉外国代码
如果代码库足够小,您可以立即开始阅读。在某些时候,碎片将开始一起落下。
在这种情况下,“足够小”会变化,随着经验的增加,它会变大。您也将从这里开始受益于“作弊”:您可以跳过您从经验中认识为“实施模式X”的代码片段。
您可能会发现在阅读代码时绕道而行很有帮助,例如:通过在看到被调用函数时查找函数,然后花费一点时间浏览它。在了解所谓的功能之前,不要停留在这些弯路上;这不是重点,它会让你觉得自己跳来跳去并没有任何进展。绕道的目的是了解新功能在不到半分钟内的作用。如果你不能,那就意味着这个功能太复杂了。中途绕行并接受这样一个事实,即你必须在没有这些额外帮助的情况下理解你的“当前”功能。
如果代码库太大,你不能只是开始阅读它。在这种情况下,您可以从高级抽象中识别程序的逻辑组件开始。您的目标是将源代码中的类型(类)与这些组件相关联,然后确定每个类在其组件中扮演的角色。将在组件内部使用类,并使用类与其他组件或框架进行通信。在这里划分和征服:首先将类分成相关的组,然后专注于一个组,并了解它的各个部分是如何组合在一起的。
为了帮助您完成此任务,您可以使用源代码的结构作为指导(而不是最终法律;由于人为错误,它有时会产生误导)。您还可以使用诸如函数或类型的“查找用法”之类的工具来查看每个引用的位置。同样,如果您不能合理地快速完成,请不要尝试完全消化IDE告诉您的内容。当发生这种情况时,这意味着你从一台你不太了解的机器中挑出了一块复杂的金属。把它放回去尝试别的东西,直到找到你可以理解的东西。
调试外国代码
这完全是另一回事。我会欺骗一点,直到你积累了丰富的经验,只要对你来说陌生,就没有办法成功调试代码。
答案 1 :(得分:2)
我发现绘制调用图和继承树通常对我有用。您可以使用任何方便的工具;我通常只使用白板。
通常情况下,代码单元/功能很容易理解,我可以清楚地看到每个单元是如何运行的,但我经常会看到更大的图片,而这就是故障发生的地方我得到了这个“我迷失了”的感觉。
从小处开始。对自己说:“我想完成 x ,那么它是如何在代码中完成的?”其中 x 是一些可以跟踪的小操作。然后,只需跟踪代码,制作一些可视化的内容,您可以在跟踪后查看。
然后,选择另一个 x 并重复此过程。每次执行此操作时,您都应该对代码有更好的感觉。
当需要实施某些内容时,请选择与您追踪的内容类似(但几乎不相同)的内容。通过这样做,您可以从跟踪级别的理解转变为实现级别的理解。
第一次与编写代码的人交谈也很有帮助。
答案 2 :(得分:2)
我尝试做的第一件事就是弄清楚代码的目的处于什么样的高级别 - 在您对问题域有所了解之前,细节是无关紧要的。找出问题的好方法包括查看标识符的名称,但考虑上下文通常更有帮助 - 您从哪里获得此代码?谁写的?它是否具有已知用途的某些应用程序的一部分?一旦你弄明白代码应该做什么,你就可以复制并开始重新格式化,以便你个人更容易理解。这可以包括在必要时更改标识符的名称,排除任何奇怪的缩进,添加空格来分解,一旦你弄清楚它们做了什么就评论位等等。这无论如何都是一个开始...... :)
此外 - 一旦你弄明白代码的目的,通过调试器对一些简单的例子进行操作,有时也可以让你更清楚地了解FWIW的内容......
答案 3 :(得分:1)
我理解你的挫败感,但请记住,那里有很多不好的代码,所以请保持你的ch。并非所有代码都不好:)
这是我倾向于遵循的过程:
答案 4 :(得分:0)
Understand是一个了不起的代码分析工具。它在我以前的雇主(L-3)中广泛使用,所以我在目前工作的地方购买了它。