代码之家  ›  专栏  ›  技术社区  ›  George

了解一个大型的、未记录的源代码集?[关闭]

  •  17
  • George  · 技术社区  · 15 年前

    我一直很惊讶 Wine . 有时我想破解它,修复一些小问题,并大致了解它是如何工作的。所以,我 download the Wine source code 就在那之后,我感到不知所措。代码库非常庞大,与Linux内核不同,几乎没有关于代码的指南。

    理解如此庞大的代码库的最佳实践是什么?

    11 回复  |  直到 15 年前
        1
  •  19
  •   Peter Phillips    15 年前

    对于复杂的代码库,最大的错误就是试图成为一台计算机。让计算机运行代码,并使用调试器来帮助找出发生了什么。

    1. 从现有的源代码中找出如何编译、安装和运行自己的葡萄酒版本。

    2. 了解如何在Wine版本的运行实例上进行调试(例如,使用gdb)。

    3. 在调试程序下运行wine,并使其演示不需要的行为。

    4. 有趣的部分:找到代码执行路径的位置,并开始学习如何将它们结合在一起。

    是的,阅读大量的代码会有所帮助,但是编译器/调试器/计算机可以比您更快地运行代码。

        2
  •  10
  •   mkoeller    15 年前

    一位教授曾经告诉我们把这种情况与爬山作比较。你可能在听一个这样做的人,告诉你往外看是什么感觉。你毫不犹豫地相信那是一个壮观的景象。

    然而,你必须开始攀登自己真正了解什么是从顶部的观点是什么样的。

    爬到山顶并不重要。仅仅达到地面以上的一个合理高度可能是非常有效的。

    但不要害怕开始攀爬。这种观点总是值得任何努力的。


    这对我来说一直是个很好的类比。我知道这个问题更多的是关于如何有效地处理代码库的具体技巧。不过,它立刻让我想起了当年的物理课。

        3
  •  8
  •   user2418306    8 年前

    (这是我不久前发布的一个问题的答案。我做了一些修改以适应这个问题。)

    经验告诉我,在学习传统系统时,您有三个主要目标:

    1. 学习代码应该做什么。
    2. 了解它是如何做到的。
    3. (关键的是)学习为什么它会像它那样做。

    这三个部分都非常重要,有一些技巧可以帮助您开始工作。

    首先,抵制仅仅用ctrl-click(或者IDE使用的任何方法)绕过代码来理解一切的诱惑。您可能无法以这种方式将每件事情都透视在您的脑海中,特别是当每一行强制您查看多个其他类以了解它是什么时,因此您需要能够在您的头脑中持有多个层次的堆栈。

    在可能的情况下阅读文档;它通常帮助您快速获得一个心理框架,在此基础上构建随后的所有内容。

    尽可能运行测试用例。

    不要害怕问一个知道你是否有问题的人。当然,你不应该把别人的时间浪费在无意义的问题上,但是如果有一些你根本不理解的东西(尤其是对于更多概念性问题,比如“把它作为一个”或其他什么东西来实现不是更有意义),那么在你把事情搞砸,不知道为什么之前,很可能有必要找出答案。

    当您最终开始阅读代码时,从一个逻辑上的“主”位置开始,然后从那里开始。不要只从上到下、按字母顺序或任何东西(这很明显)。

        4
  •  6
  •   jeffcook2150    15 年前

    熟悉大型代码库的最好方法是深入研究。许多项目都有一个需要完成的简单任务的列表,它们通常被保留以帮助人们轻松进入。您应该找到其中的一些并进行工作;您将学到很多关于一般代码大纲和结构的知识,为项目做出贡献,并获得一个简单的回报,这将有助于鼓励您承担更大的任务。

    和大多数项目一样,葡萄酒也有很好的资源可供开发人员使用:IRC、wiki、邮件列表和指南/概述。对于大多数令人望而生畏的代码基,在最初的几次修复之后并不那么可怕。葡萄酒真的很大,而且很像果仁,我怀疑在所有系统中都有专家;也不要觉得你需要成为专家。开始做一些对你很重要的事情,然后从那里开始。

    我自己也开了几家酒吧,这是一个很好的社区和良好的组织。有很多非常有用的调试消息,这是一个非常酷的项目,可以帮助您进行更长时间的调试。

    我们都很感激你的勇气和愿意为葡萄酒提供帮助(它需要帮助)。谢谢,祝你好运。

        5
  •  4
  •   MarkusQ    15 年前

    挖进去。想一个你想回答的问题,然后试着找到答案。当你厌倦了阅读代码时,去阅读dev邮件列表, developer's guide the wiki .

    不幸的是,要理解一个庞大的代码库,没有一条皇家之路。如果你喜欢这样的事情(我喜欢),你会很开心的。如果不是的话,指南书就不会真正有帮助了,所以你不会真的那么糟糕。

        6
  •  4
  •   Simon    15 年前

    寻找一个你想改进的特殊功能。搜索其实现。一旦你找到它,拉上那根稻草,剩下的都会跟着走。

        7
  •  2
  •   Ovidiu Pacurar    15 年前

    最好的办法是通过评论。 我是在讽刺你,因为你了解野兽的微小之处,添加评论,这样你就可以跟踪你的踪迹。 如果您在代码中添加缺少的指南,其他开发人员也会喜欢它。

        8
  •  2
  •   skiphoppy    15 年前

    尝试在代码中实现一些微小的更改,这对您来说是可见的。这可能是找到一种输出调试语句的可行方法(并找出输出出现的位置),也可能是更改窗口或桌面颜色的默认大小,或者其他什么。一旦你能 让事情发生 在代码库中,您已经触及了理解的表面,并且可以开始转向更复杂的事情。在这一点上,选择一个稍微有用的目标,您希望代码能够做到,并实现它。或者检查项目的bug跟踪程序,寻找一些小的东西开始。

    随时随地记录,随时随地编写单元测试,随时随地重构。当你弄清楚一个程序是怎么做的时,请评论它!!

        9
  •  2
  •   mpontillo    15 年前

    正如其他人所建议的,挖掘!阅读所有你能吸收的可用文档。然后看看你是否能找到其他感兴趣或知识渊博的人,和他们一起学习。它有助于让人们从中跳出想法并提出问题。

    对于C源代码,一旦您了解了您想要处理的代码区域,就生成 ctags cscope 该代码的数据库。这些工具使跳转和理解代码变得容易得多。许多文本编辑器(一个例子是 gvim )对ctags和cscope有支持,这样你就可以轻松地到处跳。

        10
  •  2
  •   zvikico    15 年前

    (警告:无耻的营销)

    对于使用Eclipse的Java开发人员来说,有 nWire . 它是用于导航和可视化大型代码库的Eclipse插件。

        11
  •  1
  •   Jonathan Holloway    15 年前

    理解一个大系统的一个好方法是将它分解成它的组成部分,并集中在通过应用程序的特定路径上。

    你的调试器是你在这里的朋友,在你想调查的线程中设置一个断点,然后一行一行地检查它的每个部分都做了什么…希望有帮助…