讲个真实的故事。
在Stanford的第二个学期,我闲的蛋疼去图形学lab找个了写代码的工作。我的老板就叫V教授吧,他手下有一个博士生S哥,在做一个室内家具自动设计的项目。他写了一个demo,虽然算法效果还不错,但是渲染效果很差,而且缺少比如阴影一类的视觉效果。我的工作就是让demo看上去更牛逼一点。
我看了一下demo之后,感觉难度应该不大,首先是性能有问题,性能问题搞定之后,可以加一些eyecandy的标准效果。毕竟我大三的暑假在activision撸了3个月游戏引擎优化,也算是轻车熟路了。S哥特别兴奋,把cvs账号给我(对,那个时代还用cvs),说咱们1个月差不多就搞定了吧。我说不用啊就这么点东西两周吧。
这种项目优化起来就是那些手段,没啥难度,我决定推迟到周末再开始,最后总共留了一周左右的时间。
但是当我最终坐下来开始看代码的时候,就石化了。
这是我见过的最没有结构的代码,总共三四个文件,每个都几万行,大量重复但是修改过一点点的代码被复制来复制去。渲染是opengl写的,但是所有东西都是glbegin/glend画的,也没有任何抽象,矩阵运算也全部是gltranslate/glrotate一类的。但是它又是那么没有bug的正常运行,让我叹为观止。
任何的性能提升,都建立在大量的重构基础之上,然而任何的重构都牵一发而动全身。但是眼前这坨冒着蒸汽的热翔,又是这么有机的运作着,简直就像把C++ feed到一个C++到C++的compiler里,然后吐出来一堆没有任何抽象的C++。
我其实还是尝试重构了,但是基本意味着我要把全部渲染的东西重写一遍,一周(还要上课写作业啊)看来是肯定搞不完了。最后我写了一个shadow mapping,连pcf都没加,然后替换了部分glbegin/glend就报告了V教授,说实在是搞不定了啊。
第二天V教授说你们去买个新电脑吧。
卧槽,那我还优化个什么劲?
但是这并不是一个关于重构的故事。
我后来打听了一下S哥的底细,大概是这样的:这位仁兄在本科和master都是学的建筑,并不会写代码,后来强行申请了Stanford的CS Phd,居然还进来了。因为没有受过任何CS的科班训练,更不知道啥重构,抽象,OO,FP的概念。一切东西能用就行,还tm重构,累不累啊。而且S哥轻轻松松写个几万行毫无压力,功能都很正常。
许多年以后我才意识到,这是一位挥舞代码就像挥舞笔刷的艺术家啊,这才是代码作为一种表达方式的自然存在啊。无拘无束,放荡不羁,这才是真正的,自由的写程序!
急于求成算事吗?忌讳什么的算事吗?最重要的是写出功能,写出风骨,写出浪漫,写起代码来犹如李太白写诗,呼儿将出换美酒,与尔同销万古愁啊!
然后你就花$20/hr雇个小弟来帮你重构就好啦。