• 2006-01-25

    写在放假前

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/1860028.html

    做集成,最大的缺陷在于工作肯定是最后完成,即便代码编写得再完美。因为任何人出错了,最终都会在这里暴露出来。现在是算法移植工作,也就是把原来用Matlab编写的代码改成C语言实现。我编写的是算法部分集成的代码,谢天谢地,在我后面还有一个人负责将算法集成到应用中,所以,大多数时间,我是比较轻闲的,但无论如何,我的人得在,即便什么都不做,因为谁也无法保证不出任何错误。

    最初选择Matlab作为实验平台,看中的是它的便利,而现在用C,无它,性能。语言之间的差别不仅仅是在语法上。任何一种语言背后都是一个环境、一种文化。使用Matlab这样相对高级的语言开发,好处是让一些在编程方面的新手能够快速的进入角色,他们不必像编写C代码一样顾虑很多与问题本身无关的细节,比如内存管理。但坏处也就此浮出水面,因为他们对编程的理解很还处于刚刚起步的阶段,所以,对于一些内部质量相关的因素考虑甚少。当代码在自己手中维护的时候,这个问题还不是很明显,但到了移植阶段,尤其是别人移植他们代码的时候,一切问题就都暴露了出来。

    在我们的移植过程中,就有这样的模块,Matlab版本由一组人开发,而移植工作交给了另外的人。这两天许多让我们倍受折磨的问题基本上都源自这个模块。按照领导的本意,负责算法研究的,只关心算法研究就可以了,而移植工作交给负责程序开发的人,按照分工合作的策略,这本是不错的选择。遗憾的是,负责程序开发的人也是一个新手,对算法不甚了解不说,对程序设计也没有太多的感觉,所以,只能选择原样照搬。偏偏对应时存在一些偏差,不在逻辑而在语言本身,比如Matlab数组坐标从1开始,而C是从0开始,这样,问题就来了。

    这些天改程序越发体会到“高内聚、低耦合”的重要性。因为有全局变量,为了方便,就出现了许多访问全局变量的代码,这样,也就有大量代码依赖于全局变量,而实际上,其中的很多代码完全可以通过多传几个参数消除对全局变量的依赖。虽然全局变量在各处都可以访问,但依赖它们就意味着,陷入泥潭无法自拔,因为这些代码将暗中与其它使用这些全局变量的代码耦合。事实证明了这一点,常常是改了一个地方,其它地方会莫名奇妙的出错,原因就是因为随处可用的全局变量。虽然,在很多公司中,严格区分编码和设计的人,但在我看来,如果想编好代码,不真正理解设计原则——比如“高内聚、低耦合”——是不可能的。

    领导问我,改程序的感觉如何,我答,C++真好。这里我想说的是最简单的C++功能,封装。封装意味着提高抽象能力,隐藏细节。其实很多后来的语言都成功的运用了封装,比如Java封装了内存管理的细节,许多动态语言封装了一些标准的数据结构。我们使用Matlab的目的也是如此。C在语法层面上对封装支持得不够好,所以,我们不得不在面对具体问题的时候,还要考虑语言的细节。在Matlab中,每个数组都有自己的长度,而在C里面,我们单独维护一个数组长度的变量,就是这样简单的差异,就造成了无数次的崩溃,仅仅是因为变量没有正确的赋值。原因很简单,因为原来Matlab版本中根本没有维护长度变量的代码,所以,移植的人在这个问题上出错也就不足为奇了。

    虽然我们的程序存在这样那样的问题,但想想去年刚开始什么都没有的时候,已经不知道好了多少。经过大家一年多的努力,能形成现在这样一个看上去还可以接受的程序,不禁让人感叹人的潜力无限。很多问题看上去很困难,有时甚至让人绝望,但真正走过去之后,才发现“原来一切就是这么简单”。

    春节放假前的最后一天,原本今天已经放假了,结果还有些收尾的工作,领导决定,晚放一天,晚归一天。连续几天都加班到了很晚,终于要休息了。

    分享到:

    历史上的今天:

    引用地址: