继续阅读了剩余的章节,《人月神话》是计算机领域的圣经。后续部分主要阐述了大型编程项目的工作量估算、影响因素有哪些?技术积累标准组件库的重要性,程序和文档的同等重要性,文档的提纲挈领作用,并引入了PERT图做好进度及关键路径细化;最后引出了近些年软件开发无论从技术还是管理方面都没有突破性进展(即没有银弹)的结论,后续分析了软件开发的根本任务和根本困难、次要任务和次要困难,并围绕这些困难问题详细分析目前的改进情况和未来有可能成为银弹的一些方式方法等。其实,这些年做过大量的软件系统建设,有管理类的,有专业类的软件开发,正如书中所言,任何软件系统都具有复杂性、一致性、可变性和不可见性,以及软件开发本身就是人类创造性的建设过程,导致软件系统的设计、开发、实施运营过程要比其他类型的项目建设复杂的多得多,需要我们不断的经过大量的实践再实践,也就是说软件系统应该是人类创造中最错综复杂的事物,软件工程的焦油坑在未来很长一段时间内还会存在,需要我们共同努力寻找银弹。以下是摘自书中的一些金句,值得我们在工作过程中参考与改进。
1、在大型编程项目中,要想做到胸有成竹,需要大量的实践,实践是最好的老师。
2、软件开发工作量=常数*指令数量的1.5次幂,也就是说,工作量是规模的幂指数,工作量随规模的变大急速增长;关于项目的进度安排占比,推荐做法:1/3计划调研,1/6编码,1/4构件测试和1/4系统集成测试。
3、对于软件程序的成本控制来说,除去考虑时间因素,还要考虑空间因素,因此规模控制既是一项技术工作,也是一项管理工作;在大型编程项目实践中,系统结构师要确保连贯的系统完整性,从系统整体和面向用户的态度出发设计系统及开展项目,设计人员决定用户可选项目的粗细程度,开发人员做好良好的空间-时间折中方案。
4、编程需要技术积累,每个公司、组织或项目都需要有自己的标准组件库,如队列、搜索、散列和排序例程或类库等。
5、一般来说,编程战略上的突破常来自于数据或表的重要表达,数据的表现形式是编程的核心或根本,之后才是算法。
6、软件项目中的文档是项目运行的关键枢纽,起到提纲挈领的作用,文档包括目的、用户手册、内部文档、进度、预算、组织机构图和工作空间分配。正式的文档可以作为工具记录内容、指明方向、交流沟通,甚至作为数据基础和检查列表,保持建设过程内容的一致性和检查项目的运行状态等。
7、大型编程项目要借鉴化学工程师的实验室平台-》试验工厂-》实际生产环境,利用试验场提高质量和取得经验。开发人员最终交付的是用户满意程度,部署实际产品,产品只是措施媒介,同时编程项目建设过程中唯一不变的是变化本身,用户实际需求和感受会随着程序的构建、测试和使用而变化,这就促使软件开发人员做好准备迎接目标的变化,为变更做好相应的设计系统(如细致的模块化、可扩展函数、精准的接口设计与完备文档、高级语言使用,良好的数字化版本控制等),为变更做好组织架构,组建良好的技术和管理团队,形成相应的技术管理晋升路线,外科手术队伍就是一种灵活的组织架构模式,也是长期有效的解决方案;程序在提交给用户使用后就进入程序或软件维护(即运维阶段),与硬件维护不同,软件维护主要是对设计缺陷的修复,包括更多的新增功能等,不包括硬件维护中的清洁、润滑或对损坏器件的修复等,大约占软件开发总成本的40%,一般来说,软件开发是减少混乱度(减少熵)的过程,软件维护是提高混乱度(增加熵)的过程,只是软件维护放缓了系统退化到非稳态的进程。
8、软件开发的体系结构工作不但使得产品更加容易使用,形成了产品的概念完整性,而且使得开发更容易进行并且减少bug的形成;目前自上而下的设计是最重要的新型形式化软件开发方法,再结合结构化编程、面向对象编程和测试规格说明,不断的精化每一项任务,从而避免了四个方面的bug(清晰结构表达对需求进行精确描述;模块独立性避免系统级bug;细节抑制容易识别结构缺陷;每个精化步骤级别合适并具备可测试性)。
9、大部分项目的滞后是由一天天的微小落后导致的,要建立一个进度表控制大型项目,进度表上的每一件事情被称为里程碑,好的里程碑对团队来说是一项服务,而不是沉重的负担,里程碑具备清晰的、具体的、特定的和可度量的特点,同时进取心是每个软件开发团队的必要品德,如果大型项目中的每个团队都有进取心,就不存在关键路径进度问题或整个项目滞后问题,进取提供了缓冲和储备。
10、PERT技术是关键路径计划的细化,PERT图中最有价值的部分是PERT的准备工作,包括整个网状结构的展开、任务之间依赖关系的识别和各个任务链的估计,这些都需要在早期进行非常专业的计划,而且PERT图是不断迭代更新的,大型项目需要建立计划控制小组(1-3人),负责关注PERT图的更新、修订和报告,主要处理文字工作,形成早期的预警系统,同时要采取评审机制来了解项目的里程碑进度和完成文档进度情况。
11、对于软件编程产品来说,程序和文档同样重要,程序源码是提供给机器识别的内容,文档是程序提供给用户呈现的面貌,程序的注释说明同样重要,很多项目的失败是由于没能正确有效和经济地编制文档造成的,大多数关键的用户文档是在程序编制之前完成的,包括目的、环境、范围、实现功能和使用的算法、输入-输出格式、操作指令、选项、运行时间、精度和校验等9项内容。
12、流程图是被吹捧得最过的一种程序文档,流程图是图形化的高级语言,随着高级语言的发展,未来自文档化的程序是主流,相当于将文档整合到源程序中,文档是通过程序结构、命名和格式来实现的,特别是用于在线系统的高级语言。
最后,书中提到软件开发没有银弹,即在未来的十年内,无论是技术还是管理方法上,都看不出有任何突破性的进步,能够保证在十年内大幅度地提高软件的生产率、可靠性和简洁性。
支撑内容如下:
软件活动的根本任务:打造构成抽象软件实体的复杂概念结构,这是主要关注的地方。
软件活动的次要任务:使用编程语言表达这些抽象实体,在空间和时间限制下将他们映射成机器语言。这是近些年来软件生产率取得巨大进步的地方。
软件开发的根本困难:一个相互牵制关联的概念结构,困难部分是规格说明、设计和测试这些概念上的结构。
软件开发额次要困难:对这些概念进行表达和对实现逼真程度进行验证,以及一些语法错误等。
软件系统的内在特性:复杂性、一致性、可变性和不可见性。
目前,在软件开发的次要困难方面有了一些突破,包括高级语言的使用、分时技术,以及统一的编程环境。
未来,希望继续解决次要困难的先进技术或可能成为银弹的技术有Ada或其他高级语言的现代设计与模块化概念的运用、面向对象编程、人工智能、专家系统,自动编程、图形化编程、程序验证、环境和工具、工作站等。
针对概念结构的根本困难问题,未来颇具前途的方法如下:
1)购买和自行开发:要评估好长期的开发成本和购买成本哪个合适,重大变化是硬件/软件成本比率,目前硬件在下降,软件基本免费才行,通用的工具包括书写、作图、文件管理、电子表格、email等;通用软件包包括数据统计包和简单编程能力。
2)需求精炼和快速原型:要形成详细的技术需求,包括人机界面和接口,并且不断的重复抽取和细化产品需求,一般来说,复杂的软件系统是活动的、变化的系统,前期要让客户和设计人员开展多轮次的交流沟通,通过快速原型化方法对重要界面和接口进行模拟仿真,主要展示应用的功能主线,明确实际的概念结构,是客户测试其一致性和可用性。
3)增量开发---增长,而非搭建系统。增量式开发是一种自上而下增长的软件开发方法,使得逆向跟踪方便,非常容易进行原型开发,这种开发模式对士气的推动令人震惊。
4)卓越的设计人员:人员作为软件设计的核心,非常重要,而且优秀的设计是可以传承传授的,从低劣到良好设计需要设计方法的完善,从良好到卓越需要卓越人才,需要孕育或激发创造性过程。对于软件机构来说,杰出的的设计人员和卓越的管理人员同样重要,而且杰出的设计人才更难培养,如何培养呢,具体步骤如下:尽早识别出顶级设计人员、为他们配备职业导师并规划其职业生涯、制定和维护一份职业计划进行设计和技术领导能力培养、为设计人员提供相互交流和激励的机会。