谈谈需求分析规范化

  福特汽车创始人 - 亨利福特的一句名言常常被人们作为反面案例引用:“如果听用户的,我们根本造不出汽车来,用户就是需要一匹快马。”

  需求是一个项目的源头,也是项目成功的关键所在。而需求本身,是一个复杂的过程,不仅需要业务领域知识,还需要掌握一些基本的技术和方法(建模技术、分析方法)。
  
  通过需求工程化来降低需求工程的复杂度,让需求分析人员有章可循,与用户形成共同语义环境,也就是需求分析的规范化。

  本文重点谈谈需求分析的规范化。

  对于商业化软件开发,是在满足一定用户需求的前提下,以盈利为目的做软件项目实施的,只有盈利,才能更好的服务,形成一个闭环。

  在商业化软件开发过程,需求范围管理是项目管理中重要一环,也就是软件项目的利润=需求-设计 [1],在软件开发中,需求工作致力于解决“产品好卖”的问题,设计工作致力于解决“降低成本”的问题。

1. 关于需求及需求分析

1.1. 需求及需求分类

  需求是技术无关的。技术的实现细节通常是在后面设计阶段才需要考虑的事情。而在业务建模阶段,不但要保证需求的技术无关性,还要保证你的需求不要深入细节。因为在业务建模阶段,最重要的事情就是要了解业务的全貌,深入细节会浪费时间和精力。在需求阶段讨论技术是没有任何意义的。那只会让你的注意力分散。

  在这里,首先说明用户需求、功能需求、业务需求、系统需求、产品需求的定义与差别:

  用户需求(user requirement)描述的是用户的目标,或用户要求系统必须能完成的任务。用例、场景描述和事件――响应表都是表达用户需求的有效途径。也就是说用户需求描述了用户能使用系统来做些什么。用户需求针对的是人,描述的是用户想做某件事情所遇到的问题,或所想满足的欲望;

  功能需求(functional requirement)规定开发人员必须在产品中实现的软件功能,用户利用这些功能来完成任务,满足业务需求。功能需求有时也被称作行为需求(behavīoral requirement),因为习惯上总是用“应该”对其进行描述:“系统应该发送电子邮件来通知用户已接受其预定”。功能需求描述是开发人员需要实现什么。 功能需求针对的是产品,描述是是产品如何解决用户所遇到的问题,或如何满足用户的欲望,是方式、方法;

  业务需求(Business requirement)表示组织或客户高层次的目标。业务需求通常来自项目投资人、购买产品的客户、实际用户的管理者、市场营销部门或产品策划部门。业务需求描述了组织为什么要开发一个系统,即组织希望达到的目标。使用前景和范围(vision and scope)文档来记录业务需求,这份文档有时也被称作项目轮廓图或市场需求(project charter 或 market requirement)文档。

  业务需求针对是公司,描述是公司想如何解决用户的问题,如何满足用户的欲望,并将利益最大化。重点是在后面,追求商业可行性与利益最大化。

  系统需求(system requirement)用于描述包含多个子系统的产品(即系统)的顶级需求。系统可以只包含软件系统,也可以既包含软件又包含硬件子系统。人也可以是系统的一部分,因此某些系统功能可能要由人来承担。

  产品需求是提炼分析用户真实需求,并符合产品定位的解决方案。

1.2. 关于需求调研

  需求调研工作中,需求分析人员引导用户挖掘真实的需求是至关重要的,应按如下图所示对应关系,分层综合的调研需求。
  这里写图片描述
  产品经理不能只听“二手需求”,那些是别人总结过的,已经没了“地气”,真正需要听的是用户讲真实的故事,故事里,有记叙文的六要素——时间、人物、地点、事情的起因、经过结果。有了这些信息,你才能感同身受。最终用我们产品的人,不是一个个“用户群体”,而是一个个活生生的个体。

1.3. 用户故事与用例

1.3.1. 用户故事

  用户故事(user story)是从用户的角度来描述用户渴望得到的功能。一个好的用户故事包括三个要素:
  1. 角色:谁要使用这个功能。
  2. 活动:需要完成什么样的功能。
  3. 商业价值:为什么需要这个功能,这个功能带来什么样的价值。
  一个好的用户故事应该遵循INVEST原则。

  独立性(Independent)— 要尽可能的让一个用户故事独立于其他的用户故事。用户故事之间的依赖使得制定计划,确定优先级,工作量估算都变得很困难。通常我们可以通过组合用户故事和分解用户故事来减少依赖性。
  
  有价值(Valuable)— 每个故事必须对客户具有价值(无论是用户还是购买方)。一个让用户故事有价值的好方法是让客户来写下它们。一旦一个客户意识到这是一个用户故事并不是一个契约而且可以进行协商的时候,他们将非常乐意写下故事。
  
  短小(Small)— 一个好的故事在工作量上要尽量短小,最好不要超过10个理想人/天的工作量,至少要确保的是在一个迭代或Sprint中能够完成。用户故事越大,在安排计划,工作量估算等方面的风险就会越大。
  
  可测试性(Testable)—一个用户故事要是可以测试的,以便于确认它是可以完成的。如果一个用户故事不能够测试,那么你就无法知道它什么时候可以完成。一个可测试的用户故事例子:软件应该是易于使用的。

1.3.2. 用例

  用例最早由Ivar Jacobson在1992年提出,用例通常与统一软件过程相联系。用例描述系统和角色之间的交互。

  从用户的角度来看,他们并不想了解系统的内部结构和设计,他们所关心的是系统所能提供的服务,也就是被开发出来的系统将是如何被使用的,这就用例方法的基本思想。用例模型主要由以下模型元素构成:
  
  参与者(Actor)
  
  参与者是指存在于被定义系统外部并与该系统发生交互的人或其他系统,他们代表的是系统的使用者或使用环境。
  
  用例(Use Case)
  
  用例用于表示系统所提供的服务,它定义了系统是如何被参与者所使用的,它描述的是参与者为了使用系统所提供的某一完整功能而与系统之间发生的一段对话。
  
  通讯关联(Communication Association)
  
  通讯关联用于表示参与者和用例之间的对应关系,它表示参与者使用了系统中的哪些服务(用例),或者说系统所提供的服务(用例)是被哪些参与者所使用的。

  这里写图片描述

1.3.3. 用户故事与用例的区别

  用户故事与用例的区别[2],主要在于:
  
  (1)范围不同。二者都用来体现商业价值,但故事规模可以设定比较小(例如,10天完成),以便以此为单位安排工作。用例包含的范围可能比故事大得多。
  
  (2)完成程度不同。James Grenning曾指出:故事卡中的文字“加上验收测试用例就基本等同于用例”,这意味着故事对应于用例的基本流,而故事的测试要求对应于用例的备选流。
  
  (3)寿命不同。用例通常是持久的工作产品,在产品开发和维护时,用例一直存在。然而,故事通常只存在于实现该故事的迭代中。虽然故事卡可以存档,但是许多团队都将故事卡销毁。
  
  (4)编写目的不同。用例的目的是记录客户和开发团队的一致意见。故事是为了便于制定发布计划和迭代计划,并作为有关用户需求细节方面的交谈备忘录。

  用户故事是在讲述用例中某个或某几个场景。

1.4. 基于SOA的需求分析[3]

  基于SOA的需求分析可以归纳为以业务和流程建模为驱动,以用例分析为核心,以服务建模为最终目标的三个层面的内容。

1.4.1. 流程分析和业务建模

  对于传统的面向结构和面向对象的分析方法,都少了流程分析和业务建模这个关键步骤,后续UML发展增加了业务建模部分的内容。SOA一个重要概念就是流程驱动IT,如果不从最起始的流程和业务建模入手,将会使我们只见局部而无法看到全貌;只知道有这个功能或服务,而不知道功能或服务产生的业务场景。

  对于流程分析,体现由高端到低端逐层分解的过程,高端流程主要还是价值链流程分析,由价值链分析结合业务主题域的情况分解到1级和2级的业务架构视图。在 SOA的业务建模里面有个重要概念就是业务组件,业务组件可以是业务域按执行,控制,引导三个层面的进一步分解。每个业务组件本身就是由相互关联的业务活动组成,实现独立的业务价值,业务组件本身是粗粒度的。业务组件之间的交互必须要通过服务进行。对于业务组件,可以从五个方面进一步进行描述,如下:

  业务用途 – 业务组件在组织内存在目的,表明其提供了业务价值
  业务活动 – 为实现业务用途,每个业务组件需要实现一系列相互独立的活动
  资源 – 需要什么样的人员或资产来支持这些活动
  治理方式 – 每个组件是自治的,以相互独立的方式进行管理 业务服务 – 提供或接收业务服务,外界交互的唯一渠道

  业务组件本身高内聚,松耦合,完成一个长流程需要业务组件间相互协作完成。对于业务组件的识别可以由顶向下或由底向下两个方面进行分析和识别,由底向上可以是根据业务域列出所有核心的业务功能,根据传统的UC矩阵分析方法,按照高内聚松耦合的原则来归类和抽象相应的业务组件;或者是由顶向下,进行高端业务和流程分解,充分考虑业务职能划分和流程阶段分解因素,端到端流程分解中的核心活动就是关键的业务组件。

  业务架构图矩阵分两个维度,一个是业务能力,一个是责任级别。业务能力可以根据高端业务价值链分解来确定,责任级别包括战略规划,控制和执行三个层面。业务组件图本身是动态活动的静态构图。在业务组件图出来后,针对单个的业务组件,可以进一步做流程分解和流程分析,这个分析通常有两个方面,一个是跨职能带的流程图分析,一个是EPC流程图分析,在分解到较为底层的流程图的时候,我们都推荐EPC事件驱动的流程链分析方法,这个方法和现在BPM工具的流程建模方法基本类似,很容易直接过渡到BPM流程建模。

1.4.2. 从业务流程到业务用例分析

  在原来谈基于SERU的软件需求最佳实践的时候,我们就经常谈到了业务流程分析到用例的转化,对于流程分解和流程分析,到了底层后出来的就是活动,这个活动需要识别和转化为用例。业务用例是可以独立实现一个业务价值的业务过程,可以看做是业务组件本身进一步的细化分解。在SERU分析方法里面,强调了如下几点:

  主题域分解 – 类似业务建模中的业务组件分析 流程分析 – 识别业务用例的关键步骤
领域建模 – 建立领域模型,识别关键的业务对象

  业务用例是否是服务?很多时候业务用例本身就已经是流程服务或业务组合服务,因为它是一个实现了业务价值的业务过程。在SOA里面强调了业务操作和业务数据的分离,在传统的使用ROSE工具进行用例建模的过程中也可以看到用例分析和建模从前面的流程分析到后面的两个关键模型组件即是用例模型和业务对象模型。
  
  模型部分:用例模型,业务对象模型,序列图活动图
  
  文档部分:业务场景,基本流,扩展流,业务规则,数据描述,界面原型

1.4.3. 从业务用例到服务识别和设计

  在用例到服务转化的时候,可以看到一个用例实现可能还涉及到多个原子服务的识别和设计,这些原子类服务业务人员不关心,但是却能够较好的应用于服务的组合和流程的编排。用例到服务的转化一个重点是通过序列图来分析用例实现的过程,在这个过程中我们抛弃点泳道前面用户到界面层的交互,而重点关注逻辑层的所有交互点,这些逻辑层的交互点很可能都是重要的原子类服务。

  在没有基于SOA前,可以看到业务和系统组件是强绑定的,业务变动会带来大量的技术层面的修改。而实施SOA后,在业务和IT之间会增加一个服务层,服务层实现了业务和IT的解耦。业务组件之间交互抽象和暴露为服务,服务用于业务实现时候的组合和编排,以增加组件对业务变化应对的灵活性。

  这里有一个过程,即通过业务用例的实现分析,可以识别出大部分的原子类服务,然后对服务进行进一步的归类,合并和整理。这些原子类服务里面有些是需要跨组件或跨系统协作的,而有些仅仅是用于内部协作。服务本身的可重用性和管理成本又涉及到我们如何来控制服务的粒度,对于仅仅用于内部协作的建议仍然需要保留相应的服务接口,方便后续在有需求的时候很方面的转化为服务。

2. 需求分析规范化的内容

  通过上述需求分析工作内容的介绍与分析,本文推荐使用UML的用例图、用例描述做为需求规范化的核心内容,相关文档模版介绍如下。
  
  (1)需求说明书模版
  
  用户需求说明书
  软件需求说明书
  
  (2)用例模版

2.1. 需求说明书模版

2.1.1. 用户需求说明书模版

  需求说明书模版,章节要求:
  
  这里写图片描述

  文档模版目录中需要特殊说明的如下:

  术语、缩略语,就是列出需求中用到的专业术语,以及专业词汇的缩写、简略用语。在编写需求文档过程中,容易出现忽略术语、缩略语现象,造成部分读者阅读文档困难,沟通也出现障碍。为此,需要尽量写全这部分内容。
  
  组织结构,应用系统是给人使用的,有人就涉及到组织,所有,在编写需求分析时,需要详细调研、分析组织机构及其角色。
  
  非业务需求,可靠性需求、性能需求、可用性需求、安全性需求、环境需求、接口需求等。
  

2.1.2. 软件需求说明书模版

  这里写图片描述

2.2. 用例模版(建立用例模型)

  使用用例的方法来描述系统的功能需求的过程就是用例建模,用例模型主要包括以下两部分内容[6]
  
  (1)用例图(Use Case Diagram)
  
  确定系统中所包含的参与者、用例和两者之间的对应关系,用例图描述的是关于系统功能的一个概述。
  
  (2) 用例规约(Use Case Specification)
  
  针对每一个用例都应该有一个用例规约文档与之相对应,该文档描述用例的细节内容。
  
  在用例建模的过程中,我们建议的步聚是先找出参与者,再根据参与者确定每个参与者相关的用例,最后再细化每一个用例的用例规约。

2.2.1. 寻找参与者

  所谓的参与者是指所有存在于系统外部并与系统进行交互的人或其他系统。通俗地讲,参与者就是我们所要定义系统的使用者。寻找参与者可以从以下问题入手:
  
  (1)系统开发完成之后,有哪些人会使用这个系统?
  (2) 系统需要从哪些人或其他系统中获得数据?
  (3) 系统会为哪些人或其他系统提供数据?
  (4)系统会与哪些其他系统相关联?
  (5)系统是由谁来维护和管理的?

2.2.2. 确定用例

  找到参与者之后,我们就可以根据参与者来确定系统的用例,主要是看各参与者需要系统提供什么样的服务,或者说参与者是如何使用系统的。寻找用例可以从以下问题入手(针对每一个参与者):
  
  参与者为什么要使用该系统?
  参与者是否会在系统中创建、修改、删除、访问、存储数据?如果是的话,参与者又是如何来完成这些操作的?
  参与者是否会将外部的某些事件通知给该系统?
  系统是否会将内部的某些事件通知该参与者?

  在用例的抽取过程中,必须注意:用例必须是由某一个主角触发而产生的活动,即每个用例至少应该涉及一个主角。如果存在与主角不进行交互的用例,就可以考虑将其并入其他用例;或者是检查该用例相对应的参与者是否被遗漏,如果是,则补上该参与者。反之,每个参与者也必须至少涉及到一个用例,如果发现有不与任何用例相关联的参与者存在,就应该考虑该参与者是如何与系统发生对话的,或者由参与者确定一个新的用例,或者该参与者是一个多余的模型元素,应该将其删除。
  
  可视化建模的主要目的之一就是要增强团队的沟通,用例模型必须是易于理解的。用例建模往往是一个团队开发的过程,系统分析员在建模过程中必须注意参与者和用例的名称应该符合一定的命名约定,这样整个用例模型才能够符合一定的风格。如参与者的名称一般都是名词,用例名称一般都是动宾词组等。
  
  对于同一个系统,不同的人对于参与者和用例都可能有不同的抽象结果,因而得到不同的用例模型。我们需要在多个用例模型方案中选择一种”最佳”(或”较佳”)的结果,一个好的用例模型应该能够容易被不同的涉众所理解,并且不同的涉众对于同一用例模型的理解应该是一致的。

2.2.3. 描述用例规约

  应该避免这样一种误解――认为由参与者和用例构成的用例图就是用例模型,用例图只是在总体上大致描述了系统所能提供的各种服务,让我们对于系统的功能有一个总体的认识。除此之外,我们还需要描述每一个有例的详细信息,这些信息包含在用例规约中,用例模型是由用例图和每一个用例的详细描述――用例规约所组成的。RUP中提供了用例规约的模板,每一个用例的用例规约都应该包含以下内容:
  
  (1)简要说明 (Brief Description)
  简要介绍该用例的作用和目的。
  (2)事件流 (Flow of Event)
  包括基本流和备选流,事件流应该表示出所有的场景。
  (3)用例场景 (Use-Case Scenario)
  包括成功场景和失败场景,场景主要是由基本流和备选流组合而成的。
  (4)特殊需求 (Special Requirement)
  描述与该用例相关的非功能性需求(包括性能、可靠性、可用性和可扩展性等)和设计约束(所使用的操作系统、开发工具等)。
  (5)前置条件 (Pre-Condition)
  执行用例之前系统必须所处的状态。
  (6)后置条件 (Post-Condition)
  用例执行完毕后系统可能处于的一组状态。
  
  用例规约基本上是用文本方式来表述的,为了更加清晰地描述事件流,也可以选择使用状态图、活动图或序列图来辅助说明。只要有助于表达的简洁明了,就可以在用例中任意粘贴用户界面和流程的图形化显示方式,或是其他图形。如活动图有助于描述复杂的决策流程,状态转移图有助于描述与状态相关的系统行为,序列图适合于描述基于时间顺序的消息传递。
  
  这里写图片描述
   这里写图片描述
  
  再举个早期的样例,用例编写格式如下。

2.2.3.1 用例规约
  • 用例编号
  • 用命名
  • 描述
  • 参与者
  • 前置条件 //必须满足条件
  • 后置条件 //用例做完后,对系统的影响
  • 基本路径 //最重要,主功能场景,只描述正常成功的场景,不要出现如果….;参与者动作,系统响应
  • 扩展点 //最重要,
  • 补充说明 //对基本路径和扩展点的未尽事宜进行描述

      这里写图片描述

2.2.3.2. 用例图

  用例图的主要作用是描述参与者和用例之间的关系,简单的系统中只需要有一个用例图就可以把所有的关系都描述清楚。复杂的系统中可以有多个用例图,例如每个用例包都可以有一个独立的用例图来描述该用例包中所有的参与者和用例的关系。

  这里写图片描述

参考:

[1]. 《软件方法》上册,业务建模和需求 潘加宇 清华大学出版社

[2]. 敏捷实践–用户故事和用例的选择 Super Bow 的博客

[3].再谈基于SOA的需求分析(2) 人月神话的博客

[4].EA业务建模实践之业务用例图 肖永威 2015.2

[5].软件项目需求开发过程实践之业务建模用例图 肖永威 2015.3

[6].用例建模指南 IBM developerWorks 中国 ,傅纯一, 2004.11

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
范围:CPU上可以识别的代码和数据。全部的代码总和。 要求:从定义开始的设计。完整性,彻底地定义从无开始的整个设计。这是因为软件之软,也是因为硬件平台的多样性和特殊性。 完整把握,从头设计是第一原则。因为软件世界自己并不能统一,还有继续分化的趋势。没有根本一致的基础可能是软件的本性。退回到一无所有是处理软件问题的根本。 在这样的视野下,操作系统只是一个部分,一个模块,不同的操作系统任你选择;语言的选择是运行环境的选择(每种语言有每种语言的运行时布局);所谓框架只是“类库+运行环境”的一种构造。 没有对其负载能力、操作强度进行评估前,这些东西(操作系统、语言、框架)还都不能纳入设计规范。 性能:运行过程的收敛(长时间运行的均态)。操作强度设计(串行处理速度),负载能力设计(并发处理的量)。可靠性设计。 软件问题的3个方面: 1、硬件,软件的操作对象和运行软件的数字系统(CPU系统和数字加速硬件) 2、交互操作(界面),专业界面设计 3、软件调度性能,实时的自动化过程(设备控制和自动测量)和用户交互过程(请求服务过程和干预过程;本地交互和远程交互),程控和网络访问的调度(服务器)。 软件项目的3个部分:(把3个阶段由纵向横过来,进行统筹) 分解文档,集成平台,可维护性要求。 软件设计必须有自说明特性。不能对文档产生依赖性。软件代码中合适的地方,需要对文档进行恰如其分说明。原则是,每段代码,每处需要理解的地方,如果和总体架构相关,就要有说明。 软件领域需要简化。需要还原软件本来的面目。EDA有泛滥的趋势,软件的各个方面都需要简化。软件形态、需求分析、文档说明、开发工具等。 需求分析过分强调适应生命周期的变化和没有需求分析是一样的。不切实际的面向未来的需求架构的直接结果是软件的复杂和错误百出。 软件只有一个,而观察的视角很多。要采用最适合的观察视角,让软件一目了然。 软件的生成过程和观察过程是两个不同的观念。生成过程又可以区分为:研究过程和工程过程。研究过程可以通过结果,研究报告反映;工程过程则必须采用过程刻画。 软件规范使用的语言一定要有普遍语义,但描述本身具有特殊性;不能强求它的全球唯一。一定要雄视全体,才能选择正确的立足点,这就要求对目前的软件技术有一个了解;要考虑纳入新的发展,那么规范应该分层,把一般的和具体易变的成分分开;要有具体的指导意义,越具体指导意义越大,但通用性则越小。 所谓架构,可能是十分具体应用的代表;不同类别的应用必然有不同的架构。软件架构本身是“应用架构”。因此,不能规范具体的架构。到是可以做:应用架构规范的规范。 逻辑架构的特殊性。可以判断,任何一款实用的软件采取的软件逻辑抽象都是别样的,特例的逻辑。否则,软件不可能那么轻快实用。软件逻辑,鬼魅也。而需求分析,必须是现实实用的,而不是同构/仿真的-这似乎是反对象分析的。因为这里强调的是和软件的交互界面,这个界面远远没有反映现实世界的结构。须知,软件强调的是数据处理,是输入输出。否则,就不能达到最简化。 可能现实世界的结构映射,最适合的方式是数据库 - 采用纯数据结构进行映射。除此之外,能有更合适的技术吗? 面向对象建模是吗?那么对象又如何与现实世界的对象绑定在一起呢? 这再次表明,在软件技术和需求分析之间有鸿沟。软件技术作为特殊的技术,有它的有限性。也反映了,包含软件应用在内的现实架构已经固定。 如果软件是数据处理,是输入输出,那么软件结构也就可以确定了! 可视化、用户操作界面解开了另外的软件世界,因为可视化可以代表用户更抽象的逻辑。用户希望操作可视对象,象操作现实对象一样。软件从模拟现实对象的过程中继承了其结构。 工业控制也开启了新的软件世界,因为软件要从分离的输入建立“综合感知”,感知到设备状态,然后做出响应。 软件有其固有的物理属性,也就是计算的量。算法领域,无论算法的论证多么曲折,求得的结果,物化为软件,总是“早已熟知”的软件。这一区分,是定义软件规范的基石。 算法构造领域是和软件完全不同的领域,算法不是软件。算法类似数学系统。也一如数学系统那样多样。 软件构造。算法总要转化为软件,这就是软件构造问题。寻址系统,数组。软件把自己的生成作为问题,给算法开辟了新的领域。软件生成,是一个“构造-编译”问题。手工构造,自动编译。语言的发展,是一个软件生成的历史。所谓统一建模,所谓设计模式,其实都是软件生成的问题。 需求分析需求分析本质上是独立的。所谓OOA,面向对象的建模,把程序构造概念上升到需求分析领域可能是不对的。一个先验的,复杂的难于掌握的限制,只会让人对需求分析望而却步;即使勉强掌握,难求对需求分析的创造性发展。需求分析应该专注于需求分析本身,独立发展,一切为了准确、快捷的分析。 需求分析层次高一些,抽象一些,自由一些,这样可以充分表达需求的本质。反而可以促进更高级别的程序自动生成。 软件生成的历史。软件生成是为了解决人机沟通,让“计算机语言”更接近普通人的思维逻辑。把这种“高级计算机语言”翻译成可以执行的代码,就是软件生成(代码生成)的任务。而软件编制是专业人员的事情,因此语言问题的本质其实不那么重要。须知,经过培训,莫尔司码的电报发报可以比说话的语速还快!因此,计算机语言的前途迷茫;实际上也确实迷茫,历史上语言的层出不穷本身就说明了问题,至今仍然如此。在当今,必须建立这样的观点:语言是因人而异的;面对一个语言的时候,要清醒,首先明确“这是为谁设计的语言”;也就是说,需求分析之前的需求是要明确,让什么人来设计软件,然后为他们选择合适的语言。软件生成除了代码生成,还包括另外一个意思:软件构造。这在前面已经论述过了。只是,这里的软件构造机制已经在语言中奠定了。手工参与的软件构造只是语言给出的构造机制的应用。手工的软件构造就是语言构造机制的复制,产生大量的代码,应付实际问题的量。 立体构造。这里还有一个立体问题,实际问题的构造可能产生立体构造,如同建筑,基本的构件组装出复杂的立体结构。这里是建筑设计师的功劳。可能目前我们在语言层面上混淆不清的关键也在这里,没有区分语言和立体构造的责任。一个趋势是语言本身总是试图包揽建筑师的责任。把立体构造独立出来,带来的问题是:这个构造本身必须能够证明自己是正确的。1)能产生软件2)构造逻辑上正确,确实能解决应用问题。构造本身有一个属性,它有通用性。根本原理是通用的;总体构造本身具有一般性,也就是抽象性、实际问题无关性;局部构件具有通用性。也就是说,这里存在容器和容量的区别,构造是容器,实际问题是装在容器中的量。一个好的容器要能顶住容量的压力;一个好的建筑架构要能满足负载和抗振性要求。而架构本身的承受能力是客观的,只与架构本身有关。这也就是说,架构本身自我构造的,因此也就是科学。可能软件构造本身是澄清问题的工作,明确“容量”的特点,为软件构造的选择提供准确的依据,杀鸡不要用牛刀。实际问题的“容量”很容易测量,因为它反映为应用的规模,流程的流量。(架构是什么?架构是否存在?如果我们所说非虚,那么如何为架构下一个定义-一定是一个由具体业务流量和模式支撑的架构) 软件(算法)的构造。一个是数据的复杂性(内在互相关系),一个是计算方法(步骤和缓冲)。从宏观角度,数据关系是更根本的东西。目前的高级语言,变量和流程(顺序、分支-步骤;循环-缓冲和迭代)研究的多,而数据复杂性构造不足。 同构现象。CPU指令集合可以说是硬件直接实现的软件。软件帝国从这里提取软件精神,并升华它。从硬件的角度,从寄存器和指令执行流程,体现出的是变量和迭代(顺序更迭,循环往复)。(迭代流程)基于固定寻址的变量,经过寻址接口,可以处理任意数据,从而把迭代流程变成了一般流程。CPU的基本过程,产生了指令和数据,指令天生具有子程序的基因(一般流程),数据天生具有数据结构(寻址能力)的基因。高级的构造一般也是这种结构的类似:设计一套类似CPU的机制,支撑程序和数据;独特的“寻址机制”和“CPU处理能力”是实现构造的核心机制;迭代是所有这种机制的动力学和构造方式。而数据化是“寻址机制”的基础。抽象是数据化的工厂,也因此必须研究抽象技术。 抽象技术。所谓抽象,就是具体化,是范围的界定和比对(两种具体化对象之间的比对)。如果范围界定的完整,那么比对建立的联系就是普遍联系,普遍联系也就是所谓抽象原则。 评价标准。软件架构需要评测。这种评测是“在商言商”似的评测。评测的基础是软件架构的具体化。当掌握了架构的构造方法,每种架构本身也就具体化,是一种具体的架构。一种具体化的架构,就可以识别;可以识别则可以客观评测。可以按照立体架构的“压力”、“流量”等概念进行评测。 需求的把握-需求的变化。我们希望永恒不变的需求,核心需求需求方式(表现和满足步骤);而事实上需求总在演化。软件必须无条件、最大限度地方便需求的表达和需求的满足。软件可能永远只是皮肤,需求源于现实核心深处,软件是一件衣服。这种观点下,软件是没有中心的一种架构。软件架构和需求之间联系的定量评测。 软件和算法的分开 软件的构造作为软件的通用属性 需求的独立 推论:算法是应用的算法。比如数学公式的计算、图形图象的处理、频谱分析、词法和语法分析。因此算法不是通用的软件算法。也因此软件构造是软件规范的一部分,因为它是通用的软件构造技术。 计算技术和应用之间有明显的区别,是两种不同的成分。软件规范是纯粹的,只关心计算技术。而不关心应用建模。计算方法本身早已经被发现了(也就是怎么自动计算,或者说什么是可计算的),剩下的问题只是应用问题。把应用问题的解决纳入软件计算模式。自动计算技术在汇编指令集合那里得到了说明。所谓软件设计是把这种计算方式发扬广大。 所谓算法,就是明确问题,然后发现用自动计算的方式解决问题。从这个意义上说,软件是应用问题导向的。那么,也就是要以问题为中心谈论软件。不同类型的问题需要的解决方式有独特的强调。这也就反映为所谓不同的软件技术。所以,区分软件计算技术和应用问题的成分,是软件规范需要首先识别的东西。 解决问题。本质上是把问题装到变量里面的过程,是放大CPU寄存器的过程。表示层:(把局面、环境;起点和终点需要定义在一个世界里)装进去,组织起来。计算层(展开层):基于表示,定义问题解决步骤(定义运动和过程)。 需求分析。问题描述采用的方法可能应该和软件算法完全分开。否则不能发现问题描述的创造性方法,不能表达问题本质。阐述问题,写文章我们有某篇布局之法;哲学研究我们有严谨的逻辑方法。需求分析,我们一定可以创造自己的方法。这是什么方法?满足使用要求,满足使用流程。离散/隔离各个需求。事实上,面向外部的分析理解和面向内部的分析理解之间有鸿沟。因为这是两个不同的世界。在两个相差悬殊的世界之间,搭建的构造也必然多种多样,以奇为平常。那么,建立联系的媒介少的可怜。可能问题本身也正在于这种联系的分析和设计。 软件的量,是静态的。强调这部分就忽略了活跃的、奇异的、动态的部分。软件的出现不仅仅是被动地适应显示需求,同时也改变了现实需求本身。这种和现实需求融合在一起形成的状态,正是软件活跃的部分。在以前,仅仅以“应用软件”指称是不够的。(操作系统、编译软件、应用软件) 在范畴上,分为三个层次,或说3个范畴域: 1、 活跃的、黏性的动态层次。应用层。和现实之间的界面,是设备逻辑。需求简化、解决方案的奇异性;应用算法的专业性。这是软件形象最活跃的部分。 这里用的是抽象(业务流程)和具体(设备能力)统一的思维方法,构造逻辑的软件过程同时又是可以用具体进行描述的;动态的、物理的分析手段(物理的量)。 业务流程的设计几乎就是艺术设计。 2、 中间层。程序构造层。语言、编译技术、数据结构、设计方法(过程、数据、对象)等可以形式化的计算机科学的任务。对程序能力进行抽象,设计程序自动化生成的一套系统:语言、计算系统、编译系统。这是在静态和活跃部分之间的层次。这里的观念:设计方法、主程序、程序过程(和应用层的过程不是一一对应的)。 3、 静态层。软件的量,度量层。所有程序构造过程的差别消失了。这是软件的静态观点。 每层都有对软件的自己的理念,概念、过程和模型。两个层的对比,则凸显出不可调和的差别。也是所有关于软件的不成熟的印象、抽象产生的地方。 在应用层,抽象的、逻辑过程强一些。想象的部分占据主要的部分。需要对现实的业务,基于设备的具体能力,进行构造。 3个范畴定义了“软件”和“程序”的分别。第1层和第3层论述的是“软件”,而第2层论述的是“程序”。 软件和程序的研究方法不同。程序研究方法是完备的,而软件不完备。 程序开发应当体现软件特性。1)是逻辑的过程,总体的过程和子过程的观察和校验程序。2)软件的量层次上,软件的规模、运行强度和稳定性指标的自测试程序。 第二阶段 一定要有一个标准。软件如衣服,软件的交付文档应当显示出衣服是如何编织起来的。(相对于需求,软件是衣服,非核心;相对于硬件,软件是衣服,包裹) 要有一个理论说明。 架构也是衣服的一个部件,类似衣服的连接方式,模块集合的重心比对。 衣服是一个没有核心的结构。软件也一样要显示出这个特性。 无论如何,我们需要有观察软件的眼光,无论一套软件依据什么样的理论产生。 什么是软件?描述是软件的存在形式(文本格式)。软件一定是可执行的(这是软件的严肃性,精确、定量)。软件是异化的,一般异化为具体、特例(对抽象力最好的归结方式)(没有完美满足需求的软件,相对于需求,软件只能满足固定的需求,而不能满足需求的变化,即一款软件总是具体的;由一般产生出具体的思考方法,也就是构造的方法;或着是磁力打造,一个好的理论一定对现实素材有吸引力,向磁铁一般;这也是在矛盾中建造现实的方法,只要是具体的就肯定是可以分析出潜在矛盾、不完美的,问题不仅仅是分析、认识现实,还要能够构造现实;不存在完美的现实,只存在完美的理论 科学研究的方法是简化。工程的方法是‘相似’,复制发现事物时的状态,那么事物的表现就会复现。 在具体化这里,软件和硬件工作的方法在结果上实现了一致。只是方向不同,软件是从一般进行到具体;硬件一开始就是从具体出发,层层构造,搭建系统。硬件的设计明显具有以工艺、器件为核心的特征。配合器件的特新,进行外围设计。在硬件领域,是‘具体’为上;在软件领域,是‘具体’为下。) 对具体性的解释:组成所有物资的电子、质子、中子是圆的、相同的,但是这些相同的东西组成的原子则有几百种不同。每次量的规模的添加,都导致特殊性的添加。对于软件来说,也是如此。如下的概念是母庸质疑的,软件如同大山,沟壑鲜明。(这种巨大的特殊性,一定是和巨大的需求特殊性相应的)。 “软件以文本形式存在;软件在执行着;软件以个例的形式存在”,归结为在一起就是“软件是具体的”。 低一级别的定义:软件与数据和逻辑相关(数据和逻辑是软件的基本语义)。软件与过程相关(积分(存储,数据的数据化)和步骤(逻辑);过程是步骤的遍历,是数据的消长变化)。 执行的异化。区分独立执行和整体执行的概念。独立执行的代码称为模块,否则只是‘片段’。独立性和数据完整性相关,数据越庞大那么不独立的代码片段越多,模块就越大。模块独立性具有比和整体执行所要求的更大的自由度,也就是说整体只是使用了模块一部分的执行能力。模块独立执行获得的自由度是应该能够度量;模块的执行设计应该为了获取更大的自由度;自由度是模块可执行性质量的评定指标。对于整体执行的设计来说,自由度设计可能是设计过程的主导方法,它和全面、完整的需求理解相关,也和需求变化相关;因此自由度设计也是需求定位的设计。 软件的量,也就是软件的能力。这是理解软件解决问题的方式的基础。比如逻辑能力、计算能力、存储能力、图象能力等。 软件是运行的,软件是自我构造的,软件的全体的各个环节都有自己的量。编译、操作系统、文件管理等各环节都是不同分工的软件实现的。 需要构造在功能层次上的互相配合,解释这种完整性。显然每个部分都具有独立的完整性;完整性和完整性的配合构成一个总体的系统。因此未必要求系统的完整性、长期性、稳定性。反过来,系统满足需求的快速性、快速变化适应性、和现实一起变化、消长的特性、瞬态响应特性可能更接近系统的本质。 这好比太极拳,要在一个完满的氛围里运动。 软件能力是比代码高一个级别的抽象。又是构成软件内涵的基础语义。 ‘设备能力’的概念更基础,可以统一所有其它能力;又可以作为以硬件为中心的观念的基础。 能力的获得在于‘二分’。在于互相支撑的界面,支撑在一起的双方互为能力。 1.所谓需求分析,我们总是在创造一套新的方法和语言。而最有效的需求分析是自然语言分析。借助人们心目中的全部理解所用到的描述形式。也就是进入到实际存在的需求中去理解需求,分析需求。 因为领域、术语、行业表述习惯的原因,这个阶段千差万别。 2.其次是电脑的使用方式-电脑技术(外设、通信和电脑本身的硬件形态),尝试去设计合适的使用方式和硬件解决方案。 这里有使用环境、专业技术、成本、时间,以及个人习惯等原因,同样是一个精彩的过程。对领域工作方式的熟悉、外设相关的专业技术背景、折中技术决定了这是一个经验至上的活动。这就是电脑使用方式的确定。 3.进一步,确定使用者角色。使用者和使用地点关联。使用地点也就是前面电脑使用方式的一部分。 这是一个沟通过程,也是对有了电脑辅助参与,相关领域习惯改革的问题。 4.然后,进入二元分析阶段:使用者管角度、客观功能角度,分析功能,并完成二者之间的映射。 这个阶段,功能被量化。职能量化。职能和功能之间会有模糊,有授权的转移。这个阶段就是充分考虑这些问题。 5.然后,进入传统的需求分析阶段。 计算架构和功能描述的规格分析。使用者界面规划(详细、规格级别)。 界面规划、功能、架构三者之间组成互动的具体化过程。 最后会产生系统级别的文档。运行实体、接口;系统运行态、实体接口的输入输出规格。 6.然后,实体级别的程序构造阶段。 算法构造和程序构造。主要是从资源占用的角度确定宏观的算法。在这个阶段,是程序文档化阶段。文档这个属于是这个阶段的工具。 最后会产生严格的程序模块的文档。所有这些文档组合起来,可以构成运行流程。这些文档化的程序就是逻辑化的程序本身。 7.最后,编码阶段 用一种具体的语言,按照模块文档的接口、资源、算法要求,编制代码。
### 回答1: Python在数据分析与可视化中有广泛的应用。Python拥有丰富的数据分析库,如NumPy、Pandas、SciPy等,这些库提供了强大的数据处理和分析功能,可以帮助用户快速处理大量数据。 同时,Python还拥有众多的可视化库,如Matplotlib、Seaborn、Plotly等,这些库可以帮助用户将数据可视化,更好地理解数据。用户可以使用这些库绘制各种图表,如折线图、散点图、热力图等,以及更高级的图表,如3D图表、地图等。 Python还可以与其他工具和技术集成,如Jupyter Notebook、SQL、机器学习等,这些集成可以帮助用户更好地处理和分析数据。 总之,Python在数据分析与可视化中的应用非常广泛,可以帮助用户更好地理解和利用数据。 ### 回答2: Python是一种现代编程语言,它具有强大的数据分析和可视化功能,因此在数据分析、数据可视化和数据科学的领域中被广泛应用。Python在数据分析与可视化中的优点特别突出,它不仅有着丰富的第三方库和模块,而且易于学习和使用。 1. 数据分析 Python为数据分析提供了丰富的工具,例如Pandas,Numpy,Scipy等。这些库能够处理大量的数据,进行数据的清洗、处理和统计分析等,并能够实现各种统计分析、建模和机器学习等操作。与此同时,Python还提供了强大的支持可视化的工具,如Matplotlib和Seaborn等,能够将分析结果以各种形式展现出来,如折线图、统计图、标志图等。 2. 数据可视化 Python有着强大的可视化工具。除了Matplotlib和Seaborn,Python还有其他支持可视化的第三方库,如Bokeh、Plotly等。这些库能够以不同的方式创建不同类型的图表和图形,如散点图、线图、热图、气泡图等等。通过这些工具,数据分析师可以更直观地呈现数据,让数据更加易于理解和分析。 Python的强大的数据分析与可视化功能可以帮助数据科学家更好地进行数据分析和可视化工作。优秀的工具和库可以帮助他们更快地处理、分析和理解数据。同时,Python也提供了大量的在线资源和社区,方便数据科学家学习和交流。因此,Python在数据分析与可视化中是不可或缺的工具。 ### 回答3: Python作为一种高级编程语言,功能十分强大,不仅可以用来完成一般的程序开发工作,还可以用于数据分析和可视化。Python在数据分析和可视化中应用广泛,已经成为数据科学领域中的主流工具之一,下面就Python在数据分析和可视化中的应用进行简单的介绍。 1. 数据处理:Python拥有丰富的数据处理库,如NumPy和pandas,可以方便地读取、清洗和处理数据,这是进行数据分析前重要的步骤。NumPy提供了多维数组数据结构和多种操作方法,pandas则提供了DataFrame和Series数据结构,方便对数据进行拆分、处理和分析。 2. 数据分析:Python有许多数据分析相关库,如SciPy、scikit-learn和statsmodels等,这些库提供了多种统计方法和机器学习算法,可以用于分类、聚类、回归等数据分析任务,并有丰富的可视化功能。 3. 可视化:Python通过各种可视化库,如Matplotlib、Seaborn、Plotly,以及像Bokeh和Dash这样的交互式可视化库,可以方便地制作数据可视化图表。这些库可以生成各种类型的图表,如散点图、柱状图、饼图、热图等。Bokeh和Dash还支持动态交互,用户可以根据数据的不同维度进行筛选,以获得更加直观的数据呈现。 总之,Python在数据分析和可视化中应用广泛,既有丰富的数据处理和分析函数,也有多种绘图技巧和交互式操作方式,非常适合进行数据分析和可视化的工作。同时,Python的高可读性和易扩展性,也使得它在数据科学领域中得到了广泛的认可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖永威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值