究我未完的一生,做过许多让后来的我后悔的事情。其中以太小的年纪,议论软件工程里的问题,算是其中之一。回想自己当初桀骜不驯的发言,直至如今仍感到羞愧,与此同时,更感激曾有的上级,长者无私的包容。
我想我的一生大概在软件工程领域是不会有什么成就吧。如今用浅薄的知识谈论相关的话题,显然并不能教导他人什么,只是以软件为譬喻,作万千感慨之端。
不是软件开发领域的人,很难理解软件设计之中的问题。我觉得可以粗浅地比喻成一艘多功能舰艇的模块化建造。
什么是模块化的建造呢?一艘舰艇有多个舱室与功能区,每个功能区的功能都是相对独立的。在设计的顶层规划好了各个功能区的位置与功能区之间交流的协议,剩下的活,各个功能区(子系统)就分配给不同的厂商去完成。当各个子系统完成之后,再运回总装处,组合起来集成测试验收,一艘模块化建造的舰艇就这样完工了。
而软件的设计问题就类似是针对各个功能区进行划分,设计不同功能功能区之间的通讯协议。就像大家所熟知的软件QQ,它应当有网络通讯子系统,界面显示子系统,聊天消息存储与管理子系统。
这时就有个哲学上的问题了。设计到什么样的程度是合适呢?最简单的是根本不设计,不划分模块。就像造船,在一个船厂里从头干到尾。当然这样的方式兴许能造小船,而造大船就会陷入到无尽的麻烦之中。
而另一个极端是,把一个又一个模块划分的细致又细致,分给了无数个船厂干。然而软件工程并不完全等同于造船,一艘邮轮造好了,没人会要求将它改造成潜水艇,可在软件行业总是有人试图这样做。在频繁改动的情况下,一旦当初的设计没有考虑到相应的变动,当初过分细腻的设计便成了绊脚石。比如造船,原本某个仓位是用来冷藏,配备了一大堆管线,可忽然告诉你不需要了,你那些配套的管线有什么用呢?
同样是造船。船的大小有不同,所需配备的功能有简易,使用的时间有急缓。我想软件工程也是类似的吧。软件的体量有大小,稳定性的要求有高低,并发的数量分多少,更重要的是,进度表的要求只有快。
我最近学到的一课是,设计以适度为宜。过简不行,会有很多重复的工作,过于设计追求全面,则容易导致代码的晦涩,用时增加,与后期改动时的重构风险。当然,这只是我个人粗浅的看法,肯定是有偏颇处的。而且,千难万难,“适度“最难。这需要极大的经验积累与勤奋思考才能摸准相应的度量,毫无疑问,我并没有这个能力。
最后,在我遇到的源代码中,有一些是满目疮痍的。仅仅是能运行罢了,一旦出了问题,只能不断进行修修补补,这里一块膏药,那里一块狗皮。这可能就是所谓的理想与现实的差距吧。
个人浅见,不成参考,诸多细节,恐难详考,但作拙砖,以引美玉。
化浊 2016-12-20 于北京