转载地址:http://www.cnblogs.com/lishiyun19/p/4443002.html
很多人,包括计算机科班出身的同学,在关于软件工程项目的开发与维护的问题上,或多或少的有着一些错误的认识。学习软件工程的基础知识,对提高软件开发效率、节省软件开发成本和提高软件的可维护性,具有非常重要的意义。
一、软件危机与软件工程
在 1968 年的时候由北约组织召集了一大批科学家们为解决"软件危机"这一难题的会议上,首次提出了软件工程 Software Engineering 这一概念。但是,一直以来,关于什么是软件工程缺乏一个统一有效的定义。那么,为了解释清楚什么是软件工程,我们必须要了解,什么又是软件危机呢?通常,我们把计算机软件在开发与维护过程中所遇到的一系列问题,统称为软件危机。简单的说,软件危机主要包含以下两个方面:
1.如何高效的开发软件;
2.如何有效的维护现有软件;
也就是说,软件危机贯穿于软件的整个生命过程,而这些问题绝不仅仅是不能正常运行和维护的软件所具备的,几乎所有的软件都不同程度的存在软件危机的问题。那么问题来了,什么样的原因导致了软件危机?
客观的说,由于软件是计算机系统中的逻辑部件,而不是物理部件,在一定程度上缺乏可预见性,管理和控制开发、维护过程相当的困难;此外,软件通常具有规模庞大的特点,软件的规模随着程序的复杂性成指数级的往上增长,大大增加了开发和维护的难度。
主观的说,在软件开发过程中,由于工程师们的水平良莠不齐,工程项目的时间又往往相对漫长,那么就会造成如下几个问题:
1)忽视软件需求分析的重要性,或者甚至错误的认知了软件的需求,造成了开发过程中的人力、物力和资源的浪费;
2)忽视了软件开发数据和文档的建设,造成软件项目完成后,面对几十万行甚至更多的代码,完全无法有效的进行调试和维护;
3)由于软件设计的方法不科学,导致了大量的软件代码冗余和耦合,给后期的维护带来了极大的麻烦;
综上所述,为了能够从主观和客观两个方面的因素消除或者说尽量减少软件危机带来的不确定性,我们既要采用科学的方法和工具,又要掌握合理的管理和组织开发团队的能力,因此,软件工程正是从技术和管理这两个方面去研究和指导如何能够更好的开发和维护软件的一门工程学科,这里可以参考下维基百科对软件工程的定义。
二、软件生命周期
在软件工程诞生的这半个多世纪里,通过几代科学家和优秀工程技术人员的努力探索和总结,形成了一套行之有效的软件开发和维护模式,概括的说,软件生命周期由软件定义、软件开发和运行维护这三大阶段组成,而每一个阶段又可以细分为几个小的阶段,如下图所示:
问题定义:占据整个软件项目 5% 左右的时间,定义所有要解决的问题;
可行性研究:占据整个软件项目 5%~10% 左右的时间,确定问题是否值得解决,并为后续的任务提供建议;
需求分析:占据整个软件项目 5%~10% 左右的时间,确定软件系统必须完成的工作;
总体设计:占据整个软件项目 10%~15% 左右的时间;
详细设计:占据整个软件项目 10%~15% 左右的时间;
编码和单元测试:占据整个软件项目 20%~25% 左右的时间,编写代码和单元测试;
综合测试:占据整个软件项目 30%~40% 左右的时间;
运行和维护:主要是软件交付使用后的维护工作;
三、软件工程方法学
通常,我们把在软件生命周期整个过程中使用的一整套技术方法的集合,称为软件工程方法学,主要包括 3 个要素:方法、工具和过程。
方法:是指完成软件开发过程中的各项任务的技术方法,主要阐述了"怎样做"的问题;
工具:是指是为了运用方法而提供自动的或者半自动的软件工程支撑环境;
过程:是指为了获得高质量软件所需完成的一系列的任务和框架,规定了完成各个任务的工作步骤,主要解答了"何时做"的问题;
目前,使用的最广泛的软件工程方法学主要是结构化方法学和面向对象方法学。
1>结构化方法学的主要特点:
采用结构化技术来完成软件开发的各项任务;
把软件生命周期划分为若干个阶段,然后顺序完成各阶段的任务;
每个阶段的开始和结束都有着严格的标准,对于任何两个相邻的阶段而言,前一阶段的结束标准就是后一阶段的开始标准;
在每个阶段结束之前都必须正式地进行严格的技术审查和管理复审;
2>面向对象方法学的主要特点:
把对象作为融合了数据及在数据上操作的软件构件,也就是说用对象分解取代了结构化方法的功能分解;
把所有的对象都划分成类;
按照父类与子类的关系,把若干个相关类组织成一个层次结构的系统;
对象彼此间仅能通过发送消息互相联系;
四、总结
总的来说,软件工程是一门交叉学科,是将计算机科学、数学、工程学和管理学等基本原理应用于软件的开发与维护中,以软件方法和技术为核心,重点对大型软件进行分析与评价、规格说明、设计和演化,同时涉及管理、质量、创新、标准、个人技能、团队协作和专业实践。在软件开发项目中不仅涉及了组织和应用软件系统的配置和部署所面临的实际问题,同时又必须不断促进和实践的理论知识的创新。为了真正解决实际问题,必然需要在理论和应用上获得最佳平衡。