软件工程(Software Engineering)在百度百科上是这样定义的:软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。
软件工程专业的产生并非同计算机科学与技术的产生发生在同一时期,而是源于早期计算机行业发展中所遇到的困难。1960年代后期,随着软件规模及开发难度的增加,软件开发周期长、成本高、质量差、维护难,导致软件危机的爆发。
这一次所发生的“软件危机”,也正是软件工程专业诞生的导火索。软件分为三大类:第一类是系统软件(System Software),用于控制和协调计算机以及外部设备、支持应用软件开发与运行的软件,如:操作系统、编译器与连接器、网络管理系统、数据库管理系统等;第二类软件是支撑软件(Support Software),是软件系统的中间层,支撑各种软件的开发、运行与维护的软件,如网络构建、中间件及软件运行平台、软件开发环境及工具、各种接口软件与工具组等;第三类软件是应用软件(Application Software),是为了满足特定应用领域、不同应用问题之需求的专用软件,如行业应用软件、文字与媒体处理软件、办公自动化软件、企业管理软件、工业控制软件各类嵌入式应用软件等。由此可见,软件重要性之大,向下关乎计算机设备的底层硬件执行,向上服务于客户,为各个领域提供帮助,解决问题。而此次软件危机的体现在于,人们在开发软件的各个过程中都出现了不专业化的问题,例如:对软件开发工作量和成本估计不准;软件开发进度难以控制;软件产品质量与可靠性差强人意等。
而这些现象的出现又是有所原因的,在20世纪60年代中期,计算机迎来了一次飞速的发展,大容量、高速度计算机的出现,使计算机的应用范围迅速扩大,软件开发急剧增长,高级语言开始出现;操作系统的发展引起了计算机应用方式的变化;大量数据处理导致第一代数据库管理系统的诞生。软件的规模越来越大,复杂程度越来越高,因而软件的可靠性也越来越突出。从前计算机刚刚投入使用的时代下,由于计算机存储容量小等,因而软件的规模也比较小,设计软件通常是个人的事,而当时个人设计、个人使用软件的方式再也不能满足高运算速度计算机,这样的严重不匹配下,软件开发整体效率低。我们都知道,在工业生产以及商业应用方面,要尽量使得成本低,收益高,生产效率高。而彼时的软件开发刚好违背了这一原则。计算机行业从事者没有经过系统科学的学习,无法对软件的开发进行良好的预估、规划,从而导致开发过程混乱、繁琐,产生重复劳动,浪费资源,工作量大。这不仅是对于开发者的负担,对于客户或者软件的使用者来说也是一种煎熬,因为由于软件开发的过程进度缓慢,时间上的浪费对于可获或者使用者来说也是一种损失,而且他们还要承担软件品质低劣的风险。于是,在“软件危机”的影响下,人们开始着重解决软件开发过程中所遇到的这一连串的问题。
附几个软件危机的实例:
1995年,Standish Group研究机构以美国境内8000个软件项目作为调查样本,调查结果显示,有84%软件计划无法于既定时间、经费中完成,超过30%的项目于运行中被取消,项目预算平均超出189%。
IBMOS/360
IBMOS/360操作系统被认为是一个典型的案例。到现在为止,它仍然被使用在360系列主机中。这个经历了数十年,极度复杂的软件项目甚至产生了一套不包括在原始设计方案之中的工作系统。OS/360是第一个超大型的软件项目,它使用了1000人左右的程序员。佛瑞德·布鲁克斯在随后他的大作《人月神话》中曾经承认,在他管理这个项目的时候,他犯了一个价值数百万美元的错误。
美国银行信托软件系统开发案
美国银行1982年进入信托商业领域,并规划发展信托软件系统。项目原订预算2千万美元,开发时程9个月,预计于1984年12月31日以前完成,后来至1987年3月都未能完成该系统,期间已投入6千万美元。美国银行最终因为此系统不稳定而不得不放弃,并将340亿美元的信托账户转移出去,并失去了6亿美元的信托生意商机。
摘自百度百科
在1968年10月,北大西洋公约组织(NATO)召开计算机科学会议,会上首次提出“软件工程”概念及克服“软件危机”的策略,强调按照工程化原则和方法组织软件开发工作。软件工程技术领域由此应运而生。
从这之后,人们在制做软件时开始工程化,专业化,用更加科学的方法编写软件。
我认为,软件工程它的工作方向是具有应用性的。由上面“软件工程”这一概念产生的历史背景可以知道,软件工程专业的研究领域必然是和计算机科学与技术专业是不一样的。计算机科学与技术研究的是计算机的本质问题,就像其学科课程设置的那样,更多的是一种追本溯源,更加注重计算机领域的基础问题,或者说就是在研究计算机的的每一个部位,具体到程序员的世界就是操作系统、编译原理、计算可行性、计算机原理、数字逻辑等等。而软件工程则是一种工程理论应用,考虑的是软件的整体,关注的是其所要应用解决的实际问题。
了解一门学科的发展历史,是有助于我们对于行业的明细认识的,也是有助于我们自身的。了解清楚专业的研究领域,才能帮助我们选择出适合我们发展的道路,才能使我们在自身发展、职业发展的每一个时间段,做出正确的、有利于我们未来发展的选择。
如果说,把软件工程专业比作一棵树,那么其应用方向就是它繁茂的树枝,树枝肆意地伸展、生长,逐渐粗壮,并在风雨的考验下,会在某个阳光明媚的日子里结出果实,给人们享用。那么树的四通八达的根就是支撑其成形的丰富的学科体系。
让我们先来了解一下软件学科正式成为独立学科的过程。其萌芽阶段是在1970s末期,美国制定研究生计划时采纳了IEEE/CS提出的制定软件工程教程的建议。酝酿阶段是在1980s末期,美国卡内基-梅隆大学软件工程研究所(CMU SEI)开始研究软件工程教育,组织软件工程教育研讨会,出版正式的教程并建立软件工程说是教育计划。准备阶段是在1993年,IEEE CS和ACM成立了软件工程协调委员会(SWECC),提出了“软件工程职业道德规范”、“本科软件工程教育计划评价标准”和“软件工程知识体系”(SWEBOK),全面描述软件工程实践所需要的知识,为软件工程教育发展打下坚实基础。而软件工程其真正的产生则是在距今不远的2004年8月,世界500余位大学、研究所和企业界教授专家推出了软件工程知识体系、软件工程教育知识体系(SEEK)两个文件的最终版本,标志着软件工程学科在世界范围的正式确立,并成为计算机学科领域的独立学科。
附中国软件工程专业学科的发展:
2001年,教育部建立35所国家示范性软件学院,并批准新增“软件工程”本科专业。现已又400多所高校设有软件工程专业
2011年,国务院学位委员会批准新增“软件工程”以及学科博士点与硕士点。现已经有100多所高校设有软件工程博士/硕士点
2013年,教育部成立独立的“软件工程专业教学指导委员会”
软件工程是在计算机科学与技术之上发展开来,但又自身学科着重点的应用学科。我认为软件工程其学科的独特魅力就在于软件工程这棵“树”的“根”。
软件工程成为一门独立学科这条路走了将近三十年。而自软件工程这一概念的提出到其正式成为独立学科经历的约五十年的光阴。正所谓慢工出细活,软件工程需要计算机科学的知识理论基础,而又不限于计算机的知识,更多的是使得人们更多的去考虑如何用已有的计算机知识、工具去设计软件,关注软件制做的每一个环节、每一个影响因素(其中所要注意的东西远比想象的要多)。话又说回到上面关于对计算机科学与技术和软件工程的不同之处了,软件工程比计算机科学专业更具有方向性和应用性,虽然在计算机方面的强调略有放松,但同时也有注入的新鲜血液。
这些新鲜的血液使软件工程的“根”充满了活力。只有四通八达,粗壮的根才能使得大树屹立在大地、绝壁、甚至是荒漠之中。而软件工程的“根”就是其丰富而全面的学科知识体系。
以上是美国电子电气工程师学会(IEEE CS)与美国计算机联合会ACM共同研究发布的软件工程知识体系(SWEBOK)。我们可以看到,整个体系中从软件需求到软件维护是软件的开发过程;软件的配置管理、软件工程管理、软件工程模型与方法、软件工程经济学等是隐式的润滑剂,推动开发过程的顺利无阻;计算基础、工程基础、数学基础是强大的引擎,不外现,却万万不可缺少。
而这一些小的方方面面又是由更多的知识理论体系构成的。在这里就不具体展开,详细请见SWEBOK官网下载
这样的学科知识体系配置显得合情合理,既不
多余,也不显得繁冗。下面浅谈其中的几个方面。
1 .计算基础和数学基础:为什么要将二者放在一块来讲呢?因为我认为在计算机领域,计算机知识和数学知识这一对是相辅相成的一对“命运共同体”。我们都知道,世界上,生活中无处不需要用到数学知识,它是一股强大的力量,推动世界的发展,推动各行各业的新陈代谢。但是就好比人类的肌肉一样,数学固然有强大而又神奇的力量,但苦于缺少表达出来的方式,直到现代计算机技术的飞速发展和成熟。计算机本没有强大的功能,但是它是一种表达工具,就像人的手,能将肌肉中的力量倾泻出来。计算机擅长做人类最不想做的繁琐的、海量的、重复的、无聊的计算过程。二者结合,发挥出最大的价值。数学基础为整个软件开发过程提供灵魂,解决问题;计算基础进行对软件开发的具体实现。例如:数学建模软件Matlab提供很多数理逻辑、数学分析的方法,通过计算机图像生成、数据运算,生成对实际问题的模型建立,对实际问题的求解或者对于图像、函数的线性拟合。
2 .工程基础:由软件工程的名字我们就可以知道,这门学科和工程学脱不了干系。软件工程的产生就是为了解决软件开发效率低下、软件质量得不到保证、开发资源浪费的问题,目标就是将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,以较经济的手短获得能在世纪机器上有效运行的可靠的软件地一系列方法。这与工程学的原理不谋而合,工程,是综合运用科学理论和技术方法改造客观世界及其物质特性的一门学科和技艺。工程强调以最短的时间、少而精的人力物力做出高效、可靠且有用的东西。这也正是当初软件危机时人们所需要的东西,工程学中的证实方法和试验技术、统计分析、工程设计、根本原因分析等理论对于如何合理建设软件开发体系有着十分重要的价值。
3 .软件需求:我们都说,软件工程其实不止是属于计算机行业,也属于服务行业,其中的某些方面和服务科学挂钩,以至于甚至有关于面对服务的业务过程建模、软件服务工程方法、软件服务运行支撑、面向服务的软件体系结构等软件工程相关知识。软件工程的关注点在于软件开发过程、软件开发方法、软件开发工具、软件开发质量,而软件需求分析就是其重要开头,软件需求是软件生命周期的第一个阶段,成功的软件产品,首先需要深入理解带用软件解决的问题,即软件开发者对于客户所需要的软件的清晰、明确的认识与构思。就好比建造大厦,软件需求是大厦的图纸,图纸画错了,建造出的大厦也就和设想中的南辕北辙了。不过,软件工程的需求分析并没有那么简单,正如计算机本身是一台精密的仪器一样,软件需求也涵盖很多细致的东西,其包含系统特点的描述、系统如何运作的规格和限制,一般来说,需求是在描述系统应该做什么,而不是系统如何做到这些功能。并且需求是多样化的,是变化的,是需要挖掘的,用不同的思维方法去获得结果,是需求分析的常用手段。但在此不做详述。
4 .软件测试及维护:令人惊讶的是,在一整个软件的项目中对软件开发的计划占据全部内容的12%,编码开发占据6%,而各种系统的测试维护和单元维护占据了惊人的82%。由此可见软件开发者在一个工程项目中将绝大部分的精力都放在了软件测试和维护上。对于软件的测试和维护是所开发的软件能否成功满足客户需求的重要环节,是对于软件质量的关键把控,有着无可替代的重要意义。软件的质量无法保障,则会引起很大的问题,比如:2011年,铁路12306售票网站上线初期即发生了故障,导致网站崩溃;2011年7月23日甬温线两列客车追尾发生事故,是由于信号控制设备在设计上的缺陷,导致本应该显示为红色灯取键信号错误显示为绿灯;2007年8月14日,美国洛杉矶国际机场电脑发生故障,60个航班的两万旅客无法入关,其原因是包含旅客姓名和犯罪记录的部分数据系统瘫痪。由此,软件质量低下所带来的危害严重程度可见一斑。对于软件花费大量的精力去测试和维护是理所应当的是有回报的,可以尽早发现软件产品中所存在的各种问题,这也是保证软件质量,优化其生命周期的必要措施。在软件工程的发展历程中,诞生出了丰富的软件测试方法,在此不做详述。
5 .软件的配置管理:软件配置是由在软件工程过程中产生的所有信息项构成的,它可以看作该软件的具体形态(软件配置项)在某一时刻的瞬间影像。这样的说法很抽象,下面放一个软件配置管理的实例:
图片源自网络。侵删。
软件配置管理的基本元素有:配置项、基线、配置管理数据库。配置项是软件全生命周期内受管理和控制的基本单位,大到整个系统,小到某个硬件设备或软件模块。比如图中每一个工作区所要处理的任务就是软件地配置项。基线,由一个或若干个通过(正式)评审并得到确认的配置项组成,是项目进入下一个生命周期阶段的出发点(或基准)。它是软件文档或源码(或其它产出物)的一个稳定版本,它是进一步开发 的基础,只有经过授权后才能变更。建立一个初始基线后,以后每次对其进 行的变更都将记录为一个差值,直到建成下一个基线。 配置管理数据库用于保存与软件相关的所有配置项的信息以及配置项之间关系的数据库,用于记录每个配置项及其版本号、变更可能会影响到的配置项、记录配置项的变更路线及轨迹、记录不同配置项之间的关系等。
软件配置管理贯穿整个软件生命周期与软件工程过程,始于项目之初,终于项目淘汰之时。通过以上的了解,我们可以看到,一个有效率的软件配置管理体系可以使得软件的开发有效率,它是一种标识、组织和控制修改的技术,目的是使错误达到最小并有效地提高生产效率。
6 .软件工程经济学:软件工程经济学是用于将软件开发成本最小化而利益最大化的科学,其包括与软件生命周期息息相关的生命周期经济学、风险与不确定性、经济分析方法等,凸显了软件工程在软件开发方面的专业性。
以上即是对于软件工程相关体系学科的一小部分总结归纳。正是因为其专业化以及交叉性强,在当今软件无处不在的信息化社会,软件工程专业所产生的影响日益增大,这也对软件工程技术的发展趋势提出了挑战,软件工程应该如何发展?
1 .软件服务化:以早期的面向服务的体系结构SOA、 Web Services为基础 到现在基于云计算的软件即服务SaaS和软件服务工程为代表都是软件服务化的代表。
上图很好的展现了软件服务化的趋势。因为“云”的发展,我们现在可以不用再把软件安装在自己的电脑上,而是可以以服务的方式申请软件,我们得到的是服务,而不一定是软件的实体。右图是面向服务的软件的架构,通过多层次的影射,支持了软件的服务体系结构。
2 .软件需求工程:之前说到了软件需求分析对于软件开发的重要性。随着社会的发展,人们对于软件的依赖会越来越大,而对于软件的需求也应该是更加多变灵活,故而对于软件需求的分析应当更加重视。
人们在软件需求分析中所要考虑的方面
3 .软件领域化:我国正处于经济转型、产业升级及“两化融合”进程深入阶段,信息化需求将会不断上升,并带来巨大的市场机遇。软件行业作为上述阶段过程中最为重要的支撑力量之一,未来有很大的提升空间。社会各个领域的信息化需求也呈现井喷式增长,行业应用软件在软件产品市场中占据的比重将不断在增大,并将是软件行业发展的重要动力。因此,应用软件企业将会拓展产品领域,在重点发展金融、电信、政府、教育、能源等行业应用软件的同时,全方位打造数条纵向产业链,如机械电器、石油化工、纺织服装、食品饮料、建筑材料、医药化工、汽车等行业应用软件,以形成行业竞争的新优势。
软件工程未来的发展前景是明确且合理的,顺应社会需求和市场潮流,不违背软件工程的初衷。虽然如此,但我国软件行业创新能力不足,尤其是高精尖人才的缺乏等掣肘,也一直成为行业之困。
实际上,软件行业近年来的发展,备受人才因素影响,不仅在高精尖人才方面缺乏,中级人才也非常紧俏。有分析称,除去行业发展较快、人才流动性较大等,关键环节就处在软件人才的教育和培训上。同时,人才与市场需求脱节的问题亦明显。
我认为这样的问题一方面还出于软件工程没有足够的“知名度”,使得没有更多优秀的学生去选择这个专业,去接触学习软件工程,使得软件工程专业不能保持一汪“活水”的状态。毕竟,中国学生在中学以及在幼年接收到来自学校和家庭的生涯教育实在是太匮乏了,以至于大部分学生在高考填志愿的时候都茫然无措,根本不知道自己喜欢的专业是什么,也不了解大部分学科,当然他们的家长或许也是。这就直接地导致了这样一个现象:在当今互联网的热潮之下,大家都知道计算机科学与技术专业的热门,只知道计算机很厉害,能做很多事情,能赚很多钱,但却没有去深入了解这个行业,去摸索清楚其中的每一个分支。好比盲人摸象看不清事物的本质,忽略了软件工程这样一门具有魅力的交叉性学科。