做项目也要未雨绸缪,这就和《程序员修炼之路——从小工到专家》这本书的“曳光弹”一节类似。曳光弹,就是指做项目先大致 做个雏形,或者将一些想法付诸现实,一点一点修改,未正式的项目铺路。对于大多数项目,第一个开发的系统并不合用。它可能太慢、太大,而且难以使用,或者三者兼而有之。要解决所有的问题,除了重新开始以外,没有其他的办法——即开发一有大型系统的经验都显示,这是必须完成的步骤 。而且,新的系统概念或新技术会不断现,所以开发的系统必须被抛弃,但即使是最优秀的项目经理,也不能无所不知地在最开始解决这些问题。
作为老板也要提供尽量足够的资源和项目所要用的软硬件的设施。包括目标机器,辅助机器和数据服务。保证工具的供给充足。构建单元调试。对计划和控制职能进行适度的技术人力投资是非常值得赞赏的。它对项目的贡献方式和直接开发软件产品有很大的不同。计划和控制小组作为监督人员,明白地指出了不易察觉的延迟,并强调关键的因素。他们是早期预警系统,防止项目以一次一天的方式落后一年。
计算机程序是从人传递到机器的一些信息。为了将人的意图清晰地传达给不会说话的机器,程序采用了严格的语法和严谨的定义。但是书面的计算机程序还有其他的呈现面貌:向用户诉说自己的“故事”。即使是完全开发给自己使用的程序,这种沟通仍然是必要的。不同用户需要不同级别的文档。某些用户仅仅偶尔使用程序,有些用户必须依赖程序,还有一些用户必须根据环境和目的的变动对程序进行修改。
使用程序。每个用户都需要一段对程序进行描述的文字。可是大多数文档只提供了很少的总结性内容,无法达到用户要求,就像是描绘了树木,形容了树叶,但却没有一副森林的图案。为了得到一份有用的文字描述,就必须放慢脚步,稳妥地进行。
1. 目的。主要的功能是什么?开发程序的原因是什么?
2. 环境。程序运行在什么样的机器、硬件配置和操作系统上?
3. 范围。输入的有效范围是什么?允许显示的合法范围是什么?
4. 实现功能和使用的算法。精确地阐述它做了什么。
5. 输入-输出格式。必须是确切和完整的。
6. 操作指令。包括控制台及输出内容中正常和异常结束的行为。
7. 选项。用户的功能选项有哪些?如何在选项之间进行挑选?
8. 运行时间。在指定的配置下,解决特定规模问题所需要的时间?
9. 精度和校验。期望结果的精确程度?如何进行精度的检测?
一般来说,三、四页纸常常就可以容纳以上所有的信息。不过往往需要特别注意的是表达的简洁和精确。由于它包含了和软件相关的基本决策,所以这份文档的绝大部分需要在程序编制之前书写。
验证程序。除了程序的使用方法,还必须附带一些程序正确运行的证明,即测试用例。每一份发布的程序拷贝应该包括一些可以例行运行的小测试用例,为用户提供信心——他拥有了一份可信赖的拷贝,并且正确地安装到了机器上。然后,需要得到更加全面的测试用例,在程序修改之后,进行常规运行。这些用例可以根据输入数据的范围划分成三个部分。
1. 针对遇到的大多数常规数据和程序主要功能进行测试的用例。它们是测试用例的主要组成部分。
2. 数量相对较少的合法数据测试用例,对输入数据范围边界进行检查,确保最大可能值、最小可能值和其他有效特殊数据可以正常工作。
3. 数量相对较少的非法数据测试用例,在边界外检查数据范围边界,确保无效的输入能有正确的数据诊断提示。
修改程序。调整程序或者修复程序需要更多的信息。显然,这要求了解全部的细节,并且这些细节已经记录在注释良好的列表中。和一般用户一样,修改者迫切需要一份清晰明
了的概述,不过这一次是关于系统的内部结构。那么这份概述的组成部分是什么呢?
1. 流程图或子系统的结构图,对此以下有更详细的论述。
2. 对所用算法的完整描述,或者是对文档中类似描述的引用。
3. 对所有文件规划的解释。
4. 数据流的概要描述——从磁盘或者磁带中,获取数据或程序处理的序列——以及在每个处理过程完成的操作。
5. 初始设计中,对已预见修改的讨论;特性、功能回调的位置以及出口;原作者对可能会扩充的地方以及可能处理方案的一些意见。另外,对隐藏缺陷的观察也同样很有价值。
把文档整合到源代码。这对正确维护是直接有力的推动,保证编程用户能方便、即时地得到文档资料。这种程序被称为自文档化。自文档化方法激发了高级语言的使用,特别是用于在线系统的高级语言——无论是对批处理还是交互式,它都表现出最强的功效和应用的理由。如同我曾经提到的,上述语言和系统强有力地帮助了编程人员。因为是机器为人服务,而不是人为机器服务。因此从各个方面而言,无论是从经济上还是从以人为本的角度来说,它们的应用都是非常合情合理的。
作者建议的软件必要步骤:
? 仔细地进行市场调研,避免开发已上市的产品。
? 在获取和制订软件需求时,将快速原型开发作为迭代计划的一部分。
? 有机地更新软件,随着系统的运行、使用和测试,逐渐添加越来越多的功能。
? 不断挑选和培养杰出的概念设计人员。