软件设计师错题集
- 一、计算机组成与体系结构
- 1.1 浮点数
- 1.2 Flynn分类法
- 1.3 指令流水线
- 1.4 层次化存储体系
- 1.4.1 程序的局限性
- 1.5 Cache
- 1.6 输入输出技术
- 1.7 总线系统
- 1.8 CRC循环冗余校验码
- 二、数据结构与算法基础
- 2.1 队列与栈
- 2.2 树与二叉树的特殊性
- 2.3 最优二叉树(哈夫曼树)
- 2.3.1 霍夫曼编码
- 2.4 拓扑排序
- 2.5 贪心法
- 三、系统开发基础
- 3.1 开发模型
- 3.2 软件开发方法
- 3.3 内聚性
- 3.4 模块设计原则
- 3.5 架构设计
- 3.5.1 管道过滤器风格
- 3.6 测试分类与阶段任务划分
- 3.6.1 单元测试
- 3.7 McCabe复杂度计算
- 3.8 软件质量保证
- 3.9 软件过程改进
- 四、项目管理
- 4.1 风险管理
- 4.2 其他
- 五、面向对象技术
- 5.1 面向对象的基本概念
- 5.1.1 多态
- 5.1.2 类和对象
- 5.2 面向对象开发各阶段划分及任务
- 5.3 UML图的图示
- 5.4 UML图的定义
- 5.5 UML图中的关系
- 5.6 设计模式的图
- 5.7 其他
- 5.7.1 基类中成员在派生类中的访问权限
- 5.7.2 派生类所继承的基类成员的外部能见度(外界对基类成员的访问权限)
- 六、操作系统
- 6.1 进程资源图
- 6.2 页式存储
- 6.3 磁盘管理
- 七、知识产权与标准化
- 7.1 知识产权人确定
- 7.1.1 委托开发与合作开发
- 7.1.2 商标权/专利权申请
- 八、数据库系统
- 8.1 数据仓库
- 8.2 数据库设计过程
- 8.3 范式判断
- 8.4 数据库安全
- 九、计算机网络
- 9.1 常见TCP/IP协议基础
- 9.2 协议应用提升
- 9.3 常用命令
- 9.4 IPV6
- 9.5 路由配置
- 9.6 其他
- 十、信息安全
- 10.1 对称加密和非对称加密
- 10.2 信息摘要与数字签名
- 10.3 数字证书
- 10.4 计算机病毒与木马
- 10.5 防火墙技术
- 10.6 其他网络安全控制技术
- 10.7 其他
- 十一、多媒体技术
- 11.1 其他
- 十二、UML建模
- 十三、专业英语
- 13.1 语义网络
- 13.2 SWIFT
一、计算机组成与体系结构
1.1 浮点数
- 若浮点数的阶码用移码表示,尾数用补码表示。两规格化浮点数相乘,最后对结果规格化时,右规的右移位数最多为1位;
1.2 Flynn分类法
- 根据指令流和数据流分类
- SISD 单指令流单数据流机器
- SIMD 单指令流多数据流机器
- MISD 多指令流单数据流无实际意义
- MIMD 多指令流多数据流
1.3 指令流水线
当流水线各段所经理的时间不一样,吞吐率的计算公式如下:
流水线执行时间 = 一条指令顺序执行时间 + (n-1)*流水线周期
流水线周期为指令耗时最长的一段
吞吐率=指令数/流水线执行时间
1.4 层次化存储体系
1.4.1 程序的局限性
- 时间局部性:程序中的某段指令一旦被执行,则不久的将来该指令可能再次被执行;
- 空间局部性:程序访问某个存储单元,则不久的将来,附近的存储单元也有可能被访问。
1.5 Cache
- Cache的设计思想是在合理成本下提高命中率;
- Cache是一个高速小容量的临时存储器;
- 可以用高速的静态存储器(SRAM)芯片实现以集成到CPU芯片内部,或者设置在CPU和内存之间,用于存储CPU最经常访问的指令或操作数据;
- CPU的速度和性能提高很快而贮存速度较低且价格高,其次是程序执行的局部性特点;
- 在于尽可能发挥CPU的高速度。
1.6 输入输出技术
- 程序控制(查询)方式:CPU需要不断查询I/O是否完成,因此一直占用CPU;
- 程序中断方式:中断方式CPU无需等待,提高传输请求的响应速度;
- DMA:DMA是为了在主存与外设之间实现高速、批量数据交换而设置的。DMA方式比程序控制方式、中断方式更高效,CPU只负责初始化。
1.7 总线系统
- PCI总线:是目前微型机上广泛采用的内总线,采用并行传输方式;
- SCSI总线:小型计算机系统接口时一条并行外总线;
1.8 CRC循环冗余校验码
- 循环冗余校验CRC采用模二除法运算。
二、数据结构与算法基础
2.1 队列与栈
- 普通队列:先进先出,元素在队列尾追加,而从队列头删除;
- 优先队列:元素被赋予优先级。访问元素,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征;采用二叉堆数据结构实现,二叉堆的插入和删除时间复杂度均为O(lgn)。
2.2 树与二叉树的特殊性
- 二叉树的二叉链表存储结构中每个结点有2个指针。每个结点有0个、1个或者2个空指针对应有2个、1个、0个非空指针;
- 边的个数=非空指针的个数;
- 空指针的个数=结点总个数+1;
- 边数=结点总个数-1;
- 叶子结点个数=度为2的结点个数+1;
推论如下:
设二叉树结点总个数=N,边数=M,度为0(没有子节点)的结点个数=n0,度为1(1个子节点)的结点个数=n1,度为2(2个子节点)的结点个数=n2
推出N = n0+n1+n2;
除根节点之外,每个结点都有边进入结点,M = N - 1, M = n1 + 2n2
根据上述条件推出 n0 = n2 + 1;
空结点(就是空指针,二叉树缺少的结点数)=K,K=2n0+n1
推出K = N + 1
M = N - 1,n0 = n2 + 1
2.3 最优二叉树(哈夫曼树)
2.3.1 霍夫曼编码
- 以每个字符的出现频率作为关键字构建最小优先级队列;
- 取出关键字最小的两个结点生成子树,根节点的关键字为孩子结点关键字之和,并将根节点插入到最小优先级队列中,直至得到一颗最优编码树;
- 采用贪心算法,每次获取当前情况的最优选择;
计算规则
- 通用型:6个字符需要3位表示,100000个字符 总长度 100000*3;
- 霍夫曼编码:(218%+232%+44%+48%+312%+226%)*100000
2.4 拓扑排序
- 对有向图G进行拓扑排序,顶点Vi在顶点Vj之前,则可能
- Vi和Vj是并列的;
- Vi到Vj有向弧;
2.5 贪心法
- 分治法:对于一个规模为n的问题,若该问题可以很容易解决,则直接解决;否则分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归解决这些子问题,然后将各子问题的解合并得到原问题的解;
- 动态规划法:求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃那些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解;
- 回溯法:回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标,但当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择;
- 贪心法:总是做出在当前来说时最好的选择,并不从整体上加以考虑。所做的每一步选择都是当前步骤的局部最优选择,但从整体并不一定是最优的选择,不必为寻找最优解而穷尽所有的解,所以一般可以快速得到满意解,但得不到最优解。
三、系统开发基础
3.1 开发模型
- 喷泉模型
- 面向对象开发方式,迭代无间隙,以用户需求为动力,支持软件重用
3.2 软件开发方法
- 面向对象开发方法
- Booch
- Coad
- OMT
- 面向数据结构开发方法
- Jackson
3.3 内聚性
- 通信内聚:一个模块的所有成分都操作同一数据集或生成同一数据集;
- 逻辑聚合:模块内部的各个组成在逻辑上具有相似的处理动作,但功能用途上彼此无关;
- 过程聚合:模块内部各个组成部分所要完成的动作虽然没有关系,但必须按特定的次序执行;
- 内容耦合:一个模块需要涉及另一个模块的内部信息。
3.4 模块设计原则
- 模块化设计尽量考虑高内聚,低耦合,保持模块的相对独立性
- 模块的控制范围不在其作用范围内
- 模块的规模适中
- 模块的宽度、深度、扇入和扇出适中
3.5 架构设计
3.5.1 管道过滤器风格
- 软件架构具有良好的隐蔽性和高内聚、低耦合的特点;
- 允许设计者将整个系统的输入/输出行为看成多个过滤器的行为的简单合成;
- 支持软件重用;
- 支持并行执行;
- 允许对一些如吞吐量、死锁等属性的分析。
3.6 测试分类与阶段任务划分
3.6.1 单元测试
- 模块接口测试;
- 测试模块的输入参数和形式参数的个数、属性、单位上是否一致;
- 全局变量在各模块中的定义和用法是否一致;
- 输入是否改变了形式参数;
- 局部数据结构测试;
- 路径测试;
- 错误处理测试;
- 边界测试;
3.7 McCabe复杂度计算
McCabe度量法是一种基于程序控制流的复杂性度量方法。先画出程序图,然后采用公式V(G) = m - n + 2计算环路复杂度,其中m是图G中弧的个数,n是图G中的结点数。
3.8 软件质量保证
- 外部和内部质量
- 功能性
- 适合性
- 准确性
- 互操作性
- 安全保密性
- 功能性的依从性
- 可靠性
- 成熟型
- 容错性
- 易恢复性
- 可靠性的依从性
- 易用性
- 易理解性
- 易学性
- 易操作性
- 吸引性
- 易用性的依从性
- 效率
- 时间特性
- 资源利用性
- 效率依从性
- 维护性
- 易分析性
- 易改变性
- 稳定性
- 易测试性
- 维护性的依从性
- 可移植性
- 适应性
- 易安装性
- 共存性
- 易替换性
- 可移植性的依从性
3.9 软件过程改进
- CMM是指软件过程能力成熟度模型
- CMM1级成熟度最低,5级成熟度最高
- CMMI的任务是将已有的几个CMM模型结合在一起,使之构成“集成模型”
- CMM可以提高最终产品的质量
- CMM将软件成熟度由低到高依次划分为初始级、可重复级、定义级、管理级和优先级,其中管理级和优先级对软件过程和产品都有定量的理解与控制
四、项目管理
4.1 风险管理
- 风险避免即放弃或不进行可能带来的损失的活动或工作,这是主动风险控制方法;
- 风险监控是指在决策主体的运行过程中,对风险的发展与变化情况进行全程监督,并根据需要进行应对策略的调整。
- 风险管理是指在一个肯定有风险的环境里把风险减到最低的管理过程,风险不可消除。
4.2 其他
- 花费时间最长的就是项目计划关键路径;
- 完成项目所需的最短时间就是项目计划关键路径所花费的时间。
五、面向对象技术
5.1 面向对象的基本概念
5.1.1 多态
- 参数多态:应用广泛、最纯的多态;
- 包含多态:同样的操作可用于一个类型及其子类型。包含多态一般需要进行运行时的类型检查。包含多态在许多语言中都存在,最常见的例子就是子类型化,即一个类型是另外一个类型的子类型;
- 强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求;
- 过载多态:同一个名(操作符、函数名)在不同的上下文中有不同的类型。
5.1.2 类和对象
- 对象的组成:对象名,状态(属性),行为(操作);
- 类是对象共有属性和行为的抽象,一个类定义的对象共享行为和属性
5.2 面向对象开发各阶段划分及任务
- 面向对象分析主要强调理解问题是什么;
- 面向对象设计侧重于理解解决方案;
- 面向对象分析描述软件要做什么;
- 面向对象设计要考虑实现细节问题。
5.3 UML图的图示
- 抽象类不能直接进行实例化,所以没有直接对象,只有非直接对象;
- UML通常用于系统的词汇,简单的协作,逻辑数据库模式;
- 类图:展现一组对象、接口、协作和它们之间的关系
- 对象图:展现了一组对象以及它们之间的关系;
- 用例图:展现了一组用例、参与者以及它们之间的关系;
- 序列图:是场景的图形化表示;
- 协作图:强调收发消息的对象的结构组织;
- 交互图:序列图和协作图都是交互图,交互图展示一种交互,由一组对象和它们之间的关系组成,包括它们之间可能发送的消息;
- 状态图:展现了一个状态机,它由状态、转换、事件和活动组成;
- 活动图:是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程;
- 构件图:展现了一组构件之间的组织和依赖;
- 部署图:展现了运行处理结点以及其中的构件的配置。
5.4 UML图的定义
- 领域类模型中会涉及描述自身情况的属性和操作,描述类之关系的关联,不会存在对象层次的内容
5.5 UML图中的关系
- 关联关系:描述了一组链,链是对象之间的连接;
- 依赖关系:一件事物发生改变影响到另一个事物;
- 聚合关系:整体与部分生命周期不同的关系;
- 组合关系:整体与部分生命周期相同的关系;
5.6 设计模式的图
- 组合设计模式将对象组合成树形结构以表示”部分-整体“的层次结构,使得客户对单个对象和组合对象的使用具有一致性;
5.7 其他
5.7.1 基类中成员在派生类中的访问权限
- public继承方式:不改变基类中成员的访问权限;
- private继承方式:派生类所继承的基类成员的访问权限都改为private;
- protected继承方式:父类中private成员的访问权限不变,其余的都改为protected。
5.7.2 派生类所继承的基类成员的外部能见度(外界对基类成员的访问权限)
- 基类的private成员,只有基类的成员函数可以访问,派生类不能访问;
- 通过private方式继承的基类成员(非private成员),只有派生类的成员函数可以访问,外界以及派生类的子类都不能访问;
- 通过protected方式继承的基类成员(非private成员),只有派生类以及该派生类的子类(非private、方式产生的)可以访问,外界不能访问。
- 方法F1是基类O的private成员,虽然PQ继承该方法,但是只有基类O的内部才能访问F1;
- 方法F2在P中的访问控制为protected,所以在类P内部该方法可以被访问,而类P的对象无法访问该方法,在OQ中访问控制均为public,故类OQ的对象都可以访问该方法。
- 方法F3在OPQ的访问控制均为protected,该方法只有在3个类的内部才能被访问
六、操作系统
6.1 进程资源图
- R1与R2代表资源,P1-P3代表进程
- 从资源指向进程的箭头代表有资源分配给了进程,从进程指向资源的箭头代表进程要申请这个资源;
- 阻塞点就是从这个进程开始执行,会让程序陷入死锁,执行不了,例如上图P2就是阻塞点。
6.2 页式存储
- 分页存储管理,将内存划分为大小相等的页面,每一页物理内存叫页帧,以页为单位对内存进行编号,该编号可作为页数组的索引,又称为页帧号;
- 淘汰页面,应选择最近没被访问的页面进行淘汰;
- 页面大小为4K,按2进制,则需要12位数来表示存储空间,逻辑地址3C18H转为2进制0011 1100 0001 1000,低12位为页内地址,高4位为页号,0011,转为十进制为3,页号3对应页帧号为2。
6.3 磁盘管理
- 如果磁盘的旋转周期为33ms,每个物理块读取时间是33/11=3ms,每个记录处理时间3ms
所以R0花费时间为3+3=6ms,此时磁头在R2,如果要转到R1,从R0开始一共花费一周时间+一个记录时间=33+3=36ms,
所以总的花费时间为6ms+36*10=366ms;
如果对信息优化处理,则读取时间+处理时间 * 11 = 66,磁头刚好处于能处理的记录上,不需要等待时间。
七、知识产权与标准化
7.1 知识产权人确定
7.1.1 委托开发与合作开发
- 著作权归属由委托人和受托人通过合同约定,合同中未作明确约定的,著作权属于受托人;
7.1.2 商标权/专利权申请
- 两方对同一个专利进行申请,无法都授予专利权
八、数据库系统
8.1 数据仓库
- 遗传算法
- 初始化
- 个体评价
- 选择运算
- 交叉运算
- 变异运算
8.2 数据库设计过程
- 在数据库逻辑结构设计阶段,需要需求分析阶段形成的需求说明文档、数据字典和数据流图作为设计依据
8.3 范式判断
- 自反律:若Y属于X属于U,则X -> Y
- 增广律:若X->Y,且Z属于U,则XZ->YZ
- 传递律:X->Y Y->Z 则X->Z
- 合并规则:X -> Y, X -> Z,则X->YZ;
- 伪传递律:若X->Y, WY->Z,则XW->Z;
- 分解规则: X->Y Z属于Y,则X->Z
- 在数据库逻辑设计阶段,若实体存在多值属性,那将E-R图转为关系模式,将实体的码分别和每个多值属性独立构成一个关系模式,得到的关系模式属于4NF
8.4 数据库安全
- 索引是数据库中提高查询效率的一种机制,不能进行数据更新;
- 视图一般是提供查询数据的,具有一定安全机制,但是不能进行数据更新;
- 触发器可以作为更新机制,但是无法避免数据库的关系模式被第三方获取,不安全;
- 存储过程,可以定义代码给用户使用,避免向第三方提供系统表结构过程,体现数据库安全机制。
九、计算机网络
9.1 常见TCP/IP协议基础
- ARP和ICMP是网络层协议;
- X.25是标准的接口协议;
- SNMP是应用层协议,协议报文封装在UDP协议中传送
- TLS(Transport Layer Security Protocol),传输层安全协议,用在两个通信应用程序之间提供保密性和数据完整性,通常位于某个可靠的传输协议上
9.2 协议应用提升
- DHCP,无效的IP地址:169.254.X.X(windows),0.0.0.0(linux)
9.3 常用命令
- ping windows系列自带的一个可执行命令,用于验证与远程计算机的连接;
- tracert命令 用来显示数据包到达目的主机所经过的路径;
- arp 用来显示和修改地址解析协议(ARP)缓存中的项目。
9.4 IPV6
- 两个IPV6结点可以通过现有的IPV4网络进行通信,则使用隧道技术;
- 纯IPV6结点可以和IPV4结点通信,则使用翻译技术。
9.5 路由配置
- 对于多种不同的路由协议到一个目的地的路由信息,路由器首先根据管理距离决定相信哪一个协议;
9.6 其他
- 在ASP内置对象,response可以修改cookie值,也可创建cookie,request可以访问cookie中值;
- 三网合一是指电信网,广播电视网,互联网
十、信息安全
10.1 对称加密和非对称加密
- 典型的对称加密算法:DES,3DES,AES等
- 典型的非对称加密算法:RSA,ECC等
- 典型二点摘要算法:SHA,MD5
10.2 信息摘要与数字签名
- 数字签名是信息的发送者才能产生的,别人无法伪造的一段数字串,对信息的发送者发送信息真实性的一个有效证明,但不能验证接收者的合法性。
10.3 数字证书
- 数字证书包含发送方公钥;
- 数字签名确保消息不可否认。
10.4 计算机病毒与木马
- 木马程序通过邮件附件、程序下载等形式传播;
- 通过伪装网页登录过程,骗取用户信息进而传播;
- 通过攻击系统安全漏洞传播木马,占用系统资源,降低电脑效能,危害本机信息安全,将本机作为工具来攻击其他设备;
- Sniffer适用于拦截通过网络传输二点TCP/IP/UDPP/ICMP等数据包的一款工具,可用于分析网络应用协议,用于网络编程的调试、监控通过网络传输的数据、检测木马程序等。
10.5 防火墙技术
- DMZ是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题而设立的缓冲区,这个缓冲区位于内部网络和外部网络之间的小网络区域内。
10.6 其他网络安全控制技术
- 防火墙是位于两个(或多个)网络间,实施网络间访问控制的一组组件的集合,是一套建立在内外网络边界上的过滤封锁机制。
- 过滤掉不安全服务和非法用户
- 控制对特殊站点的访问;
- 提供监视internet安全和预警的方便端点。
- 漏洞扫描系统基于漏洞数据库,通过扫描等手段,对指定的远程或者本地计算机系统的安全脆弱性进行检测,发现可利用的漏洞的;
- 可以获取某FTP服务器中是否存在可写目录的信息;
- 入侵检测是防火墙的合理补充,帮助系统对付网络攻击,扩展系统管理员的安全管理能力(包括安全审计,监视,进攻识别和响应),提高信息安全基础结构的完整性,从计算机网络系统中的若干关键点收集信息,并分析这些信息,看网络中是否有违反安全策略的行为和遭到袭击的迹象。入侵检测被认为是防火墙过后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测、从而提供对内部攻击,外部攻击和误操作的实时保护;
- 病毒防御系统是一个用来防止黑客、病毒、木马的防御系统。
10.7 其他
- 数据的机密性(保密性):数据在传输过程中不能被非授权者偷看;
- 数据的完整性:数据在传输过程中不能被非法篡改;
- 数据的真实性(不可抵赖性):信息的发送者身份的确认或系统中有关主体的身份确认,保证信息的可信度;
- 可用性:发送者和接收者双方的通信正常。
十一、多媒体技术
11.1 其他
- 面向对象程序设计语言为面向对象实现阶段提供支持;
- 若不能得到全部顶点的拓扑序列,则说明该有向图一定包含回路;
- 一个文法定义的语言是终结符号串的集合,这些终结符号串应能从文法的起始符号出发推导出来;
- 甘特图动态地反应项目开发进展情况
- PERT/CPM/鱼骨图可用来描述项目开发的进度安排;
- 设备驱动程序是直接与硬件打交道的软件模块,设备驱动程序的任务是接受来自于设备无关的上层软件的抽象请求,进行与设备相关的处理;
- I/O设备与主机间进行数输入输出主要有直接程序控制方式、中断方式、DMA方式和通信控制方式;
- 在中断方式下、CPU需要执行程序来实现数据传送任务;
- 中断方式和DMA方式下,CPU和I/O设备都可同步工作;
- 若同时接到DMA请求和中断请求,CPU优先响应DMA请求。
十二、UML建模
- 当采用标准UML构建系统类模型(Class Model),若类B除具有类A的全部特性外,类B还可以定义新的特性以及置换类A的部分特性,那么类B与类A具有泛化关系;
- 若类A的对象维持类B对象的引用或指针,并可与类C的对象共享相同的类B的对象,那么类A和类B具有聚合关系;
十三、专业英语
13.1 语义网络
The development of the Semantic Web proceeds in steps, each step building a layer on top of another. The pragmatic justification for this approach is that it is easier to consensus achieve on small steps, whereas it is much harder to get everyone on board if too much is attempted. Usually there are several research groups moving in different directions; this competition of ideas is a major driving force for scientific progress. However, from an engineering perspective there is a need to standardize. So, if most researchers agree on certain issues and disagree on others, it makes sense to fix the points of agreement. This way, even if the more ambitious research efforts should fail, there will be at least partial positive outcomes.
Once a standard has been established, many more groups and companies will adopt it, instead of waiting to see which of the alternative research lines will be successful in the end. The nature of the Semantic Web is such that companies and single users must build tools, add content, add use that content. We cannot wait until the full Semantic Web vision materializes - it may take another ten years for it to be realized to its full extent (as envisioned today, of course).
语义网络的发展是一步一步的,每一步都建立在之前的基础之上。选择这种方法的现实理由就是因为很容易对一小步达成一致,而如果想要一步到位就难的多。通常,很多研究组织都是从不同方向考虑的,这种思想的竞争的方式是科学进步的驱动力。然而,从工程的角度来说是需要进行标准化的。因此,如果大多数研究者统一某个观点不同意另一个的时候,改正观点是有意义的,这样,即使再宏大的研究努力也会失败,可能会有局部的积极效果。
一旦一个标准被建立,许多组织和企业都会采纳,而不是等待并查看其他研究先是否会获得成果。语义网络的性质就是让企业和单个用户必须构建工具,添加内容并使用。我们不会等着整个语义网络被物化-因为实现它的全部内容需要再过十年时间(当然是按照今天所设想)。
13.2 SWIFT
There is nothing in this world constant but inconstancy. -SWIFT
Project after project designs a set of algorithms and then plunges into construction of customer-deliverable software on a schedule that demands delivery of the first thing built.
In most projecs, the first system built is barely usable, it may be too slow, too big, awkward to use, or all three. There is no alternative but to start again, smarting but smarter, and build a redesigned version in which these problems are solved. The discard and redesign may be done in one lump, or it may be done piece-by-piece. But all large-system experience shows that it will be done. Where a new system concept or new technology is used, one has to build a system to throw away, for even the best planning is not so omniscient as to get it right the first time.
The management question, therefore, is not whether to build a pilot system and throw it away. You will do that. The only question is whether to plan in advance to build a throwaway, or to promise to deliver the throwaway to customers. Seen this way, the answer is much clearer. Delivering that throwaway to customers buys time, but it does so only at the cost of agony for the user, distraction for the builders while they do the redesign, and a bad reputation for the product that best redesign will find hard to live down.
Hence plan to throw one away, you will, anyhow.
不变只是愿望,变化才是永恒。
一个接一个的软件项目都是一开始设计算法,然后将算法应用到待发布的软件中,接着根据时间进度把第一次开发的产品发布给客户。
对于大多数项目,第一个开发的系统并不适用。他可能太慢、太大、难以使用,或者三者兼有。要解决所有的问题,除了重新开始以外,没有其他的办法-即开发一个更灵巧或者更好的系统。系统的丢弃和重新设计可以一步完成,也可以一块块地实现。所有大型系统的经验都显示,这是必须完成的步骤。而且,新的系统概念或者新技术会不断出现,因此开发的系统必须被抛弃,但即使是最优秀的项目计划也不能无所不知的在最开始就解决这些问题。
因此,管理上的问题不再是“是否构建一个实验性的系统,然后抛弃它”,你必须这样做。现在的问题是“是否预先计划抛弃原型的开发,或者是否将该原型发布给用户”。从这个角度看待问题,答案更加清晰。将原型发布给用户,虽然可以获得时间,但是其代价高昂-对于用户,使用极其痛苦,对于重新开发的人员,分散了经精力,对于产品,影响了声誉,即使是最好的再设计也难以挽回名声。
因此,为舍弃而计划,无论如何,你一定要这样做。