软件设计是怎样炼成的(1)——什么是优秀的设计?
摘要:
某项目的设计文档评审会上,各路技术大牛进行了"热烈"的讨论,讨论的焦点是怎样的设计才漂亮!大家围绕着如何OO,如何高内聚低耦合,如何反转控制等话题进行了"热烈"的争论。照这样开下去,这个评审会岂不是变成了"神仙大会"!怎样的设计才叫优秀的设计呢?
大纲:
1.什么是优秀的设计?
2.优秀的设计能节省项目工作量
3.优秀设计从分析需求开始
4.软件系统不是木桶型的
5.软件设计的"大道理"
6.规划系统骨架--架构设计
7.打造系统的底蕴--数据库设计
8.细节决定成败--详细设计
9.用户感觉好才是真的好--用户体验设计
10.持续提升设计水平
1.什么是优秀的设计?
某项目的设计文档评审会上,各路技术大牛进行了"热烈"的讨论,讨论的焦点是怎样的设计才漂亮!大家围绕着如何OO,如何高内聚低耦合,如何反转控制等话题进行了"热烈"的争论。
你觉得以下标准可以成为"漂亮"设计的标准吗?
1)高效
2)可靠
3)易用
4)安全
5)可扩展
6)兼容性强
7)移植性强
……
如果每次设计文档评审,我们都采用上述标准来评审,你觉得这个设计评审会有效果吗?
当时我参加了这样的一个设计评审会,觉得气氛很不对,照这样开下去,这个评审会岂不是变成了"神仙大会"!
于是我问了两个问题:
1)谁能说说这个项目的主要需求?
2)这些需求,设计上是如何考虑实现的?
结果没有人能答上来!
我们从书本上看到的那些"通用"的设计标准,说得难听一点,就是废话!对实际的项目工作基本上没有实质用途!
请看下面4个例子,分别思考这4个案例的软件设计思路,你会发现上述"漂亮设计的标准",真的是废话!
案例1:某项目要求在很短时间内完成,而且客户对系统的当前认识还是比较初步的,你打算怎样设计这个系统?
案例2:某软件公司接了一个"网页+数据库"类型的项目,这类项目已经做过多个,但这次的业务却是新的,你怎样考虑这个项目的设计?
案例3:某软件公司已经成功为n个医院做了管理系统,现在需要为一家新的大医院做类似这个系统,你会怎样考虑这个系统的设计?
案例4:你接到一个任务,要做一个即时战略游戏,目标是要在当前游戏市场找中杀出一条血路,你怎样考虑这个游戏的设计?
4个案例各有特点,分别代表了4种"典型":
案例1:需求很朦胧,工期很紧,技术上基本上没有积累。
案例2:需求是新的,但可以重用"网页+数据库"的技术架构。
案例3:需求是类似的,技术架构也是类似的,相信你会直接重用之前的系统。
案例4:这是一个需要创意和高技术含量的游戏,而游戏软件的需求和技术都是充满挑战的。
上述4种情况,相信你采取的设计策略是不一样的,你可能会发现所谓的优秀设计没有固定的标准。
如果硬是要来一个优秀设计的标准呢?
我会这样说:就是做高性价比的设计!
一个优秀的设计应该具备以下特点:
1)优秀的设计都是需求驱动的,不熟悉需求就做出来的设计是不靠谱的;
2)优秀的设计应该是当前团队能理解能实现的,太超前的设计项目团队做不出来,这个设计只能是摆设;
3)优秀的设计应充分考虑当前各种限制条件,适当做出平衡,能保证达成项目的目标:
4)优秀的设计能尽量降低项目的整体工作量,让整个项目更加可控。
2.优秀的设计能节省项目工作量
关于软件设计的话题,如果脱离一些实际案例讨论的话,很容易变成空洞无力的学术讨论,所以本文将会列出很多案例供你参考。
设计案例:开发某线上社区网站
背景:某社区已经举办了多期沙龙活动,为了拓展沙龙的影响力,让更多朋友受益,树立良好品牌,将来实现盈利,有必要建立一个线上的社区网站。
该网站应有这样的功能:
1)发布各种活动信息。
2)发布业界新闻。
3)能开展线上沙龙活动,包括在线视频沙龙。
4)具备SNS社区,可汇聚人气。
5)每位会员有自己的博客,能维护自己的个人页面。
6)支持简体中文、繁体中文、英文三种语言随时切换。
7)支持全文搜索。
你打算如何设计上述系统呢?
你可能会问,有工期限制吗?
你说呢?真实项目一定会有工期限制的,这个项目你的工期只有1个月!
你可能会说:你当我是神仙啊,1个月有可能怎样死都死不出啊!
这个时候能帮助你的就是优秀的设计,优秀的设计有可能能让你用很少的工作量就做出来,优秀的设计也不一定需要你全部从零开发的,我们可以拿来主义!有不少开源软件是可以基本满足上述要求的,我们可以直接拿来用,这样你需要付出的工作量就少很多了。
我曾经用某开源软件做了这样的一个网站出来,但发现没有全文搜索功能,结果我想了一个"投机取巧"的办法,自己不写一句代码,直接利用谷歌的这个搜索功能"site:域名 关键字",让谷歌帮我搞定全文搜索。当然这样做出来的效果还不是很完美,但至少我能在很短时间内能做出个大概啊,如果自己开发还不一定能做出这样的效果呢!
小结:
受工期限制、受能力限制等制约因素,十全十美的设计基本上是很难做到的,但如果因为赶工期而在软件设计上节省时间甚至是直接忽略这步,其实是得不偿失的。在软件设计上"节省"1小时,可能会让你将来多投入成倍的项目时间;越是工期紧,越需要冷静思考软件的设计,合适的设计能大大地降低项目工作量,让你后期的工作轻松很多。
本文仅仅是本系列文章的第一篇,软件设计没有这么简单,这仅仅是开始噢……
如果本文对你有帮助,麻烦点一下"推荐"啦,谢谢!
作者:张传波
创新工场创业课堂(敏捷课程)讲师
软件研发管理资深顾问
CMMI首席专家
《火球--UML大战需求分析》作者
软件知识原创基地创办人