1,软件创建
创建活动主要指编码和调试过程。主要包括:
· 问题定义
· 需求分析
· 实现计划
· 总体设计
· 详细设计
· 创建即实现
· 系统集成
· 单元测试
· 系统测试
· 校正性的维护
· 功能强化
先决条件:
问题定义
需求分析
结构设计
选择编程语言
编程约定
2,子程序
程序设计语言(PDL)
设计、编码、检查
高质量子程序:
恰当的命名
强内聚
松耦合
合适的长度
防错性编程
较少的参数
· 建立子程序的最重要原因是加强可管理性(即降低复杂性),其它原因还有节省空间、改进正确性、可靠性、可修改性等等。
· 强调强内聚性和松散耦合的首要原因是它们提供了较高层次的抽象性,你可以认为一个具备这种特性的子程序运行是独立的,这可以使你集中精力完成其它任务。
· 有些情况下,放入子程序而带来巨大收益的操作可能是非常简单的。
· 子程序的名称表明了它的质量,如果名称不好但却是精确的,那么说明它的设计也是非常令人遗憾的。如果一个子程序的名称既不好又不精确,那它根本就无法告诉你程序作了些什么。无论哪种情况,都说明程序需要改进。
· 防错性编程可以使错误更容易被发现和修复,对最终软件的危害性显著减小。
3,模块化设计
“模块化”同时涉及到子程序设计和模块设计。这是一种值得研究的,非常有用的思想方法。
模块的内聚与耦合
信息隐蔽
· 不管调用哪一个,子程序与模块的不同是很重要的,要认真考虑子程序与模块的设计。
· 从模块数据是被几个子程序使用的这一角度来说,它与全局数据是相同的,但从可以使用它的子程序是有限的,而且清楚地知道是哪些子程序可以使用它这一角度来说,模块数据与全局数据又是不同的。因此,可以使用模块数据而没有全局数据的危险。
· 信息隐蔽总是有益的。其结果是可以产生可靠的易于改进的系统,它也是目前流行的设计方法的核心。
· 创建模块的原因有许多是与创建子程序相同的。但模块概念的意义要比子程序深远得多,因为它可以提供一整套而不是单独一个功能,因此,它是比子程序更高层次的设计工具。
· 可以在任何语言中进行模块设计。如果所采用的语言不直接支持模块,可以用编程约定对其加以扩展,以达到某种程度的模块化。
4,结构设计
设计的层次:
划分成子系统
划分成模块
划分成子程序
子程序内部设计
受迎的设计特点:
智力上的可管理性
低复杂性
维护的方便性
最小的联系性
可扩充性
可重复使用性
高扇入
低或中等程度扇出
可移植性
简练性
成层设计
标准化技求
· 设计是一个启发的过程。 固执地坚持某一种方法只会抑制创造力,从而产生低质量的程序。坚持设计方法上有一些不屈不挠的精神是有益的,因为这可以迫使你对这种方法进行充分理解。但是,一定要确信你是在不屈不挠而不是顽固不化。
· 好的设计是通过迭代逼近得到的:你尝试过的设计方案越多,你最终所确定的设计方案也越好。
· 结构化设计比较适合于小规模的子程序组合,同时,它对于功能变化可能性比数据大的问题也是较适用的。
· 面向对象设计更适于子程序与数据的组合,通常在比结构化设计抽象程度更高些的层次上适用。它尤其适合于数据变动可能性大于功能变动可能性的问题。
· 设计方法仅是一种工具,你对工具运用得好坏决定了你所设计的程序的质量。利用不好的设计方法,也可能设计出高质量的程序。而即使是好的方法,如果运用不当的话,也只能设计出拙劣的程序。但不管怎样,选择正确的工具更容易设计出高质量的软件。
· 许多关于设计的丰富而有用的信息都是在本书之外的。在这里所论述的,不过是冰山的一角而已。
5,数据
· 在你的工具箱中需要一张全部数据结构的清单,以便用最合适的方法处理每一种问题。
· 建立自己的数据类型,以增加程序的可变动性,并使其成为自说明的。
· 数据初始化很容易产生错误,因此应采用本章推荐的技术来避免由意外初始值所产生的错误。
命名:
· 恰当的变量名是可读性好的必要条件之一。特殊的变量如循环变量和状态变量要予以特殊考虑。
· 命名约定可以区分局部、模块和全局变量。同时它还可以区分类型名称,比如可以对命名常量、枚举类型和变量加以区分。
· 不管你从事的是哪种项目,都应该采用命名约定。所采用的命名约定取决于程序的规模和从事这一程序的程序员的人数。
· 匈牙利约定是一种非常有效的命名约定,比较适于大规模项目和程序。
· 在现代编程语言中几乎不需要采用缩写技术。
6,基础代码结构
变量
基本数据类型
复杂数据类型
顺序程序语句
条件语句
循环语句
控制结构
布局和风格
7,单元测试
单元测试——对单个子程序和模块而不是对整个系统的测试。
单元测试的一般方法:
· 对每个需求进行测试,以便确保需求得到实现。在需求阶段上计划测试或尽量使测试早一些——在你编写单元测试前。你应考虑测试对需求的遗漏。安全性、存储、安装程序、系统可靠性都是测试的对象,并且在需求分析时它们都易被疏忽。
· 对和设计有关的程序进行测试以确保设计得到了实现。在设计阶段尽早计划测试——在你开始进行子程序的详细编码工作之前测试。
· 在详细测试的基础上对需求和设计测试增加基本测试。使用数据流测试和其它测试方法仔细检查你的代码。从最低限度来说,你应对每行代码进行测试。下节将讨论基本测试和数据流测试。
8,调试与调整
调试并不是提高软件质量的一种方法。它只用于改正错误。
科学调试方法:
1.通过重复实验收集数据
2.建立假设以解释尽可能多的相关数据
3.设计实验以便证实或否定假设
4.证实或否定假设
5.按要求重复以上步骤
以上过程和调试有着对应的关系。以下是发现错误的有效方法:
1.固定错误
2.确定错误源
3.改正错误
4.测试修改
5.寻找类似错误
· 注意你的编译警告信息,并及时改正编译所提示的错误。如果你忽略了明显错误的话,你就难以改正微妙的错误。
代码调整方法:
1 用高度模块化设计开发软件,这样易于理解,修改。
2 如果性能很差,测量系统,找出频繁执行位置。
3 判断性能的弱点是否是由不合格的设计数据结构算法引起的,判断代码调整是否合适;如果代码调整不合适,返回步骤1。
4 调整步骤3中识别出来的系统中的薄弱环节,测量每一个改进,如果它不能提高系统性能就放弃重来。
5 重复步骤2。
9,个人性格
编程工作极强的内部特点使得个人特点异常重要。,在程序员成为高级程序员的过程中,性格是更有决定意义的因素。
聪明和谦虚
好奇心
诚实
交流和合作
创造力和纪律
懒惰
· 你的个人性格直接影响你编写计算机程序的能力。
· 最有明显作用的性格为:谦虚、好奇心、诚实、创造性和纪律,还有文明的“懒惰”。
· 高级程序员的发展和生成与天才并无多大联系,任何事情都和个人的发展有关。
· 令人吃惊的是,小聪明、经验、坚持和欲望既可帮助你也能妨碍你。
· 许多程序员不主动去吸收新信息和新技术,而是靠偶然地上获得一些新信息,如果你抽出少量时间学习别人的编程经验,过一段时间后,你将在你的同行中脱颖而出。
· 好的性格对养成良好习惯有很大影响。为了成为一位高水平的程序员,你应养成良好的习惯,其余的就会随之而来。
读书心得:
一本十分经典的书。概念性的东西太多,不容易看懂。虽经典,但看完也没觉得有多大收获。了解了软件创建是怎么一回事,都有哪些工作。对子程序、模块、高级结构、数据等的设计,有了更好的理解。对基本代码结构可能较为熟悉了,就没什么看点了。单元测试是个好东西,可惜目前都还没在项目中用过,以后有机会再细细研究吧。个人性格确实对编程有极大的影响,从这些年的工作中深有体会,特别是交流和合作。唯有良好的习惯,才能成为优秀的程序员。