谁能解释一下aop?
在现代社会中,软件被用在许多方面。电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、游戏等典型软件。同时,几乎所有的行业都有计算机软件应用,比如工业、农业、银行、航空、政府部门等等。这些应用促进了经济和社会发展,提高了人们的工作效率,改善了生活质量。
软件工程师是用软件创造软件的人的总称。软件工程师根据领域的不同可以分为系统分析师、软件设计师、系统架构师、程序员、测试人员等等。程序员通常用来指代各种软件工程师。
软件工程的框架可以概括为:目标、过程和原则。
(1)软件工程目标:生产出正确、可用、费用适当的产品。正确性是指软件产品实现预期功能的程度。可用性是指软件的基本结构、实现和文档对用户可用的程度。适度成本是指软件开发和运行的整体成本满足用户要求的程度。这些目标的实现在理论和实践上都有许多问题需要解决,对工艺、工艺模型和工程方法的选择形成制约。
(2)软件工程过程:生产一个最终能满足需求、达到工程目标的软件产品所需的步骤。软件工程过程主要包括开发过程、运行过程和维护过程。它们涵盖需求、设计、实现、验证和维护等活动。需求活动包括问题分析和需求分析。问题分析获得需求的定义,也称为软件需求规范。需求分析产生功能规格。设计活动通常包括总体设计和详细设计。概要设计确立了整个软件体系结构,包括子系统、模块和相关层次的描述,以及各个模块的接口定义。详细设计生成程序员可用的模块描述,包括每个模块中的数据结构描述和处理描述。实施活动将设计结果转化为可执行的程序代码。确认活动贯穿整个开发过程,实现完成后的确认,确保最终产品满足用户的要求。维护活动包括使用过程中的扩展、修改和改进。与上述流程相伴随的,还有管理流程、支持流程、培训流程等等。
(3)软件工程原则是指围绕工程设计、工程支持和工程管理,在软件开发过程中必须遵循的原则。
一、软件工程概述
概念:按需而生
软件工程是工程的一种。工程学是一门将理论和知识应用于实践的科学。就软件工程而言,它借鉴传统工程的原理和方法,以便高效地开发高质量的软件。计算机科学,数学,管理科学都是应用的。计算机科学和数学用于构建模型和算法,工程科学用于制定规范、设计范例、评估成本和确定权衡,管理科学用于管理计划、资源、质量和成本。
软件工程的概念主要是针对20世纪60年代的“软件危机”而提出的。它最早出现在1968年的北约(北大西洋公约组织)会议上。自这一概念提出以来,围绕软件项目开展了对开发模型、方法和支持工具的研究。其主要成果有:提出了瀑布模型,开发了一些结构化程序设计语言(如PASCAL和Ada)和结构化方法。并围绕项目管理提出了成本估算、文档评审等方法和工具。纵观60年代末80年代初,其主要特点是,前期以系统实现技术为主,后期开始强调开发管理和软件质量。
自20世纪70年代初“软件工厂”概念提出以来,软件生产技术和软件生产管理的研究与实践主要围绕软件过程和软件复用展开。其主要成果有:提出了广泛使用的面向对象语言和相关的面向对象方法,大力开展了计算机辅助软件工程的研究和实践。特别是近年来,软件构件技术、软件质量控制技术和质量保证技术被广泛应用于软件复用和软件生产。目前各软件企业都非常重视资质认证,都想通过这些工作提升企业管理和技术。软件工程中涉及的元素可以总结如下:
根据这个框架,我们可以看到软件工程涉及到软件工程的目标、原则和活动。
目标:我只关注“产品”
软件工程的主要目标是生产具有正确性、可用性和适当费用的产品。正确性是指软件产品实现预期功能的程度。可用性是指软件的基本结构、实现和文档对用户可用的程度。成本适当性是指软件开发和运行的整体成本满足用户要求的程度。这些目标的实现在理论和实践上都有许多问题需要解决,对工艺、工艺模型和工程方法的选择形成制约。
软件工程活动是“生产一个最终满足需求并实现工程目标的软件产品所需的步骤”。主要包括需求、设计、实现、确认、支持等活动。需求活动包括问题分析和需求分析。问题分析获得需求的定义,也称为软件需求规范。需求分析产生功能规格。设计活动通常包括总体设计和详细设计。概要设计建立了整个软件架构,包括子系统、模块和相关层次的描述,以及每个模块的接口定义。详细设计生成程序员可用的模块描述,包括每个模块中的数据结构描述和处理描述。实施活动将设计结果转化为可执行的程序代码。确认活动贯穿整个开发过程,实现完成后的确认,确保最终产品满足用户的要求。支持活动包括修订和改进。与上述活动相伴随的,还有管理流程、支持流程、培训流程等等。
框架:四项基本原则是基石。
软件工程围绕工程设计、工程支持和工程管理提出了以下四个基本原则:
首先,选择一个合适的开发模式。这个原理和系统设计有关。在系统设计中,软件需求、硬件需求等因素相互制约、相互影响,往往需要权衡。因此,我们必须了解需求定义的可变性,并采用合适的开发范式来控制它,以确保软件产品满足用户的需求。
第二,采用合适的设计方法。在软件设计中,通常会考虑软件的模块化、抽象性、信息隐蔽性、本地化、一致性和适应性等特点。合适的设计方法有助于实现这些功能,从而实现软件工程的目标。
第三,提供高质量的工程支持。工欲善其事,必先利其器。在软件工程中,支持软件过程的软件工具和环境是非常重要的。软件工程项目的质量和成本直接取决于提供给软件工程的支持的质量和有效性。
第四,注重开发过程的管理。软件工程的管理直接影响到可用资源的有效利用,满足目标的软件产品的生产,以及软件组织生产能力的提高。因此,只有对软件过程进行有效的管理,才能实现有效的软件工程。
这个软件工程框架告诉我们,软件工程的目标是可用性、正确性和成本效益;实施一个软件项目,需要选择合适的开发范式,采用合适的设计方法,提供高质量的工程支持,并对开发过程实施有效的管理;软件工程活动主要包括需求、设计、实现、确认和支持,每个活动可以根据具体的软件工程采用合适的开发范式、设计方法、支持过程和过程管理。按照软件工程的框架,软件工程学科的研究内容主要包括:软件开发范式、软件开发方法、软件过程、软件工具、软件开发环境、计算机辅助软件工程(CASE)和软件经济学。
功能:高效开发高质量的软件。
自软件工程概念提出以来,经过30多年的研究和实践,虽然“软件危机”并没有完全解决,但是软件开发方法和技术已经取得了很大的进步。特别需要指出的是,从20世纪80年代中期开始,美国工业界和政府部门开始意识到软件开发中最关键的问题是软件开发组织不能很好地定义和管理他们的软件过程,以至于一些好的开发方法和技术不能发挥预期的作用。换句话说,在没有良好定义和管理的软件过程的软件开发中,开发组织不能从好的软件方法和工具中获益。
据调查,中国现在的情况和10多年前的美国差不多。软件开发流程定义不清晰,文档不完整,不规范。软件项目的成功往往归功于软件开发团队中一些杰出的个人或团队的努力。这种依赖于个人的成功不能为整个组织的软件生产率和质量的提高奠定有效的基础。只有建立整个组织的过程改进,采用严格的软件工程方法和管理,并坚持不懈地付诸实践,才能实现整个组织的软件过程能力的持续改进。
这个事实告诉我们,只有坚持软件工程的四个基本原则,重视软件技术的应用和软件工程的支持与管理,并在实践中贯彻执行,才能高效地开发出高质量的软件。
二、软件工程的七个基本原则
自1968提出“软件工程”这一术语以来,研究软件工程的专家学者提出了100多条关于软件工程的原则或信条。美国著名软件工程专家Boehm综合了这些专家的意见,总结了TRW多年来开发软件的经验,在1983中提出了软件工程的七个基本原则。
Boehm认为,七项原则是保证软件产品质量和开发效率的最低原则集。
它们相互独立,是不可或缺的最小集合。同时,它们是相当完整的。
当然,人们无法用数学方法严格证明它们是一个完整的集合,但可以证明,在此之前已经提出的100多个软件工程准则可以包含或衍生出这七个原则的任意组合。
以下是软件工程的七个原则:
1采用分阶段生命周期计划严格管理。
本文是在借鉴前人的基础上提出的。统计数据显示,50%以上的失败项目都是由于计划不周造成的。在软件开发和维护的漫长生命周期中,需要完成许多不同种类的工作。这个原则就是要把软件的生命周期分成几个阶段,并据此制定一个可行的计划,然后严格按照计划管理软件的开发和维护。Boehm认为,在整个软件生命周期中应规定并严格执行六种计划:项目总结计划、里程碑计划、项目控制计划、产品控制计划、验证计划和运维计划。
2 .坚持阶段复习
统计结果表明,大多数错误是在编码前产生的,约占63%;& lt2 & gt一个错误发现得越晚,纠正它的成本就越大,是2到3个数量级。所以软件的质量保证不能等到编码结束,要坚持严格的阶段评审,以便尽早发现错误。
3.实施严格的产品控制
开发人员最讨厌的事情之一就是改变需求。但实践告诉我们,需求的变化往往不可避免。这就要求我们采用科学的产品控制技术来满足这一要求。也就是说要采用变更控制,也就是基准配置管理。当需求发生变化时,其他阶段的文档或代码也随之变化,以保证软件的一致性。
4.采用现代编程技术
从六七十年代的结构化软件开发技术到最近的面向对象技术,从第一、二代语言到第四代语言,人们已经充分认识到方法和力量一样强大。采用先进的技术不仅可以提高软件开发的效率,还可以降低软件维护的成本。
应该清楚地回顾结果。
软件是一种看不见摸不着的逻辑产品。软件开发团队的工作进度可视性差,难以评估和管理。为了更好地管理,应该根据软件开发的总体目标和完成期限,明确定义开发团队和产品标准的职责,以便对获得的标准进行清晰的评审。
6开发团队的人员要少而精。
开发人员的质量和数量是影响软件质量和开发效率的重要因素,应该少而精。
这篇文章基于两个原因:高质量开发人员的效率比低质量开发人员高几倍到几十倍,开发工作中犯的错误也少很多;当开发团队由N人组成时,可能的沟通渠道为N(N-1)/2,说明随着人数N的增加,沟通成本会急剧增加。
7.承认持续改进软件工程实践的必要性。
遵循以上六个基本原则,可以更好地实现软件的工程化生产。但它们只是对已有经验的总结和归纳,并不能保证赶上技术不断发展的步伐。因此,Boehm提出软件工程的第七个原则应该是认识到软件工程实践持续改进的必要性。根据这一原则,既要积极采用新的软件开发技术,又要注意不断总结经验,收集进度、消耗等数据,统计错误类型和问题。这些数据不仅可以用来评估新软件技术的效果,还可以指出必须注意的问题和应该首先研究的工具和技术。
面向方面编程(AOP)被认为是近年来软件工程的又一重要发展。这里的方面指的是完成一个功能的对象和功能的集合。在这方面,有泛型编程和模板。
涉及
胡昆山,中国软件产业发展现状及人才需求,2003年9月1,
第三,软件工程的目标和通用模型
软件工程的目标是提高软件的质量和生产率,最终实现软件的工业化生产。质量是软件需求者最关心的问题,用户即使不要物美价廉,也要求正版。生产力是软件供应商最关心的问题,老板和员工都希望在更短的时间内赚更多的钱。质量和生产力有着内在的联系,高生产力必须建立在合格的质量基础上。质量不达标,对供需双方都不好。从短期效益来看,追求高质量会延长软件开发时间,增加成本,似乎降低了生产力。从长远的效益来看,高质量会保证软件开发的全过程更加规范流畅,大大降低软件的维护成本,本质上是提高生产力,获得良好的口碑。质量和生产力并不存在根本矛盾,一个好的软件工程方法可以同时提高质量和生产力。
软件供需双方代表能在饭桌上谈笑风生,得益于一线开发人员的辛勤工作。质量和生产率的提高依赖于程序员和程序经理。对于开发者来说,如果质量和生产力之间一定要有个先后顺序,那应该是质量第一,生产力第二。这是因为:(1)质量直接体现在软件的每一个程序中,高质量自然是开发者的技术追求,也是职业道德的要求。(2)高质量对所有用户都有价值,而高生产力只对开发者有意义。(3)如果一开始就追求高生产率,容易让人急功近利,留下隐患。还不如放慢进度,保证每个环节的质量,才能长期受益。
软件的质量因素有很多,如正确性、性能、可靠性、容错性、易用性、灵活性、可扩展性、可理解性、可维护性等等。有些因素相互重叠,有些则相互矛盾。真正提高质量不容易!
软件工程的主要环节包括:人员管理、项目管理、可行性与需求分析、系统设计、程序设计、测试与维护,如图1.1。
软件工程模型认为,所有的环节都要通过一定的流程连接起来,整个流程可以标准化操作,就像工厂的生产线一样。常见的软件工程模型有:线性模型(图1.2),增量模型(图1.3),螺旋模型,快速原型模型,形式化描述模型等等【按mam 1999,sommerville 1992】。
最早的软件工程模型是线性模型(又称瀑布模型)。线性模型过于理想化和简单,不再适合现代软件开发模式,几乎被业界所抛弃。偶尔被人提起,都属于被降职的对象,没有留下一丝遗憾。但我们要认识到,“线性”是最容易掌握和熟练运用的思维方法。当人们遇到一个复杂的“非线性”问题时,总是想尽办法将其分解或转化为一系列简单的线性问题,然后逐一求解。一个软件系统的整体可能很复杂,但单个的子程序总是很简单的,可以用线性的方式实现,否则会累得无法工作。线性是一种简单,简单就是美。当我们理解线性的精神时,我们不应该机械地套用线性模型的外观,而是生动地使用它。例如,增量模型本质上是分段线性模型,如图1.3所示。螺旋模型是一个连续的曲线线性模型。线性模型的影子可以在其他模型中找到。
对程序员来说,应用固定的模型不是明智之举。比如“编程”和“测试”的关系,传统上认为是先编程后测试,如图1.4(a)。对于一些复杂的程序,将测试分为同步测试和总测试更有效,如图1.4(b)。
不管是什么软件工程模型,总有图1.1的链接。本书从一个具体的软件工程模型开始,依次描述了人员管理、项目管理、可行性和需求分析、系统设计、程序设计、测试以及维护和再生工程。编程部分以C++/C语言为例。
第四,软件架构和工具的选择
软件体系结构表示一个软件系统的高层结构,其主要特点是:1)软件系统体系结构是一种高层抽象,不涉及具体的系统架构(如B/S或C/S)也不关心具体的实现。2)软件架构必须支持系统所需的功能,在设计软件架构时必须考虑系统的动态行为。3)在设计软件架构时,必须考虑现有系统的兼容性、安全性和可靠性。同时也要考虑系统未来的扩展性和可伸缩性。所以有时候你要在不同方向的多个目标中做决定。
目前有一些标准化的软件架构,如ISO开放系统互联模型、X Window系统等。软件系统的结构通常被定义为两部分:一部分是计算组件。另一个是组件之间的交互。如果把软件系统看成一幅画,计算组件就是节点,组件之间的交互就是节点之间的弧线。组件之间的连接可以认为是一种连接器,如过程调用、事件广播、数据库查询等。正确的体系结构设计是软件系统成功的关键。
我们明白了软件工程的重要性之后,却没有相应的工具,我们很难很好的完成一个系统。在需求分析和设计阶段,我们需要什么样的工具?
当然,最好使用基于UML的CASE工具。目前流行的是Rose,它是一个很好的分析和建立对象和对象关系的工具。编码时,我们需要版本控制工具,MS的SourceSafe就是一个很好的版本管理工具和项目管理工具。当然,具体的开发工具有很多,但是如果你是一个滥用VC多年的程序员,你一定会选择它,因为它会让你感受到什么是真正的面向对象编程,而你在使用VB、PowerBuilder、Delphi的时候很少有这种感觉。至于数据库模式构建,我一直用Sybase的S-Design,不知道有没有更好的工具。
另外需要注意的是,我们需要建立几个文档编写的模板,以便开发人员根据这些模板编写标准的技术和说明文档。帮助文档可以在微软的HTML Help Workshop(hhw.exe)中制作,也可以编译成。chm格式。它只有一个文件,使用和分发都很方便。最后,如果开发者不集中在一个地方,最好建立一个邮件列表,开发者可以通过邮件系统讨论开发中的各种问题。
动词 (verb的缩写)软件开发方法概述
国外大型软件公司和机构一直在研究软件开发方法的概念,也提出了许多实用的开发方法,如生命周期法、原型法、面向对象法等。以下是一些流行的开发方法:
1,结构化方法
结构化开发方法是由E.Yourdon和L.L.Constantine提出的,也就是所谓的SASD方法,也可以称为面向功能的软件开发方法或面向数据流的软件开发方法。Yourdon方法是20世纪80年代应用最广泛的软件开发方法。它首先使用结构化分析(SA)来分析软件的需求,然后使用结构化设计(SD)来设计整个系统,最后使用结构化编程(SP)。它给出了两种典型的软件结构(转换型和事务型),大大提高了软件开发的成功率。
2.面向数据结构的软件开发方法。
杰克逊方法是最典型的面向数据结构的软件开发方法。杰克逊方法将问题分解成各部分的层次结构,这些层次结构可以用三种基本结构形式来表示。三种基本的结构形式是顺序、选择和重复。三种数据结构可以组合成一个复杂的结构系统。该方法从目标系统的输入输出数据结构入手,导出程序框架结构,再补充其他细节,得到完整的程序结构图。这种方法对于输入输出数据结构清晰的中小型系统特别有效,比如商业应用中的文件表处理。这种方法也可以与其他模块详细设计方法相结合。
3.面向问题的分析法
PAM(问题分析法)是日立公司在上世纪80年代末提出的一种软件开发方法。其基本思想是考虑输入输出数据的结构,指导系统的分解,并在系统分析的指导下逐步综合。该方法的具体步骤是:从输入输出数据结构中导出基本处理框架;分析这些处理盒之间的顺序关系;一步一步按顺序处理盒子,直到画出整个系统的焊盘图。这种方法本质上是一种全面的自下而上的方法,只是在逐步合成之前已经被有目的地分解了。这样做的目的是充分考虑系统的输入和输出数据结构。PAM方法的另一个优点是使用PAD图。这是一个二维树形结构图,是目前为止最好的细节设计表示方法之一。当然,由于输入输出数据结构和整个系统之间也有差距,所以这种方法仍然只适用于中小型问题。
4.原型法
使用原型法的原因有很多,主要是随着我们系统开发经验的增加,我们也发现并不是所有的需求都可以提前定义,反复修改是不可避免的。当然可以采用原型法,因为开发工具发展很快,比如VB,DELPHI等工具,我们可以很快开发出一个用户看得见摸得着的系统框架,让对计算机不是很熟悉的用户可以根据这个模板提出自己的需求。
原型系统的开发通常包括以下几个阶段:
(1)确定用户需求
(2)开发原始模型
(3)征求用户对改进初始原型的意见。
(4)修改原型。
原型开发更适合用户需求不明确、业务理论不确定、需求变化频繁的情况。在系统规模不太大、不太复杂的情况下,最好使用这种方法。
5.面向对象的软件开发方法
目前计算机行业最流行的词是分布式、并行、面向对象。由此可以看出面向对象概念在当前计算机行业中的地位。例如,两种流行的面向对象技术,DCOM和CORBA,就是例子。当然,我们其实用的是面向对象的编程语言,比如C++。不可否认,面向对象技术是软件技术的一次革命,在软件发展史上具有里程碑式的意义。
随着面向对象程序设计向面向对象设计和面向对象分析的发展,最终形成了OMT。这种方法是自底向上和自顶向下的结合,它基于对象建模,不仅考虑输入和输出数据结构,而且包括所有对象的数据结构。因此,OMT完全达到了帕姆没有完全达到的目的。而且OO技术在需求分析、可维护性、可靠性等软件开发的三个关键环节和质量指标上有了实质性的突破,基本解决了这些方面的严重问题。
综上所述,面向对象系统采用自底向上归纳和自顶向下分解的方法。通过对象模型的建立,可以真正建立基于用户的需求,系统的可维护性大大提高。目前业界面向对象建模的标准是UML(统一建模语言)。
这里需要说一下微软MSF(微软解决方案框架)的框架,它简单的把系统设计分为概念设计、逻辑设计、物理设计三个阶段。概念设计阶段是从用户的角度出发能获得多少对象,以对象为主体绘制业务框架。逻辑设计阶段是对概念设计阶段的对象进行重新分析、细分、整合和删除。并建立每个对象的方法属性和对象之间的关系。实际上,物理设计就是确定我们实际需要的组件、服务、框架结构和具体的编程语言。MCF的整体结构清晰,是一个良好的、可操作的基于对象开发的框架体系。
6.可视化开发方法
实际上,可视化开发不能单独视为一种开发方法,而是一种辅助工具。比如用过SYBASE的S-Design的人都知道,这个工具可以用来建立一个图形化的数据库模型进行显示,并导入到不同的数据库中。当然没有多少人用过S-Design,但是很多人用过VB,DELPHI,C++ Builder等开发工具。事实上,你正在使用可视化开发工具。
当然,不可否认的是,你只是在编程中使用可视化,而不是在高层的系统分析和系统设计中。其实建立一个系统分析和系统设计的可视化工具是一个很好的卖点,国外也有很多工具致力于这方面的产品设计。例如,业务对象是一个非常好的可视化数据库分析工具。
可视化开发使我们专注于业务逻辑和业务流程,用户界面可以通过可视化工具轻松形成。通过操作界面元素,如菜单、按钮、对话框、编辑框、单选框、复选框、列表框和滚动条,应用软件由可视化开发工具自动生成。
六、如何培养软件工程的思维和方法。
作为一个软件开发人员,一个常见的问题是,在项目开始的时候,我喜欢谈论实现的细节,并且乐在其中。我们更倾向于讨论如何用灵活简短的代码实现一个特定的功能,而忽略了对整个系统架构的考虑。所以作为一个开发人员,尤其是有经验的开发人员,我们应该把自己从代码中解放出来,更多的时候,我们甚至应该在头脑中暂时放弃如何实现的思考,从整体的项目或者产品来考虑一个软件产品。
以下是我的一些个人经历:
1.考虑整个项目或产品的市场前景。作为一个真正的系统分析师,不仅要从技术角度考虑问题,还要从市场角度考虑问题。换句话说,我们还需要考虑产品的用户群是谁,产品投放市场后是否有生命力。比如,即使用最好的技术实现单进程操作系统,其市场前景也一定不容乐观。
2.站在用户的角度考虑问题。比如有些操作对于开发者来说是非常明显的问题。但是对于普通用户来说可能很难掌握,也就是说有时候我们要在灵活性和易用性上妥协。另外,在功能实现上,也需要综合考虑。虽然有些功能很强大,但是如果用户几乎不用,可能在产品的第一个版本就不会推出。站在用户的角度,也就是说用户认可的才是好的,而不是开发者认为的好。
3.从技术角度来看