我会讲一个发生在我身上的案例的故事。
我想为 x264 实现一种新的帧类型决策算法,该算法使用前向动态规划(维特比算法)。但它会变得复杂、混乱、丑陋等等。我真的不想这样做。我试图将这个项目抵押到 Google Summer of Code 上,但是由于某种可怕的运气,我们的一个学生只是放弃了他的项目......就是选择该项目的学生。
于是,经过两个月的抱怨和躲避,我终于开始研究算法了。我就是这样做的。
首先,我与另一位开发人员交谈,他显然已经对如何做到这一点有了一些想法。我们讨论了这个问题,他向我解释了这个问题,直到我从算法的角度完全理解了这个过程。这是任何此类项目的第一步:充分理解其背后的算法,以便可以对整个项目进行伪代码。
然后我和我的另一个同事聊了聊。我们走到白板前,我把它画出来,直到he也明白了。通过向别人解释,我自己也有了理解。这是第二步:向其他人解释算法,以便they可以对其进行伪代码。这是对编程过程的模拟,因为编程是向计算机“解释”算法的一种形式。
然后,我编写了一个简单的 Java 原型,它使用任意假值作为成本函数,并且仅用于测试维特比搜索。我完成了它,并通过详尽的搜索进行了检查——它完全匹配。我的动态规划是正确的。这是第三步:在尽可能简单的环境中编写尽可能简单的算法形式。
然后我将它移植到 x264 的本地语言 C。它又起作用了。这是第四步:将算法的简单形式移植到完整环境中。
最后,我用真实的成本函数替换了假的成本函数。经过一些错误查找和修复后,它起作用了。这是最后一步:将算法与环境完全集成。
这个过程只花了不到一周的时间,但从我在项目开始时的角度来看,这完全是令人畏惧的,我什至无法让自己开始——但是通过将其分解为这样一个一步一步的过程,我不仅能够完成它 http://git.videolan.org/?p=x264.git;a=commitdiff;h=9818865c1f5eccbc04fb51f062cb1b3abff02db0,但完成速度比我预期的要快得多。
而且其好处远远超出了 x264;我现在对维特比了解得如此透彻,以至于我现在可以向其他人解释它......而其他人也可以从中受益匪浅。例如,一位 ffmpeg 开发人员正在使用我的算法和代码的改编版来最佳地解决一个有些不同的问题:音频文件中的最佳标头放置。