软件工程
维基百科,自由的百科全书
软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。
在现代社会中,软件应用于多个方面。典型的软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统,编译器,数据库,游戏等。同时,各个行业几乎都有计算机软件的应用,比如工业,农业,银行,航空,政府部门等。这些应用促进了经济和社会的发展,提高人们的工作效率,同时提升了生活质量。
软件工程师是对应用软件创造软件的人们的统称,软件工程师按照所处的领域不同可以分为系统分析员,软件设计师,系统架构师,程序员,测试员等等。人们也常常用程序员来泛指各种软件工程师。
目录 |
[编辑] 软件工程与计算机程序设计
软件工程存在于各种应用中,存在于软件开发的各个方面。而程序设计通常包含了程序设计和编码的反复迭代的过程,它是软件开发的一个阶段。
软件工程力图对软件项目的各个方面作出指导,从软件的可行性分析直到软件完成以后的维护工作。软件工程认为软件开发与各种市场活动密切相关。比如软件的销售,用户培训,与之相关的软件和硬件安装等。软件工程的方法学认为一个独立的程序员不应当脱离团队而进行开发,同时程序的编写不能够脱离软件的需求,设计,以及客户的利益。
软件工程的发展是计算机程序设计工业化的体现。
[编辑] 软件工程与计算机科学
软件的开发到底是一门科学还是一门工程,这是一个被争论了很久的问题。实际上,软件开发兼有两者的特点。但是这并不意味着它们可以被互相混淆。
很多人认为软件工程基于计算机科学和信息科学就如传统意义上的工程学之于物理和化学一样。
在美国,大约40%的软件工程师具有计算机科学的学位。在世界其他地方,这个比例也差不多。他们并不一定会每天使用计算机科学方面的知识,但是他们每天都会使用软件工程方面的知识。
軟體工程 | 计算机科学 | |
---|---|---|
目標 | 在時間、資源、人員這3個主要限制條件下構建滿足用戶需求的軟體系統。 | 探索正確的計算和建模方法,從而改進計算方法本身。 |
產品 | 軟體(比如辦公套件和編譯器)。 | 演算法(比如希爾排序法)和抽象的問題(比如哲學家進餐問題)。 |
關注點 | 軟體工程關注如何為用戶實現價值。 | 軟體理論關注的是軟體本身運行的原理,比如時間複雜度,空間複雜度,和演算法的正確性。 |
變化程度 | 隨著技術和用戶需求的不斷變化,軟體開發人員必須時刻調整自己的開發以適應當前的需求。同時軟體工程本身也處於不斷的發展中。 | 對於某一種特定問題的正確解決方法將永遠不會改變。 |
需要的其他知識 | 相關領域的知識。 | 數學。 |
著名的探索者和教育家 | Barry Boehm, David Parnas, and Frederick P. Brooks。 | Edsger Dijkstra, 高德纳, Robert Tarjan, Peter Slater, and 艾伦·图灵。 |
著名的實踐者 | John Backus, Dan Bricklin, 蒂姆·伯纳斯-李, 林纳斯·托瓦兹, 理查德·马修·斯托曼。 | 無。 |
國內從業人數 | 592,370(截至2002年)。 | 不明。 |
世界從業人數 | 不明。 | 不明。 |
[编辑] 软件危机
请参考:软件危机
软件工程的兴起要根源于20世纪60,70和80年代的软件危机。在那个时代,很多的软件最后都得到了一个悲惨的结局。很多的软件项目开发时间大大超出了规划的时间表。一些项目导致了财产的流失,甚至某些软件导致了人员伤亡。同时软件开发人员也发现软件开发的难度越来越大。
OS 360操作系统被认为是一个典型的案例。到现在为止,它仍然被使用在IBM360系列主机中。这个经历了数十年,极度复杂的软件项目甚至产生了一套不包括在原始设计方案之中的工作系统。OS 360是第一个超大型的软件项目,它使用了1000人左右的程序员。Fred Brooks在随后他的大作《人月神话》(The Mythical Man-Month)中曾经承认,在他管理这个项目的时候,他犯了一个价值数百万美元的错误。
财产的损失:软件的错误可能导致巨大的财产损失。欧洲阿里亚娜火箭的爆炸就是一个最为惨痛的教训。
人员伤亡:由于计算机软件被广泛应用于包括医院等与生命息息相关的行业。这也使得软件的错误导致人员伤亡成为了可能。
在軟體工程界被大量引用的案例是Therac-25的意外. 在1985年六月到1987年一月之間, 六個已知的醫療事故來自於Therac-25錯誤地超過劑量, 導致患者死亡或嚴重輻射灼傷[1]。
在工业上,某些嵌入式系统导致机器的不正常运转,从而将一些人推入了险境。
最近的相关报道可以参见[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)和模板。
[编辑] 软件工程师
请参考软件工程师以及IT工程师认证
[编辑] 相关内容
[编辑] 參考
- 胡崑山,《中国软件产业发展现状与人才需求》,2003年9月1日,http://software.ccidnet.com/pub/article/c372_a62973_p1.html