实践是最好的老师,但如果不能从中学习,再多的实践也没用。
巧匠因工具而出名
程序 -> 编程系统(接口系统集成) -> 编程系统产品
程序 -> 编程产品(通用化,测试,文档,维护)-> 编程系统产品
要想成为通用的编程产品,程序必须按照普遍认可的风格来编写,特别是输入的范围和形式必须扩展,以适用于所有可以合理使用的基本算法。接着,对程序进行彻底测试,确保它的稳定性和可靠性,使其值得信赖。这就意味着必须准备、运行和记录详细的测试用例库,用来检查输入的边界和范围。此外,要将程序提升为程序产品,还需要有完备的文档,每个人都可以加以使用,修复和扩展。经验数据表明,相同功能的编程产品的成本,至少是已经过测试的程序的三倍。
软件任务的进度安排:
1/3 计划
1/6 编码
1/4 构件测试和早期系统测试
1/4 系统测试,所有的构件已完成
在许多重要的方面,它与传统的进度安排方法不同:
分配给计划的时间比寻常的多。即便如此,仍不足以产生详细和稳定的计划规格说明,也不足以容纳对全新技术的研究和摸索。
对所完成代码的调试和测试,投入近一半的时间,比平常的安排多很多。
容易估计的部分,即编码,仅仅分配了六分之一时间。
允许充分的系统测试时间是非常重要的。
向进度落后的项目中增加人手,只会使进度更加落后。一拥而上的开发方法是高成本的、速度缓慢的、不充分的、开发出的是无法在概念上进行集成的产品。创造性活动包括了三个独立的阶段:体系结构、设计实现、物理实现。
结构师:
牢记是开发人员承担创造性和发明性的实现责任,所以结构师只能建议,而不能支配。
时刻准备着为所指定的说明建议一种实现的方法,同样准备接受其他任何能达到目标的方法
对上述的建议保持低调和平静
准备方法坚持所作的改进建议
一般开发人员会反对体系结构上的修改建议,通常他是对的 = 当正在实现产品时,某些特性的修改会造成意料不到的成本开销。
文档说明形式应当包括:
形式化
记叙性定义
如果同时具有两种方式,则必须以一种作为标准,另一种作为辅助描述,并照此明确地进行划分。
好的项目先决条件应该包括:
清晰的目标
充足的人力
丰富的材料
足够的时间
足够的技术
交流
组织
树状编程队伍,每颗子树所必须具备的基本要素:
任务
产品负责人
技术主管和结构师
进度
人力的划分
各部分之间的接口定义
对需求使用合适的编程语言
规模控制:
和制定驻留空间一样,应该制订总体规模的预算;和制订规模预算一样,应该制订后台储存访问的预算。
在指明模块有多大的同时,确切定义模块的功能。
空间技能:
功能交换尺寸
空间交换时间
文档
计算机产品的文档
目标
技术说明
进度、时间表
预算
组织机构图
报价、预测、价格
大学科系的文档
目标
课程描述
学位要求
研究报告
课程表和课程的安排
预算
教室分配
教师和研究生助手的分配
软件项目的文档
做什么
时间:进度表
资金:预算
地点:工作空间的分配
人员:组织图
拥抱变化
随着学习的过程更改设计
系统软件开发时减少混乱度的过程,本身处于亚稳态。
软件维护是提高混乱度的过程,即使是熟练的软件维护工作,也只是放缓了系统退化到非稳态的进程。
需要什么样的文档
使用程序
目的
环境
范围
实现功能和使用的算法
输入输出可是
操作指令
选项
运行时间
精度和校验
这份文档的绝大部分需要在程序编制之前书写
软件任务中的必要活动
仔细的进行市场调研,避免开发已上市的产品
在获取和制订软件需求时,将快速原型开发作为迭代计划的一部分
有机地更新软件,随着系统的运行、使用和测试,逐渐添加越来越多的功能。
不断挑选和培养杰出的概念设计人才。
如何培养出杰出的设计人才:
尽可能早地、有系统地识别顶级的设计人员,最好的通常不是那些最有经验的人员。
为设计人员指派一位职业导师,负责他们技术方面的成长,仔细地为他们规划职业生涯。
为每个方面制订和维护一份职业计划,包括与设计大师的、经过仔细挑选的学习过程,正式的高级教育和以及短期的课程 - 所有这些都穿插在设计和技术领导能力的培养安排中
为成长中的设计人员提供相互交流和学习的机会。
软件系统:
层次化,通过分层的模块或者对象。
增量化,从而系统可以持续地运行。
再论面向对象编程:
模块化和清晰的接口
封装,即外界无法看到组件内部结构
继承和层次化类结构以及虚函数
强抽象数据类型化
软件开发瀑布模型
计划->编码->单元测试->系统测试->现场支持
应当在项目早期添加额外的人力只能根据过去判断将来,然而永远无法根据过去规划将来。
做人要谦逊
学有所成,学有所用。
领取专属 10元无门槛券
私享最新 技术干货