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

软件设计本质论(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的简洁和犀利,不想在语法层面花费太多时间。但我相信这些方法并不限于某种语言。

 

水平有限,望大家不吝赐教,欢迎讨论。呵,心里有点虚,请多鼓励。

 

 


 

 

 
原文地址:https://www.cnblogs.com/zhangyunlin/p/6167850.html