1 软件设计目标——灵活性/可插入性/可扩展性
1.不管你在何处工作,构建些什么,用何种语言,在软件开发上,一直最痛苦的事情是什么?或者什么是你开发之中最讨厌的问题?——需求变更
2.杀死一个程序员不需要刀,只要需求变3次就好
3.软件不断变更法则:真实世界中使用的程序必须进行变更,否则它在环境中的作用就会越来越小
4.需求改变的态度——拒绝变化无用,积极心态面对变化
5.而敏捷对预测未来的方式是全新的,强调通过提高团队的能力、设计的弹性和流程的灵活性来适应变化。这种思路对软件开发也是很大的冲击。
6.软件设计的目标——灵活性,因为增加一个功能特性的成本并不单单是为这些功能编码所花费时间的成本,还应该包括特性扩展的障碍成本。现在我们遇到的最大障碍是现在的系统混乱,难以扩展。
7.案例分析——通过案例分析需要变化的根源,以及各种情况
2 如何设计才能实现灵活性
2.1 软件设计的灵活性
1.什么是好的设计和衡量的手段,世界大师的观点(Robert C. Martin, Peter Code, James Shor)
2.一个好的系统设计应该有如下的性质:可扩展性、灵活性、可插入性——Peter Code [CODE99]
3.可扩展性(Extensibility)容易添加新的功能。结合案例,通过哪些手段如何实现该目标
4.灵活性(Flexibility)代码修改平稳地发送。结合案例,通过哪些手段如何实现该目标
5.可插入性(Pluggability)容易将一个雷抽出去,同时将另一个有同样接口的类加入进来,结合案例,通过哪些手段实现该目标
6.分析真实项目,如何做详细设计,给我们哪些启示,我们可以学到什么
7.分析我们项目之中,是哪些原因导致了没有实现这些目标
2.2 案例——某项目认证管理模块设计案例
1.某省移动项目,必须考虑支持多种设备厂商
2.初始设计的问题分析
3.应用何种模式解决问题
3 灵活性设计基本原则/模式/实践
3.1 灵活设计的基本原则
1.发现和封装变化的原则
2.找出应用中可能需要变化之处,把它们独立出来,不要和那些需要变化的代码交织在一起
3.抽象稳定接口(抽象类),针对接口编程,而不是针对实现编程
4.分离变化维度,单一职责原则
5.动态绑定还是静态绑定,多用组合,少用继承
6.创建与使用分离,创建有变化也要封装
7.结合多个案例项目进行分析,怎样发现和封装变化,如何通过具体的手段来适应这些变化
3.2 灵活性设计的最佳实践
1.多态(polymorphism)和针对接口编程
2.数据驱动(Data-Driven Design)
3.元数据驱动设计
4.反射驱动(Meta-data or Reflective)
5.解释器驱动
6.脚本引擎技术
7.结合多个案例项目进行分析,怎样发现和封装变化,如何通过具体的手段来适应这些变化
3.3 案例——结合案例分析软件设计原则/模式
1.某项目系统的演变,以及设计原则的应用效果,通过项目的演化,分析这些核心设计原则的应用场景
2.通过一个大型实例,传递Clean Code,设计原则等,包括DRY原则,Tell Don’t Ask原则,Solid原则(Single Responsibility, Open Closed, Liskov Substitution, Interface Segregation, Dependency Inversion)
3.案例分析——设计原则的应用
4 软件设计腐化
4.1 设计腐化与技术债务
1.设计腐化的途径
2.总结常见的设计腐化途径、原因及克服方法
3.技术债务概述
4.技术债务对软件系统的危害
5.技术债务对软件开发人员的危害
6.技术债务与破窗效应
7.技术债务的解决之道
8.通过案例分析,如何解决技术债务
4.2 技术债务监控
1.软件腐化监控
2.国际著名某电信研发中心监控工具
4.3 软件腐化与希波克拉底宣言
1. First, Do No Harm. 首先,做到不伤害!——Hippocrates
2. Proxy代码模式与软件修改方案
3. Decorator模式与遗留软件修改
4. 案例分析——维护遗留系统而不是遗留系统变烂
4.4 案例——演示系统软件腐化的过程
1.某电信研发中心项目系统
2.初始设计的问题分析
3.故障单管理系统
4.流程审核的改变
5.故障单类型的增加
6.传统设计的问题与如何通过代码进行演化
7.通过案例分析,对比有时是因为人员的设计技能导致加速软件的付腐化
8.通过案例分析,进行哪些重构
5 演化式设计
5.1 演化式设计(Emergent Design)
1.演化式设计 Emergent Design
2.演化式设计——重构带来了一种新的设计方法,称为反思性设计(Reflective Design)。除了创建一种设计并用代码实现它之外,你现在还可以分析已有代码的设计并改善它。寻求改进的一种最好的方法是通过代码嗅觉(code smells)
3.在详细设计之中,如何对发现问题的设计进行重构
4很多公司习惯做大量的预习设计,这被证明是风险很高的做法。好的架构和设计是演化出来的,通过这个环节了解演进式设计的方法,包括演进式设计的方法、工具、模式等内容。包括如何计划重构活动以实现架构演进,如何从设计方法、技术债务、复杂性等角度来看演进架构
5.案例分析,根据课程介绍的坏症状,进行重构合理的设计
5.2 设计的新认识——源代码就是设计
1.传统代码认识的误区
2.设计与施工分离的误区
3.源代码就是设计
4.分析真实代码项目,认识代码的重要性、垃圾代码的危害
5.3 劣设计的坏症状和重构
1.拙劣设计概述
2.拙劣设计常见症状以及如何发现和治疗
3.在详细设计之中,如何对发现问题的设计进行重构
4.代码坏味道概述
5.常见的重构设计模式
6.重构到设计模式
7.案例分析——对实际项目的案例进行代码分析和重构
8.案例分析——根据课程介绍的坏症状,进行实际项目重构的设计
5.4 案例——某零售项目系统分析
1.零售租赁管理系统
2.第一版本设计和评审
3.故障单类型的增加
4.传统设计的问题与如何通过代码进行演化
6 关注人——设计师与技能的思考
6.1 设计师与设计技能
1.某研发团队5年前引入敏捷的失败教训——能力比方法重要,但改变方法比改变能力简单多了
2.无论什么道什么术,什么方法或思想,离开了人都是虚妄。优秀的设计来自优秀的设计师,因此应该首先是尊重个体的主动和创造性,提高个体工作技能,而不是应用了一种流程,消灭了个体的活力。首先关注人,才能真敏捷。
3.案例分析,某研发中心引入敏捷的实战分析,什么才是真正的敏捷
6.2 设计师能力模型
1.设计能力金字塔
2.软件设计价值观
3.软件设计原则
4.软件设计模式
5.软件设计最佳实践
6.通过某研发中心的设计师能力模型分析,设计能力提升计划
7 软件设计复用性
7.1 软件复用设计
1.在详细设计之中,分析发现共同的行为的抽象和共同的机制来实现
2.软件通用服务组件的设计
3.复用已有的东西,比自己编写更容易。如果不容易,大家就不会去复用
4.软件复用的管理策略
5.对象级别复用
6.模块级别复用
7.架构层次复用
8.软件复用之道
9.案例分析复用的设计之道
7.2 某电信项目案例——异常处理框架设计
1.系统的异常处理策略
2.设计一个通用异常处理子系统
3.分析如何应用设计模式
4分析通过应用设计模式,带来了哪些好处(表现在软件的灵活性)
5.分析如何转换为框架
典型案例分析:该框架已经在多个大型项目之中应用
8 软件设计案例分析
1.某电信核心系统设计最佳实践和案例分析
2.某电力系统设计最佳实践和案例分析
3.某web互联网电子商务系统设计最佳实践和案例分析
4.某税务系统设计最佳实践和案例分析