您的位置:首页 > 其它

软件设计本质论(Essential Design) —序

2006-07-29 16:36 197 查看
软件设计本质论(Essential Design) —序

转载时请注明出处:http://blog.csdn.net/absurd/

标题可能让人觉得有些自负,这并非出于我的本意。为了避免冒犯一些挑剔的网友,对此我先做一点说明。本质这个词历来与哲学的关系比较紧密,本质与现象对应,于是本质似乎都是一些极端抽象的东西。而近年来出版的一些书籍,如《COM本质论》、《.NET本质论第1卷:公共语言运行库》和《Essential C++》等,让我明白原来可以换一种方式理解本质一词:本质指那些在某个领域最基本、最重要的知识,而不一定要升华到《道德经》的高度。

在本系列中,我想讲一下在软件设计领域中,那些最基本、最重要的知识,以及这些知识的实际应用。这些知识源于这些年来所看的书籍和实践,没有一项是我独创的,很多原发明者已经无法考查了。我要做的,只是理解这些知识,结合自己的经验,把它们言简意赅的写出来。如果你看明白了(当然要加上一点思考),我的目的也就达到了。

关于软件设计,大师们已经讲过很多了。经过国内一些高手们的努力,软件设计知识在国内的普及也取得了不错的效果。大师们讲得非常精彩,但是这种高屋建瓴讲解,总是显得不那么平易近人。很多人学过面向对象的设计,回答问题时头头是道,但真正做设计时却无从下手。因为不知如何使用这些方法,自然很少在工作中运用它们,没有多久就忘了,可能只是在面试前,再拿几本书来翻翻。

这些设计理论与实践之间或许只有一线之隔,但跨越之一线的距离是何等艰难!这我是深有体会的,很多OO设计的书上都说,苹果类是水果类的子类,某个具体的苹果是苹果类的实例。这话很容易理解,但我想了很久,才明白如何在软件中运用这种方法。我一开始就学面向对象设计和编程,不断的读书和实践,但至少过了两年,我才有点明白面向对象的威力所在。

本系列旨在强调这些基本原理的应用,而不是充当大师的录音机。目标是把理论与实践无缝的接合起来,让新手可以快速上路。

尽管花了不少时间去学习和实践,直到现在,在软件设计领域中,我还是个新手,还有大量东西要学习,特别对企业应用软件更是知之甚少。这几年来,从一些关于软件设计的书籍学到一些知识,在从事服务器软件和智能手机软件开发中也累积了一些经验,加上研究了一些开源软件的设计和实现,有些知识和经验可以和大家分享。或许有些是我误解了,对本是错误的东西深信为正确,或者反之。写出来之后,若得到一些高手的指点,也是会受益非浅的。

什么是好的软件设计。脱离软件的需求和背景,很难界定什么是好的设计或者坏的设计。比如,在一个实时响应的系统中,C/S模型可能并不合适; 在一个性能要求很高的环境,严格的分层设计可能并不合适,如此等等。有人说,软件设计就是一个决策过程,在适当的时候选择适当方法。孤立的评价本系列中所提的方法的好坏没有多大意义,我们不会说什么设计好,什么设计不好,只会说什么时候,什么方法适用。

在决定写本系列时,犹豫了很久。一方面担心自己是不是有能力写下来,另一方面担心自己是不是有精力去写。对于前者,我想这是一个总结的机会,同时也是一个学习的机会,借此也可以考查自己对设计的实际把握如何,对于不明白的东西借机研究清楚。对于后者,这是取不得一点巧的,已经列出了二十多个专题,有的专题可能后面会拆成多个来讲,也可能还会加入新的专题。要去查找资料,要去写一些验证代码或者示例代码,这要花费很多时间。假设每周写一个专题,那也得写上半年。

最近从一些组员所做的设计来看,他们的设计能力都有待提高,甚至可以说不懂设计。这是我比较担心的,我们的目标不只是完成这个项目,做一款手机出来,而是要建立一个开放的平台,这要求更高的质量。我们决定做一些软件设计的培训,这要准备一些培训资料,在内部培训时使用。这最终促成我决定写这一些系列BLOG了。

好了,言归正传,我们把本系列的主题先介绍一下:

1. 从链表设计说起
2. 白话面向对象
3. 分离接口与实现
4. 基于分层的设计
5. 基于分治的设计
6. 基于继承的设计
7. 基于状态机的设计
8. 基于点对点的设计
9. 基于C/S模型的设计
10. 基于共享数据的设计
11. 基于管道-过滤器的设计
12. 基于插件的设计
13. 基于微内核的设计
14. 基于契约式的设计
15. 基于分布式的设计
16. 基于并发的设计
17. 论界面与逻辑的分离
18. 软件的质量目标与应对手段
19. 如何编写设计文档
20. 一个设计文档模板的点评
21. 实例分析:X Window
22. 实例分析:Reactos

以上提纲是粗略的,正如软件设计本身是迭代的一样,随时间的推移,这些专题以及专题的顺序可能会做适当的调整。另外,其中涉及的代码多半是用C写成的,用了几年C++后,最后还是回来用C,我喜欢C的简洁和犀利,不想在语法层面花费太多时间。但我相信这些方法并不限于某种语言。

水平有限,望大家不吝赐教,欢迎讨论。呵,心里有点虚,请多鼓励。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: