我一直对Wine感到惊讶。有时我想破解它,修复一些小问题并大致了解它是如何工作的。所以,我下载了 Wine 源代码,然后我就感到不知所措。代码库非常庞大,而且 - 与 Linux 内核不同 - 几乎没有关于代码的指南。
理解如此庞大的代码库的最佳实践是什么?
我一直对Wine感到惊讶。有时我想破解它,修复一些小问题并大致了解它是如何工作的。所以,我下载了 Wine 源代码,然后我就感到不知所措。代码库非常庞大,而且 - 与 Linux 内核不同 - 几乎没有关于代码的指南。
理解如此庞大的代码库的最佳实践是什么?
对于复杂的代码库,您可能犯的最大错误就是试图成为一台计算机。让计算机运行代码,并使用调试器帮助找出发生了什么。
弄清楚如何从现有的源代码编译、安装和运行您自己的 Wine 版本。
了解如何在您的 Wine 版本的运行实例上进行调试(例如使用 gdb)。
在调试器下运行 Wine 并使其显示不受欢迎的行为。
有趣的部分:找到代码执行路径的去向,并开始学习它们是如何结合在一起的。
是的,阅读大量代码会有所帮助,但是编译器/调试器/计算机可以比您更快地运行代码。
一位教授曾经告诉我们,把这种情况比作爬山。您可能正在听有人这样做,并告诉您眺望这个国家是什么感觉。你会毫不犹豫地相信那是一个壮观的景象。
但是,您必须开始攀登自己才能真正了解从顶部看到的景色。
而且一路爬到顶峰也不是那么重要。仅仅达到高于地面的高度可能就足够了。
但永远不要害怕开始攀登。这种观点总是值得任何努力。
这对我来说一直是一个很好的类比。我知道这个问题更多的是关于如何在开始攀爬后有效处理代码库的具体技巧。但是,它立刻让我想起了我们当时的物理课。
(这是我不久前发布的一个问题的答案。我对其进行了一些修改以适应这个问题。)
经验告诉我,在学习遗留系统时,你有 3 个主要目标:
所有这三个部分都非常重要,并且有一些技巧可以帮助您入门。
首先,抵制只是通过 ctrl-click(或任何您的 IDE 使用的方式)围绕代码来理解所有内容的诱惑。您可能无法以这种方式将所有内容都放在脑海中,尤其是当每一行都迫使您查看多个其他类以了解它是什么时,因此您需要能够掌握多个级别的堆在你的头上。
尽可能阅读文档;它通常可以帮助您快速获得构建后续所有内容的思维框架。
尽可能运行测试用例。
不要害怕问知道你是否有问题的人。诚然,您不应该将其他人的时间浪费在无意义的查询上,但是如果您根本不理解某些内容(对于更多概念性问题尤其如此,例如“将其实现为更有意义吗? ___”或其他东西),在你把事情搞砸并且不知道为什么之前找出答案可能是值得的。
当你最终开始阅读代码时,从一个合乎逻辑的“主要”位置开始,然后从那里开始。不要只是从上到下阅读代码,或者按字母顺序,或者任何东西(这可能很明显)。
熟悉大型代码库的最好方法是深入研究。许多项目都有一个需要完成的简单任务列表,它们通常是为了帮助人们轻松完成而保留的。你应该找到并处理其中的一些; 您将学到很多关于一般代码大纲和结构的知识,为项目做出贡献,并获得轻松的回报,这将有助于鼓励您承担更大的任务。
与大多数项目一样,WINE 为其开发人员提供了良好的资源。IRC、wiki、邮件列表和指南/概述。对于大多数令人生畏的代码库,在最初的几个修复之后它并不那么可怕。WINE 确实很大,而且很像内核,我怀疑在所有系统中都没有专家。也不觉得你需要。开始做一些对你很重要的事情,然后从那里开始。
我自己已经为 WINE 打了几个补丁,这是一个很好的社区和良好的结构。有很多非常有用的调试消息,这是一个非常酷的项目,可以帮助你更长时间地完成它。
我们都感谢您为 WINE 提供帮助的勇气和意愿(它需要它)。谢谢,祝你好运。
寻找您有兴趣改进的一项特殊功能。搜索它的实现。一旦你找到它,拉上那根稻草,其余的都会随之而来。
最好的方法是通过评论。我具有讽刺意味,因为您了解野兽的微小部分添加评论,以便您可以跟踪您的踪迹。如果您在代码中添加缺少的指南,其他开发人员也会喜欢它。
尝试在代码中实现一些微小的变化,这对你来说是可见的。这可能是找出一种可行的方式来输出调试语句(并找出输出出现的位置),它可能正在改变窗口的默认大小或桌面颜色,或其他东西。一旦你可以在代码库中做一些事情,你就已经触及了理解的表面,并且可以开始转向更复杂的事情。此时,选择一个您希望代码执行的稍微有用的目标,并实现它。或者查看项目的错误跟踪器并寻找一些小的开始。
随手记录,随手编写单元测试,随手重构。当您弄清楚例程的作用时,请发表评论!
(警告:前面的无耻营销)
对于使用 Eclipse 的 Java 开发人员,有nWire。它是一个用于导航和可视化大型代码库的 Eclipse 插件。
理解大型系统的一个好方法是将其分解为它的组成部分,并专注于通过应用程序的特定路径。
您的调试器是您的朋友,在您要调查的线程中设置一个断点,然后逐行逐行查看每个部分的功能......希望对您有所帮助......