« type redefinition 的解决方法 | 返回首页 | 没钱就别接受高等教育? »

一次大的重构

今天花了一晚上的时间,两个人把引擎的一些设计改了。最终统计,改动涉及 267 个源文件。因为改动是一步步走的,所以好多是叠代进行的,很多文件都被反复改了好几次。

改的心惊肉跳的,这个时候,发现自动测试是多么的重要啊。

Comments

用惯ms开发平台的人是理解不了简单工具组合后的威力的 我平常就用editplus+makefile+gcc写程序,觉得顺手 但是有个问题,不知你们是怎么解决的 我平常写代码调试都用windows,程序运行的实际环境却是freebsd,一个测试机器4.7,一个正式机器5.x. 一些独立出的库,每次都要在三个环境下编译3个二进制版本,然后用makefile根据不同的操作系统连接不同的二进制文件。 这是我能想到的最简单的办法,不知还有无更简单的。
代码的实现本身是不用放弃的。我们每个模块的实现都是独立的,跟平台接口的部分,就10多行。这和 COM 这样的组件模型是不同的。如果日后放弃掉整个平台的架构(我认为可能性不大) 绝大部分代码都是可以留下来的。 至于平台本身,已经做完了,无须多修改和维护吧。无非几个月的工作。 我们追求的是一种更纯粹的2进制复用。用最少的规范来做到这一点,这和 COM 有所不同。当然我不是说我们的设计比 COM 好,只是适用范围,使用环境和目标不同罢了。
有一天你会放弃你现在所作的东西,除非你的东西能成为标准,或许你现在做的东西仅仅是从对付逆向工程考虑的。
细节我已不想多谈,反正基础部分都已实现,已经不在乎当初实现的时候的艰难。在其上写东西也非常顺手。 这部分工作理论上谁都可以做的,而大部分人都没有必要去做。我们做的东西只是让系统建立在一个自己设计过的平台上。
但是这样你就要放弃编译器的link功能,而自己从特定格式的obj中处理程序信息。
我觉得有点走火入魔了
PE 文件也是人为定义出来的,所以自己定义一个也不是难事。 我们整个系统都是构建在自己定义的这种格式上,无一例外。当然不只是"纯算法"的东西。 我奇怪一点,在不依赖操作系统的LoadLibrary等的API的前提下,Copy-On-Write或section之类的东西怎么做。你目前做的应该是windows平台下的引擎吧?
重构的经验是一次次累积出来的。我想做多了大家都有经验,我自己没怎么总结过。 大约就是不断的给旧代码中增加一些东西,然后连同旧有的代码一起删掉。重构的过程绝不是一蹴而就的,是一个修改-编译-测试-再修改的过程。大多数中间增加和修改的代码,最终一定会删掉的,但是这个中间过程是不可省略的。
能否把你这次重构的经验抽象出来 分享一下? (前提是不泄露商业信息), 呵呵, 三言两语有点太抽象。
PE 文件也是人为定义出来的,所以自己定义一个也不是难事。 我们整个系统都是构建在自己定义的这种格式上,无一例外。当然不只是"纯算法"的东西。
应该更可能是obj文件,这样的应用前提是没啥关联性,基本就纯算法的东西。
我感觉他说的自定义的动态连接格式其实就是静态库,然后用他们自己的引擎动态加载,其实不是很难的东西。如果你对静态lib文件比较熟悉,你也可以动态加载lib文件。
自定义动态连接格式? 我十分好奇, 能否细说一下:)
我说的project是 VS 里的 project 概念。 我们一个目标模块可能就只一个 cpp 文件一个类,几百行。不过放在 VS 里必须定义一个 project,暂时我还不知道怎么让 VS 的一个 project 可以编译出多份 dll (姑且这样看,我们的模块不是 dll, 而是自定义动态连接格式)
如果一个人需要同时管理两三百个项目,那整个工程肯定是死定了. 如果有个超强的人顶住,暂时不死,但是将来怎么办? HL2就是用VC6管理的,你们项目不会比HL2还大吧? 虽然VC比较土,但起码人人都会
云风能不能谈一下关于你们设计的2进制重用框架的大致思路,相较COM而言有哪些优势和劣势?
我们的项目追求2进制重用,就是为了好维护。我参加过的公司的所有项目都是同事在维护。我们现在这个项目,贡献代码量最多的程序员也不是我 :) 我们是 3~4 个人共同维护的。 每个工具都有适用的范围,我们这个项目就不适合用 VS. 我用 editplus ,它只是编辑代码的工具而非 build tool ,如果用 notepad 我也不会难过到哪去。 但是 bjam 的功能,现在 vs 还是不能取代的。 我们即使写一个 map 一个 vector 也必须编译成独立的2进制模块。几乎每个类的实现都必须是2进制独立的。模块间出现任何2进制度重复都是要求避免的。 任何一个框架都会有它的门槛,跨越过去后就不难了。就如 COM ,我从来不认为他门槛很低,也不认为它很难。
明白你的意思,既然用的好就继续了,最主要是工作项目行进顺利。 但俺不大同意你说的用vs会使项目死掉的观点,工具毕竟是工具,关键的是用工具的人,譬如EditPlus就能被你用的出神入化。 俺说这个是觉得好的编程工具的使用手感会非常好,会使的编码的过程充满愉悦,一些好的辅助功能大大增加工作效率,就象我就特喜欢netbeans的refactor。 测试也是,工具帮你管着项目和UnitTestCase的代码,Refactor的时候也会把UnitTestCase里面的一起改掉,会觉得很舒心。 这些都是闲说说啦 主要是你工作顺利 项目顺利。
我只想知道网易如果没了云风,后续的代码如何维护?呵呵,也许这正是云风的目的吧,开个玩笑。 不可能要求每一个程序员都如你这样纯粹,如你这样用find replace。我不知道你的project怎么要到2-300个,又为什么要全部同时在一个workspace里展示出来。我只知道大部分开发者用VS能很好的管理开发的项目,并且对于后继开发人员会很容易入手。还有对于接口来说,永远是设计他的人员觉得最简单,:),我相信你这么一大套系统不会简单到哪里去的。 当然现在网易有钱,在招人上完全可以去招你认为合格的程序来进行你们的项目。不过我总觉得你这样的项目管理对于公司比较危险,还是那个问题如果你云风不在了,会很麻烦。
方便的工具容易使得人偷懒。 就好象剪贴板的功能,使得复制代码更加方便了。假设我们项目禁止在编码的时候使用 copy-paste 的功能,势必让大家杜绝复制代码的操作。 依赖任何编码/调试工具的特定功能,都有可能从代码结构的改进上去掉依赖性。 我们的引擎是2进制复用的,所以不需要记忆任何模块实现的细节。接口部分简化再简化了,比 COM 还有简洁很多。 我的确是用 find/replace 做 Refactor 的,当然做多了也有技巧。整个来说还是很顺利的。同时也依赖我们良好的编码,可以用很快的速度反复 build/test,经过几次重构后,代码总行数下降到 8 万 5 千行,一共 600 个源文件,最终目标 200 个。build all 一次我的机器上只要不到一分半钟 :D 今天想,如果当初我们选择 VS ,估计项目已经死了。不说别的,同时管理两三百个 project,IDE 肯定慢的跟蜗牛似的。
我个人不大支持使用EditPlus此类功能还是相对简陋的编辑器,反正我觉得效率没有vs来的高。 用惯了Refactor的自动工具都不知道云风做动作很大Refactor动作怎么做的(find?|replace?),真的很佩服。 云风在技术上追求纯粹...^_^
我没说清楚,会错意了。我的意思是editplus没有可以自动定位变量和函数定义,自动显示成员列表等辅助工具. 如果只使用这种编辑器,意味着完全靠自己记住涉及到上百多源文件的所有函数,类及其成员的具体信息?否则的话需要不时切换源文件窗口寻找各种定义, 大大降低效率。超过5w行以上的项目,我是离不开sourceinsight这样的工具了。
editplus?30刀一个lisence。。。还是用gvim或是emacs合适。
我们用 bjam 做工程管理。editplus 只是编辑器而已,任何时候都可以换掉。VS 绝对不适合我们的项目,我们的 target 现在已经几百个了。难道在 VS 里建 几百个 project? 那才叫难管理呢。
记得云风说过现在只用editplus这样的编辑器.像这样涉及267个文件的重构,也只是使用EP这种简单的编辑器吗?而不使用SourceInsight或者VS这样的强大的工具吗?为了锻炼脑力?
想要用轮子,把轮子拿过来用就行了,但是想要资深的使用轮子,那就非把轮子拆开研究个透彻不可。 当已经把别人的轮子研究个透彻了,发明一个自己的轮子也就不难了。
重新发明轮子是一个笑话,但是,当搞清楚别人的轮子的成本还要高于自己制造轮子的时候,自己制造轮子还是更好的选择。
这次我们不仅没用 COM, 连 CRT 都自己做了。而且使用的是 C++ 的子集(比如禁止使用静态对象等) 为什么这样做不想多做解释,重做轮子的骂名已经背了很多了。只想说,以我做了这些年软件的感觉来说,这次的路是对的。
晕ing
记得某人说过,回归测试是重构的前提。偶感觉没有自动的回归测,重构就是疯狂的死亡之舞。。。。
为什么不用COM呢?是因为要跨平台吗?

Post a comment

非这个主题相关的留言请到:留言本