精华内容
下载资源
问答
  • 面向对象方法学与结构方法学的异同
    千次阅读
    2019-12-07 21:10:29

    面向对象方法学与结构化方法学的异同

    面向对象方法与结构化方法都是软件开发过程中的方法。在传统的软件开发过程中多采用结构化技术完成软件开发的一系列工作,但这种方法并不适应发型软件产品的开发,而随着硬件发展,对于大型软件产品的需求又逐步提高,于是面向对象方法就应运而生。面向对象方法在上世纪八十年代中期开始被人们所关注的,而到了九十年代,面向对象方法学已经成为开发大型软件的首选范型。面向对象方法学的极大推广在目前并没有完全取代传统方法学说明了面向对象方法学目前也有缺陷需要进一步提高。那么面向对象方法学和结构化方法学之间的异同点有哪些呢,笔者认为二者不同点主要有以下几个方面:

    一、开发思想方面

    结构化方法开发的背景是在上世纪六十年代末提出软件危机之后,为了应对软件危机,软件开发的先辈们模仿当时比较成熟的工程化生产而提出一种方法。而这种方法也确实减轻或者说缓解了软件危机。结构化方法学的思想是面向过程,自上而下、逐步地分解问题,把一个大问题分解成多个小问题,小问题再分解成多个更小的问题,直到保证底层的问题足够简单,容易解决。

    面向对象方法学在开始,是编程语言而被引入的。而把对象作为编程的实体最早是上世纪六十年代由Simula 67语言引入思维。在结构化方法学提出几年之后,上世纪八十年代面向对象方法学逐渐走上历史的舞台,并在之后乃至现在大放异彩。面向对象方法学的思想是面向对象,以对象为中心,把数据封装在对象内部成为对象的属性,把面向过程的函数转为对象的行为方法,把对象抽象成为类,用以描述和设计、开发软件系统。

    二、基本概念方面

    结构化方法学又被称生命周期方法学或传统方法学。软件从设计者诞生开发想法起始,到没有人用、被废弃结束,称为软件的生命周期。传统的软件开发方法中,软件的生存周期分为三个大的阶段,即软件定义阶段,开发阶段,维护阶段。详细又可以分为问题定义、可行性分析、需求分析、系统设计、系统实现、后期维护等阶段。

    面向对象方法学是一种把面向对象程序设计语言的思想应用于软件开发过程,指导开发过程的方法。面向对象方法学由以下三部分面向对象分析、面向对象设计、面向对象程序设计组成。面向对象开发是按照人的逻辑概念,思维方式去解决问题,使软件开发时的代码重用性和可靠性大大提高。也使软件更容易被人理解,从而提高软件后期运行易维护性。

    三、开发过程方面

    结构化开发分为以下五个阶段

    1、系统规划阶段

    系统规划阶段的内容主要为明确软件的发展规划,确定用户对软件需求,并制定软件开发的计划。

    2、系统分析阶段

    系统分析阶段的内容有解析软件所对应的工作任务,工作任务中的数据和数据流图,软件的功能所需要的技术支持和选择。

    3、系统设计阶段

    系统设计阶段的工作有设计系统总体的结构,相关硬件设施的建设,相关环境的建立与进一步确定和数据库、数据结构设计等。

    4、系统实施阶段

    系统实施阶段的内容为按照上衣阶段的成果,协调技术人员开始编程同时对软件编程开发人员展开培训,测试等相关任务。

    5、系统运行阶段

    系统运行阶段的工作包括以下三个部分即对软件的运行管理,用户评价反馈,后台数据监省察。在软件运行时,一定会出现一些问题,这是也一定需要对软件进行修改,维护和调整,又时甚至会出现影响比较大的问题,如用户需求发生重大改变,相关技术革新,例如网络系统的更新换代,平台的升级更新,虽然这些问题可能出现的时间会比较晚,但也要即使监管并进行相关软件功能或者模块的升级。

    面相对象开发分为以下四个阶段

    1、面向对象分析阶段(OOA)

    这一阶段的工作主要有需求分析以及建立相关需求模型。具体来说就是建立软件中需要的相关的完整的对象,包括这些对象应具有的属性和相关行为。

    2、面向对象设计阶段(OOD)

    这个阶段的主要任务就是将上一阶段得到的需求转化为有技术能力实现的,成本符合预算的并且能够达到用户需求的软件实现方案。具体呢就是确定软件的高层架构,确定需要的类以及对外接口和实现算法等。

    3、面向对象编程阶段(OOP)

    此阶段的工作内容就是实现上一阶段的设计结果,并在编程的过程中修正出现的设计不到位的部分,实现预计的各项功能。

    4、面向对象测试阶段(OOT)

    面向对象测试阶段的主要工作任务就是测试软件各项功能是否存在问题,各项性能如容错性,稳定性,安全性等各项性能,以让软件不断完善。

    四、优劣对比的方面

    结构化方法开发

    优点

    1、传统方法学吧软件的大生命周期分成了许多小的阶段,每一个小阶段又可以分为其他多个不同的阶段,知道每个阶段的任务足够简单,实现相对独立,这样在开发时的分工合作就会比较简单,这样面对一些相同软件便可以流水线式快速高效开发。

    2、在传统方法学软件生命周期每一个阶段都会细细划分,这样也便于科学的管理开发进度使开发工作可以科学条理的开展,而且由于传统方法学中有着非常严格的审查制度,只有审查合格之后才可以进行下一阶段的开发工作。这可以在一定程度上保证软件的质量及其可维护性。而且值得肯定的是这种开发方法由于使用时间较长使其管理层面和技术层面都比较成熟,所以在一些简单的软件开发中,它的效率很高,甚至在当代一些软件开发仍然或多或少地使用传统方法学进行开发。

    缺点

    1、由于传统方法学的开发只能串行开发,前面的工作如果没有做好,就会给后面的工作带来非常大的麻烦,所以它的生产效率总体来说会比较低。

    2、由于其面向过程的局限性,软件的重用性非常差,程序冗余比较严重

    3、因为软件代码冗余比较多,这就会给后期的开发带来许多困难,这就使得软件的可维护性很低,由此带来的软件容错性、稳定性也比较低。

    4.开发出的软件无法很好地满足用户需求。由于用户一般是非专业人员,其所使用的语言逻辑,描述都可能有误差,这就导致呢软件在满足用户需求上效果不佳。

    面向对象方法开发

    优点

    1、面向对象方法学的开发逻辑和人的逻辑思维方法相近。开发大型软件难度相对降低,易被人所理解,同时也可以更好的满足客户需求。
    2、可以灵活的修改软件,软件稳定性高,这就使的后期可维护性有了很大的提高。而后期的软件升级也相对更加容易,更加稳定。

    3、面向对象的程序可重用性有了很大的提高,减少了程序冗余,代码重复,这在一定程度上也降低了开发难度,同时便于维护。

    缺点

    1、面向对象开发也存在着许多弊端,由于面向对象对环境的依赖,虽然大部分拥有了不错的跨平台性能,但需要依赖环境的支持,而相关的开发软件并不全面充分。

    2、面向对象开发不大适合比较大型的信息管理系统开发,而如果从整体设计划分不合理的情况下,会导致系统结构有较大缺陷,关系无法正常分配。

    3、由于其开发逻辑思维与人相似,所以无法从科学的角度管理和优化开发。

    五、对以上总结如下:

    传统方法学编程是以过程为中心的,尽量把大的程序划分为许多个相对独立、功能尽可能简单的小的程序模块,其强调重视过程,重视功能的结构化,和简单化。最终实现功能是通过一系列过程的调用和处理来完成。虽然经过时间累积开发人员们的不断完善,传统开发方法一直都有新的成果,模式出现,但无可避免的被面向对象开发方法所冲击。

    面向对象编程是将对象作为中心的,其功能的实现是对一系列相关对象的操作,给对象发送消息,再由对象来执行相对应的一系列操作并返回结果,重在强调对象。而在理论上,面向对象的程序设计方法可以生产更良好的模块内聚和耦合特性,更好得实现软件开发的逻辑原则,这也使得面向对开发的软件更易于重用与维护,也相对更加稳定,质量也相对更高。

    更多相关内容
  • 、什么是自动测试自动测试是把以人为驱动的测试行为改成机器执行,通过精心设计的测试用例,由机器按照测试用例的执行步骤对应用进行自动操作,然后输出结果,由测试人员进行比较。自动测试可以极大的节省...

    一、什么是自动化测试

    自动化测试是把以人为驱动的测试行为改成机器执行,通过精心设计的测试用例,由机器按照测试用例的执行步骤对应用进行自动操作,然后输出结果,由测试人员进行比较。自动化测试可以极大的节省人力、时间和硬件资源,提高测试效率。

    大白话就是: 写好自动操作app的脚本,运行起来,输出结果,结果正确,app正常测试没问题。

    二、移动自动化测试的流程

    1. 通过id、name、xpath等方法定位页面元素

    2. 对定位到的页面元素执行相应的操作

    3. 对操作后出现的结果和预期结果做一个比较

    三、移动自动化测试的优点

    1. 对程序员来说,在提交代码之前,可以先进行回归测试,这样能提高代码质量,加快代码上线速度。

    2. 自动化测试能够很方便的自动完成安装/卸载、启动/运行、UI适配等枯燥的手工测试环节,节省很多时间,在准确编写测试脚本的前提下,能够帮助测试人员完成更多要求。

    3. 脚本和框架一般在iOS和Android平台是通用的,同一测试脚本适用于所有Android机型,可快速完成兼容性测试。

    4. 可以模拟产生数据。通过一些重复的操作,产生一些简单的数据。能够保存截图、输出log、输出错误信息。

    5. 可以长时间运行,并保证数据的正确性,避免人工测试的人为错误。

    6. Android可以通过局域网,多设备多脚本多case连续测试。

    7. 可以借助透视宝对应用性能进行全面诊断。比如,用户提供安装有透视宝SDK的apk/ipa的安装包,就可以对用户的APP进行一次整体测试,产生一份包括崩溃、内存泄漏、网络监控和UI性能测试的具有洞察力的详细报告。目前云智慧的很多客户在产品发布之前都要先绑定透视宝SDK,之后在 testin、百度云测、腾讯优测等平台进行测试之后才评估是否使用。

    8. 不需要重新编译APP。

    四、移动自动化测试的缺点

    1. 需要借助Appium工具来录制脚本,而Appium是第三方的开源工具,需要布置环境。

    2. 可通过Xcode自带的Instruments或者Android自带的UIAutomator工具录制脚本,要会简单使用xcode和eclipse。

    3. 录制成功的脚本代码需要重新编写,来输出结果、进行截图、输出错误信息等,需要会编写简单的python或者JS脚本。

    4. 每次要测试一个新app的时候,都要重新设计测试用例,重新设计输出规范和记录内容,重新生成标准化的测试报告。

    5. 需要对结果进行逻辑处理,需要人工比较、分析。

    6. 没办法手机录脚本,需要配合客户端。

    7. 框架维护不易,复用率低。

    五、移动测试自动化框架(Android)

    1. Appium (IOS/Android)

      • 开源、跨平台的自动化测试工具,适用于测试原生或者混合型的移动app,支持ios、Android和FirefoxOS平台,利用它,开发者可以利用测试代码完全访问后端api和数据库。Appium是无须SDK和编译就可以对原生应用进行测试的。
      • 可以直接在PHP 、Python、Ruby、C#、Clojure、Java、Objective-c、JavaScript、以及Perl等语言中编写测试脚本。
    2. Colabash (IOS/Android)

      • 支持Cucumber,开源免费,可进行多方位测试:截屏 手势识别 实际功能代码等
    3. Robolectric (Android)

      • 基本上摆脱了模拟器测试的老套路的单元测试框架,可以解压Android Sdk,还能直接对应用进行测试
    4. App Grader (Android)

      • App Grader是以色列uTest的,比较少人知道,但是它能为众多的Android开发者提供非常专业的意见参考
      • 开发者可以将自己开发的应用和其他同类型应用就图形、功能及其其他地方进行比较,之后还会推出ios

    5…

    六、Appium

    1. 我选择的是Appium,为什么呢?

    1. 同时支持android、ios、混合app
    2. 支持多语言,PHP 、Python、Ruby、C#、Clojure、Java、Objective-c、JavaScript、以及Perl
    3. 能与大多数主流开发测试工具集成,可是使用任何测试框架驱动Appium
    4. 不会要求测试人员修改或者重新编译待测应用
    5. 有一个活跃社区

    2. Appium简介

    • Appium 是由Sauce Labs 提供支持的一款自动化测试框架,针对原生(native)、混血(hybrid)、和移动Web应用,使用WebDriver协议来驱动ios和Android
    • Appium的设计理念是测试原生应用,不应该要求用户引入额外的SDK或者重新编译应用,另外Appium应该能与测试人员喜欢的测试实践、测试框架、测试工具一起使用。
    • Appium 旨在用户可以通过任何语言以及任何测试框架去自动化测试任何移动应用,另外通过测试代码可以访问后端的API和DB

    3. Appium的要求

    针对Anroid:

    Mac OSX 10.7+ 或者 Windows 7+ 或者 Linux
    Android SDK >= 16 (SDK<16 使用Selendroid 模式)

    4. Appium概念

    1.服务端/服务器架构

    appium的核心其实是一个暴露了一系列REST API的server。

    这个server的功能其实很简单:监听一个端口,然后接收由client发送来的command。翻译这些command,把这些command转成移动设备可以理解的形式发送给移动设备,然后移动设备执行完这些command后把执行结果返回给appium server,appium server再把执行结果返回给client。
    在这里client其实就是发起command的设备,一般来说就是我们代码执行的机器,执行appium测试代码的机器。狭义点理解,可以把client理解成是代码,这些代码可以是java/ruby/python/js的,只要它实现了webdriver标准协议就可以。

    这样的设计思想带来了一些好处:
    1. 可以带来多语言的支持
    2. 可以把server放在任意机器上,哪怕是云服务器都可以;(是的,appium和webdriver天生适合云测试)

    2. Session

    自动化测试总是基于会话内容来实现的,客户端与服务端初始化会话方式,具体到不同的库有区别,但它们最终都会发送一个post/session 请求到服务器,携带一个名为Desired Capabilities的JSON对象,服务器将会自动化会话并响应一个Session ID用于发送后续命令

    3. Desired Capabilities
    Desired Capabilities是一组发送到服务器的键和值(map and hash),告诉服务器测试人员期望建立的自动化会话类型,这里有各种类型的属性,可以用来改变服务器在测试期间的行为。例如,可以设置platformName属性值为Android,以便告诉Appium我们期望Android会话而不是IOS

    4. Appium Server
    Appium是用Node.js写的服务器,它可以通过源码构建和安装或者直接通过NPM安装,这里不建议用命令安装,外国网你懂的,下一篇文章教大家安装。

    5. Appium Clients
    Appium提供了Java、Ruby、Python、PHP、JavaScript、和C#语言的客户端库,都是基于WebDriver协议扩展的,当使用Aoppium时候,测试人员可以使用他们来代替标准的WebDriver客户端,可以在

    6. Appium.app 和 Appium.exe
    Apppium提供了Appium server的GUI封装下载,它们包含了运行Appium server所需要的都东西,所以不用担心node,它们还携带了Inspector,用于检查windows应用撑血的结构,但是Windows下用不了,我这里用 Android Device Tool。

    5. Appium的原理

    Appium基于WebDriver,利用Bootstrap.jar,最后通过UiAutomator的命令,实现app的自动化测试,如图。

    这里写图片描述

    图解析:

    • 左边是WebDriver script 是我写的测试脚本
    • 中间是Appium服务,Appium启动一个服务(默认4723),与Selenium-WebDriver测试框架类似,Appim支持标准的WebDriver JSONWireProtocol,它提供一套Web服务,Appiumm Server接收WebDriver标准请求,解析请求内容,调用对应的框架响应操作,例如:脚本发送一个单击按钮请求给Appium Server
    • Appium server 会把请求转发给中间件Bootstrap.jar,它使用java编写的,安装在手机上,Bootstrap接收Appium命令,最终通过调用UiAutomator的命令来实现。
    • 执行结果由Bootstrap返回给Appium Server
    • Appium还用到了Chromedriver来支持基于WebDriver的测试。

    七、什么是黑盒白盒测试

    • 黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。并没有通过检查程序的源代码或者很清楚地了解该软件的源代码程序具体是怎样设计的。测试人员通过输入他们的数据然后看输出的结果从而了解软件怎样工作。

    • 白盒测试:是通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修正。

    二者最大的区别应该就是测试对象不一样,白盒测试主要针对的是程序代码逻辑,黑盒测试主要针对的是程序所展现给用户的功能,简单的说就是白盒测试后台程序,黑盒测试前台展示功能

    so,你说appium是什么测试呢?

    展开全文
  • 聊分布式对象存储

    千次阅读 2018-11-12 15:20:41
    今天来聊聊我正在读的本分布式对象存储的书籍。 前天11月10号,想着京东有满200-100的活动,就买了一些书,准备沉淀一下。自己打算在分布式系统上搞几年,所以买的书基本上都是关于分布式存储的。本身也没想着买...

    1. 前言

    今天来聊聊我正在读的一本分布式对象存储的书籍。

    前天11月10号,想着京东有满200-100的活动,就买了一些书,准备沉淀一下。自己打算在分布式系统上搞几年,所以买的书基本上都是关于分布式存储的。本身也没想着买一些分布式系统的经典教材,就随便选了几本京东上销量比较高的,偏实用一些的书籍。权当心血来潮,未经过任何调研。

    当前看的这本是《分布式对象存储-原理,架构和go语言实现》。

    2. 总体感觉

    书今天上午开始看,还未看完,先说一下总体感觉,从半价角度上来说,这本书物超所值,如果是给有一定编程能力且打算入行分布式系统的同学看,那么就更值得了。对于想自己动手实现一个分布式系统的同学,按照书中的代码,一点点的敲,完整实现一个分布式的对象存储不成问题,应该会有不少的成就感。然而若是给架构师或者研究分布式的同学看,不是很建议,内容显得过于宽泛且不够深入(主观感觉)。书中虽然知识点众多,但各个知识点有效篇幅内容明显不足,而且更大的困扰是各种实现层代码散布全书,导致真正在讲关于分布式的核心内容就更少了(不过对于一个想自己实现一个系统的同学来说,更多的代码反而更好,这就显得仁者见仁智者见智了)。保守估计关于代码以及代码的函数流程的阐述占据了全书的1/2,甚至更多。

    • 优点
      完整的讲述了一个分布式对象存储从0到1的过程,不断改造和扩展新功能,循序渐进的方式来讲解,是其优势之处。书中涉及到知识点很多,有分布式系统的基本涉及,元数据管理,去重,纠删码,压缩等,也就是说的常见的分布式系统的feature方面都有,能够给一个不在这个领域的人一个宏观的感知。例如,本书能够回答的是目前的分布式系统的架构是如何,有什么主要特性。
    • 缺点
      大量的代码让我遇到代码的时候都大量的跳跃,一上午的时间,读了三章(其实很多代码都没有细看,主要看了架构设计以及思路设计),收获偏小。但是因为自己还没有读完,所以也没有太大的发言权,只是自己一厢情愿的看法而已了。

    3. 内容总结

    看书不总结书中内容,对于记忆力很差的我,等于白看,因此现在把我看到的内容写下来,权当一记录,也希望能够给其他想买这本书的同学一些参考。

    3.1. 对象存储简介

    传统的存储系统有NAS和SAN,它们本质上是两个点,NAS是相当于有一个文件服务器,可进行文件上传和下载等操作,而SAN更强调storage的概念,它将多个存储设备组成一个整体,对外只提供storage的功能,而没有文件等上层抽象概念,可以把它想象成一个大的网络硬盘。这些内容其实与对象存储并不矛盾。对象存储按照其名字来说,核心就是将对象进行存储。对象有唯一标识,可认为是key,而对象的数据,可认为是value。

    如果实现一个单机版本的对象存储呢?
    基于Go语言,使用REST请求(GET用于下载,PUT用于上传)

    1. 启动一个Listen Service,并且绑定handler(处理函数)
    2. 在处理函数判断是GET还是PUT请求然后进入不同的处理
    3. 如果是GET请求,直接根据路径,拿到对象的内容(其实就是一个本地的file文件),返回给客户端
    4. 如果是PUT请求,根据路径,将post的body写入到指定的文件中
    5. 客户端模拟使用curl,可用于演示put和get请求

    这里不得不说go实现真的好简洁,寥寥几十行,就实现了基本的HTTP服务,并能读写文件数据返回到客户端。

    书中很多地方说了REST,原来并不知道这种称呼,简单看了一下网上的介绍也不甚了了,基本感觉就是提供了数据访问的接口的标准定义,都按照这样的标准请求和返回,方便解析。有点像HTTP的规范定义版本?

    3.2. 分布式系统

    对于3.1的单机对象存储,最先要做的就是实现分布式,也就是可扩展性。要想做到这一点,一个重要的概念就是请求和数据分离。其实就是有专门的接口服务负责接收请求并转发(感觉好像代理服务器,但是不同的是它需要维护数据节点的状态信息),有专门的数据服务负责数据的存储。这样的话,如果容量不足需要扩容数据存储,直接拉几台机器加入到数据集群中即可。

    CSDN上的PDF版本需要5分,奈何没那么多积分,只能手机拍照截图了。

    如上图所示,为了实现两个服务的分离,接口存储和数据存储需要加入中间层,以隔离两个服务。 本书使用RabbitMQ(看着像消息队列Kafka),负责上下层之间的消息转发。当客户端的写入操作到达接口层,需要找到相应的数据节点,完成写入;当客户端的读取操作到达接口层,也需要找到存储的节点,发起读取;另外接口层需要知道哪些数据节点是alive的,这样以便于写入的时候避开挂掉的数据节点。

    欲完成以上功能,需要如下:

    • 心跳
      数据节点每间隔一断时间(5s)发起心跳请求消息,扔到apiServer exchange中(感觉像kafka的topic)。接口服务作为消费者,消费apiServer中的消息,收到某个节点心跳就记录当前节点。注意,这个心跳消息会广播到所有的接口服务(说是广播,其实从本质上是所有的接口服务都独立订阅了apiServer,都能收到apiServer中的全部消息)。这样每个接口服务都能看到所有的数据节点,接口服务节点之间没有任何差异,这也就实现了接口服务的平行扩容。
    1. 客户端发GET到接口服务
    2. 接口服务生产消息到dataServer
    3. dataServer中的消息被所有的数据节点消费,只有具有指定对象的data节点才会返回,并返回其监听地址
    4. 接口服务收到data节点的监听地址后,向data节点发起数据读取请求
    5. 接口服务节点将读取到的数据返回给客户端

    • 与读的过程基本一致,不同的是写入的节点是随机选取的其中一个,然后是将数据传递到数据节点,交给数据节点写入。

    总体来说,读和写的过程可以归结为两个步骤:

    1. 定位数据节点(对于读,只有存储了请求对象的节点返回;对于写,随机选择)
    2. 发起数据读写(接口节点和数据节点传递对象的内容,或者写入,或者读出)

    这里面有一些问题:

    1. 所有的数据读写请求,都完整了经过了接口服务和数据服务,似乎有点浪费,是否能够做到将数据服务的节点返回给客户端,由客户端发起读取操作呢?
    2. Put同一个对象,可能到达不同的数据节点,从而存储多份数据
    3. 不可容错,当前的数据节点丢了一台,数据就丢了
    4. 是否需要一致性Hash?目前的对象的节点定位要求所有数据节点都参与,也就是说接口节点不知道对象的位置,从而不得不向所有的数据节点发起询问,如果采用hash求模的方案,就可直接根据hash模值定位到数据节点。
    5. 数据版本号。如果能够使得一份数据有多份版本?

    上面的很多问题,需要很多内容才能完善。例如版本号是一种数据一致性的方案(MVCC),那也有很多其他的方案,不过文中并无涉及;关于数据hash,有不少保证一致性hash的方案,也无涉及。

    3.3. 元数据服务

    说实话,在看到元数据服务的时候,以为要自己实现一套元数据的存储方案,仔细一读发现使用的是ES(elasticSearch)。对于ES,同样不熟悉,等后面看是否专门写个博客介绍一下。简单来说,ES负责存储对象的元数据信息,接口服务利用ES返回的元数据从而数据节点中取得对象的Value。

    为什么会有这个ES? 对象要支持多版本访问(既有最新版本,也有历史版本),使得对象要有版本号的概念,另外数据本身可能还有长度属性,类别属性(是图片还是文本等)等等的内容,这些内容不可能存储在接口服务器中的。因为如果存在接口节点中,接口服务就无法做到数据一致性了,例如通过接口节点A增加了一个新的对象,接口节点B就无法感知到,客户端向B请求,会报告对象不存在。从本质来说,正是由于接口服务节点的无状态特性(只负责转发请求,不过本文中还维护的data节点的alive),才赋予了接口服务节点的平行扩容能力。ES充当了中心化的有状态服务,给接口节点提供元数据查询服务,所有的更新操作都会经过ES,从而确保数据的一致性。

    那如何设置一个对象的元数据metadata,简单起见,使用四种属性:name,version,hash,size
    唯一标识:

    • name和version唯一标识一个对象。客户端可使用name+version向ES发起请求,ES返回其metadata;
    • hash唯一标识一个对象。数据存储以hash作为唯一标识,请求数据服务时候,需要传入hash值。

    这种上层name+version,下层hash的操作有一定的好处。从上层客户端使用来说,name才是最容易记忆和关心的,对外公开使用name更易记忆和理解;从底层存储服务来说,只需要唯一标识?那为何不使用name+version呢?这主要因为hash值提供区分文件是否unique的属性。假设文件A和文件B的内容完全一样,如果使用name+version的方式数据需要存储两份,而使用hash值,只需要存储一份(这其实是属于Dedup研究的范畴Dedup简介, Dedup一种应用),只要在元数据映射中记录A -> Hash Identifier, B -> Hash Identifier即可。

    以GET操作为例

    1. curl向接口服务发起Get object请求,传入name;
    2. 接口节点向ES发起name的元数据;
    3. ES返回name的元数据,未指定版本则返回最新版本(name, version, hash, size)的元数据;
    4. 接口节点使用hash值向data节点发起定位请求(数据存储在哪个data节点上);
    5. 存储了该object的data节点返回自己监听的地址;
    6. 接口节点利用返回的data地址,向其发起对象读取请求;
    7. data节点返回对象的value信息;
    8. 接口节点将value转发给curl客户端。

    额外的问题:

    1. 上传数据的时候需要指定hash值,这个hash值服务器并无校验
    2. 数据传输通路完整的经过接口服务节点
    3. 元数据需要保证数据一致性,例如多个写请求同时到达,进行版本增加以及数据存储要保证原子操作。

    3.4. 校验去重

    在分布式系统中,通常有来自不同用户的相同的数据。存储多份相同的数据会增加存储开销,那么如何进行数据去重呢?本书采用的是基于对象的hash去重:对整个object计算hash值,如果存在此hash值,那么可认为已经存储了此数据。

    Hash处理流程

    用户上传对象的时候提供hash值和数据,这本身需要服务器进行校验(比对hash值),只有校验合格的数据才会被服务器接收。而另一方面,接口服务必须在收到完整数据的情况下,才能够进行hash比对。

    temp对象的使用

    如何确认一个hash值已经存在? 感觉本书的方法还是比较巧妙的。假定用户上传的数据X的hash值为hash_ori,上传后首先将数据写入到数据节点的temp目录下,并由接口节点计算其hash值为hash_temp。接口节点随后比对hash_ori和hash_temp,如果一致,那么调用PUT命令,将temp路径下的数据转正,并删除temp的数据,如果不一致,直接删除temp数据,并返回客户端hash不匹配。

    操作流程如下:

    1. 客户端上传数据X和hash值h
    2. 接口定位此hash值,如果存在,表明文件已经存在,直接添加元数据到ES中
    3. 如果不存在,那么向数据服务请求一个uuID,并将数据写入到temp/uuID中
    4. 接口在传递数据的过程中,同时计算hash值,并与客户端的hash值进行比对
    5. 比对成功之后,将临时对象转正(其实就是数据服务移动并重命名文件)
    6. 删除临时对象temp/uuID

    3.5. 冗余恢复

    这算是我多年的研究领域了,将一个数据拆分成k个数据块,然后用这k个数据块生成m个校验块,这k+m个数据块称为一个条纹。这个条纹内任意k个数据块都可以构建出原始数据,因此可以容忍任意m个数据块的丢失。现在分布式系统常用的是里德所罗门RS编码,参数化形式为RS(k, m)。

    在实现RS编码的时候,有两种数据布局方式,一种是stripping方式,一种continuous。
    Stripping:读取文件可以并发读取,同时建立4个数据流,每个流中读取一个小的block,一轮读取完毕后,再下一轮;
    Continuous:读取文件只能按顺序读取,每次读取一个完整的block,这个block读取完毕后,开始读取下一个block。

    假定每个数据块2MB,包含两个小块。对于一个8MB的文件,使用RS(4, 2)编码
    对于Stripping方式(每列代表一个数据块),则

    1 2 3 4 P P
    5 6 7 8 P P 
    

    对于Continuous方式,则

    1 3 5 7 P P
    2 4 6 8 P P
    

    本书使用的是Stripping方式,接口节点首先与数据节点建立6个数据流通道,对应的数据分片文件名命名为X.0, X.1… X.5(其中X为对象的hash值),然后将客户端PUT上来的数据流进行切片,每个小片8KB,因此每读取32KB进行RS(4, 2)编码,生成6个小片,并将这6个数据片传输到数据节点上,直到传输完成。

    读取可操作的余地就非常大了,对于用户读取X,一种是进行online recovery,同时返回6个分片的地址,然后全部都读取,可能出现有些分片丢失,只要有4个分片OK就可以直接重构出来,并写入;另外一个角度是应对慢节点:只要有4个分片返回,就中断其他的传输,然后重构原始数据返回给客户端,慢节点的问题能解决的很好。

    3.6. 断点续传

    这个没啥特别的,最重要是个offset和length的概念。

    下载:给出offset,开始下载
    上传:先请求上次写入的offset,从offset开始上传数据。

    3.7. 数据压缩

    数据压缩应该最好在客户端进行,减少网络传输。使用现有的压缩算法(很多开源的库)即可。
    常用的压缩算法:zlib, defalt, gzip, bzip2

    3.8. 数据维护

    系统维护至关重要

    1. 删除过期数据(例如很老的版本的数据清除)
      一个对象存储完整的历史版本并不实用,这样存储开销会很大。因此,需要有相应的机制来清除历史版本,释放存储开销,例如只保存最近的几个版本即可。
    2. 数据节点的定期清理无用数据
      有些数据可能没有元数据引用,例如删除对象,元数据已经删除,但是数据本身可能由于网络等问题,并没有立刻被清除,对于这些无用数据也要清理。
    3. 数据节点的检查和修复(类似于HDFS的block scanner)
      根据文件名hash值与文件内容计算的hash值进行比对,如果不一致,表明此数据损坏,需要启动数据恢复。

    竞争条件

    删除数据的关键点是不能删除被使用的数据。 例如有一种情况,

    1. 后台清理发现有一个无用数据D,
    2. 用户上传了一个文件,它的hash值和这个无用数据D相同,
    3. 后台维护程序清理了无用数据D
    4. ES添加了一条指向数据D的引用
      也就是说,数据准备删除过程中,却被外界引用。本书针对这种情况,先移动此无用数据到回收站,过一个月再删除,但是这样一个月后还是会出现这个问题啊,引用的数据还是被删除了。根本原因在于,不应该引用一个已经被删除(无元数据)的数据。用户上传文件,判断hash值是否存在只能基于ES中的内容判断,而不能基于数据节点上的数据判断,数据节点上的数据是不可靠的,随时可能会发生变动。

    4. 书籍的额外建议

    1. 每一章前面一个作者的ppt的照片,感觉不是很好,技术书籍很少见,给人以凑页之嫌。
    2. 书中的很多知识点都是feature之类的,并没有学到比较深刻的分布式系统知识 。

    参考资料:

    展开全文
  • 软件工程原则: 抽象与自顶向下,逐层细化 信息隐蔽和数据封装 模块 局部 确定性 一致性和标准 完备性和可验证性 瀑布模型: 开发活动的特征:(1)以上项活动方产生的工作对象为输入(2)利用这输入,实施...

    谁能告诉我这科的理论在哪可以实用呀?搞不懂,只能收藏一下包不挂科

    知识点总结

    第一章:

    软件工程定义

    1968年10月,Fritz Bauer 首次提出了“软件工程”的概念,并将“软件工程”定义为:为了经济地获得能够在实际机器上有效运行的可靠软件,而建立并使用的一系列工程化原则。

    1993年IEEE对软件工程的定义:软件工程是将系统化的、规范化的、可度量的途径应用于软件的开发、运行和维护的过程,即将工程化应用于软件的方法的研究。

    软件工程原则:

    抽象与自顶向下,逐层细化  信息隐蔽和数据封装 模块化 局部化 确定性 一致性和标准化 完备性和可验证性

    瀑布模型:

    开发活动的特征:(1)以上一项活动方产生的工作对象为输入(2)利用这一输入,实施本项活动应完成的内容(3)给出该项活动的工作结果,作为输出传给下一项活动(4)对实施该项活动的工作结果进行评审,若其工作得到确认,则继续进行下一项活动,否则返回前项,甚至更前项的活动进行返工

    瀑布模型的优点:

    (1)可强迫开发人员采用规范化的方法

    (2)严格地规定了每个阶段必须提交的文档

    瀑布模型的缺点

    (1)由于瀑布模型几乎完全依赖于书面的规格说明,很可能导致最终开发出的软件产品不能真正满足用户的需要。如果需求规格说明与用户需求之间有差异,就会发生这种情况(2)瀑布模型只适用于项目开始时需求已确定的情况。总地来说,瀑布模型是一种应付需求变化能力较弱的开发模型,因此,很多在该模型基础上开发出来的软件产品不能够真正满足用户需求

    第二章:

    可行性研究的过程:

    1. 复查系统规模和目标

    复查系统定义,改正含糊或不确切的叙述,清晰地描述对目标系统的一切限制和约束

    1. 研究目前正在使用的系统

    现有的系统是信息的重要来源。若一个软件是对旧系统的改造,那开发新系统时,要充分了解老系统存在的问题,需要增加的功能,新系统实际上是老系统的部分功能加上一些新增功能形成的系统

    1. 导出新系统的高层逻辑模型
    2. 重新定义问题

    新系统的逻辑模型实质上表达了分析员对系统必须做什么的看法,得到新系统的高层逻辑模型之后,可能会发现前面问题定义的范畴过大,分析员还要和用户一起再复查问题定义,对问题进行重新定义和修正。

    1. 导出和评价供选择的解法

    分析员应该从系统逻辑模型出发,研究问题的几个组成部分,细化各功能点,导出若干个较高层次的物理解法供比较和选择

    1. 推荐行动方针
    2. 草拟开发计划

    任务分解 进度规划 财务预算 风险分析及对策

    1. 书写文档提交复查

    第三章:

    一.软件需求的定义:

    以清晰、简单、一致且无二义性的方式,描述用户对目标软件系统在功能、行为、性能、设计约束等方面的期望,是在开发过程中对软件系统的约束。

    二.需求分析的任务

    1. 业务需求:是客户对于软件系统的高层次目标要求,定义了项目的远景和范围
    2. 用户需求:从用户角度描述软件系统的功能需求与非功能需求,通常只涉及系统的外部行为。
    3. 功能需求:功能需求描述软件系统应该提供的功能或务,通常涉及用户或其他外部系统与目标系统之间的交互,不考虑目标系统内部的实现细节
    4. 非功能需求:非功能需求即性能需求,反映了客户对软件系统质量和性能的额外要求
    5. 约束条件: 约束条件是软件系统设计和实现时必须满足的限制条件
    6. 业务规则: 业务规则是对某些功能的可执行性成内部执行速制的一些限定条件
    7. 外部接口需求:    外部接口需求是描述目标系统与外部环境之间的交互接口
    8. 数据定义:当用户描达一个数据项或一个复杂的业务数据结构的格式或缺省值时,正在进行数据定义

    第四章:

    启发规则

    启发规则是软件结构设计优化准则,软件概要设计的任务就是软件结构的设计,为了提高设计的质量,必须根据软件设计原理设计软件,利用启发规则优化软件结构。

    1.改进软件结构提高模块独立性2.模块规模适中3.适当控制深度、宽度、扇出、扇入

    4.模块的作用域应该在控制域之内5.力争降低模块接口的复杂程度

    6.设计单入口单出口的模块7.模块功能可预测

    第五章:

    详细设计的过程

    软作详细设计是软件工程的重要阶段,在详细设计过程中,细化了高层的体系结构设计,将软件结构中的主要部件划分为能独立编码、编译和测试的软件单元,并进行软件单元的设计,同时确定了软件单元和单元之间的外部接口。

    一.详细设计的基本任务

    1. 算法设计:用某种图形、表格、语言等工具将每个模块处理过程的详细算法描述出来
    2. 数据结构设计:对于需求分析,概要设计确定的概念性的数据类型进行确切的定义
    3. 物理设计: 对数据库进行物理设计,即确定数据库的物理结构
    4. 其他设计

    a.代码设计:为了提高数据的输入、分类、存储及检索等操作的效率,对数据库中的某些数据项的值要进行代码设计b.输入/输出格式设计c.人机对话设计

    1. 编写详细设计说明书  6 . 评审:对处理过程的算法和数据库的物理结构要进行评审

    .详细设计方法:

    1. 自顶向下,逐步求精  2.具有单入、单出的控制结构 3. 五种控制结构:顺序结构,选择,先判断型循环结构,后断型循环结构,多选择分支结构

    第七章:

    一.测试用例设计:

    白盒测试是对软件的过程细节做细致的检查。这一方法把测试对象看作 个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信息设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与期望的状态一致。

    覆盖标准

    1. 语句覆盖

    含义:就是选择足够多的测试用例,运行被测程序,使得程序中每条语句至少执行一次。

    1. 判定覆盖

    含义:又称为分支覆盖,在设计测试用例,针对程序中具有分支结构的部分,为了测试所有的可能结果,需要将每个分支都至少执行一次,查看相应的语句执行情况和结果

    (1)a=2,b=0,x=4,覆盖RACBDE

    (2)a=3,b=1,x=1覆盖 RABE

    1. 条件覆盖

    条件覆盖是指设计测试用例时,除了保证每条语句执行一次,还要使判定表达式的每个条件的各种可能取值都至少执行一次,为了实现条件覆盖,保证各种可能的条件都取值,即保证

    第一个判断有以下取值:a>1,a<=1,b=0,b≠0

    第二个判断有以下取值:a=2,a≠2,x>1,x<=1

    选择两组测试用例:

    (1)a=2,b=2,x=2(满足a>1,b≠0,a=2,x>1的条件),执行路径为 RABDE

    (2)a=1,b=0,x=0(满足a<=1,b=0,a≠2,x<=1的条件),执行路径为RABE

    1. 判定/条件覆盖

    单独使用判定覆盖和条件覆盖测试结果都不够全面, 若将两种覆盖结合,就会相互补充,判定/条件覆盖就是设计足够多的测试用例,使得每个判定表达式中的每个条件都取到各种可能的值,并且使每个判断语句的所有判断结果至少出现一次。

    (1)a=2,b=0,x=2(满足a>1,b=0,a=2,x>1的条件),执行路径RACBDE

    (2)a=1,b=1,x=1(满足a<=1,b≠0,a≠2,x<=1的条件),执行路径RABE

    1. 条件组合覆盖

    条件组合覆盖就是设计足够多的测试用例,使得每个判定表达式中条件取值的各种组合都至少出现一次。根据每个判定表达式情况,列出如下条件组合

    (1)a>1,b=0,A表达式为真;(2)a>1,b≠0,A表达式为假;(3)a<=1,b=0,A表达式为假

    (4)a<=1,b≠0,A表达式为假;(5)a=2,x>1,B表达式为真(6)a=2,x<=1,B表达式为真;

    (7)a≠2,x>1,B表达式为真;(8)a≠2,x<=1,B表达式为假。

    选择以下四组测试用例

    选择条件a=2,b=0,x=2,(1)、(5)组合,执行路径 RACBDE

    选择条件a=2,b=1,x=1,(2)、(6)组合,执行路径 RABDE

    选择条件a=1,b=0,x=2,(3)、(7)组合,执行路径 RABDE

    选择条件a=1,b=1,x=1,(4)、(8)组合,执行路径 RABE

    1. 路径覆盖

    就是选取足够多的用例,保证程序的所有路径都至少执行一次,如果存在环形结构,也要保证此环的所有路径都至少执行一次。

    (1)a=1,b=1,x=1(满足a<=1,b≠0,a≠2,x<=1的条件),执行路径为RABE

    (2)a=2,b=0,x=2(满足a>1,b=0,a=2,x>1的条件),执行路径为 RACBDE

    (3)a=2,b=1,x=2(满足a>1,b≠0,a=2,x>1的条件),执行路径为 RABDE;

    (4)a=3,b=0,x=1(满足a>1,b=0,a≠2,x<=1的条件),执行路径为 RACBE

    二.测试的步骤:

    1. 单元测试

    a.单元测试的主要任务

    单元测试针对每个模块,主要解决五个方面的问题:(1)模块接口(2)局部数据结构(3)路径测试 (4)过界条件 (5)出错处理

    b.单元测试的执行过程

    1. 集成测试

    a.非增式集成测试方法 b. 增式集成测试方法

    1. 确认测试

    确认测试的标准  配置审查的内容  Alpha Beta 测试  

    1. 系统测试

    方法:恢复测试方法   安全测试方法  强度  性能

    第八章:

    一.软件维护的概念

    软件维护是指在软件运行或维护阶段对软件产品所进行的修改,这些修改可能是改

    正软件中的错误,也可能是增加新的功能以适应新的需求,但是一般不包括软件系统结

    构上的重大改变。根据软件维护的不同原因,软件维护可以分成四种类型

    (1)改正性维护

    在软件交付使用后,由于开发时测试得不彻底或不完全,在运行阶段会暴露一些开

    发时未能测试出来的错误,为了识别和纠正软件错误,改正软件性能上的缺陷,避免实

    施中的错误使用,应当进行的诊断和改正错误的过程,这就是改正性维护

    (2)适应性维护

    随着计算机技术的飞速发展和更新换代,软件系统所需的外部环境或数据环境可能

    会更新和升级,如操作系统或数据库系统的更换等。为了使软件系统适应这种变化,需

    要对软件进行相应的修改,这种维护活动称为适应性维护

    (3)完善性维护

    在软件的使用过程中,用户往往会对软件提出新的功能与性能要求,为了满足这些

    要求,需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件

    的可维护性,这种情况下进行的维护活动叫作完善性维护,完善性维护不一定是救火

    式的紧急维修,而可以是有计划的一种再开发活动

    4)预防性地护

    这类维护是为了提高软件的可维护性,可靠性等,为以后进一步改进软件打下良好

    的基础的维护活动,具体来讲,就是采用先进的软件工程方法对需要维护的软件或软件中的某一部分重新设计、编码和测试的活动。

    二.软件维护的特点

    1.软件维护受开发过程影响大

    2.软件维护困难多

    3.软件维护成本高

    三.软件维护的步骤

    软件维护工作包括建立维护组织、报告与评估维护申请、实施维护流程等步骤。

    在影响分析和版本规划的过程中,不同的维护类型需要采用不同的维护策略

    (1)改正性维护:首先应该评价软件错误的严重程度,对于十分严重的错误,维护

    员应该立即实施维护对于一般性的错误,维护人员可以将有关的维护工作与其他开发

    任务一起进行现划。在有些情况下,有的错误非常严重,以致不得不临时放弃正常的维

    护控制工作程序,既不对修改可能带来的副作用作出评价,也不对文档作相应的更新,而

    是立即进行代码的修改。这是一种救火式的改正性维护,只有在非常紧急的情况下才使

    用,这种维护在全部维护中只占很小的比例。应当说明的是,救火式不是取消,只是推迟

    了维护所需要的控制和评价。一旦危机取消,这些控制和评价活动必须进行,以确保当

    前的修改不会增加更为重要的问题

    (2)适应性维护:首先确定软件维护的优先顺序,再与其他开发任务一起进行规划

    (3)定善性维护,根据商业的需求和软件的发展,有些完善性维护可能不会被接受。对于被接受的维护中请,应该确定其优先次序井现划其开发工作

    第九章

    质量保证

    产品的生命,不论生产何种产品,质量都是极端重要的。软件产品开发周期长,耗费巨大的人力和物力,更必须特别注意保证质量。

    软件质量:概括地说,软件质量就是“软件与明确地和隐含地定义的需求相一致的程度”。更具体地说,软件质量是软件与明确地叙述的功能和性能需求、文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。

    软件质量因素的定义:

    正确性:系统满足规格说明和用户目标的程度,即,在预定环境下能正确地完成预期功能的程度

    建壮性:在硬件发生故障、输人的数据无效或操作错误等意外环境下,系统能做出适当响应的程度

    完整性(安全性):对未经授权的人使用软件或数据的企图,系统能够控制(禁止)的程度

    效率:为了完成预定的功能,系统需要的计算资源的多少

    可用性:系统在完成预定应该完成的功能时令人满意的程度

    风险:按预定的成本和进度把系统开发出来,并且为用户所满意的概率

    可理解性:理解和使用该系统的容易程度

    可维修性:诊断和改正在运行现场发现的错误所需要的工作量的大小

    灵活性(适应性):修改或改进正在运行的系统需要的工作量的多少

    可测试性:软件容易测试的程度

    可移植性:把程序从一种硬件配置和(或)软件系统环境转移到另一种配置和环境时,需要的工作量多少,有一种定量度量的方法是:用原来程序设计和调试的成本除移植时需用的费用

    可再用性:在其他应用中该程序可以被再次使用的程度(或范围)

    互运行性:把该系统和另一个系统结合起来需要的工作量的多少

    软件质量保证的措施主要有:基于非执行的测试(也称为复审或评审),基于执行的测试(即以前讲过的软件测试)和程序正确性证明。

    复审主要用来保证在编码之前各阶段产生的文档的质量;基于执行的测试需要在程序编写出来之后进行,它是保证软件质量的最后一道防线;程序正确性证明使用数学方法严格验证程序是否与对它的说明完全一致

    技术复审的必要性:

    正式技术复审的显著优点是,能够较早发现软件错误,从而可防止错误被传播到软件过程的后续阶段。

    正式技术复审是软件质量保证措施的一种,包括走查和审查等具体方法。走查的步骤比审查少,而且没有审查正规。

    走查主要有下述两种方式。

    (1) 参与者驱动法。参与者按照事先准备好的列表,提出他们不理解的术语和认为不正确的术语。文档编写组的代表必须回答每个质疑,要么承认确实有错误,要么对质疑做出解释。

    (2) 文档驱动法。文档编写者向走查组成员仔细解释文档。走查组成员在此过程中不时针对事先准备好的问题或解释过程中发现的问题提出质疑。这种方法可能比第一种方法更有效,往往能检测出更多错误。经验表明,使用文档驱动法时许多错误是由文档讲解者自己发现的。

    审查步骤:

    (1) 综述。由负责编写文档的一名成员向审查组综述该文档。在综述会结束时把文档分发给每位与会者。

    (2) 准备。评审员仔细阅读文档。最好列出在审查中发现的错误的类型,并按发生频率把错误类型分级,以辅助审查工作。这些列表有助于评审员们把注意力集中到最常发生错误的区域。

    (3) 审查。评审组仔细走查整个文档。和走查一样,这一步的目的也是发现文档中的错误,而不是改正它们。通常每次审查会不超过90分钟。审查组组长应该在一天之内写出一份关于审查的报告。

    (4) 返工。文档的作者负责解决在审查报告中列出的所有错误及问题。

    (5) 跟踪。组长必须确保所提出的每个问题都得到了圆满的解决(要么修正了文档,要么澄清了被误认为是错误的条目)。必须仔细检查对文档所做的每个修正,以确保没有引入新的错误。如果在审查过程中返工量超过5%,则应该由审查组再对文档全面地审查一遍。

    程序正确性证明:

    测试可以暴露程序中的错误,因此是保证软件可靠性的重要手段;但是,测试只能证明程序中有错误,并不能证明程序中没有错误。因此,对于保证软件可靠性来说,测试是一种不完善的技术,人们自然希望研究出完善的正确性证明技术。

     

     

    软件工程一测

     

    1. 软件工程三要素:______________、_________________、_________________
    2. 获取愿景的三部曲:
    3. 愿景_______(是/否)功能。
    4. 愿景必须指出__________
    5. 迭代与增量的定义
    6. UML静态图包括(4个)
    7. UML动态图包括(5个)
    8. 为什么使用UML语言
    9. ______________是软件成功的基础。

     

     

    答案:

    1. 工具(系统)、方法(技能)、开发过程(框架)
    2. 第一步:找到软件项目的“老大”;第二步:得到“老大”对项目的期望(愿景);第三步:描述出愿景的度量指标。
    3. 度量指标
    4. 迭代是反复求精,增量是逐块建造
    5. 类图、对象图、组件图、部署图
    6. 时序图、协作图、状态图、活动图、用例图
    7. 主要用于交流,有利于清晰,有利于精确
    8. 需求

     

     

    软件工程二测

     

    1. 在项目失败的因素中,与      相关的比例最高。
    2.       是解决需求噩梦的手段。
    3. 简要分析项目开发过程中,公司老板、中层经理、一线员工的需求分别有什么特点。
    4. ICONIX过程从把需求文档变成可运作的代码过程只需四步,需要使用哪四张UML图?
    5. 若某公司设有公司老总、市场总监与财务总监,实现强化客户管理功能、提升财务效率功能、优化公司资源功能的三种软件,“老大”分别是谁?

     

    答案:

    1.需求

    2.需求工程

    3.公司老板:企业战略、开源节流(定于愿景)

      中层经理:简化管理、优化流程(业务建模)

      一线员工:工作简单(用例分析)

    4.用例图、序列图、类图、健壮性图

    5.强化客户管理:市场总监

      提升财务效率:财务总监

      优化公司资源:公司老总

     

     

     

    软件过程三测

     

    1. 业务建模序列图阶段要注意什么?
    2. 业务序列图中,alt表示(           ),loop表示(              ),opt表示(         );
    3. Alt和opt在使用的时候有什么区别?
    4. 业务序列图中,消息的名字表示什么?
    5. 业务序列图中,消息的方向表示什么?
    6. 把(        )看作特殊的业务实体。
    7. 业务建模结果复核目的有两点,分别是什么?

     

     

     

     

    答案:

    1. 本阶段不要考虑要实现什么系统
    2. 分支,循环,可选分支
    3. Alt表示分支,是需要条件的;opt表示可选分支,没有条件,有选择性。
    4. 代表责任和目的
    5. 责任委托,不是数据流动
    6. 时间
    7. 一是完善业务建模成果,寻找是否有遗漏或错误的地方进行修正,如果问题明显,就需要迭代回去继续做业务建模工作;

    二是关键干系人在信息和意见上达成一致,并共同签字确认,作为下一阶段启动的标志。

     

     

     

     

     

     

    软件工程四测

     

    1. 业务建模要求我们把视角从_______,以达到清晰准确地“诊断”,对症“开方”

    答案:软件系统转向客户组织,站在客户角度看问题

    2、业务建模三步骤:

    1、___________2、____________3、____________

    答案:

    1. 明确我们为谁服务(选定愿景要改进的组织)。
    2. 要改进的组织是什么现状(业务用例图、现状业务序列图)。
    3. 我们如何改进(改进业务序列图)。

    3、了解组织现状:

       (1)从外部看:组织是____的集合,用业务用例图来建模

       (2)从内部看:组织是____的集合

    答案:价值、系统

    4、业务用例图帮助我们从______了解组织的______。

    答案:高层次 、业务构成

    5、业务执行者是在业务组织之外,与其交互,享受其价值的_______

    答案:人或组织

    6、业务用例是业务组织为业务执行者提供的______.

    答案:价值

    7、业务序列图帮助我们从______了解组织的______。

    答案:细节上、 业务流程

    8、业务序列图详细描述________、_______、________之间如何交互,以完成某个业务用例的实现流程

    答案:业务执行者、业务工人、业务实体

    9、举个简单的例子并识别其中的业务对象:业务执行者、业务工人、业务实体

    答案:自由发挥

    10、我们如何改进(改进业务序列图)

    答案:了解业务组织现状的目的——发现流程中的改进点:

    • 信息自动流转
    • 封装复杂业务逻辑
    • 职责转移
    • 访问和操作业务对象

    其他……

     

    软件过程五测

    1. 域建模_____不等于_____(等于或不等于)数据模型
    2. ___用例分析________前做域建模
    3. 需求分析的主流分析方法有___原型法____、______用例法_______
    4. 绘制系统用例图的步骤

    1. 确定系统边界

    2. 识别系统执行者

    3. 识别系统用例

    4. 确定用例间的关系

    1. 怎样区别主执行者和辅执行者

      主执行者:

    1.用例发起者;

    2.用例为其实现有价值的目标;

    辅执行者:

    1.用例支持者;

    2.用例的完成需要与其交互,得到其支持

    1. 如何找到执行者

      谁使用该系统?

    • 谁改变系统的数据?

    • 谁从系统获取信息?

    • 谁负责维护、管理并保持系统正常运行?

    • 系统需要应付哪些硬件设备?

    • 系统需要和那些外部系统交互?

    • 谁对系统运行产生的结果感兴趣?

    • 有没有自动发生的事件?

    1. 系统用例是执行者通过系统____达到某个目标______
    2. 用例的关系____泛化____、_____包含_______、______扩展__________
    3. 先发现执行者还是先发现用例?为什么?

       执行者比用例明显。

    • 执行者的个数远比用例的个数少。

    • 找到一个执行者,就可以找到一堆用例。

    • 执行者是系统外部人物的代表,所以当然是要先找到执行者,才能够从执行者的角度去寻找用例。

    1. 用例命名的三个条件是什么?

     用例名称必须是动宾短语。

    • 采用域建模中的名词术语。

    • 慎用弱动词弱名词——会掩盖真正的业务

    1. 用例_____不等于______功能,用例____不等于______步骤

     

    软件过程六测

    1. 每个用例必须对应有___愿景目标______
    2. 用例描述的基本组成__干系人利益_____________、_____基本路径____________、________扩展路径_______、_______业务规则_______________
    3. _________用例_______是干系人利益的平衡点。
    4. 基本路径的书写要求。

      以主动语态、“名词-动词-名词”格式来书写。

      主语只能是执行者或系统。

    1. 基本路径与扩展路径是否要分开。

      要

     

    展开全文
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,...希望文章对您有所帮助,如果有不足处,还请海涵~
  • java面向对象简介

    千次阅读 多人点赞 2021-11-06 13:59:14
    人们希望构建个无须深奥的专业训练就可以进行编程的系统,并且要符合当今的标准惯例。因此,尽管人们发现C++不太适用,但在设计Java的时候还是尽可能地接近C++,以便系统更易于理解,Java剔除了C++中许多很少使用、...
  • 该工具最突出的特性之一是能够将纯文本功能描述(使用Gherkin语言编写)作为自动测试执行。让我们来看看下面的例子: Feature: Update password  Scenario: Admin user can update the user password Given I...
  • 个测试人员都应该了解每种框架的优缺点,以帮助你的团队更好地确定最适合的测试的框架,以达到事半功倍。
  • 引言 我对于本科时光的印象,还停留在...每当夜深人静,思绪归于对自己人生未来的严肃思考,不知去往何处的苦闷,再加不断迫近的升学/就业选择的压力,尤其是一些看似周密的计划,由于想把每环都做的尽善尽美,...
  • 结构方法、面向对象方法的区别

    千次阅读 2016-06-22 09:32:16
    结构方法、面向对象方法的区别 1.结构方法遵循的基本原则 结构方法的基本思想就是将待解决的问题看作个系统从而用系统科学的思想方法来分析和解决问题结构方法遵循以下基本原则 (1)抽象...
  • 谈谈可视编程 (转)

    万次阅读 多人点赞 2019-06-17 20:32:16
    在计算中,可视编程语言(VPL)允许用户通过图形操作程序元素而不是通过文本指定来创建程序。但一直以来,除了在一些非常有限的领域外,可视编程都未成功。对此,有人认为文本编程语言混淆了编程的本质,也有...
  • Spring 专业认证考试学习指南

    千次阅读 2019-12-13 10:47:41
    Spring 专业认证考试学习指南简介
  • 计算机科学与技术专业:主要学什么? 本文主要包括如下内容: 程序员职位要求 CS 专业课程列表 怎样寻找资源学习? 程序员高薪排行榜 程序员职位要求 看课程之前,我们先来看看 BAT 的招聘岗位 JD: 新...
  • 《软件工程》第九章 面向对象方法学引论 作业

    千次阅读 多人点赞 2020-04-23 16:30:21
    1.什么是面向对象方法学?它有哪些优点? 面向对象的方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题...
  • 本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,篇文章足够。能换你个收藏了吧?
  • 案例上手 Python 数据可视

    万次阅读 多人点赞 2019-02-27 23:30:05
    课程亮点 ...数据可视是数据分析和机器学习的重要环节,比如数据清洗、特征工程、机器学习、数据分析(特别是报告)、评估等环节都会用到“数据可视”技术。 数据可视同时还广泛存在于各...
  • 函数式编程的优点

    千次阅读 2014-03-27 09:49:01
    因为函数式编程的每个符号都是 final 的,没有函数产生过副作用。因为从未在某个地方修改过值,也没有函数修改过在其作用域之外的量并被其他函数使用(如类成员或全局变量)。这意味着函数求值的结果只是其返回值...
  • 关系数据库系统与面向对象数据库系统各自的优缺点 关系数据库系统的优点 a.灵活性和建库的简单性:目前在多数RDDMS产品中使用标准查询语言SQL,允许用户几乎毫无差别地从个产品到另个产品存取信息。 b....
  • 对象存储(OSD)及架构原理

    千次阅读 2020-06-30 16:11:50
    存储局域网(SAN)和网络附加存储(NAS)是我们比较熟悉的两种主流网络存储架构,而对象存储(Object-based Storage)是种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)...
  • 面向对象编程基本概念

    千次阅读 2018-04-18 15:41:53
    面向对象编程(OOP)为软件社区引入了场革命,以帮助解决这些问题。 OOP专注于模块,改变容忍度,代码重用,易于理解和分布式开发。今天大多数项目都使用面向对象的概念。由于C ++引入了OOP,因此用户体验已经...
  • Java对象与Java类

    千次阅读 多人点赞 2021-07-28 22:23:35
    面向对象是什么?2.Java类1.什么是类2.Java类类的结构Java类的格式3.java对象4.类和对象5.类中的变量,方法1.变量分类2.方法分类6.方法重载7.对象与引用基本类型和引用类型的区别:值传递与引用传递8.static关键字概念...
  • 结构方法的基本思想就是将待解决的问题看作个系统从而用系统科学的思想方法来分析和解决问题结构方法遵循以下基本原则 (1)抽象原则 抽象原则是一切系统科学方法都必须遵循的基本原则它注重把握系统的...
  • 类通过个简单的外部接口与外界发生关系,对象对象之间通过消息进行通信。程序流程由用户在使用中决定。简单讲就是说万物皆对象。 三大特征 1.封装: 利用抽象数据类型将基本数据的操作封装在...
  • JAVA面向对象的思维导图

    千次阅读 2019-08-31 20:05:43
    JAVA面向对像做的个简单的思维导图:
  • 牛逼!Java 从入门到精通,超全汇总版

    万次阅读 多人点赞 2021-05-06 19:40:33
    文章目录Java 基础Head First JavaJava 核心技术卷一Java 编程思想设计模式Head First 设计模式图解设计模式设计模式重学 Java 设计模式Java 进阶Java 并发编程实战Java 并发编程艺术Java 并发编程美图解Java多...
  • 工业互联网作为新一代信息技术与制造业深度融合的产物,不仅能为制造业乃至整个实体经济数字、网络、智能升级提供新型网络基础设施支撑,还不断催生新模式、新业态和新产业。工业互联网平台作为工业互联网实施...
  • 三种存储类型:块存储、文件存储、对象存储

    千次阅读 多人点赞 2020-11-02 10:21:27
    对象存储 所以出现对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄个读写块,利于共享的存储出来呢?于是就有...
  • 面向对象七大设计原则

    千次阅读 2020-06-15 23:49:37
    面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源代码的复用,另一方面要确保系统能够易于扩展和修改,具有良好的可维护性。 面向对象设计原则为支持可维护性复用而诞生
  • Java实现面向对象编程

    万次阅读 2018-07-17 16:18:06
    1.1用面向对象设计电子宠物系统... 14 1.1.1为什么使用面向对象... 14 1.1.2使用面向对象进行设计... 15 1.2通过创建对象实现领养宠物功能... 17 1.2.1创建类的对象... 17 1.2.2构造方法及其重载... 23 1.2.3...
  • 首先说明,接下来 这部分内容,跟面向对象没什么关系,只是描述出我们接下来 "需要做什么 ".  大家都知道电梯是怎么回事了,所以获取需求的过程我就不啰嗦了,直接把最后结果描述出来.(对于计算机专业学生或软件工程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,972
精华内容 16,388
关键字:

对象专业化的优点之一是