如何进行良好的程序设计(1)
关于程序设计,掐指算来也写了快有十年的程序了,之前很长的一段时间都是以算法类的竞赛为主,对于程序结构的设计,总是胡乱写写,能跑通就算ok了。来公司后, 接触了一些大一点的项目的设计,设计的重要性就凸现出来了。
为了更好的设计(不能说到完美,但是至少不要把自己和用户弄晕),我写点自己的一些感悟(有自己思考的,也有和公司的前辈讨论得到的),不能说本系列是一篇指导性的文章,权当是抛砖引玉,希望能够大家不吝赐教,多多讨论。
对于程序设计,常常是有下面的一个过程:
1)给出了需求,对需求进行思考,考虑用某种结构去实现
2)对于结构的思考觉得可以满足了需求,开始程序设计
3)设计的过程中发现某些地方有效率问题、可行性问题、或者某些不能满足需求的问题 - 在当前的基础上进行修修补补
4)设计的过程中用户提出了一些新的需求 - 在当前的基础上进行修修补补
5)为了调试、测试的方便,在程序中的一些临时代码也忘了清除,使得程序看起来乱七八糟
6)重复2)3)4)的过程,直到看起来满目苍夷的程序完成需求,交付项目
7)过了半年一年,用户有了一些新的需求,或者发现了一些bug,当重拾代码时,发现代码已经不忍卒读了
每次经历这样的一次情况,内心中都有一种煎熬的感觉,觉得程序越写越背离了当初设计的初衷,代码连自己都不想去看,哪里能算优秀的程序呢。有时候觉得很懒,喜欢给自己找一些借口,比如项目做完了的时间可以学习一下其他的东西,看看论文什么的,或者说省一点时间去陪陪家人。其实设计和算法一样,都是非常有价值的东西,就像IPad和笔记本的比较一样,IPad就因为设计的新颖,和各处的精益求精,让全世界的人为之疯狂。
最近和同事进行讨论,自己也想了想,可以从下面的一些方面来学会如何进行良好的设计:
想要设计应该先去多看看别人优秀的代码,从代码中体会大师的设计。设计模式只是设计的一小方面,我觉得更重要的是类、函数的功能设计,让这些函数不管从接口上还是从内部的实现上,都是去做一些比较干净的功能。这样不管自己去写,别人去读,或者加入新的函数和类等,都更加方便。
对于一些书(比如Effective C++等)中间讲的知识不一定要生搬硬套的去使用,而可以从别人的代码中看看大师们是怎样用这些技巧的,比如imp指针这种技巧,我觉得就不适合在普通的接口中使用,这种技巧不同于人的直接思维,在原本简洁的借口后面包装了一个不太漂亮的“影子”。也不利于编码和理解、调试。
对设计,应该是跨越语言的范围的,对于不同的语言,也同样可以看到很多美好的设计,比如Java中非常多的开源项目就可以有很多可以去参考学习。比如我们目前正在做的分布式机器学习库就可以去参考一下Apache的Mahout,里面对问题的处理方式应该是一致的。对于同一种语言开发出来的程序,可以去看看语言的技巧如何正确的使用。
对测试,我个人习惯不太好,总喜欢在测试的时候加入一些cerr等代码,有时又会忘记了删除,让代码看起来会不太好看,对于单元测试,也不太清楚怎样去写良好的单元测试,这也是后面得去慢慢学习的内容。
对设计,应该是一个精心去雕琢的过程,尽量能够保持在自己能力内的完美,然后这也是日积月累的工作,没有捷径可走,只有多看多学才行。