所在位置:首页 -- 技术培训 -- 软件设计 -- 软件详细设计原理与实践

软件详细设计原理与实践


 课程背景
俗话说“杀死一个程序员不需要刀,只要软件需求变三次就好了”。请问设计师你为什么这么痛苦呢?除了埋怨那些该死的需求变化之外,我们还应该有哪些反思?设计师应该具备哪些能力来应对变化呢?
如果您是具有多年经验的软件设计师,请问什么是好的设计?
软件大师Peter Code认为,一个好的系统设计应该有如下的性质:可扩展性、灵活性、可插入性。为什么他认为软件的灵活性是这么重要呢?这是因为:
·软件的成本Cost(total)可以分解为初始开发成本Cost(develop)和后期维护成本Cost(maintain)之和
Cost(total)= Cost(develop)+ Cost(maintain)
而维护成本包括以下几个部分:
Cost(maintain)= Cost(understand)+ Cost(change)+Cost(test)+Cost(deploy)
随着软件开发经验积累,我们意识到软件维护成本远远高于它的初始开发成本。这是因为理解现有设计需要成本,修改需要成本,还有测试和部署这也需要大量成本。最终发现软件的维护成本远远大于初始创建成本。
Cost(maintain)>> Cost(develop)
但是,我们的软件设计师却很少关注设计的灵活性性,现实中的软件系统几乎总是会慢慢变为一个烂摊子。去年才构建的漂亮小巧的系统到了今年却变成了由一堆纠缠不清的函数和变量搅和在一起的“代码浆糊”。
为什么会这样?
为什么一个设计会逐渐“发出腐化的臭味”?
为什么它们不能保持原先那样的清晰简洁呢?
有时候设计人员会把原因归咎于客户,责怪他们总是需求变更。那么,难道我们的设计就是没问题的,都是客户的错吗?设计师难道就不能设计灵活一些吗?
如果您有这方面的困惑,那就请参加我们的课程吧! 
 教学大纲

教学单元 单元教学内容
第一单元:什么优秀设计以及如何实现应对需求变化 内容一:什么是好的设计
1. 什么是好的软件详细设计和衡量的手段。
2. 世界大师的观点(Robert C Martin、Peter Code、James Shor)。
3. 我们现实项目的情况随时需求的变化,我们自以为豪的设计都逐渐变烂,变成纠缠不清的代码浆糊。
4. 可扩展性(Extensibility)容易添加新的功能。结合案例,通过哪些手段如何实现该目标?
5. 灵活性(Flexibility)代码修改平稳地发生。结合案例,通过哪些手段如何实现该目标?
6. 可插入性(Pluggability)容易将一个类抽出去,同时将另一个有同样接口的类加入进来。结合案例,通过哪些手段如何实现该目标?
7. 分析真实项目,如何做的详细设计,给我们哪些启示,我们可以学习到什么?
8. 分析我们在项目之中是那些原因导致了没有实现这些目标。

内容二:案例——某省移动基站综合管理项目案例
1. 某省移动项目,必须考虑支持多种设备厂商。
2. 初始设计的问题分析。
3. 应用何种模式解决问题。

内容三:如何应对需求的变化
1. 设计基本原则。
2. 发现和封装变化的原则。
3. 面向对象的基本原则(OCP/SRP/DIP等基本设计原则)。
4. 根据共性性分析进行行为职责或者数据的抽象。
5. 根据可变性分析进行职责的结构分析和实现。
6. 局部化变更,可修改性战术目标是减少由某个变更直接影响的模块数量。
7. 防止连锁反应,目标是限制对局部化的模块的修改,减少间接受变更影响的模块。
8. 推迟绑定时间,尽量不要静态编译,应该运行期间决定组件之间关系。
9. 结合多个案例项目进行分析,怎样发现和封装变化,如何通过具体的手段来进行适应这些变化。
10. 结合多个案例项目进行分析,怎样发现和封装变化,如何通过具体的手段来进行适应这些变化。

内容四:案例——某省电信网管项目
1. 某省移动项目,必须考虑支持多种设备厂商。
2. 初始设计的问题分析。

第二单元:技术债务和软件设计腐化 内容一:技术债务
1. 技术债务概述。
2. 软件债务对软件系统的危害。
3. 软件债务对软件开发人员的危害。
4. 技术债务与破窗效应。
5. 技术债务的解决之道。
6. 通过案例分析,如何解决破窗效应。

内容二:混乱的设计
1. 目前国内软件项目的设计现状。
2. 大泥球仍然是最常见的设计方式。
3. 通过案例分析,对比2种设计思维带来的维护问题。

内容三:案例——演示系统软件腐化的过程
1. 某电信项目系统。
2. 初始设计的问题分析。
3. 通过该案例分析,对比有时是因为人员的设计技能导致加速软件的腐化。

第三单元:设计层次(架构、详细设计、编码)如何交互 内容一:软件架构和设计概述
1. 软件架构和详细设计关注点和区别。
2. 软件架构师职责。
3. 软件架构视图和软件架构文档。
4. 详细设计师必须知道的架构决策。
5. 软件详细设计师和职责。
6. 结合多个案例进行分析,根据项目的不同类型,进行合适的架构视图,展现多个大型项目的架构视图。


内容二:软件详细设计
1. 传统详细设计的局限性。
2. 什么是好的软件详细设计和衡量的手段。
3. 软件详细设计的过程和内容。
4. 敏捷设计新思想。
5. 过度详细设计(Over-engineering)问题和注意事项。
6. 设计不足(Under-engineering)问题和注意事项,分析真实项目,设计与实现的新思想。

内容三:源代码就是设计
1. 传统代码认识的误区。
2. 设计与施工分离的误区。
3. 源代码就是设计。
4. 分析真实项目代码,认识代码的重要性,垃圾代码的危害。

内容四:案例——多项目详细设计分析
1. 通过多个零售系统设计分析。

第四单元:敏捷设计—预先设计做到什么程度 内容一:软件不可预测性
1. 软件需求的不可预测性。
2. 预先设计的局限性。
3. 传统瀑布型设计的问题。
4. 案例分析,根据课程介绍的坏症状,进行重构合理的设计。

内容二:敏捷设计思想——演化式设计
1. 敏捷设计思想:强调通过提高团队的能力、设计的弹性和流程的灵活性来适应变化。
2. 演化设计:重构带来了一种新的构设计方法,称为反思性设计(Reflective Design)。除了创建一种设计并用代码实现它之外,你现在还可以分析已有代码的设计并改善它。寻求改进的一种最好的方法是通过代码嗅觉(code smells)。
3. 在详细设计之中,如何对发现问题的设计进行重构。
4. 案例分析,根据课程介绍的坏症状,进行重构合理的设计。

内容三:案例——某电信项目系统
1. 故障单管理系统。
2. 流程审核的改变。
3. 故障单类型的增加。
4. 传统设计的问题与如何通过代码进行演化。
 

第五单元:防止变异技术 内容一:防止变异技术
1. 防止变异技术。
2. 多态(polymorphism)和针对接口的编程。
3. 数据驱动(Data-Driven Design)。
4. 元数据驱动设计。
5. 反射驱动(Meta-data or Reflective)。
6. 解释器驱动。
7. 脚本引擎技术。
8. 结合多个案例项目进行分析,怎样发现和封装变化,如何通过具体的手段来进行适应这些变化。

内容二:案例——某项目系统防止变异技术的应用分析
1. 结合多种技术防止变异,如何做的通用性。

第六单元:领域驱动设计--软件核心复杂性应对之道 内容一:领域驱动设计
1. 业务逻辑层架构模式。
2. 事务脚本模式/领取驱动设计/表模块。
3. 领域驱动设计的优缺点和面临的挑战。
4. 如何建立软件项目的有效模型。
5. 构建基于模型的语言,用来连接领域专家,开发者和代码自身。
6. 技术人员和业务人员在建模过程中的探索式交互。
7. 案例分析,通过案例演示,领会驱动设计与传统事务脚本模式的优缺点。
第七单元:软件设计复用 内容一:软件复用设计
1. 在详细设计中分析发现共同的行为的抽象和共同的机制来实现。
2. 软件通用服务组件的设计。
3. 复用已有的东西,比自己编写更容易。如果不容易,大家就不会去复用。
4. 软件复用的管理策略。

内容二:软件通用机制的设计与实现
1. 异常的机制设计与实现。
2. 系统的配置管理机制的设计与实现。
3. 系统的Cache缓存机制的设计与实现。
4. 异步消息和通知机制的设计与实现。
5. 认证授权以及安全/加解密的机制设计与实现。
6. 事务管理机制的设计与实现。
7. 定时触发的机制设计与实现。
8. 后台批处理机制设计与实现。
9. 校验机制设计与实现。
10. 通信机制设计与实现。

内容三:框架(Application framework)设计
1. 应用框架概述。
2. 框架vs.类库的不同。
3. 在软件详细设计时如何应用框架和设计新的框架。
4. 典型案例分析:结合多个项目实例,在实际项目中如何进行应用和开发框架。

内容四:某电信项目案例-异常处理框架设计
1. 系统的异常处理策略。
2. 设计一个通用异常处理子系统。
3. 分析如何应用设计模式在该案例。
4. 分析通过应用设计模式,带来了哪些好处(表现在软件的灵活性)。
5. 分析如何转换为Framework。
6. 典型案例分析:该框架已经在多个大型项目之中应用。

内容五:某电信项目案例的详细设计分析
1. 项目背景。
2. 使用AOP思想改造项目设计。
3. AOP与软件复用。

第八单元:敏捷建模 内容一:敏捷建模
1. UML在详细设计阶段的应用方式(4种方式)。
2. UML类图和顺序图在详细设计中如何协作进行职责分配。
3. UML图的是否保留和废弃。
4. 结合多个案例项目进行分析如何正确应用UML建模,以避免过度建模以及怎样保留UML建模成果和代码的同步问题。

内容二:详细设计的文档和相关工具(根据学员和时间,现场适当调整)
1. 设计文档撰写。
2. 设计文档的评审与基线。
3. 设计文档的版本管理。
4. 设计文档的变更控制略。
5. 详细设计转化为代码。
6. 界面设计工具。
7. 数据建模工具。
8. 部署模型设计相关工具。
9. 结合案例进行分析详细设计文档的编写。
 

第九单元:软件设计质量 内容一:软件的质量属性
1. 软件开发的4个要素成本、时间、功能范围和质量。
2. 什么是系统质量属性。
3. 如何进行定义质量属性。
4. 详细设计需要考虑的质量属性。
5. 通过案例分析如何在设计时考虑设计质量。

内容二:软件的质量属性对详细设计的影响
1. 软件的可靠性设计策略。
2. 软件的可修改性设计策略。
3. 软件的性能设计策略。
4. 软件的安全性设计策略。
5. 软件的易用性设计策略。
6. 系统质量属性和设计原则和模式的关系。
7. 结合多个案例进行分析,通过哪些手段来实现这些质量属性。

第十单元:软件设计案例分析 内容一:大型软件项目详细设计案例分析
1. 软件详细设计最佳实践。
2. 某电信项目详细设计最佳实践。
3. 某电力项目详细设计最佳实践。
4. 某Web互联网项目详细设计最佳实践。