您知道代码的特定部分对项目至关重要,但可能需要花费大量时间才能完成吗?你有没有感觉到你宁愿在别的东西上工作(可能不那么重要)或根本没有代码而不是在那部分工作?那个野兽,你努力避免并使用你知道的每一个懒惰技巧来推迟其不可避免的实施?
现在,我可能只是在懒惰,但我总是不得不处理这样的代码.写一些我不喜欢写的东西(如果你是为了好玩并且没有得到报酬,那就更糟了!).一个庞大的系统,需要花费大量的时间才能让它进入一个阶段,在这个阶段你可以获得任何有用的结果或它的工作指示.你如何开始这样的编码?大多数人可能会建议分而治之和类似的建筑技术,但这不是关于你如何做到的; 这是关于你如何让自己开始这样做.你采取的第一步是什么?
我将讲述一个案例,其中发生了这件事.
我想为x264实现一种新的帧类型决策算法,该算法使用前向动态编程(Viterbi算法).但它会变得复杂,混乱,丑陋,等等.我真的不想这样做.我试图将这个项目归结为Google Summer of Code,但出于某种可怕的运气不好,我们拥有的那个仅仅依靠他的项目的学生......是选择该项目的学生.
因此,经过两个月的抱怨和躲避它,我终于开始研究算法了.而这就是我做到的.
首先,我与另一位开发人员进行了交谈,他显然已经有了一些关于如何做到这一点的想法.我们讨论了它,直到我从算法的角度充分理解这个过程之后,他向我解释了它.这是任何此类项目的第一步:了解它背后的算法,以便您可以对整个事物进行伪代码.
然后,我和另一位同事交谈.我们上了白板,然后我把它描绘出来,直到他理解为止.通过向其他人解释,我获得了自己的理解.这是第二步:将算法很好地解释给别人,以便他们可以对其进行伪码.这是编程过程的仿真,因为编程是向计算机"解释"算法的一种形式.
然后,我编写了一个简单的Java原型,它使用任意伪值作为成本函数,并且仅用于测试维特比搜索.我完成了它,并在一次详尽的搜索中检查了它 - 它完美匹配.我的动态编程是正确的.这是第三步:在最简单的环境中编写最简单的算法形式.
然后我将它移植到C,x264的母语.它再次起作用.这是第四步:将简单形式的算法移植到完整环境.
然后,最后,我用真实的成本函数替换了伪成本函数.经过一些打击和修复后,它起作用了.这是最后一步:将算法与环境完全集成.
这个过程只花了一个星期,但从项目一开始我的角度来看,这是完全令人生畏的,我甚至无法开始 - 但是通过将其分解为这样一个一步一步的过程,我不仅能够完成它,而且比我预期的要快得多.
而且好处远远超过x264; 我现在非常了解维特比,现在我可以向其他人解释...而其他人可以从中受益匪浅.例如,其中一位ffmpeg开发人员正在使用我的算法和代码的改编来最佳地解决一个稍微不同的问题:音频文件中的最佳标题放置.