33

产品级敏捷: 高效, 使命必达的产品开发生态系统 - Cloud-Native 产品级敏捷

 4 years ago
source link: https://www.deva9.com/cloud-native/%E4%BA%A7%E5%93%81%E7%BA%A7%E6%95%8F%E6%8D%B7/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

产品级敏捷: 高效, 使命必达的产品开发生态系统

romeo-a-1312892-unsplash.jpg

前言:

产品开发最危险的一件事便是: 开发人员往往是在无知的情况下, 写代码。

产品开发最没效率的一件事便是: 架构师进行笨重的软件设计, 输出对开发人员毫无帮助的设计文档。

产品开发最不可思议的一件事便是: 开发人员开发汽车; 测试人员测试飞机 。

产品开发最悲催的一件事便是: 天天熬夜加班, 最终发布的版本, 却对客户、对用户, 产生不了任何正面的影响。

产品开发中最郁闷的一件事便是: 来了团队两、三年, 还是没法成为能独当一面的大牛。

产品级敏捷经由团队的高度协作与自主, 建立起一讲求个人价值与责任, 逐步的形成一高效的产品开发生态系统。在这生态系统中, 团队成员不仅能高效的完成版本开发, 更重要的是能发挥 “集体的智慧” 做出最佳的决策◦ 而使每一轮版本的发布, 都能以最少的产出, 却能对客户、对使用者, 产生最大的影响。

本文:

产品级敏捷是我在 2014 年所独立创建的; 是当今在业界唯一能将精益敏捷开发与软件工程, 无缝结合的端到端的产品开发模式。

产品级敏捷:

  • 有著精益敏捷开发的轻量级、可视化、即时发现问题等的特点
  • 也有著软件工程的系统化与规范化
  • 更重要且独特的是, 产品级敏捷中的各核心工程实践, 均可根据团队所要开发的需求 (特性) 的不同, 而可任意的 “组合” 成团队所需的工程实践; 使得团队可真正的拥有适合自身的产品开发的工程实践与工作模式, 使得团队不仅是能高效的开发产品, 更能保证产品发布的质量; 对客户、对使用者, 产生最大的影响

产品级敏捷共有五大核心工程实践:

  • Slice Board (切片板) : 使得每一轮版本的发布, 都能以最少的产出, 却能对客户产生最大的影响
  • Architecture Map (架构地图): 轻量级的设计每一轮版本的架构设计, 并识别每一轮版本在架构上的风险
  • Story Wall (故事墙): 使得开发人员与测试人员, 认同 User Story 的价值, 并从产品外部的视角, 清楚的明白: User Story 完成的定义或标准为何?
  • Scenario Tree (场景树): 轻量级且可视化的 Story 的设计与定义完成
  • Feature API (特性API): 从外部的视角, 使得特性对外所提供的 API, 均能代表ㄧ有价值的 “业务概念”

Slice Board (切片板):

任何的产品; 不论是与使用者会直接发生互动的应用系统, 或是提供给众多产品使用的平台; 都应该要先有一个完整的产品特性树。

产品特性树将使得我们可以很清楚的知道, 从外部使用者或外部产品的视角, 产品的架构, 最终应提供哪些有价值的服务?

而团队中针对产品特性树中的每一个特性, 都应该要有一个主要的特性负责人; 每一个特性都会有一个主要的特性负责人负责, 每一个特性负责人, 都将负责多个特性。

在产品级敏捷中, 特性负责人的主要责任便是: 经由与团队中各不同领域的成员; 架构师, 开发骨干人员, 测试经理, 资深测试人员; 共同具体分析出每个特性的业务场景。

特性负责人与团队成员协作, 分析每个特性业务场景的主要步骤如下:

步骤-1:     特性负责人, 分析特性是由哪些业务活动所构成的?

步骤-2:     特性负责人, 针对特性中的某个业务活动, 分析出此业务活动的基本流。

步骤-3:    团队成员, 以特性负责人所分析出的基本流为基础, 分析出相关的扩展流与异常流。

步骤-4:     特性负责人, 决定团队成员所分析出的扩展流与异常流, 哪些是需在这个版本中, 置入到产品的架构中, 来进行开发的。

步骤-5:     特性负责人, 再选取特性中的其他业务活动, 并重复步骤二至步骤五。直到特性中的所有业务活动均已分析完毕为止。

当特性负责人, 将特性的所有业务活动均分析出, 其各自的基本流, 扩展流与异常流之后, 特性负责人便可经由组合基本流, 扩展流与异常流, 而分析出从外部使用者或外部产品的视角, 有价值的端到端的业务场景切片。

特性负责人经由与团队成员的协作:

  • 团队成员, 分析出扩展流与异常流; 团队成员作加法。
  • 特性负责人, 从团队成员所分析出扩展流与异常流中, 删除不需要置入产品的架构中, 去进行开发的扩展流与异常流; 特性负责人作减法。

团队成员作加法, 特性负责人作减法; 此种团队协作的方式, 不仅使团队成员间, 能对需开发的特性场景 (需求), 迅速的达成一致的共识, 并且能使得每个特性, 都能以最少的场景 (需求), 却能对外部使用者或外部产品, 产生最大的正面影响。

图一: Slice Board 使得特性负责人与团队成员协作; 分析对客户、对使用者能产生最大正面影响的业务场景切片。

sliceboard.png

Architecture Map (架构地图):

当特性负责人与架构师, 开发骨干人员, 测试经理, 资深测试人员协作, 而可分析出特性下的所有业务场景切片时, 特性负责人与架构师, 开发骨干人员, 测试经理, 资深测试人员应再持续的协作, 根据由分析特性业务场景切片时, 所获得的知识, 继续分析出特性在架构上的依赖。

这些架构上的依赖, 包括:

  • 特性依赖产品外部的哪些产品? 设备?
  • 特性依赖外部这些产品或设备的哪些接口? 端口? 数据库?
  • 特性依赖自身产品内部的哪些子系统?
  • 特性依赖自身产品内部的这些子系统的哪些接口? 数据库?

当特性负责人与架构师, 开发骨干人员, 测试经理, 资深测试人员分析出特性在架构上的依赖后, 特性负责人便以 “Architecture Map”, 去承载这些特性在架构上的依赖。

特性负责人与架构师, 开发骨干人员, 测试经理, 资深测试人员便可根据特性的 Architecture Map 中, 所体现出的各特性在架构上的依赖, 而识别出:

  • 哪些依赖会存在著风险, 而使特性无法进行集成测试?
  • 或者哪些依赖所造成的风险, 会使特性无法进行独立发布、独立部署?

特性负责人必需与架构师, 开发骨干人员, 测试经理, 资深测试人员协作, 认真的分析因架构上的依赖, 对特性在执行集成测试或独立发布、独立部署上, 所可能带来的风险为何? 并深度的思考, 应该有怎样的A计划? B计划? 才能消除或降低因为架构上的依赖, 所导致的风险; 这一步真的很关键, 往往会决定产品开发的成功或失败…

图二: Architecture Map: Payroll 与 Finance 由不同的团队开发, 并且Payroll 依赖著 Finance。Payroll 与 HR 是经由数据库整合; Payroll 与 HR 共用 Employee 数据表。HR 会调用Recruitment 的 REST API。

architecturemap.png

Story Wall (故事墙):

特性负责人与架构师, 开发骨干人员, 测试人员, 资深测试人员, 经由协作, 完成了:

  1. 特性业务场景切片的分析。
  2. 特性架构上的依赖分析。

所以, 接下来特性负责人便可:

  • 将特性内部的业务场景切片, 依场景或功能点, 拆分成一个或多个 User Stories。
  • 将特性会与其他特性产生交互的场景, 拆分成一个或多个 User Stories。

特性负责人, 需针对每一个 User Stories, 提供以下的信息给开发人员与测试人员:

  • 会与 User Story 直接产生交互的外部使用者、系统、设备或事件。
  • 外部使用者、系统、设备或事件, 和 User Story 直接产生交互的目的。
  • 外部使用者、系统、设备或事件, 和 User Story 直接产生交互的主要场景。
  • User Story 完成标准 (验收条件):
    • 使用性: 外部使用者、系统、设备或事件是经由何种方式; 浏览器, 手机, 接口, 端口或某事件类型; 与 User Story 直接产生交互。
    • 性能
    • 可靠性
    • 安全性     

在产品级敏捷中, 特性负责人, 不应只是传递特性的需求, 而应该是:

  • 要能说服开发与测试人员, 能认同 User Story 的价值。
  • 并使开发与测试人员能从产品外部的视角, 清楚明白: 外部使用者、系统、设备或事件所期望 User Story 完成的定义或标准为何?

对于没被我们说服的这些开发、测试人员,我们怎能相信这些开发、测试人员,能为我们产出高质量的特性?

假如,我们自己都不把说服开发、测试人员,这么重要的事,当成是一回事,那只能再度的证明:我们自己也都是抱着一种做事的心态;只要开发、测试人员听我的命令在做事就行了。

做产品和做事最大的差别,不在于做事的内容,而在于心态与文化;一种懂得尊重他人,说服他人能交心,又能严守原则与是非的心态与文化。

产品的特性负责人,对于自己所负责的特性,都无法从外部的视角,明确且清楚的定义出,什么是特性开发完成的条件时,这样的特性负责人,除了只会使团队交付永远没有市场竞争力、永远无法使客户满意的产品外,其他什么事也没法做…

图三: Story Wall

storywall.png

Scenario Tree (场景树):

特性负责人, 说服开发与测试人员, 能认同特性中的 User Story 的价值, 并使开发与测试人员能从产品外部的视角, 清楚的明白: 外部使用者、系统、设备或事件所期望的特性中的 User Story 完成的定义或标准为何后, 开发人员与测试人员便必需协作, 藉由 “Scenario Tree”, 针对特性中的每个 User Stories, 共同的完成:

  • 从产品外部的视角, 分析出 User Story 最佳的易用性业务流活动步骤。
  • 分析出 User Story 每个业务流的活动步骤, 对外依赖的接口, 数据库或端口。
  • 分析出 User Story 每个业务流活动步骤完成后, 其所产出的实体。
  • 设计出每个实体的关键的纬度, 经由这些关键的纬度, 便能校验出 User Story 每个业务流活动步骤完成后, 其所产出的实体是正确、不正确、合法或不合法。
  • 由每个实体的关键纬度, 设计出 User Story 每个业务流活动步骤的表格式测试用例; 经由此表格式测试用例, 便可定义出:
    • User Story 每个业务流活动步骤, 其 开发完成 的定义。

开发人员, 架构师, UX 工程师与 Product Owner, 也必需协作, 藉由 “Scenario Tree” , 针对特性中的每个 User Stories, 共同的完成下列的设计:

  • User Story 是属于哪一个版本的特性? 或是属于新产生的特性?
  • User Story 将开发在那个模块? 那个类或文件内?
  • User Story 所需的数据表结构。
  • User Story 所需的使用者介面。

更重要的是: Product Owner 可藉由 “Scenario Tree, 确认开发人员已清楚的知道:

  • User Story 开发完成的定义为何?
  • User Story 该如何进行开发者测试?
  • User Story 最佳易用性的行为为何?

Product Owner 应坚持:

确认开发人员能经由 “Scenario Tree, 清楚的知道, 上述的三件事后, 才允许开发人员, 进行 User Story 的开发。

因为, 唯有如此, 才能确保特性交付时的质量与易用性。

假如,某个开发人员没办法清楚且具体的定义出,自己所负责开发的 User Story,什么是完成?那可以预见的是,这个开发人员,便只是会在我们的产品中, 不断的制造问题单罢了…

图四: Scenario Tree: 业务流活动步骤: 获取客户租 CD 数据, 将会调用一 REST API, 并产生一实体: 客户租 CD 数据。验证实体: 客户租 CD 数据, 是, 否正确的关键纬度是: Customer ID, CD 数, CD ID, Rental Date

scenariotree.png

Feature API (特性API):

每个特性依照场景或功能点, 分解成一到多个的 User Stories。每个 User Story 经过开发人员与测试人员的协作, 藉由 “Scenario Tree”, 分析出特性中包含哪些 “实体” ?

每一个特性中的实体应能只明确代表特性中的某个单一的业务概念; 同样的, 特性中的某个业务概念应也只能由特性中某个单一的实体所代表。

所以, 在特性中的 Scenario Tree 中, 假如, 识别出有一个以上的实体; 名称不同, 但这些实体所代表的业务概念, 却是同一个的业务概念; 则开发人员与测试人员, 便应该将这些代表相同业务概念的实体, 合并为单一的实体。

当开发人员与测试人员可从特性中的 Scenario Tree 中, 将特性中的实体都能明确的对映到某个单一的业务概念后, 开发人员与测试人员便可轻松的从 Scenario Tree 中, 依照实体所对映的活动, 而分析出每个实体对外需提供的方法 (API)。

最后, 开发与测试人员再将所有实体对外需提供的方法 (API) 集成, 便成为特性对外需提供的方法 (API)。

图五: Orders 与 Order Status 虽是不同的实体, 但, 却代表著同一个业务概念; Orders。所以, 将 实体Orders 与实体 Order Status 合并。

FeatureAPI.png

组合团队自身所需的核心工程实践:

团队往往面对不同类型的需求 (特性) 开发; 只需演示的需求 (特性), 在既有架构上, 需快速交付的需求 (特性), 新的需求 (特性) 的开发…等等。

团队针对这些不同类型需求 (特性) 的开发, 应该有不同的核心工程实践的组合

例如: 只需演示的需求 (特性), 建议: 只需 Slice Board, Story Wall, Scenario Tree 的组合; 便可快速的产出最少的场景, 却能吸引客户最多的关注。

 Slice Board Architecture MapStory WallScenario Tree Feature API
只需演示的需求 (特性)V VV 
在既有架构上, 需快速交付的需求 (特性)VVVV 
新的需求 (特性) 的开发VVVVV

结论:

产品级敏捷使得市场行销、产品管理与研发团队之间, 有了共通的语言, 而可共同的面向外部的客户与市场; 以最少的产出, 对客户产生最大的影响。

更重要的是, 藉由产品级敏捷, 企业将能打造一以人为本, 内聚力强, 强调协作互助, 完全自主当责的全功能幸福团队。

产品级敏捷期待著你的参与!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK