软件工程师入门学习一.概述什么是软件工程,为什么要软件工程?1.软件要知道什么是软件工程,当然得先知道什么是软件.软件就是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据和相关文档的完整组合.注意:软件不仅包括程序,还包括文档.所以做软件也不仅仅是编程序,还需要写文档,后者应该提到与前者并重的地位。
2.软件危机从50年代到60年代,人们曾经把程序设计看作是一种任人发挥创造才能的技术领域,只要程序能得到正确的结果,程序的写法可以不受任何约束.人们认为好的程序应该是运用了许多与众不同的技巧和窍门的程序.这种观点好象把编程序当成了一种艺术,因为艺术总是宣扬个性,喜欢与众不同.(实际上,编程序的确可以看做是一种艺术,不过这种艺术是在遵循一定范式和准则这个前提下的艺术,个人观点)然而,随着软件的规模越来越大,人们在实践中发现随心所欲编写的程序给维护,修改带来了很大的麻烦.程序晦涩难懂,不同程序员,不同时期编写的模块难以接口.因此,软件开发遇到了很大的困难.往往投入很大,收获甚微.做的软件漏洞百出,或无人使用.这就是软件危机.于是,人们在茫然中,渐渐的抛弃了原先的观点,开始探索一种新的软件开发的思想.这就导致了软件工程的产生.程序也从按个人意图创造的"艺术品"转化为一种工程化的产品。
3.软件工程的定义软件工程的定义很多,如:“软件工程是开发,运行,维护和修复软件的系统方法”;“建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法”等等。
定义是抽象的,掌握精髓才是关键。
对软件工程的最好理解就是“只可意会,不可言传”,试问各位看官,您们都学过化学,但化学的定义是什么呢?但是,为了更快的意会,有必要在此废话几句。
软件工程可以看作是一种方法,一种思想,就是指导大家如何更好地开发软件的方法和原则。
软工也可看作是一种工具,就是帮助大家分析,设计软件的工具,如:流程图,数据字典,以及一些辅助软件等。
软工还可以看做是一种过程,就是软件开发的过程。
实际上,方法,工具,过程三者是软件工程的三要素.4.软件生存期软件同其他事物一样也有一个孕育,诞生,成长,成熟,衰亡的过程,这个过程就叫做软件生存期。
软件生存期含有六个步骤:制订计划,需求分析,设计,程序编码,测试和运行维护.所以,请注意,当开始计划开发一个软件的时候,这个软件的生存期就已经开始了,而不是到软件开发完成时才开始。
5.软件生存期模型软件生存期模型是用来表示软件生存期内各种活动是如何组织的,是从软件项目需求直到软件经使用后废弃为止,跨越整个生存期的系统开发,运做和维护所实施的全部过程,活动和任务的结构框架.迄今为止,已提出多种生存期模型,如:瀑布模型,演化模型,螺旋模型,喷泉模型,智能模型等.这里只介绍最基本和常见的瀑布模型。
瀑布模型,即软件开发的过程是:计划,需求分析,设计,编码,测试,运行维护六个阶段.他们是自上而下,相互衔接的固定次序,如瀑布流水,逐级下落.实际上,各个阶段的工作并非完全自上而下的,各个阶段之间可能有反复.如果采用瀑布模型开发软件,就要遵循这六个步骤.所以请注意,做软件并不等于编程序,编程序仅仅是其中的一个部分.不要认为一个人不编程序了,他就不做软件了,他可能做系统分析和总体设计,而这相对编码来说是更重要的.6.软件工程的主要研究内容从上面的瀑布模型可以看出软工的主要研究内容:软件需求分析,软件设计, 程序编码,软件测试,软件维护,软件复用,质量保证等.需要说明的是,软工的内容如马克思主义一样是发展变化的,它的内容是不断充实的.二.需求分析什么是软件需求分析,为什么要需求分析,如何进行需求分析.1.为什么要需求分析需求分析就是分析软件用户的需求是什么.如果投入大量的人力,物力,财力, 时间,开发出的软件却没人要,那所有的投入都是徒劳.如果费了很大的精力,开发一个软件,最后却不满足用户的要求,从而要重新开发过,这种返工是让人痛心疾首的.(相信大家都有体会)比如,用户需要一个for linux的软件,而你在软件开发前期忽略了软件的运行环境,忘了向用户询问这个问题,而想当然的认为是开发for windows的软件,当你千辛万苦地开发完成向用户提交时才发现出了问题,那时候你是欲哭无泪了,痕不得找块豆腐一头撞死.需求分析之所以重要,就因为他具有决策性,方向性,策略性的作用,他在软件开发的过程中具有举足轻重的地位.大家一定要对需求分析具有足够的重视.在一个大型软件系统的开发中,他的作用要远远大于程序设计.2.什么是需求分析什么是需求分析,上面已经提过,简言之就是分析软件用户的需求,细致的进行调查,把用户"做什么"的要求最终转换为一个完全的,精细的软件逻辑模型,并些出软件的需求规格说明,准确地表达用户的要求.3.需求分析的任务简言之,需求分析的任务就是解决"做什么"的问题,就是要全面地理解用户的各项要求,并准确地表达所接受的用户需求.4.需求分析的过程需求分析阶段的工作,可以分为四个方面:问题识别,分析与综合,制订规格说明,评审.a.问题识别:就是从系统角度来理解软件,确定对所开发系统的综合要求,并提出这些需求的实现条件,以及需求应该达到的标准.这些需求包括:功能需求(做什么), 性能需求(要达到什么指标),环境需求(如机型,操作系统等),可靠性需求(不发生故障的概率),安全保密需求,用户界面需求,资源使用需求(软件运行是所需的内存,CPU等),软件成本消耗与开发进度需求,预先估计以后系统可能达到的目标.b.分析与综合:逐步细化所有的软件功能,找出系统各元素间的联系,接口特性和设计上的限制,分析他们是否满足需求,剔除不合理部分,增加需要部分.最后,综合成系统的解决方案,给出要开发的系统的详细逻辑模型(做什么的模型).c.制订规格说明书:即编制文档,描述需求的文档称为软件需求规格说明书.请注意,需求分析阶段的成果是需求规格说明书(好象软考曾经考过这个问题),向下一阶段提交.d.评审:对功能的正确性,完整性和清晰性,以及其它需求给予评价.评审通过才可进行下一阶段的工作,否则重新进行需求分析。
5.需求分析的方法需求分析的方法有很多.这里只强调原型化方法,其它的方法如:结构化方法, 动态分析法等(个人认为,对初学者不必深究这些方法,实际上我也从来没用过这些方法)在此不讨论.原型化方法是十分重要的(是软考等常考的知识点).原型就是软件的一个早期可运行的版本,它实现了目标系统的某些或全部功能.原型化方法就是尽可能快地建造一个粗糙的系统,这系统实现了目标系统的某些或全部功能,但是这个系统可能在可靠性,界面的友好性或其他方面上存在缺陷.建造这样一个系统的目的是为了考察某一方面的可行性,如算法的可行性,技术的可行性,或考察是否满足用户的需求等.如,为了考察是否满足用户的要求,可以用某些软件工具快速的建造一个原型系统,这个系统只是一个界面,然后听取用户的意见,改进这个原型.以后的目标系统就在原型系统的基础上开发.原型主要有三种类型(软考考过):探索型,实验型,进化型.探索型:目的是要弄清楚对目标系统的要求,确定所希望的特性,并探讨多种方案的可行性.实验型:用于大规模开发和实现前,考核方案是否合适,规格说明是否可靠.进化型:目的不在于改进规格说明,而是将系统建造得易于变化,在改进原型的过程中,逐步将原型进化成最终系统。
在使用原型化方法是有两种不同的策略:废弃策略,追加策略.废弃策略:先建造一个功能简单而且质量要求不高的模型系统,针对这个系统反复进行修改,形成比较好的思想,据此设计出较完整,准确,一致,可靠的最终系统.系统构造完成后,原来的模型系统就被废弃不用.探索型和实验型属于这种策略。
追加策略:先构造一个功能简单而且质量要求不高的模型系统,作为最终系统的核心,然后通过不断地扩充修改,逐步追加新要求,发展成为最终系统。
进化型属于这种策略.三.软件设计什么是软件设计,如何进行软件设计。
1.软件设计与程序设计的区别程序设计就是编程序,这是大家熟悉的,很多人印象中的"做软件"就是编程序, 因此可能有人会把程序设计和软件设计等同起来.这是不对的,软件设计是对软件的整体结构,程序结构,数据结构,文件结构,接口定义等的设计,是宏观上的设计. 而程序设计仅仅是软件设计的实现,所以做软件决不简单等同与编程序。
2.软件设计的重要性需求分析阶段解决的是"怎么做"的问题,而设计阶段就是解决"如何做"的问题。
软件设计阶段所做出的关于软件总体结构等的决策将直接影响软件开发的难度, 软件维护的难易程度,他将最终决定软件质量的好坏和软件开发的成败。
3.软件设计的任务软件设计有两个步骤:概要设计和详细设计(过程设计).概要设计将软件需求转化为数据结构和软件的系统结构.详细设计通过对结构表示进行细化,得到软件的详细的数据结构和算法.概要设计阶段要完成的工作有:(1)制订规范,首先为软件开发组制订在设计时应该共同遵守的标准(如文档编写规范,函数命名准则等),以便协调组内各成员的工作.(2)软件体系结构的总体设计。
(3)处理方式设计。
(4)数据结构设计.(5)可靠性设计.(6)编写概要设计阶段的文档.(7)概要设计评审.详细设计阶段要完成的任务是:(1)确定软件各个组成部分内的算法以及各部分的内部数据组织.(2)选定某种过程的表达形式来描述算法.(3)进行详细设计的评审.也就是说概要设计是更高层的设计,而详细设计是更面向实现的设计。
4.软件设计基础软件设计的策略有:自顶向下,自底向上,以及这两种的结合,等等.自顶向下,即先从大的模块入手,把系统分为几个大的模块,然后每个大模块再分成小的模块,如此逐步细化下去,直到模块够小,能够实现为止.自底向上,与此相反,先从系统要用到的最底层的小模块设计起,然后组合某几个小模块成为一个大的模块,如此逐步综合,直到设计出整个系统.以上两种策略的综合,即可能先用自顶向下的策略设计出某几个大的模块,某个大模块的设计又采用了自底向上的设计方法,等等。
当对系统的总体结构非常清晰是可采用直顶向下的方法.而当系统的总体结构一时难以把握,可以先从小处着手,采用自底向上方法,一个一个模块的构造,直到构造出整个系统。
5.软件设计的方法与工具软件设计的方法很多,如:结构化设计方法,Jackson设计方法等.这些方法一般较为形式化和烦琐,在此不做讨论.需要说明的是,在需求分析阶段采用的"原型化方法",也可以应用于软件设计阶段,实际上在软件开发的大部分过程,原型化的思想都可采用。