精华内容
下载资源
问答
  • 谈谈对软件工程的理解

    千次阅读 2020-02-24 10:21:18
    既然谈论软件工程那么肯定要知道他的定义是啥,我个人的理解软件工程就是按照工程学的管理方式,有组织、有计划的,在一定的质量基础、时间限度和成本范围内,实现功能明确的软件系统。而且,软件工程在企业范围内...

    在阅读了《软件工程实践这的研究方法》之后,对软件工程有了一定的了解和掌握。接下来,谈一谈我对软件工程的大致理解。
    既然谈论软件工程那么肯定要知道他的定义是啥,我个人的理解,软件工程就是按照工程学的管理方式,有组织、有计划的,在一定的质量基础、时间限度和成本范围内,实现功能明确的软件系统。而且,软件工程在企业范围内运行,一定需要企业资源的支持,要与企业的经营、决策、管理体系联系在一起,才能够被踏踏实实的落实下来。
    在软件工程中,软件团队是一个很重要的部分。个人技术固然很重要,但放在整个软件工程中也显得微不足道。接下来就是软件本身的开发,一个软件的诞生最先的就是需求分析,只有先把需求分析完成好后程序员才能去根据需求分析设计和实现代码。在软件的完成后则需要对其进行测试,对软件的质量有所保证,软件稳定之后才能发布。所以说软件工程专业是一门研宄用工程化方法构建和维护有效的、实用的和高质量的软件的学科。而且它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等各个方面。 在现代社会中,软件应用于多个方面。典型的软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统,编译器,数据库,游戏等。再者,在现在的各个行业中几乎都有计算机软件的应用,比如工业,农业,银行,航空,政府部门等。这些应用促进了经济和社会的发展,使得人们在高效工作的同时,也提高了生活质量。在早期的软件工程,他的发展是理清软件工程过程的各种活动,提出软件生命周期的概念和软件开发的瀑布模型,制定软件生命周期中主要活动的质量标准。而现在不一样了,现今的软件工程专业涵盖了很多个知识域:软件工程过程:管理软件工程过程的目的是,实现一个新的或者更好的过程。软件工程过程关注软件过程的定义、实现、评估、測量、管理、变更、改进以及过程和产品的度量。软件工程过程分为,①围绕软件生存周期过程的技术和管理活动,即需求获取、软件开发、维护和退役的各种活动。②对软件生存周期的定义、实现、评估、度量、管理、变更和改进软件需求(建模过程):软件需求描述解决现实世界某个问题的软件产品,及对软件产品 的约束。软件需求涉及需求抽取、需求分析、建立需求规格说明和确认,涉及建模、软件开发的技术、经济、时间可行性分析。软件需求直接影响软件设计、软件测试、软件维护、软件配置管理、软件工程管理、软件工程过程和软件质量等。软件设计(建模过程):设计是软件工程最核心的内容。设计既是“过程”,也是这个过程的“结果”。软件设计由软件体系结构设计、软件详细设计两种活动组 成。它涉及软件体系结构、构件、接口、以及系统或构件的其它特征,还涉及软件 设计质量分析和评估、软件设计的符号、软件设计策略和方法等。软件构造:通过编码、单元测试、集成测试、调试、确认这些活动,生成可 用的、有意义的软件。软件构造除要求符合设计功能外,还要求控制和降低程序复 杂性、预计变更、进行程序验证和制定软件构造标准。软件构造与软件配置管理、 工具和方法、软件质量密切相关。评审技术:在开发软件工程工作产品时可能会犯错误,这并不是羞耻的事—只要在产品交付最终用户之前,努力、很努力地发现并纠正错误即可。技术评审是在软件过程早期查错最有效的机制。人员:软件工程师和同事一起进行技术评审,也叫同行评审软件测试:测试是软件生存周期的重要部分,涉及测试的标准、测试技术测试度量和测试过程。测试不再是编码完成后才开始的活动,测试的目的是标识缺陷和问题,改善产品质量。软件测试应该国绕整个开发和维护过程。测试在需求阶段就应该开始,測试计划和规程必须系统,并随着开发的进展不断求精。正确的软件工程质量观是预防,避兔缺陷和问题比改正好。代码生成前的主要测试手段是静态技术(检查),代码生成后采用动态技术(执行代码)。测试的重点是动态技术,从程序无限的执行域中选择一个有限的测试用例集,动态地验证程序是否达到预期行为。软件工程管理:运用管理活动,如计划、协调、度量、监控、控制和报告,确保软件开发和维护是系统的、规范的、可度量的。它涉及基础设旌管理;项目管理度量和控制计划三个层次。度量是软件管理决策的基础。近年来软件度量的标准、测度、方法、规范发展较快软件工程工具和方法:软件开发工具是以计算机为基础的,用于辅助软件生存周期过程。通常,工具是为特定的软件工程方法设计的,以减少手工操作的负担、使软件工程更加系统化。软件工具的种类很多,从支持个人到整个生存周期。软件工具分为:需求工具、设计工具、构造工具、测试工具、维护工具、配置管理工具、工程管理工具、工程过程工具、软件质量工具等。软件工程方法支持软件工程活动,使软件开发更加系统,并能获得成功。软件开发方法不断发展。当前,软件工程方法分为:①启发式方法,包括结构化方法、面向数据方法、面向对象方法和特定域方法;②基于数学的形式化方法;③用软件工程多种途径实现的原型方法,原型方法帮助确定软件需求、软件体系结构,用户界面等。软件质量:软件质量贯穿整个软件生存周期,涉及软件质量需求、软件质量度量、软件属性检测、软件质量管理技术和过程等。软件配置管理:为了系统的控制配置变更,维护整个系统生命周期中配置的致性和可追踪性,必须按时间管理软件的不同配置,包括配置管理过程的管理、软件配置鉴别、配置管理控制、配置管理状态记录、配置管理审计、软件发布和交付管理等产品度量:产品度量关注的是软件工程工作产品具体的、可测量的属性,帮助软件工程师认识他们所开发的软件的设计和构造。对计算机软件开发而言,定性要素总是存在的。软件工程师需要客观标准以帮助指导数据、体系结构、界面和构件的设计。测试人员需要定量指标以帮助选择测试用例及其目标。产品度量为分析、设计、编码和测试能更客观地执行和更定量地评估提供基础。软件项目管理:在软件从初始的概念演化为可运行的实现的过程中,项目管理涉及对人员、过程和所发生事件的策划和监控。人员:在软件项目中,每个人或多或少都做着“管理”工作。但是,管理活动的范围各不相同。软件工程师管理他的日常活动,计划和监控技术任务。项目经理计划和监控软件工程师团队的工作。高级管理者协调业务和软件专业人员之间的关系。构造计算机软件是一项复杂的任务,尤其是当它涉及很多人员长期共同工作的时候。这就是为什么软件项目需要管理的原因。风险管理:很多问题都会困扰软件项目,风险分析和风险管理就是辅助软件团队理解和管理不确定事物的活动。风险是潜在的一它可能发生也可能不发生。但是,不管发生还是不发生,都应该去识别它,评估它发生的概率,估算它的影响,并制定它实际发生时的时应急计划。软件维护:软件产品交付后,需要改正软件的缺陷、提高软件性能或其他属性、使软件产品适应新的环境。软件维护是软件进化的继续。软件维护要支持系统快速地、便捷地满足新的需求。基于服务的软件维护越来越受到重视。软件维护是软件生存周期的组成部分。然而,历史上维护从未受到重视。情况有了改变,软件组织力图使软件运营时间更长,软件维护成为令人关注的焦点

    展开全文
  • 简单谈谈对软件工程的理解

    千次阅读 2020-02-24 03:50:48
    对软件工程的理解 在阅读了《软件工程实践这的研究方法》之后,对软件工程有了一定的了解和掌握。接下来,谈一谈我对软件工程的大致理解。 既然谈论软件工程那么肯定要知道他的定义是啥,我个人的理解,软件工程...

    对软件工程的理解

    在阅读了《软件工程实践这的研究方法》之后,对软件工程有了一定的了解和掌握。接下来,谈一谈我对软件工程的大致理解。

    既然谈论软件工程那么肯定要知道他的定义是啥,我个人的理解,软件工程就是按照工程学的管理方式,有组织、有计划的,在一定的质量基础、时间限度和成本范围内,实现功能明确的软件系统。而且,软件工程在企业范围内运行,一定需要企业资源的支持,要与企业的经营、决策、管理体系联系在一起,才能够被踏踏实实的落实下来。

      在软件工程中,软件团队是一个很重要的部分。个人技术固然很重要,但放在整个软件工程中也显得微不足道。接下来就是软件本身的开发,一个软件的诞生最先的就是需求分析,只有先把需求分析完成好后程序员才能去根据需求分析设计和实现代码。在软件的完成后则需要对其进行测试,对软件的质量有所保证,软件稳定之后才能发布。所以说软件工程专业是一门研宄用工程化方法构建和维护有效的、实用的和高质量的软件的学科。而且它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等各个方面。

       在现代社会中,软件应用于多个方面。典型的软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统,编译器,数据库,游戏等。再者,在现在的各个行业中几乎都有计算机软件的应用,比如工业,农业,银行,航空,政府部门等。这些应用促进了经济和社会的发展,使得人们在高效工作的同时,也提高了生活质量。

    在早期的软件工程,他的发展是理清软件工程过程的各种活动,提出软件生命周期的概念和软件开发的瀑布模型,制定软件生命周期中主要活动的质量标准。

    而现在不一样了,现今的软件工程专业涵盖了很多个知识域:

    软件工程过程:管理软件工程过程的目的是,实现一个新的或者更好的过程。软件工程过程关注软件过程的定义、实现、评估、測量、管理、变更、改进以及过程和产品的度量。软件工程过程分为,围绕软件生存周期过程的技术和管理活动,即需求获取、软件开发、维护和退役的各种活动。对软件生存周期的定义、实现、评估、度量、管理、变更和改进

    软件需求(建模过程):软件需求描述解决现实世界某个问题的软件产品,及对软件产品 的约束。软件需求涉及需求抽取、需求分析、建立需求规格说明和确认,涉及建模、软件开发的技术、经济、时间可行性分析。软件需求直接影响软件设计、软件测试、软件维护、软件配置管理、软件工程管理、软件工程过程和软件质量等。

    软件设计(建模过程):设计是软件工程最核心的内容。设计既是“过程”,也是这个过程的“结果”。软件设计由软件体系结构设计、软件详细设计两种活动组 成。它涉及软件体系结构、构件、接口、以及系统或构件的其它特征,还涉及软件 设计质量分析和评估、软件设计的符号、软件设计策略和方法等。

    软件构造:通过编码、单元测试、集成测试、调试、确认这些活动,生成可 用的、有意义的软件。软件构造除要求符合设计功能外,还要求控制和降低程序复 杂性、预计变更、进行程序验证和制定软件构造标准。软件构造与软件配置管理、 工具和方法、软件质量密切相关。

    评审技术:在开发软件工程工作产品时可能会犯错误,这并不是羞耻的事—只要在产品交付最终用户之前,努力、很努力地发现并纠正错误即可。技术评审是在软件过程早期查错最有效的机制。人员:软件工程师和同事一起进行技术评审,也叫同行评审

    软件测试:测试是软件生存周期的重要部分,涉及测试的标准、测试技术测试度量和测试过程。测试不再是编码完成后才开始的活动,测试的目的是标识缺陷和问题,改善产品质量。软件测试应该国绕整个开发和维护过程。测试在需求阶段就应该开始,測试计划和规程必须系统,并随着开发的进展不断求精。正确的软件工程质量观是预防,避兔缺陷和问题比改正好。代码生成前的主要测试手段是静态技术(检查),代码生成后采用动态技术(执行代码)。测试的重点是动态技术,从程序无限的执行域中选择一个有限的测试用例集,动态地验证程序是否达到预期行为。

    软件工程管理:运用管理活动,如计划、协调、度量、监控、控制和报告,确保软件开发和维护是系统的、规范的、可度量的。它涉及基础设旌管理;项目管理度量和控制计划三个层次。度量是软件管理决策的基础。近年来软件度量的标准、测度、方法、规范发展较快

    软件工程工具和方法:软件开发工具是以计算机为基础的,用于辅助软件生存周期过程。通常,工具是为特定的软件工程方法设计的,以减少手工操作的负担、使软件工程更加系统化。软件工具的种类很多,从支持个人到整个生存周期。软件工具分为:需求工具、设计工具、构造工具、测试工具、维护工具、配置管理工

    具、工程管理工具、工程过程工具、软件质量工具等。软件工程方法支持软件工程活动,使软件开发更加系统,并能获得成功。软件开发方法不断发展。当前,软件工程方法分为:启发式方法,包括结构化方法、面向数据方法、面向对象方法和特定域方法;基于数学的形式化方法;用软件工程多种途径实现的原型方法,原型方法帮助确定软件需求、软件体系结构,用户界面等。

    软件质量:软件质量贯穿整个软件生存周期,涉及软件质量需求、软件质量度量、软件属性检测、软件质量管理技术和过程等。

    软件配置管理:为了系统的控制配置变更,维护整个系统生命周期中配置的致性和可追踪性,必须按时间管理软件的不同配置,包括配置管理过程的管理、软件配置鉴别、配置管理控制、配置管理状态记录、配置管理审计、软件发布和交付管理等

    产品度量:产品度量关注的是软件工程工作产品具体的、可测量的属性,帮助软件工程师认识他们所开发的软件的设计和构造。对计算机软件开发而言,定性要素总是存在的。软件工程师需要客观标准以帮助指导数据、体系结构、界面和构件的设计。测试人员需要定量指标以帮助选择测试用例及其目标。产品度量为分析、设计、编码和测试能更客观地执行和更定量地评估提供基础。

    软件项目管理:在软件从初始的概念演化为可运行的实现的过程中,项目管理涉及对人员、过程和所发生事件的策划和监控。人员:在软件项目中,每个人或多或少都做着“管理”工作。但是,管理活动的范围各不相同。软件工程师管理他的日常活动,计划和监控技术任务。项目经理计划和监控软件工程师团队的工作。高级管理者协调业务和软件专业人员之间的关系。构造计算机软件是一项复杂的任务,尤其是当它涉及很多人员长期共同工作的时候。这就是为什么软件项目需要管理的原因。

    风险管理:很多问题都会困扰软件项目,风险分析和风险管理就是辅助软件团队理解和管理不确定事物的活动。风险是潜在的一它可能发生也可能不发生。但是,不管发生还是不发生,都应该去识别它,评估它发生的概率,估算它的影响,并制定它实际发生时的时应急计划。

    软件维护:软件产品交付后,需要改正软件的缺陷、提高软件性能或其他属性、使软件产品适应新的环境。软件维护是软件进化的继续。软件维护要支持系统快速地、便捷地满足新的需求。基于服务的软件维护越来越受到重视。软件维护是软件生存周期的组成部分。然而,历史上维护从未受到重视。情况有了改变,软件组织力图使软件运营时间更长,软件维护成为令人关注的焦点

    展开全文
  • 对软件架构设计一些总结和理解

    万次阅读 多人点赞 2015-09-06 22:28:18
    软件架构是指在一定设计原则基础上,从不同角度组成系统各部分进行搭配和安排,形成系统多个结构而组成架构,它包括该系统各个组件,组件外部可见属性及组件之间相互关系。组件外部可见属性是指其他...

    1. 软件架构设计的What & Why

    ● 啥是软件架构(Software Architecture)?

    软件架构是指在一定的设计原则基础上,从不同角度对组成系统的各部分进行搭配和安排,形成系统的多个结构而组成架构,它包括该系统的各个组件,组件的外部可见属性及组件之间的相互关系。组件的外部可见属性是指其他组件对该组件所做的假设。

    软件架构设计就是从宏观上说明一套软件系统的组成与特性。

    软件架构设计是一系列有层次的决策 ,比如:功能与展现的决策;技术架构的决策;自主研发还是合作;商业软件还是开源软件 。

     

     

    为啥要进行软件架构设计?

    业务需求层出不穷;软件系统越来越复杂;参与的人越来越多;共性和特殊性的问题越来越多;技术发展日异月新;……

     

    2. 软件架构师

     

    2.1. 软件架构师是干什么的

     

    介于需求与开发的中间人     良好的沟通能力
    能够统领全局的大牛 良好的大局观
    能够将需求转换为技术     洞悉前沿与市场嗅觉
    能够为软件研发提供指导     见多识广的大牛
    需要全面思考软件系统方方面面的问题     缜密地思考问题
    能够攻关和搞定重要技术难题     公司可信赖的支柱

     

    2.2. 架构师的素质

     

    全局思维  

    从业务、市场,到技术实现;

    从软件的过去、现在,到将来;

    从外部客户,到内部研发;

    从软件研发,到硬件部署;

    从功能实现,到运行效率  

    战略思维  

    在所在行业的发展战略;

    在业务领域的发展战略;

    在技术方向的发展战略;

    在潜在市场的发展战略。

    前瞻思维  

    市场趋势的发展动向;

    前沿技术的发展动向;

    竞争对手的发展动向;

    合作伙伴的发展动向。

    抽象思维  

    各项业务需求:抽象成功能模块;

    各项功能的实现:抽象成软件架构。 

    逆向思维

    假如不实现会怎样?

    假如没搞定会怎样?

    假如没有它会怎样?

    假如被延期会怎样?

     

    2.3.  架构师的分类

    随着行业和社会的发展,架构师的定义和分类越来越广泛和细分,广泛和细分其实并不矛盾,如果“广泛”是x轴,“细分”是y轴,则二维坐标系x和y轴中间的任一点就是一种架构师类别。但总体来说,或目前来说,集合业界的大致认知,总结如下:

     

    No. 分类 描述
    1 解决方案架构师 与客户探讨业务需求,将业务、市场,与技术、产品结合起来,为客户提供解决他们需求的方案。
    2 系统架构师 也称应用架构师。最终确认和评估系统需求,并将业务转换为技术,为研发人员制订核心框架与技术规范 为研发工作澄清技术细节并扫清技术障碍 。
    3 平台架构师 这里的平台其实包括两个平台,一个是系统平台,也就是负责搭建多个系统整合的系统应用平台;另外一个其实是基础平台,是专门负责搭建基础技术平台;两者其 实区别蛮大,也经常容易被从业人员混乱。举个简单例子,金蝶有平台架构师一职,但是金蝶BOSS应用和金蝶中间件两者招聘的对象和技术要求是截然不同的。
    4 业务架构师 业务架构其实已经开始脱离技术层面了,但是它要求架构师有跨越多系统的大局观,去整合和组织不同系统的技术平台与交互模式。其实这个职位的未来也就是CIO了。
    5 网络架构师 过去,我们可能听的最多的是网络工程师。不错,一个优秀的网络架构师必须有足够的网络技术基底,并且它的关注点也是系统的基础架构。比如说如果搭建并优化集群环境,如果构建基于云计算的系统应用与部署等等。它对于像淘宝、腾讯这样的互联网公司是极其重要的。
    6 移动架构师 移动互联网的迅猛发展横向和纵向都细分出了很多新的职责和岗位,移动架构师的职责和作用日益重要,既要整体和全局考虑整个前后端的软件系统架构,又要重点深入移动客户端的架构设计的方方面面,既要有跨平台思维,又要拿捏好原生和混合开发的尺度,另外移动应用的特点,导致移动架构师必须要比传统系统架构师更加注重非功能性的质量属性。
    7 前端架构师

    这也是互联网的迅猛发展而细分出来的新的职责和岗位,这里的前端特指Web开发中的前端,主要考虑前端呈现层的设计(HTML/CSS/JS/AJAX/RIA/…),跨浏览器设计,性能优化等等。

    注:这些年,在很多互联网一线大厂,Web前端和移动客户端有融合为大前端的趋势和内在需求,所以,大前端架构师的知识领域和职责范围也有不同的涵盖和侧重。

    8 ... ...

     

    3.  软件需求

    软件架构设计中常说需求驱动架构设计,可见需求在整个架构设计中起到了关键指引和方向的作用,如果以目标导向为原则,则需求的满足和实现就是架构设计的终极目标。
    OK,在进行架构设计之前,我们先看下软件需求。

    3.1.  软件需求怎么来的(软件需求的过程)

     

    阶段

    需求阶段

    说明

    什么人做什么事

    可能产生的文档

    客户方

    实施方

    客户方

    实施方

    1

    业务需求

    高纬度抽象的需求,也是来自客户的原始需求,背景描述,业务诉求和期望目标。

    项目负责人或接口人描述需求或提供客户方需求文档。

    销售或售前接触客户,听取和记录需求。

    工作说明书(SOW),或邀标书

    售前的方案建议书

    2

    用户需求

    通常是在问题定义的基础上进行用户访谈、调查,对用户使用的场景进行整理,从而建立从用户角度的需求。

    项目负责人或接口人接受访谈和调研。

    需求分析师或项目经理等进行需求调研。

     

    调研计划、用户需求调研提问库、调研日志、用户需求说明书

    3

    软件需求

    从系统实现的角度描述的需求。开发人员(设计和分析人员)在业务需求、用户需求的基础上形成的。

     

    需求分析师或项目经理、架构师等讨论和细化需求,编写需求文档

     

    SRS(Software Requirement Specification)软件需求规格说明书

     

    3.2.  软件需求的分类:

     

    另外,也有McCall软件质量模型:

    注:在架构设计中,对非功能性需求的重视程度,也会影响架构设计的好与劣;但也要平衡过渡设计和适可而止的关系。

     

    4.  软件架构的过程

    业界软件架构设计的方法论很多,各有各自的应用场景和特点,下文结合ADMEMS(Architecture Design Method has been Extended to Method System)架构设计方法论说明软件架构的过程:

     

    架构阶段

    目标

    方式方法

    现实工作场景

    预架构阶段

    全面理解需求;需求结构化,摒弃“需求列表”,建立二维需求观(ADMEMS矩阵)。

    使用ADMEMS矩阵方法,捋清需求间关系和发现衍生需求。

    1、与人:与项目经理、需求分析师等内部需求人员了解需求;与客户了解需求(不建议架构师做需求分析师角色)。
    2、与物:了解《需求规格说明书》等需求文档。"
    3、对需求有什么问题,反馈给售前或销售,可能会参与拜访客户或电话会议。
    4、销售或售前有时会要求提供一个大致的工作量,以便他们初步评估项目可行性。

    概念架构

    高层组件及其关系

    1、初步设计,基于关键功能,借助鲁棒图进行以发现职责为目的的初步设计(不是必须)。
    2、高层分割,将复杂系统切分为多个二级系统或多个子系统。
    3、考虑非功能需求,采用ADMEMS推荐的目标-场景-决策表。

    1、参与内部讨论:项目可行性分析、讨论,从需求、技术、人力、风险等角度提供建议。
    2、项目投标准备:参与投标团队的技术方案编写,编写系统架构章节,解决招标书上技术问题的问答。
    3、参与项目讲标:作为讲标团队成员参与项目讲标,负责技术问答环节的应对。

    细化架构

     

    5视图法

    在项目概要设计阶段,进行架构设计,制定规范和约定,为详细设计提供指导。

    实现

    详细设计
    编码实现

    架构设计形成详细设计文档

    在项目实现阶段,对开发人员提供规范指引和技术支持。

     

    注:架构设计的过程和内容的不是固定不变的,现实中,比如售前提供解决方案中,很多时候需要架构师提供细化架构中才会深思的逻辑架构、物理架构等,这时候,架构师就需要有螺旋思维和跳跃思维的方式,就像武功中,招式是死的,人是活的,要学会灵活运用。

     

     

    5.  软件架构设计的方式方法

     

    5.1.  多视图法


    多视图方法是业界广泛认同的一种架构设计思路,包括:
    ● SEI的3视图法:
    模块视图、组件-连接器视图、分配视图。
    ● 西门子的4视图法:
    概念视图、模块视图、代码视图、执行视图。
    ● RUP的4+1视图法:
    用例视图、逻辑视图、开发视图、进程视图、物理视图。
    ● 联邦企业架构框架:
    技术架构视图、信息架构视图、应用架构视图、业务架构视图。
    ● ……

    5.2.  5视图法

    5视图法分析的意义:

    ● 全面分析软件系统方方面面的问题
    ● 尽早地发现和排除项目风险与不确定因素
    ● 从不同角度去展现要设计的软件系统
    ● 为项目进行中不同的干系人提供指导:
        -- 逻辑架构描述系统功能,并指导系统测试
        -- 开发架构规范软件的层次及代码风格
        -- 数据架构指导数据库的设计
        -- 运行架构定义了一些关键过程的设计
        -- 物理架构明确软件如何部署与实施

    5.3.  5视图法设计步骤

    两种观念:

     

    观念

    设计步骤

    观念一

    顺序进行:

    1、逻辑架构。

    2、开发架构

    3、数据架构

    4、运行架构

    5、物理架构

    观念二

    5个视图是穿插进行设计的,对复杂系统而言,根本不可能将逻辑视图设计完了后再考虑其它视图。

    笔者观念

    观念一和观念二的情况在现实状况中都可能存在,要根据具体情况具体分析,但总体而言,5视图穿插进行思考更有利于思考的全局性和完整性。

     

    5.4.  如何进行5视图法的设计

     

    以下5视图表格中的工具和方法每个架构师或略有差异,以下仅为参考。

    5.4.1.  逻辑架构

    逻辑架构的重点是考虑软件功能性需求。

     

    No.

    考虑的方面

    产出物

    工具

    说明

    1

    系统功能划分为几个子系统与功能模块?

    系统功能树

    树型结构图

     

    2

    向什么用户提供什么样的功能?

    用例模型

    UML用例图

    体现用户和行为

    3

    每个功能都是怎样的操作流程与分支?

    用例描述

    用例描述表

     

    含输入输出、事件流分析;

    不要有界面描述

    UML活动图

    进行业务流程分析,包括泳道图

    4

    如何通过界面与用户交互?怎样交互?

    鲁棒分析

    鲁棒图

    通过对“用例描述表”进行原文分析法拣出名词和动词

    5

    应当设计哪些类与界面?怎样设计?

    领域模型

    UML类图

     

    6

    与哪些外部系统接口?怎样接口?

    接口描述

    UML类图

     

     

    5.4.2.  开发架构

     

    开发架构重点关注的是开发编码实现方面的问题。

     

    No.

    考虑的方面

    产出物

    工具

    说明

    1

    分层结构设计

    分层架构图(开发架构图)

    各种绘图工具

    好的分层结构支持自动化测试

    2

    开发技术选项

    开发语言

    开发框架

    开发工具

     

    考虑商用产品、开源框架、自研框架

    3

    模块划分

    源码工程;Project目录结构;

    分包(分库)

     

     

    4

    开发规范

    开发/编码规范文档;

     

     

    5

    软件质量属性

    分析和决策结果

     

    考虑运行期和开发期软件质量属性,并权衡利弊进行决策。

     

    5.4.3.  数据架构

     

    数据架构不仅仅要考虑开发中涉及到的数据库,实体模型,也要考虑物理架构中数据存储的设计。

    No.

    考虑的方面

    产出物

    工具

    说明

    1

    数据是集中还是分布存储的?如何考虑分布式存储?

    数据架构图

     

     

    2

    领域模型到数据库表的转换?表结构关系的设计?

    逻辑模型

    物理模型

    ER图

    Power Designer

    Visio

     

    3

    实体如何设计?充血模型和贫血模型?

    UML类图

     

     

    4

    使用什么数据库?关系型还是非关系型?

    选型结果

     

     

     

     

     

    关系型数据库

    非关系型数据库(NoSQL)

    Oracle(首次发行:1980年)

    MySQL(首次发行:1995)

    MS SQL Server(首次发行:1989)

    PostgreSQL(首次发行:1989)

    IBM DB2(首次发行:1983)

    Microsoft Access(首次发行:1992)

    Sybase ASE(首次发行:1987)

    SQLite(首次发行:2000)

    …… 

    MongoDB(首次发行:2009)

    Cassandra(首次发行:2008)

    Apache CouchDB

    Hbase

    Redis

    db4o

    BaseX

    …… 

     

     

     

    5.4.4.  运行架构

     

    运行架构关注的不再是全局而是局部,着重关注那些关键点与难点,常常需要技术攻关与预研。主要考虑控制流、通讯机制、资源争用、锁机制、同步异步、并发、串行,同时也要考虑质量属性。

    No.

    考虑的方面

    产出物

    工具

    说明

    1

    运行:同步vs.异步;并发vs.串行

    考虑开发架构中代码的实现。

     

     

    2

    交互:对象间交互;状态转换

    考虑开发架构的合理性,到类、到接口、到代码。

     

     

    3

    质量:安全;可靠;可伸缩

    考虑开发架构的合理性

     

     

    4

    性能:响应时间;吞吐量

    估算:

    在线人数、并发人数;

    每秒事务量;

    响应时间。

     

     

     

     

     

    5.4.5.  物理架构

     

    物理架构主要考虑硬件选择和拓扑结构,软件到硬件的映射,软硬件的相互影响。

     

    考虑的方面

    产出物

    工具

    说明

    1

    网络方面:网络拓扑;网络设备;安全机制

    拓扑图

    安全规范

     

     

    2

    性能方面:可靠性、可伸缩性

    需要什么样设备性能

     

     

    3

    部署方面:集中式还是分布式;组件部署

    部署图

     

     

     

     

     

     

    6.  一个思考,谁驱动了架构设计?

     

    需求驱动了架构设计?

    质量属性了驱动了架构设计(ADD)?

    领域驱动了架构设计(DDD)?

    风险驱动了架构设计?

    质疑驱动了架构设计?

    ……

    到底是谁驱动了架构设计?我们以船舶设计建造为例,来看这些问题:

    目标和结果

    问题

    回答

    小结

    设计和制造一艘远洋货轮,能经历数月海上颠簸和长途跋涉,并保证货物的安全和完整,最后能顺利抵达目标港口。

    我们为什么要设计和制造这样的大船?

    市场有这个需求;

    获利很丰厚;

    解决就业;

    ……

    不管是外部需求还是内部的需求,都是需求。不正是需求驱动吗?

    如何保证货船能长途航行并经受波涛和风雨?

    船要造的结实;

    鲁棒性

    这些不正是质量属性驱动设计吗?

    引擎设计的强劲;

    性能

    船的燃料充足;

    持续可用性

    装备卫星电话、GPS、雷达等设备

    互操作性

    货物和人员要安全

    安全性

    船舶设计师怎么设计这样的船舶?

    现在都会通过计算机进行船舶的CAD和3D模型设计。

    是不是佷似领域模型驱动了设计?

    造船一定有很多风险吧?

    那是,比如订货方客户有时提出改装船舶的意见(需求变化的风险);有时某些工艺成品率不稳定(质量风险);等等。

    所有可能的风险点在设计时都要考虑到,做好预案,才能保证架构设计的可行性和灵活性,风险驱动了架构设计。

    上面怎么提了那么多问题,其实还有很多问题,比如……

    嗯,你现在有不少疑问了。

    不断的质疑架构设计中可能存在各种问题,有质疑才有思考,才有解决方案,从而推动架构设计的不断完善。

     

    总结:

     

    以上几个方面都能驱动架构设计,并不是零和的规则,而是一个立方体从不同方向看的问题。以上方面有些是指导思想,有些是行动方式,有的兼而有之,阐述方式看似不同,终极目标还是造出大船(实现需求),造出好船(质量属性),怎么造(领域模型),造的顺利(风险控制),挑不出毛病(架构师自己先质疑问题并解决了)。

     

     

    7.  软件架构设计的误区

     

    ● 高开高走落不到实处

    ● 理想与现实需要折中

    ● 遗漏关键性约束与非功能需求

    ● 为虚无的未来埋单而过度设计

    ● 过早做出关键性决策

    ● 客户说啥就是啥成为酱油哥

    ● 埋头干活儿缺乏前瞻性

    ● 架构设计还要考虑系统可测性

    ● 架构设计不要企图一步到位

     

     

    8.  部分参考资料

     

    温昱的《一线架构师实践指南》

     


    注:有网友问:这是自己总结,还是看书总结呢?
    我的回答是:看书是学习的过程,概念是不变真理,架构是工作内容,经验是多年积累,教训是切身体会,内容是自己总结,文章是自己码字,^_^。

    展开全文
  • 对软件测试的理解

    千次阅读 2017-12-28 20:09:07
    IEEE定义:使用人工或自动手段来运行或测量软件系统过程,以检验软件系统是否满足规定要求,并找出与预期结果之间差异。  测试对象:软件需求、软件概要设计、软件详细设计、软件源代码、可运行程序、...

     IEEE定义:使用人工或自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异。

        测试对象:软件需求、软件概要设计、软件详细设计、软件源代码、可运行程序、软件运行环境。覆盖到软件研发过程中的方方面面

        五大要素:质量、人员、资源(硬件设备、网络环境、时间)、流程(规范要求)、技术​

        目标:保证软件质量:(1)提高测试覆盖率 (2)提升测试效率​

        遵循原则​:1.测试显示缺陷的存在,但不能保证系统不存在缺陷

                         2.穷尽测试时不可能的,应及时设定测试终止条件

                         3.软件测试应该尽早进行​

    缺陷在软件研发的前期引出,越往后修复成本越高​

                         4.缺陷具备群集特性

                         5.测试的杀虫剂悖论

     采用同样的测试用例方法多次测试同一个模块不会再发现新的缺陷, 测试用例和测试方法应该不断的修改评审,引入新方法

                         6.测试的二八原则

      测试的时间和资源是有限的,测试总存在风险。 把百分之八十的时间用在百分之二十的重要模块上

                         7.测试活动依赖于测试背景

     

    软件测试分类

    按照测试阶段

    1.单元测试:对最小可视单元进行测试,针对代码

    遵循原则:(1)尽可能保证每个测试用例是互相独立的​

                   (2)一般由代码的开发人员来实施

    优点:能尽早的发现缺陷/有利于重构/简化集成(保证了最小单元的稳定性,正确性,为集成测试提供保障/文档(减少文档存在)/用于设计(设计的本身能够验证设计)

    限制:不可能覆盖到所有路径,不能捕捉到所有的路径错误

            单元测试的投入非常大(投入产出的平衡点)

     各种单元测试框架​

    Junit 针对Java的框架​

    2.集成测试(单元模块之间的借口):在单元测试的基础上,测试在将所有的软件单元按照概要设计说明的要求组装成(模块,子系统或系统)的过程中各部分工作是否达到或实现相应技术指标及要求的活动

    实施方案:Big Bang:  所有的东西组装好一起测试

                   (瀑布) 自顶向下:​递增组装,从主程序开始沿控制层逐层向下

                   (瀑布)自底向上(最常用):从程序模块的最底层逐层向上组装测试

                   (敏捷) 核心系统集成:​把核心的部分挑出来进行测试

                   (敏捷)高频集成:每隔一段时间对现有的代码进行集成测试

    集成测试与单元测试的测试对象不同,集成测试测试模块与模块的之间的关系,集成测试的主要依据是软件概要设计,单元测试依据软件详细设计​

    3.系统测试(功能和性能):将经过集成测试的软件作为计算机系统的一部分,与系统中其他部分结合起来,子实际运行环境下对计算机系统进行一系列严格有效的测试,以发现软件潜在的问题,保证系统的正常运行.(专职的测试岗位最重要)

      ​关注点:

          系统本身的使用,

          关注被测系统与其他相关系统之间的连通,

          关注系统在不同压力下使用的表现,

          关注系统在真实的使用环境下的表现

    测试对象:除了软件​之外,还包括计算机的硬件以及相关的外围设备,数据采集和传输机构,支持软件,系统操作人员等整个系统.

    倾向于​业务.

          ​

    4.验收测试:也称交付测试,针对用户需求,业务流程的正式的测试,确定系统是否满足验收标准.由用户,客户或其他授权机构决定是否接受系统.

    分类:

    用户验收测试

    运行验收测试

    合同和规范验收测试

    alpha(α)测试:开发者提供环境,用户进行测试(开发完了,开发者环境)

    Beta测试:完全脱离开发者环境,由用户在用户的环境上测试

    release:完全交付(正式交付版本)

    验收测试驱动开发​(敏捷):TDD BDD 针对用户故事条件开发

    测试手段:

    黑盒测试、白盒测试

    静态测试、动态测试

    手工测试、自动化测试

    黑盒测试:在 完全不考虑程序内部结构和内部特性的情况下,通过相关暴露出的接口来对程序进行测试,只检查程序的功能是否按照需求说明的规定能正常使用。能适当的接收输 入数据并产生正确输出信息。着眼于外部结构不考虑内部的逻辑,针对软件界面及可见功能进行测试。从用户的视角通过不同的数据事件驱动系统,根据结果进行判 断

    优点:容易实施,不需要考虑内部

              更贴近用户的视角

    缺点:视同不可见,测试覆盖率低,只能覆盖到代码的 百分之四十

               针对黑盒的自动化测试,测试用例的重用率较低​,脚本维护代价大

    主要关注点:

    是否有不正确或者遗漏的功能,其次接口上给定的输入系统能否接受并输出正确的结果

    是否有数据结构错误或外部信息访问错误,性能上能否满足用户需求

    在系统测试阶段用黑盒测试多

    黑盒测试主要设计方法:

    等价类划分法:把所有的输入当中等价的划分为一类形成若干典型的有代表性的输入,通过这些典型的输入进行测试用例设计。

    边界值分析法:关注各种各样的边界条件,编写程序时,边界值容易出现失误、

    错误推测法:基于经验或直觉来判断可能出现错误的情况、

    因果图法:拿到程序规格需求说明说明书,将程序输入输出看成原因和结果,根据规格语义说明生成判定表

    正交试验分析法:筛选输入数据然后设计测试用例的输入输出、

    状态迁移图法:通过状态迁移关系设计测试用例,如:提交审批到待审批状态,退回等等各种状态,通过状态画出变迁的关系图、

    流程分析法:梳理逻辑来进行测试用例设计

    白盒测试:测试人员对内部结构十分了解,逻辑结构是透明的。根据逻辑结构设计来设计测试用例。衡量标准:逻辑覆盖率

    语句:保证程序的每条语句至少执行一次

    判定:每个分支至少执行一次,

    条件:所有的条件表达式至少计算一次

    条件组合:覆盖所有不同条件的组合情况

    路径覆盖:每一条可能的路径至少执行一次

    优点:需要对系统有深入了解

              可以检测代码中每条分支和路径,覆盖率高

              可以检测出代码中的隐藏错误

              对代码的测试比较彻底

    缺点:昂贵,较高的覆盖率需要巨大的工作量,成本高

              无法检测代码中的遗漏路径以及难发现数据敏感性错误​

              不能够直接验证需求规格的正确性

    主要测试方法:

    代码检测法:多面检查,代码走查

    静态结构分析法:通过使用测试工具分析源代码的内部结构

    静态质量度量法:根据标准的质量

    逻辑覆盖法:6中逻辑覆盖方法​

    基本路径测试法:程序控制流图

    灰盒测试:介于黑盒与白盒,系统主键判断系统符合用户需求

    静态测试无需执行被测程序,而是通过评审软件文档或代码,度量程序静态复杂度,检查软件是否符合变成标准,借以发现编写的程序的不足之处,减少错误出现的概率​

    特点:程序不被运行,之间看文档代码,可人工也可自动化工具

    方式:互审,走查(小组走查程序或文档​),会议

    动态测试通过运行被测程序,来检查运行结果与预期结果的差异来分析运行效率,正确性和健壮性等。​

    手工测试:由专门的测试人员从用户的视角来验证软件是否满足设计要求的行为。更适用于针对深度的测试和强调主观判断的测试。

    充分利用人的主观判断和创造性来进行测试

    自动化测试:使用单独的测试工具软件控制测试的自动化执行以及对预期和结果进行自动检查

    单元测试,接口测试,性能测试多用于自动化测试

    手工测试优点:容易发现缺陷、更容易实施、创造性、灵活性

    缺点:覆盖量化难、重复测试效率低、不一致性、可靠性低、人力资源依赖

    自动化测试优点:高效率、速度快、高覆盖下、覆盖容易度量、准确可靠、不知疲劳

    缺点:机械,发现缺陷率低、一次性投入大

    展开全文
  • 嵌入式软件的理解

    千次阅读 2015-08-19 11:09:32
    嵌入式软件就是给专门嵌入式系统设计的软件,和一般PC软件差别不是很大,主要区别在嵌入式系统功耗和内存大小上有严格限制,所以嵌入式软件一定要精简,高效。 一个嵌入式系统一般都包含以下几个部分:cpu...
  • 一说到“架构”这个词,顿时感觉自己也高大上了不少(勿喷)。相信很多刚入行不久的同学来说,一说到架构就是一种云里雾里,无法捉摸的感觉。...业务架构最表层的理解就是业务模块的粒度划分。好的业务架构的设计是
  • 对软件工程的理解 这周我研读了《软件工程导论》这本书,这本书对软件工程这门学科进行了概括,并系统性的讲述了软件工程是干什么的,怎么干。书中说道软件工程是为了应对软件危机而诞生的,是指导计算机软件开发...
  • 对软件产品化的理解

    千次阅读 2016-08-11 16:43:12
    风险最大的是对于产品化的理解。 提到“产品化”,大部分技术人员,包括很多公司老板,首先想到的是可销售性,也就是免实施,“软件产品的制造成本为零,微软就是这样发财的”,这是很多人跟我这么说,为什么要做...
  • 开源软件的理解

    千次阅读 2013-09-02 11:21:40
    这是前几个月的一个作业,贴出来和大家一起讨论一下(以我blog的流量,应该也没人讨论吧,呵呵)。 读了《大教堂与集市》,对于开源软件...纵观开源软件的历史,也是一部坎坷史,同时也是一部互联网的发展史,在没有
  • 谈谈你对软件开发的理解

    千次阅读 2018-03-15 20:38:10
    我当时笔试时自己只写了软件开发流程软件开发流程:1.需求分析2.系统总体设计3.系统详细设计4.编码5.测试6.软件交付7.验收8.维护
  • 谈谈我对软件度量的理解

    千次阅读 2013-05-17 22:49:22
    在我还没搞清楚这门课之前,先来谈谈我对软件度量的理解吧!看是不是很简单。这门课虽然没什么好学的,但是确实是很重要的,这个毋庸置疑!都是些理论和方法,很空,但是都是真理!  什么是软件度量,怎样去度量...
  • 对软件工程的理解与总结

    千次阅读 2013-03-29 21:54:09
    这篇文章主要是个人对软件工程或是说软件项目理论+实践上的总结,这篇文章可以让自已对这块的主题有一个更加清晰的认识(整理思路),希望也能给您带来些帮助。   对项目前期的理解 无论大小项目,总是会有一个...
  • 对软件工程这门课的理解

    万次阅读 2018-03-20 13:09:58
    当我看到作业是谈谈自己对软件工程这门课的理解时,我是有点惊讶的,这学期刚刚开学两周,课也上了没几节,可以说我对软件工程这个概念完全没有理解。但是我想,既然是作业,我也只能强迫我自己去看书查资料说说我...
  • 当我们依据自己需要选项进行组合后,将得到不同界面和业务规则。比较常见有:报表、对于数据校验、流程等。 接着WEB页面进入了我视野。利用诸如:JSP、PHP、ASP甚至CGI等技术来生成活动界面。而太多...
  • 理想的软件开发团队组成只应该有3-5人: 船长角色:核心程序员x1,制定时间节点,构架设计和编码,完成75%-65%代码量。 大副角色:程序员x1,按照指示编码和对外沟通交流,完成20%代码量,并且作为船长备份。 ...
  • 一个优化软件的选择可以从以下几个方面进行综合评价,软件的获得难易程度,软件的使用难易程度,软件后期的服务(资料,论坛的活跃程度等),性能。 Lingo 软件比较容易上手,易于实现,用edu邮箱申请可以有半年...
  • 谈谈对软件开发的理解

    千次阅读 2014-09-04 13:51:09
    大学毕业已有三年整,一直都是浑浑噩噩,领导布置任务,然后就是自己去代码实现,今根据自己理解近来总结如下,如有不好 错误,请大家指点。 关于软件开发,我分为以下三个本质步骤: 1、从...
  • 对软件需求分析的理解

    千次阅读 2014-03-26 15:26:35
    上一篇,是从理论层次上描述需求分析,下面谈谈我需求分析看法: 一、需求获取  需求获取是根据客户特点,采用某种方式尽可能多地获取到业务基本需求,这些需求是原生,未经过加工,如有必要,用录音...
  • 对软件工程一点理解

    千次阅读 2013-10-25 16:06:18
    从大学学编程以来,写代码几乎是...编码规范和架构设计有了些感觉, 因为需求总是在变, 如果只是拼凑功能,后面维护和添加功能变得很麻烦。 这也算是一种领悟吧。见到一些程序员还是以拼凑功能为中心写代码。
  • 文件备份软件的理解

    千次阅读 2014-10-26 22:51:07
    存放信息和数据文件
  • 浅谈对软件工程认识与理解

    万次阅读 多人点赞 2016-03-11 16:47:32
     软件开发是一个把用户需要转化为软件需求,把软件需求转化为软件设计,用软件代码来实现软件设计,对软件代码进行测试,并签署确认它可以投入运行使用过程。在这个过程中每一阶段,都包含有相应文档编制工作...
  • 从开发人员角度对软件测试些许理解  对软件测试认识:  软件测试要求开发人员避免测试自己开发程序。从心理学角度讲,这是很有道理。特别是一个相对复杂系统,开发人员在刚刚开发完成时候,尚沉浸...
  • 对软件开发中的"抽象"的理解

    千次阅读 2019-03-09 23:15:54
    软件开发过程中,经常会提到"抽象"这一概念,无论是应用层、操作系统层,还是驱动层,都会涉及到抽象编程,那到底什么是抽象呢? 1 何为抽象? 1.1从哲学角度看: 抽象是从众多事物中抽取出共同、...
  • 一、建设平台架构的主要思想 对于建设平台架构,首先应注重它的工程化设计和管理,而且要用比产品和项目更加严谨的工程化思想,来进行平台构架的规划、...我认为,软件的工程化,就是在软件的构建过程中,应用...
  • 浅谈对软件企业OEM的理解

    千次阅读 2019-10-16 09:28:27
    OEM (Original Equipment Manufacturer),汉语翻译为“原始设备制造商”,含义是指定牌生产合作,通俗说法叫做“代工”。这里面代表企业,首推近期成功上市富士康公司,目前估值4000亿,也为中国OEM厂商,...
  • 要做好职业规划首先要想好我正在进行培训事情,软件测试,我也算是接触了一个月时间,期间学写了linux系统,学习了oracle,学习了c语言,这说明软件测试不仅仅是理论,也是需要了解it基础知识,也就是说...
  • 在ISO9000中质量定义是“质量促进组织所关注以行为、态度、活动和过程为结果文化。通过满足客户和相关方需求和和期望实现其价值。组织产品和服务质量取决于满足客户能力,以及相关方有益、无意...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,157
精华内容 9,262
关键字:

对软件的理解