Talk about programming design

我曾经一直在寻找一个答案,那就是:如何去设计?怎样才能使我的设计更好?或者说更完善。我有什么规则需要遵守?还有就是面对一个实际的问题,我该怎么去设计一个结构去解决他。当然,这里所说的仅限于软件设计方面。其实站在更高的角度,设计应该包括任何事物的设计。

我认为学习程序的过程当中有一个问题应该会很自然而然的产生出来。那就是,面对一个实实在在程序或者说一个系统,我应该如何设计,如何写出高效的代码,如何写出一个可维护的代码。而不仅仅是为了完成某一效果。这应该是更深层次的考虑。我读过很多计算机相关的书籍,刚开始学习各式各样的语言C/C++、JAVA、C#,但是这些教授计算机语言的书虽然很多程度上以《某某程序设计XXX》为书名,或者《XX入门到精通》为书名。但是我认为,他们很大程度上教会我的不是去“写代码”(写优质的代码,可以将代码组织成系统的方法),这些书仅仅是告诉我这些语言应该怎么去使用,有什么使用条件等等。这不仅让我联想到我们的英语教育问题。我们花了这么多功夫去学习英语的语法。但是为什么到头来连一篇好的文章却写不好,即使我们对每个语法了如指掌。

我曾在一段很长的时间里认为我写的代码不够好,不光是算法方面的问题,而且还包括整个体系结构上面的问题。这算是我在程序领域上的一个困惑时期吧。但是我并没有放弃我对答案的寻找。我Google了很多地方,我也查看了下计算机专业人的所学课程。发现除了语言之外一个重要的问题就是数据结构与算法了。于是我便去自学数据结构与算法。

我去图书馆里借了一本《数据结构与算法JAVA版》,是本国外的著作。这本书写的还是挺好的,我花了一个暑假的时间将里面的思想和算法上机亲自抄了一遍,在敲代码的过程中体会里面的思想。确实非常博大精深,而且我很佩服里面那种和独特的思想。有些算法确实非常晦涩难懂。但是,学习过数据结构与算法确实给我的程序设计上面带来了不小的提高。之后我也没再看其他的数据结构与算法的书了(或许以后有需要,我还会再去看看,里面的知识确实能给你带来提高)。

虽然在学习完数据结构与算法之后我对答案的寻找又更近了一步,而且觉得自己代码水平也有所提高,但是新的问题又来了。我仍然不知道如何去有效的系统的设计一个好的实际的系统。我在学习完数据结构与算法之后的过程中选学了一门《C#》的课程。希望能看看有什么新东西我能够学习到的。在学习了一段时间后,我觉得除了语法不同和设计界面元素比较简单罢了,好像其他的东西并没有很多。虽然我在这堂课的课程设计作业里写了个《俄罗斯方块》游戏玩玩。而且用了在我理解的MVC设计模式(之前在网上有了解过设计模式一说,就稍微了解了一下觉得这个方案可以解决我的设计问题,虽然我对它的理解可能不全面,我只是按我理解的MVC模式写了俄罗斯方块)。我在设计俄罗斯方块的过程中考虑了很多问题,包括对象之间的联系,共同特征和不同特征,他们之间的交互等等。再考虑这些过程的时候我花了很多时间构思,但是并没有着手写代码。但是当我觉得我想的差不多了的时候我开始着手编写,竟然花了4天时间就完成了。而且效果还不错Bug也不多,就算有我也能立马发现它在哪里。这然我自己也觉得不可思议。我在C#这门课上是第一个展示我的程序的人。当时同学们看了也很惊讶。而且我把我的设计思路稍微阐述了一下。我印象里最清楚的就是老师说了句我的设计思路已经超出这门课的范围了,这让我内心里暗暗有点高兴。在之后的几周内,我就发现有其他同学也“仿照”我也做了个俄罗斯方块,贪吃蛇什么的。我也很认真的听了下他们的设计思路。在我看来,他们的设计思路普遍都是我走过的老路(我之前一直自娱自乐,写过很多程序代码,代码在我看来很长也很乱,当时能看懂但我保证过了一个星期我就不记得我在写什么了,而且虽然效果一样,但我直觉告诉我这不是好的设计,因此我在不断地学习过程中积累了很多经验)。我并没有嘲笑他们的意思,我觉得任何一个学习程序设计过程中的人都应该会经历这些过程。

虽然在设计俄罗斯方块的过程中,我感觉我得到了不小的提高(虽然看上去用了继承、多态,但和接口这类高级的写法),但是在设计过程中同样也发现很多问题,最明显的问题就是接口设计问题,一开始我觉得是这样的,但在最后发现这个接口有问题。而且导致我更换接口,而且做了比较大的改动。这或许是我设计没考虑周全的问题,但是觉得更主要的就是,我没有找到一种比较普遍的设计思路。这也是我想迫切知道的一个问题。我早有耳濡目染关于设计模式的一些东西。当时还不知道这具体是什么玩意,只知道他能够指导我如何设计。我在那时就有个想法:“对于一个具体的设计,什么是最重要的?”,我觉得应该是整体结构。我是我心里的一个自然的想法。我也觉得这应该是对的。就比如建筑设计,当你看那些大楼拔地而起的时候,我觉得他们最主要解决的问题就是大楼的骨架,他的结构。那些华丽的外表只是装饰而已。还有在绘画方面,好的画家往往会先去设计这幅画的整体布局,然后再逐步细化。没有掌握这个思路也是为什么我们小时候画人物的时候最后画得东倒西歪的主要原因。当然这样的例子还有很多,在这里就不再多说了。总而言之,我找到了一个新的目标,就是如何去设计一个好的结构。好的结构有许多优秀特性,对于软件来说,最主要的我想就是扩展性和维护性。非常适合我们去不断地改进。然而坏的设计,却改动起来非常困难。这在其他方面也有共同性,我也不多说了。

于是就在这样的思考之下,我开始买进学习模式的设计道路。我在图书馆里无意间发现一本叫《设计模式解析》的外国翻译著作,这本书讲得很好。他所要阐述的问题不是告诉你什么是什么,而是这是为什么。所有你所能学习到东西远比知道有什么设计模式重要的多。我比较推荐这本书。而且更主要的是他能告诉你一些设计的思维过程。这是我一直希望了解的东西。对于设计的诸多内容我想是互通的。我觉得他应该能够解决我多年以来一直想要找的答案吧!就算不能也能给我一个好的方向!

life