论设计思想的传承

来源:互联网 发布:ubuntu添加阿里云源 编辑:程序博客网 时间:2024/03/29 07:52
         好的软件设计人员,往往能做出很灵巧,很优雅的设计,如果只有他一个人开发的话,我想这个设计会演化成一个很好的软件产品。但是大多数软件产品却不是一个 人来完成,特别是好的设计人员是稀缺资源,公司往往认为如果让这个优秀的设计人员继续去写代码是一种浪费,然后会把他拉去做另一个设计,当然这个设计肯定 也会是优雅灵活的。
        牛牛就是这样一个优秀的设计人员。牛牛也一直很自信和快乐的重复做着他的设计工作。一切看起来很完美,直到有一天这个牛牛发现,他半年前的设计并没有顺理 成章的演化为一个很好的软件产品,bug成堆,复用性差,扩展困难。问题出在哪儿?是设计还不够好?牛牛决定探个究竟,把这个产品的代码拿过来看看,到底 问题出在哪儿,可是令他吃惊的是他的设计已经变的千疮百孔,任意扭曲。牛牛断定这批开发人员能力太差,然后,他拿出另一个产品的代码,情形竟然类似!
牛牛迷惑不解,求教于大师:
        “我把我的优秀的设计交给他们,并详详细细的教他们如何使用,他们为什么还是扭曲了我的设计呢?”
大师曰:
        “吾传佛法,而非教规,可知为何?”。
牛牛皱眉想了一会儿心领神会。
        我想不只我一个人发现这个问题,设计在传播过程中,或者在执行的过程中发生的扭曲。有些人可能会把这个问题归结为执行的人能力太差理解不了的设计,可是作 为设计人员的你是否进到了责任呢?你传授的时候是否把你的设计思想传授了下去呢?还是只是告诉别人怎么用你的设计?

       怎样才能把我们的设计思想传承下去呢?怎样才能让执行人员理解精髓而不是迷惑于表面呢?我今天就介绍这几个工具。
       第一个是隐喻,这是上上策,也是最难掌握的。极限编程的第一版中就把隐喻列为基本价值观之一,但是在第二版却删掉了,原因就是太难掌握,但是他的威力也是非常巨大的。
       什么是隐喻呢?隐喻就是暗语,比喻的一种。或者我们干脆理解为比喻。我理解隐喻的精髓在“喻”而不是“隐”。简单说来就是把我们的软件设计比喻成一个大家熟悉的事物,通过大家对这个事物的了解了增加对我们软件设计思想的了解。
       McConnell在代码大全中把软件开发比作建筑。虽然可能并不准确,但是向瀑布模型等却精确的理解了这个思想。
       在软件设计思想中,我能想起的一个隐喻就是“鸭子”理论:“如果走起路来像鸭子,叫声像鸭子,那么它就是一只鸭子”。这是动态语言中比较推崇的理论,它的 主要思想是行为决定你的类型,而不是你的class。严格来说可能应该译为“鸭子类型化”(英文是Duck Typing)。
       第二个工具就是理论模型或者架构模式。理论模型是上策,架构模式只能算中策。但是他们有共同点:他们都有现成的成熟的理论;他们都需要学习才能掌握;他们 都有很高的抽象性。理论模型抽象性比架构模式更高,而且我们说的理论模型,更多的是指从其他领域借鉴过来的模型,这些模型在其他领域可能已经有了很多的辅 助理论和现成的定理。
       什么是理论模型?计算机科学是从数学发展来的,而数学是对真实世界的高度抽象,而对于不同领域不同问题的数学抽象,就是一个模型。这个过程也叫做数学建模。对于一些典型的,复杂的领域,数学界一般都已经有了一些成熟的理论和模型,这是我们可以借鉴的。
       架构模式我相信大家一定比我知道的还多,这里就不班门弄斧了。
       对于理论模型的作用,最强有力的支持是关系数据库和关系代数。数据库系统经过很多年的发展直到使用关系代数作为理论模型才最终成熟起来,谁也不能否认关系 代数对于关系数据库的作用。现在的工作流系统之所以不够成熟,很大一个原因是没有一个成熟的理论模型作为依据。
       理论模型的使用把设计思想很好的传承下去。一些优秀的软件项目也往往会找一些理论模型作为基础,例如Jbpm,就明确使用活动图,有限状态机,PetriNet分别作为图形建模,状态变迁和流程执行的理论模型。
       架构模式和理论模型的差别是,架构模式是软件设计本身抽象出来的,而不是从其他领域借鉴的。架构模式使用非常广泛,spring的IOC,rails的 ORM部分activerecord的activerecord(前一个是产品后面一个是模式),还有大家非常熟悉的MVC,三层架构。
       最后一个工具就是概要设计,这虽然是最容易,最广泛使用的,在我认为却也是最差的,只能沦为下策。概要设计如果没有遵循任何的理论模型和架构模式,这给开发人员的理解和记忆带来了更大的困难,也由于没有合适的参考,在软件的开发过程中,也最容易发生变化。

       我上面通篇都在讲设计思想的传承。传承是如何做到的?“传”需要我们告诉别人;“承”需要别人能继续你的工作。我们往往只做到了“传”,而且“传”不得其 法,让下面的人不知道如何“承”。上面提到的三个工具,除了“传”之外,可以让别人更好的“承”,无论是隐喻,理论模型还是概要设计都能起到知道软件设计 开发作用,这就是别人要“承”的东西。
       其实道理很简单,但是很多人可能根本就没有意识到这个问题的严重性。希望一此文给大家提个醒。
原创粉丝点击