强有力的、积极主动管理和指导项目活动的项目领导的重要性。
软件开发经理管理非技术风险,项目架构师管理技术风险。
技术风险包括:继承结构的选择、机制的选择
非技术风险:监督第三方厂商交付,管理客户和开发团队间关系,分析期间发现真正的需求
对微观过程,固有的不稳定性,需要采取积极的计划来强制结束
设计开发的宏观过程
OO项目的不同之处在于任务调度和产品评审与其他系统有一些差别
大中型项目,每周一次团队会议(讨论已完成和即将进行的工作)
小频率会议对促进交流有必要,但不能过多(项目失去方向的信号)
OO开发需要每个开发人员有大量时间可支配
团队会议:微调进度,洞察隐现的风险
调度宏观过程可提交的产品。
评估即将面临的和长远的风险,必要时集中开发资源处理这些风险(如果没有主动攻击风险,就会被其攻击)
不受过于乐观的计划支配:开发团队的校准标准和工具
管理团队对每一个开发人员可能遇到的附加因素做出计划
管理团队认识各成员的真实生产率,开发人员更准确估工
尽早交付架构方面的发布版本,尽早使用工具
对用例场景和系统的架构进行正式评审,对较小技术问题进行非正式评审
用例场景正式评审:团队分析员(精通用例开发)、领域专家、其他最终用户,开发人员在场,含QA(测试员)。贯穿分析阶段。
架构评审:系统的整体结构,包括类结构和机制。架构师和其他设计人员领导。
早期注重于系统架构问题,以后聚焦于某个组件或具体的普遍机制。
在早期确认设计的有效性,沟通架构愿景;增加架构可见度,发现模式和协作,便于简化
OO过程重点在架构设计上,架构师和其他设计人员在开发早期加快工作,甚至在分析后期就催促其进行探索。后续增量中,需要的资源通常更少,测试所需资源也更少。
测试一个在早期进行,自证是一个累计而非单独的活动。集成所需的资源也更少,因为增量式发生
角色: 项目架构师;组件主管;应用工程师
架构师: 梦想家。中小系统,由一两个具有独特洞察力的个人负责。对大型,由团队负责
不一定是最高级开发人员,但是最有资格去制定战略决策的人
有丰富经验,凭直觉就能够判断出给定领域有关的通用架构模式,存在什么问题
具有编程经验,精通表示法,过程和工具(根据类的聚集和对象的协作来展示愿景)
架构师最好参与全程(熟悉系统,接受架构决策的结果等)
组件主管:设计一个完整的组件,设计、保护和商讨组件接口,指导其实现
类聚集和机制的拥有者,负责系统的测试和发布
精通表示法和过程。比架构师更好的设计员和程序员,但比架少经验;占1/3~1/2
应用工程师:完成一项或两项职责。在组件主管的监督下实现一个组件。
可以含设计类,通常实现类,单元测试;使用类,组装类来完成用例场景
熟悉表示法和过程,但不必是这方面的专家;是非常优秀的程序员,占一半或更多
大型项目:
项目经理 负责项目的交付、任务、资源和日程安排的动态管理
分析员 演化和解释最终用户的需求,是问题域内的专家,不脱离开发图案段
复用工程师 管理项目的类、组件和设计的仓储,寻找共同点,生产和改造通用的类和组件
质量保证员 度量开发产物。指导原型、产品发布的系统级测试
集成经理 组装已发布组件的兼容版本,以便组成一个可交付版本,维护发布产品的配置
文档编写员 产出产品及其架构的最终用户文档
工具编制工程师 创建和改编方便生产项目移交物的软件工具
系统管理员 管理项目使用的物理计算资源
对组件做版本控制。代码、用例规格、可视化模型、软件架构文档等都需要配置管理
一个宏观过程生产一系列可执行的发布版本,每一个都有新增功能
开发过程期间持续进行。
(1) 单元测试:单个类和机制的测试,由实现结构的应用工程师负责
(2) 组件测试:一个完整组件的集成测试,由组件主管负责,可用作组件的回归测试
组件泛指,一个或一组,或一个子系统,相对于项目大小
(3) 系统测试:系统整体的集成测试,有质量保证团队负责。也用作回归测试
每个级别,聚焦于测试对象的外部行为;
将系统推向极限,以了解在某些条件下如何发生故障
用例场景、设计、代码、文档都可复用
类是首要复用工具:可被子类化,特化或扩展基类;
可以惯用法、机制和框架的形式复用类、对象和设计的模式;
以组件形式复用协作的类;相对单个类,框架和模式复用处在更高抽象级别
复用的比例数值无法起衡量作用,易产生误导;有复用总比没有强
复用不会自发产生,必须制度化;积极寻找复用的机会并奖励
这就是把模式提取作为一个明确活动包含在宏观过程的原因
由专人负责领导,通过架构评审识别共同点,鼓励复用
购买商业类和组件来协助开发
复用短期消耗资源,有长期回报
整个软件产品使用的适应性。
一个简单的、可修改的架构是所有高质量软件的关键
缺陷bug率曲线比数字更重要,应该为钟形
对每个增量发布版本,都应该执行一个系统测试,并画出曲线
缺陷率:在大约10000行代码被检查后达到一个稳定值,并保持不变
80%的缺陷在20%的系统类中被发现
过程度量
● 应用规模
场景脚本的数目(NSS) 关键类的数目(NKS) 支持类的数目(NSC) 子系统的数目(NOS)
● 人员规模
每个类人-天数(PDC) 每个开发人员类数(CPD)
● 调度
主要迭代的数目(NMI) 已完成的合同数目(NCC)
进度测量:关键接口的稳定性,后期即使要改,通常向上兼容
CK产品度量(设计度量):
可视的模型:用例图展示需求;活动图-用例场景的细节;类图-关键抽象;状态机图-状态相关类;序列图-系统功能时对象的协作;组件图-类到组件的映射
糟糕:逐个类对每个方法的语义作孤立的描述,无协作(生成无用的文档)
支持UML的可视化建模工具
软件配置管理和版本控制工具(组件为配置管理单元)
类库工具(如果查找组件成本高于新建,则不会复用)
复用工程师:维护类库。鼓励复用
工具编制工程师:有集成工具套件的最佳情况下,不需要,系统管理员管理集成套件
开发高效的用户界面:更多偏向艺术而非科学
原型使用是必要的;用例场景的生成能高效地驱动用户界面分析
数据库组件(遗留数据),用分离关注原则;将这些数据库的访问封装在已经定义良好的接口类的界限之内。
实时系统:以用户为中心,亚秒级;对数据获取,亚微秒级;防止过早发生优化。聚焦于产生简单的架构,发布版本逐代演化
遗留系统:不能放弃,但维护费难忍,随时间推移,需要被取代;可将其封装在定义良好的接口类的上下文之中,随时间推移,移动架构覆盖范围,以取代遗留系统的功能(架构愿景有必要,逐步替代并非不一致的修补)
如何开发面向对象设计的能力:
● 为开发人员和管理人员提供以下正式培训
UML
要使用的OOAD过程
要使用的工具
要使用的语言和库
● 先在一个低风险项目中使用OO开发,让团队通过以下途径学习
使用有经验的OOAD顾问作为项目团队的导师
培养团队中的高手,让他们作为OO方法的导师,去其他项目播种
● 向开发人员和管理人员展示设计良好的面向对象系统
通过例子来学习通常直接和高效。从分析师做起,逐渐成长为设计角色;从设计人员开始,使用现有的结构良好的抽象。
采纳的原因:寻求竞争优势;项目复杂,似乎没有其他解决方案
好处:采用人类的认知来工作;使系统更便于修改;鼓励复用;减少开发风险;利用OO语言的表现力
【OO概念列表】
【风险】