第二章 注重实效的途径
1 重复的危害
系统中的每一项知识都必须是单一、无歧义、权威的表示;
DRY- Dont repeat yourself 不要重复你自己;
重复如何发生
强加的重复
信息的多种表示
代码中的文档; 把注释保留给其他的高级说明
文档与代码
语言问题;
无意的重复
设计问题; 使影响局部化;
无耐性的重复
走捷径;欲速则不达
开发者之间的重复
交流,促进知识的沟通;
2 正交性
正交性:表示某种不相依赖性或是解耦性;
消除无关事物之间的影响,让组件独立、具有单一、良好定义的目的称为内聚;
正交的好处
提高生产率
改动能局部化;
促进复用;
重叠减少,生产率提高
降低风险
降低开发中的固有风险
问题代码被隔离
系统更健壮;
更好的测试;
项目团队
团队的组织有许多重叠,各个成员对责任感到困惑,效率差;
设计
系统多个模块,分层架构
工具箱与库
引入第三方要注意保持系统正交性明智选择技术
面向切面编程 AOP
编码
每次编码都有降低系统正交性的危险;
让你的代码保持解耦
避免使用全局数据
避免写相似的函数
养成不断批判对待自己代码的习惯;
测试
正交的设计和实现,易于测试;
文档
正交性利于文档的编写
3 可撤销性
不必作出许多关键的、不可逆转的决策;
不存在最终决策;
保持架构的灵活性,预先考虑问题,抽象服务等,只需要改配置文件;
薛定谔的猫
猫,粒子50%机会分裂猫会死,猫是死是活?
答案都是; 每当有两种可能结果的亚核反应发生时,宇宙就会克隆,一个发生一个不发生,只有你打开盒子才知道,你在哪一个宇宙中;
每一项代码决策都导致不同版本的未来;
4 曳光弹
黑暗中机枪射击?1 找出目标确切的位置 2 曳光弹与常规弹交接射击,不断获得反馈;
在黑暗中发光的代码;总有改动需要完成,总有功能需要增加,渐进的过程;
优点
用户能及早看到能工作的东西
开发者构建了一个他们能在其中工作的结构;
有了一个集成平台;
有了可演示的东西
能感觉到工作的进展;
原型制作:探究系统的某项具体的方面,对概念实验后,东西扔掉,根据学到的经验教训重新编码;
你设计一个用户界面,用户满意后,把它扔掉,重新用目标语言编码;
原型制作生成用过就扔的东西,曳光代码虽然简约,却是完整的,并且构成了最终系统骨架的一部分。
5 原型与便笺
为了学习而制作原型
怎样使用原型
正确性:适当使用虚假数据
完整性:出错入参
健壮性:可能不完整
制作架构原型
主要组件的责任是否得到良好的定义
主要组件的协作是否定义
耦合是否最小化
能否确定重复的潜在来源
接口定义和各项约束是否可接受
怎样不适用原型
确定是用过就扔,不会不熟的,不完整;
坚持部署原型,适用曳光弹;
6 领域语言
靠近问题领域编程
实现小型语言
数据语言与命令语言
独立语言
易于开发还是易于维护?可扩展性与维护权衡
7 估算
估算,以避免意外发生;
多准确才足够准确; 某种程度上,所有的解答都是估算,只不过有一些更准确;
使用估算的单位不同会对结果的解读产生影响;
130个工作日,相当接近的时间完成
6个月,5-7个月完成;
130更高的精确程度;
估算来自哪里;以问题的模型为基础;
理解提问的内容
建立系统的模型;建立粗略、就绪的思维模型
把模型分解为组件;每个组件都有一些参数
给每个参数指定值
计算答案
追踪你的估算能力
估算项目的进度
检查需求
分析风险
设计、实现、集成
向用户确认
在被要求估算时说什么
我等会儿回答你,今天晚上给你答复;