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