软件工程
一,概述
现在,“计算机程序设计”这个名词对不同的人可能有着不同的含义。在很多时候,我们会很直接地想到利用各种语言来书写程序。但是在另外一些时候,我们会将软件工程中的各个活动,比如需求分析,软件的设计,代码编写,测试,甚至维护都用“程序设计”这样一个词来统称。
在现代社会中,一个“软件”通常是由一系列的文件和程序构成的,而实际上人们往往把“软件”和“程序”混合的交替使用。而关于如何“生产”一个有效,稳定,实用,切合用户需求的软件的方法就是“软件工程”。通常意义上,我们可以把软件工程划分为以下几个部分:
系统需求
软件架构
软件的构建
软件测试
软件维护
配置管理
软件项目管理
软件开发过程
软件工程和方法
10. 品质保证
是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。软件工程涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。软件工程力图对软件项目的各个方面作出指导,从软件的可行性分析直到软件完成以后的维护工作。软件工程认为软件开发与各种市场活动密切相关。比如软件的销售,用户培训,与之相关的软件和硬件安装等。软件工程的方法学认为一个独立的程序员不应当脱离团队而进行开发,同时程序的编写不能够脱离软件的需求,设计,以及客户的利益。
由于软件的开发兼有科学(计算机科学)和工程学(软件工程)的特点,所以软件工程师必须具备计算机科学和信息科学的理论基础。
软件工程与计算机科学:差异对比
软件工程 |
计算机科学 |
|
目标 |
在时间、资源、人员这3个主要限制条件下构建满足用户需求的软件系统 |
探索正确的计算和建模方法,从而改进计算方法本身 |
产品 |
软件(比如办公套件和编译器) |
算法(比如希尔排序法)和抽象的问题(比如哲学家进餐问题) |
进度和时间表 |
软件项目都有特定的进度和时间表 |
研究项目一般不具有设定的进度和时间表 |
关注点 |
软件工程关注如何为用户实现价值 |
软件理论关注的是软件本身运行的原理,比如时间复杂度,空间复杂度,和算法的正确性。 |
变化程度 |
随着技术和用户需求的不断变化,软件开发人员必须时刻调整自己的开发以适应当前的需求。同时软件工程本身也处于不断的发展中。 |
对于某一种特定问题的正确解决方法将永远不会改变 |
需要的其他知识 |
相关领域的知识 |
数学 |
著名的探索者和教育家 |
Barry Boehm, David Parnas, and Frederick P。 Brooks |
Edsger Dijkstra, 高德纳, Robert Tarjan, Peter Slater, and 艾伦·图灵 |
著名的实践者 |
John Backus, Dan Bricklin, Tim Berners-Lee, 林纳斯·托瓦兹, 理查德·马修·斯托曼 |
无 |
二,历史起源
1,软件危机:20世纪60到80年代出现了软件危机,很多的软件项目开发时间大大超出了规划的时间表,一些项目导致了财产的流失(如欧洲阿里亚娜火箭的爆炸),甚至某些软件导致了人员伤亡(如医用[http://courses.cs.vt.edu/~cs3604/lib/Therac_25/Therac_1.html Therac-25软件]产生错误剂量导致医疗事故)。同时软件开发人员也发现软件开发的难度越来越大。
OS 360操作系统被认为是一个典型的案例。到现在为止,它仍然被使用在IBM360系列主机中。这个经历了数十年,极度复杂的软件项目甚至产生了一套不包括在原始设计方案之中的工作系统。OS 360是第一个超大型的软件项目,它使用了1000人左右的程序员。Fred Brooks在随后他的大作《人月神话》(The Mythical Man-Month)中曾经承认,在他管理这个项目的时候,他犯了一个价值数百万美元的错误。
2, 银弹与没有银弹:从软件危机被提出以来。人们一直在寻找解决它的方法。于是一系列的方法被提出并且加以应用。比如结构化的程序设计,面向对象的开发,CMM,UML等等。
在1986年,IBM大型电脑之父Fred Brooks发表了他的着名论文《没有银弹》(No Silver Bullet:Essence and Accidents of Software Engineering)。
在这篇着名的论文中他断言:“在10年内无法找到解决软件危机的银弹”(There will be no silver bullet within ten years)。 这篇论文在其后引起了巨大的反响。关于这本论文及其引起的反响,可以参考银弹与没有银弹。
Fred Brooks的着名作品还有《人月神话》
三,软件工程方法学
软件工程的方法有很多方面的意义。包括项目管理,分析,设计,程序的编写,测试和质量控制。
软件设计方法可以区别为重量级的方法和轻量级的方法。重量级的方法中产生大量的正式文档。
着名的重量级开发方法包括ISO 9000,CMM,和统一软件开发过程(RUP)。
轻量级的开发过过程没有对大量正式文档的要求。着名的轻量级开发方法包括极限编程(XP)和敏捷流程(Agile Processes)。
根据《新方法学》这篇文章的说法,重量级方法呈现的是一种“防御型”的姿态。在应用“重量级方法”的软件组织中,由于软件项目经理不参与或者很少参与程序设计,无法从细节上把握项目进度,因而会对项目产生“恐惧感”,不得不要求程序员不断撰写很多“软件开发文档”。而轻量级方法则呈现“进攻型”的姿态,这一点从XP方法特别强调的四个准则—“沟通、简单、反馈和勇气”上有所体现。目前有一些人认为,“重量级方法”适合于大型的软件团队(数十人以上)使用,而“轻量级方法”适合小型的软件团队(几人、十几人)使用。当然,关于重量级方法和轻量级方法的优劣存在很多争论,而各种方法也在不断进化中。
一些方法论者认为人们在开发中应当严格遵循并且实施这些方法。但是一些人并不具有实施这些方法的条件。实际上,采用何种方法开发软件取决于很多因素,同时受到环境的制约。
四,软件开发过程
软件开发过程是随着开发技术的演化而随之改进的。从早期的瀑布式(Waterfall)的开发模型到后来出现的螺旋式的迭代(Spiral)开发,以致最近开始兴起的敏捷开发方法(Agile),他们展示出了在不同的时代软件产业对于开发过程的不同的认识,以及对于不同类型项目的理解方法。
注意区分软件开发过程和软件过程改进之间的重要区别。诸如像ISO 15504, ISO 9000, CMM, CMMI这样的名词阐述的是一些软件过程改进框架,他们提供了一系列的标准和策略来指导软件组织如何提升软件开发过程的质量、软件组织的能力,而不是给出具体的开发过程的定义。
五,软件工程的发展方向
“敏捷开发”(Agile Development)被认为是软件工程的一个重要的发展。它强调软件开发应当是能够对未来可能出现的变化和不确定性作出全面反应的。
敏捷开发被认为是一种“轻量级”的方法。在轻量级方法中最负盛名的应该是“极限编程”(Extreme Programming,简称为XP)。而与轻量级方法相对应的是“重量级方法”的存在。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方法的例子比如CMM/PSP/TSP。
面向方面的编程(Aspect Oriented Programming,简称AOP)被认为是近年来软件工程的另外一个重要发展。这里的方面指的是完成一个功能的对象和函数的集合。在这一方面相关的内容有泛型编程(Generic Programming)和模板。
参见
软件开发技术名词的解密篇 软件工程(SE,Software engineering,Software Development)是把计算机科学,项目管理,工程学,应用域等技术和实践应用于软件设计,创建和维护的学科。
softengineering.ppt 313k
softengineering2.ppt 173k
《软件工程思想》 .pdf 1906k
软件工程5_系统设计.doc 630k
软件工程7_测试与改错.doc 39k
软件工程[哈工大 讲义].ppt 3322k
软件工程知识体系指南2004版.pdf 912k
软件工程笔记.rar 275k
软件工程资料1.pdf 517k
软件工程资料2.pdf 3269k
软件工程资料3.pdf 3858k
面向对象技术课程讲义.rar 1886k