各类 IT/软件企业和研发机构的技术总监,软件架构师、软件设计师、程序员。最好你工作2年以上,并且遭受过客户需求经常变更的折磨和蹂躏。
| 课程编号 | 开课日期 | 地点 | 培训天数 | 选择报名 |
各类 IT/软件企业和研发机构的技术总监,软件架构师、软件设计师、程序员。最好你工作2年以上,并且遭受过客户需求经常变更的折磨和蹂躏。
时间地点:2011年6月15日-18日深圳
培训费用:4500元/人(含教材、培训费、培训期间午餐以及学习用具等)食宿统一安排,费用自理。
培训对象:各类 IT/软件企业和研发机构的技术总监,软件架构师、软件设计师、程序员。最好你工作2年以上,并且遭受过客户需求经常变更的折磨和蹂躏。
各有关单位:
如果你是具有多年经验的软件设计师,请问什么是好的设计?
如果你不知道什么是好的设计? 怎么可能实现优秀设计呢! 那就听听世界大师们怎样定义什么是好的设计.
软件大师Peter Code认为一个好的系统设计应该有如下的性质:可扩展性、灵活性、可插入性。
在《敏捷开发的艺术》一书中,James Shor,他为设计质量下了一个非常具体的定义:“一个良好的软件设计在最小化软件的创建、修改和维护时间的同时,保证了运行性能。”
他们为什么都认为软件的可维护性是非常重要呢. 这是因为:
30年前, Ed Yourdon在Structure Design一书将经济学作为软件设计的底层驱动力.软件的成本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)
但是我们的软件设计师却很少关注设计的可维护性,设计师会发现现实中的软件系统几乎总是会慢慢变为一个烂摊子. 开始漂亮的设计随着时间的推移会慢慢“发出腐化的臭味”.去年才构建的漂亮小巧的系统,到了今年却变成了由一堆纠缠不清的函数和变量搅和在一起的“代码浆糊”.
为什么会这样?为什么一个原先好好的设计会逐渐“发出腐化的臭味”?为什么它们不能保持原先那样的清晰简洁呢?
有时候设计人员会把原因归咎于客户,责怪他们总是改变需求.自我安慰地认为,只要客户的需求仅限于他们最初所声明的,那么我们的设计就是没问题的,所以错就错在客户改变了他们的需求.然而问题在于:需求总是在改变.那些不能适应未来需求变更的设计是糟糕的设计.能够适应未来需求变更的设计是每一位合格的软件开发者的目标.
如果你是技术总监或者技术经理,请问怎样才能提高我们技术团队人员的设计能力? 为什么我们的团队经常加班,但是效率非常低? 仅仅靠加班和加人就可以吗?
现在国内的项目成员经常离职,平均技术积累的才3年经验左右,这样导致我们的团队经常必须面对大量的新设计师. 我们学习了面向对象,设计原则,设计模式. 可惜有几个真正可以把这些思想应用到实际项目之中. 往往这些思想变成了一种谈资,变成了面试和入职的门槛问题. 我们的开发团队经常加班, 加人,可以总感到人手不够? 我们的开发效率非常低,.
为协助国内软件企业及软件设计师快速掌握以上技能,在国内组织了一批“源于实践,指导实践”的专家,结合多年国内外项目开发的实战经验,让学员如果做详细设计,什么样子的设计才是好的,什么样子的设计是拙劣的.如果才能提高我们的设计能力. 帮助大家学以致用,消除“知与行”之间的鸿沟。
课程特色:
本课程注重实战,采用案例贯穿方式完成授课,让学员体验软件详细设计的完整过程,掌握软件详细设计的基本原则和模式,同时课程也以大量失败案例来警示学员,避免重蹈覆辙。
课程目标:
1:优秀设计的特征?什么是优秀设计?如何实现?
2:什么是架构?什么是设计?详细设计做的什么程度?编码就是低级工作吗
3: 预先设计可以搞定所有问题吗?软件需求为什么老是变化?设计应该怎样应对变化?
4:设计复用? 为什么我们总是重复劳动,个人重复,小组成员重复?不同小组之间重复.
5:设计原则/设计模式? 我们为什么学习了设计模式,却根本不会使用?
6:软件设计实现功能就可以了吗? 怎么考虑设计质量? 我们老是赶进度而忽略软件质量?
7:为什么我们的软件开发团队整天加班? 软件仍然很难维护?我们做错了什么?
8:UML到底可以帮助我们做什么?可以提高设计质量吗?为什么我们真正很少使用?
9: 设计如何评价? 如何度量? 为什么我们设计评审经常吵?谁也说服不了谁?
10: 其他大型项目的详细设计是如何做的? 和我们到底有什么不同?有什么值得学习的?
学员基础:
学员学习本课程应具备下列基础知识:
1)了解OOP(面向对象)编程相关概念;熟悉Java/C#或者C++语言;
2)简单了解UML基本语法(主要使用类图和顺序图等常见几类UML图)。
核心要点:
本课程主要包含以下几个方面的内容:
1、结合电信、电力、税务和金融,互联网等多个项目实战案例进行分析。详细介绍相关项目设计思想.
2、鉴赏经典的开源项目,如临摹钢笔字贴一样,让我们看看好的设计应该如何去做。该开源项目均出自世界大师之手.
3、软件设计基本原则:结合案例分析这些原则,特别是一些最基本的设计原则,是如何应用在软件详细设计之中的。
4、设计模式: 知道模式是什么是一回事,而真正理解如何应用模式就完全是另一回事了。借助真实项目案例,展示如何在实际开发之中正确的选择和运用模式,而不是靠所谓的艺术感而进行设计堆砌。
5、常见设计的坏症状: 介绍目前我们常见的糟糕的设计坏症状,以告诫学员,今后如何避免出现这样的拙劣设计。
6、重构和持续集成:软件并不是在一开始就可以设计的完美无缺,因此可以通过预先设计,经过不断的重构进行改善,重构是实现优秀设计的一种重要手段,设计模式往往是重构的目标。
7、UML建模技术如何在设计之中进行应用。避免目前UML语法式的学习,以避免过度滥用UML。
8、软件通用机制的设计与实现:介绍常见详细设计之中必备的通用机制(比如异常处理框架,日志处理,事务,Cache,工作流,通信,接口,安全)。
9、敏捷设计:学习敏捷设计方法的思想,价值观、原则和实践,对敏捷设计有一个清晰全面的认识。
10、应用框架(Application framework)设计:结合具体案例进行分析,如何应用和设计Framework。
课程大纲:
第一单元 什么优秀设计以及如何实现
内容一:什么是好的设计
1.什么是好的软件详细设计和衡量的手段
2.世界大师的观点(Robert C Martin , Peter Code,` James Shor)
3.我们现实项目的情况,随时需求的变化,我们自以为豪的设计,都逐渐变烂,变成纠缠不清的代码浆糊.
4.可扩展性(Extensibility)容易添加新的功能. 结合案例,通过那些手段如何实现该目标
5.灵活性(Flexibility)代码修改平稳地发生. 结合案例,通过那些手段如何实现该目标
6.可插入性(Pluggability)容易将一个类抽出去,同时将另一个有同样接口的类加入进来. 结合案例,通过那些手段如何实现该目标
7.分析真实项目,如何做的详细设计,给我们哪些启示,我们可以学习到什么
8.分析我们在项目之中是那些原因导致了没有实现这些目标.
内容二:案例- 某省移动基站综合管理项目案例
1.某省移动项目,必须考虑支持多种设备厂商
2.初始设计的问题分析
内容三:如何实现优秀设计—预先设计与分析
1.设计基本原则
2.发现和封装变化的原则
3.面向对象的基本原则(OCP/SRP/ DIP等基本设计原则)
4.共性和可变性分析原理
5.根据共性性分析,进行行为职责或者数据的抽象
6.根据可变性分析,进行职责的结构分析和实现
7.结合多个案例项目进行分析,怎样发现和封装变化,如何通过具体的手段来进行适应这些变化
内容四:案例- 某省电信网管项目
1.某省移动项目,必须考虑支持多种设备厂商
2.初始设计的问题分析
内容五:如何实现优秀设计—发现变化/封装变化/隔离变化
1.发现变化
2.封装变化的原则
3.隔离变化
4.局部化变更-可修改性战术目标是减少由某个变更直接影响的模块数量.
5.防止连锁反应-目标是限制对局部化的模块的修改.减少间接受变更影响的模块.
6.推迟绑定时间-尽量不要静态编译,应该运行期间决定组件之间关系
7.结合多个案例项目进行分析,怎样发现和封装变化,如何通过具体的手段来进行适应这些变化
第二单元 架构/详细设计/源代码也是设计
内容一:软件架构和设计概述
1.软件架构和详细设计关注点和区别
2.软件架构师职责
3.软件架构视图和软件架构文档
4.详细设计师必须知道的架构决策
5.软件详细设计师和职责
6.结合多个案例进行分析, 根据项目的不同类型,进行合适的架构视图. 展现多个大型项目的架构视图
内容二:案例-多项目案例架构分析
1.通过多个电信/金融/电力系统架构分析,项目案例视图
2.分析项目案例视图—分视角/分等级
内容三:软件详细设计
1.传统详细设计的局限性
2.什么是好的软件详细设计和衡量的手段
3.软件详细设计的过程和内容
4.敏捷设计新思想
5.过度详细设计(Over-engineering)问题和注意事项,
6.设计不足(Under-engineering)问题和注意事项分析真实项目,设计与实现的新思想
内容四:代码新思维----源代码就是设计
1.传统代码认识的误区
2.设计与施工分离的误区
3.源代码就是设计
4.破窗效应和技术债务
5.分析真实项目代码, 认识代码的重要性.垃圾代码的危害
内容五:案例- 多项目详细设计分析
1.通过多个电信/金融/电力系统设计分析
第三单元 软件设计过程—敏捷设计与反思性设计
内容一:软件不可预测性
1.软件需求的不可预测性
2.预先设计的局限性
3.传统瀑布型设计的问题
4.案例分析, 根据课程介绍的坏症状,进行重构合理的设计
内容二:敏捷设计思想---演化式设计
1.敏捷设计思想--强调通过提高团队的能力、设计的弹性和流程的灵活性来适应变化。
2.演化设计--重构带来了一种新的构设计方法,称为反思性设计(Reflective Design)。除了创建一种设计并用代码实现它之外,你现在还可以分析已有代码的设计并改善它。寻求改进的一种最好的方法是通过代码嗅觉(code smells).
3.在详细设计之中,如何对发现问题的设计进行重构
4.案例分析, 根据课程介绍的坏症状,进行重构合理的设计
内容三:案例---某电信项目系统
1.故障单管理系统
2.流程审核的改变
3.故障单类型的增加
4.传统设计的问题与如何通过代码进行演化
第四单元 软件设计度量—怎样评价设计
内容一:软件设计质量评审---世界难题----如何评价设计?
1.通过指标进行重构设计
2.UML设计图的难以度量
3.代码度量
4.软件设计师能力的考核
5.Talk is cheap,show me the code.-Linux之父 Linus Torvalds
6.案例分析, 根据课程介绍的工具进行分析代码问题,从而找到设计问题
第五单元 重构与设计
内容一:重构和持续集成
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
典型案例分析:该框架已经在多个大型项目之中应用
内容五:某电信项目案例的详细设计分析
1.项目背景(
2.使用AOP思想改造项目设计
3.AOP与软件复用
第七单元 软件建模与设计文档
内容一:UML建模技术在详细设计之中的应用(强调如何应用UML)
1.UML在详细设计阶段的应用方式(4种方式)
2.UML类图和顺序图,在详细设计中,如何协作进行职责分配
3.UML图的是否保留和废弃
结合多个案例项目进行分析,如何正确应用UML建模,以避免过度建模以及怎样保留UML建模成果和代码的同步问题
内容二:详细设计的文档和相关工具(根据学员和时间,现场适当调整)
1.设计文档撰写
2.设计文档的评审与基线
3.设计文档的版本管理
4.设计文档的变更控制略
5.详细设计转化为代码
6.界面设计工具
7.数据建模工具
8.部署模型设计相关工具
结合案例进行分析详细设计文档的编写
第八单元 软件原则/模式/最佳实践
内容一:软件设计原则
1.软件设计原则概述
2.面向对象设计的基本原则
3.通过案例分析设计原则如何应用
4.结合项目实例,分析设计原则在软件详细设计时期的实际应用事项
内容二:软件设计模式的应用
1.设计模式概述
2.设计模式的本质论
3.设计模式如何适应变化和封装
4.设计模式在高层(组件级)和底层设计(类和对象级)之中的应用
5.解决开发人员只停留在对设计模式的理论认识上,无法将设计模式思想有效地应用在软件设计过程中
6.结合项目实例,分析设计模式在软件详细设计时期的实际应用
结合案例进行分析, 应用设计模式之前和应用之后的对比, 从中发现这些
内容三:案例---多项目设计模式应用最佳实践
1.设计应用最佳实践
2.通过分析多个项进行分析设计模式的应用
3.结束设计模式应用前和后的区别
第九单元 软件设计质量
内容一:软件的质量属性
1.软件开发的4个要素成本,时间,功能范围和质量
2.什么是系统质量属性,
3.如何进行定义质量属性
4.详细设计需要考虑的质量属性
5.通过案例分析,如何在设计时考虑设计质量
内容二:软件的质量属性对详细设计的影响
1.软件的可靠性设计策略
2.软件的可修改性设计策略
3.软件的性能设计策略
4.软件的安全性设计策略
5.软件的易用性设计策略
6.系统质量属性和设计原则和模式的关系
7.结合多个案例进行分析,通过那些手段来实现这些质量属性
第十单元 软件设计案例分析
内容一:大型软件项目详细设计案例分析
1.软件详细设计最佳实践
2.某电信项目详细设计最佳实践
3.某电力项目详细设计最佳实践
4.某Web互联网项目详细设计最佳实践
讲师简介:
15年以上软件从业经历,历任程序员、设计师、软件架构师、项目经理等职位.曾任某著名外企中国研发中心高级工程师、技术专家。主要项目经验:参与或支持多家大型电信企业系统软件如中国电信97系统,中国移动BOSS系统(营业受理系统主架构师),负责某大型国有银行信贷核心系统,国家电网多个省门户系统,中国邮政,国家税务,社保等关键项目,负责系统架构设计及详细设计和相关软件技术支持。近年来专注于软件架构方法论和软件设计原则/模式,帮助客户进行需求分析、建模以及架构设计,为多家大型企业改造其核心业务系统,支持公司的业务迅速扩展,帮助客户设计并实施多个业务流程平台。之前,在国外某大型IT公司任3年核心程序员,从事核心软件系统底层开发实现。