S'S ALGORITHM

Software Lifecycle

Requirements / WRSPM

Design:Architecture

Pipe and Filter

管道和过滤器(Pipe and Filter)是在软件架构和设计模式中,一种非常常见的设计模式。它被用来处理数据流,并将复杂的处理过程分解为一系列简单的步骤。

Client-Server

Client-Server(客户端-服务器)是一种经典的软件设计模型。它是分布式计算架构的一种,其中任务和负载被分配到两个主要的组件:客户端和服务器。这种模型被广泛用于各种网络应用程序和系统设计中。

  1. 请求-响应循环
    • 客户端向服务器发送请求,服务器接收到请求后进行处理,然后将结果返回给客户端。
  2. 网络通信
    • 客户端和服务器通过网络进行通信,常用的协议有HTTP、HTTPS、FTP、TCP/IP等。
  3. 异步处理
    • 在许多现代应用中,客户端可以异步地发送请求,而无需等待服务器的响应才能继续进行其他操作。

Client-Server 的应用示例

Client-Server 与其他模型的对比

Master-Slave

Master-Slave 模式是一种分布式计算架构,广泛应用于数据库、计算任务调度和系统管理中。它将任务和数据在主服务器(Master)和从服务器(Slave)之间进行分配,以提高系统的可用性、性能和容错性。

  1. 主从角色
    • 主服务器(Master):负责管理和协调,从属于控制中心。它分配任务、存储数据,并对系统进行整体控制。
    • 从服务器(Slave):接收来自主服务器的任务,并执行指定的操作。它可以将结果返回给主服务器或独立存储数据。
  2. 任务分配
    • 主服务器分配任务,从服务器执行。通常在计算任务中,主服务器会根据任务的复杂度和从服务器的负载情况进行分配。
  3. 数据复制
    • 在数据库系统中,主服务器将数据更新推送给从服务器,从而实现数据的冗余和备份。这样可以提高数据读取的效率和系统的容错能力。
  4. 容错性和高可用性
    • 从服务器的存在提高了系统的容错能力。如果主服务器出现故障,从服务器可以作为备份进行故障切换(Failover)。
  5. 读写分离
    • 通过将写操作集中在主服务器,而将读操作分散到从服务器,从而提高系统的性能。

Master-Slave 模式的应用示例

  1. 数据库系统
    • 在 MySQL、PostgreSQL 等数据库中,Master-Slave 模式用于实现数据复制和负载均衡。主数据库负责写操作,从数据库负责读操作。
  2. 分布式计算
    • 在 Hadoop 中,NameNode 作为主节点,DataNode 作为从节点。NameNode 负责元数据管理,DataNode 负责实际的数据存储。
  3. 任务调度系统
    • 诸如 Apache Kafka 之类的消息队列中,主节点负责管理主题和分区,从节点负责实际的消息存储和传递。

优点:

缺点:

Master-Slave 模式通过角色分配和任务调度,实现了高效的数据处理和系统管理。它在性能优化和高可用性方面表现出色,但也面临单点故障和数据一致性等挑战。通过合理的设计和实施,Master-Slave 模式能够为复杂的分布式系统提供强大的支持。

想起了k8s和Airflow的scheduler

Layered Model

分层模型是一种软件架构设计模式,通过将系统划分为多个层次,每个层次承担不同的职责,以实现更好的结构化和模块化。这种模型通常用于设计复杂的软件系统,使系统更易于开发、维护和扩展。

  1. 分层结构
    • 系统被划分为多个层,每一层在其上层之下并依赖于其下层。
    • 每层负责特定的功能,并通过接口与其他层进行交互。
  2. 模块化
    • 每一层可以独立开发、测试和修改,降低系统复杂度。
    • 层与层之间的相互依赖减少,增强了系统的灵活性和可维护性。
  3. 职责分离
    • 不同层次负责不同的职责,如数据访问、业务逻辑、用户界面等。
    • 职责的分离有助于明确系统的功能边界,提高代码的可读性和可维护性。
  4. 可扩展性
    • 通过增加或修改特定层的功能,可以轻松扩展系统,而不影响其他层。
  5. 可移植性
    • 底层的实现细节可以独立于高层,增强了系统的可移植性。

Layered Model 通常由以下几个主要层次组成:

  1. Presentation Layer(表示层)
    • 负责与用户的交互,包括用户界面的显示和输入处理。
    • 例如:Web 应用中的 HTML/CSS/JavaScript,桌面应用中的 GUI 组件。
  2. Application Layer(应用层)或 Business Logic Layer(业务逻辑层)
    • 负责处理应用程序的核心业务逻辑和规则。
    • 将用户的请求转化为具体的操作,通过与数据层交互来处理数据。
  3. Data Access Layer(数据访问层)
    • 负责与数据库或其他持久化存储系统进行交互。
    • 包括数据的查询、插入、更新和删除操作。
  4. Data Layer(数据层)或 Persistence Layer(持久层)
    • 负责实际的数据存储和管理,包括数据库系统和文件存储。
    • 管理数据的物理存储,确保数据的持久性和一致性。

以一个电子商务应用为例,Layered Model 的各层可能包含以下内容:

  1. Presentation Layer(表示层)
    • 负责显示产品信息、处理用户输入和结账流程。
    • 通过 RESTful API 或者 GraphQL 与应用层进行交互。
  2. Application Layer(应用层)
    • 实现产品搜索、购物车管理和订单处理等业务逻辑。
    • 负责用户认证和授权,确保用户的操作符合业务规则。
  3. Data Access Layer(数据访问层)
    • 负责从数据库中读取产品信息、订单状态,并进行数据持久化。
    • 使用 ORM(对象关系映射)工具或 SQL 查询与数据库交互。
  4. Data Layer(数据层)
    • 使用 MySQL 或 MongoDB 等数据库存储用户信息、产品目录和订单记录。
    • 维护数据库的架构和索引,确保数据的完整性和查询效率。

优点

缺点

Layered Model 被广泛应用于各种软件系统,包括但不限于:

Layered Model 与其他架构的对比

Layered Model 是一种经典的架构模式,通过分层实现系统的职责分离和模块化,适用于大多数复杂的业务系统。虽然在性能和灵活性上存在一些挑战,但其易于理解、维护和扩展的特点,使得它在软件设计中具有重要地位。通过合理的分层和接口设计,Layered Model 可以为复杂的系统提供清晰的结构和强大的支持。

其他构架

Microservices Architecture(微服务架构)

Event-Driven Architecture(事件驱动架构)

Service-Oriented Architecture(面向服务架构)

Repository Pattern(仓储模式)

资源链接

Design:Modularity

模块化是一种软件设计原则,旨在将软件系统分解为子系统,然后再分解为若干个相对独立的模块(Module),以便于开发、理解、维护和重用。这些模块可以是代码、组件、功能模块或子系统,它们通过清晰的接口进行交互。

和上一部分的系统构架不同,这部分专注于系统内部的,功能分离的设计模式

何为设计?:设计行动本身,和设计文档

Design is not coding, coding is not design.What important is the real world solutions.

模块化的基本概念

应用领域

Stages of Design:设计的各个阶段

Modularity 的目的

Information Hiding:

Data Encapsulation

强内聚 & 低耦合

强内聚(Strong Cohesion):意味着模块内的代码和功能高度相关,目标明确,通常关注单一职责。这种设计使模块更专注于其核心功能,避免了混杂不同功能的代码。

低耦合(Loose Coupling):强调模块间的独立性和灵活性。低耦合设计允许模块在互不干扰的情况下演变和发展,使得系统的修改和扩展变得更加容易。

Coupling 耦合

Cohesion 内聚

Implementation & Deployment

Implementation

Deployment

built with the idea of retreat

Testing

Unit - Integration - Incremental

Top-Down & Bottom-Up

Back-to-back testing

Who Should test

Manual & Automatic test

Black Box & White Box

Software Development

Software Development models

Waterfall Model

瀑布开发模型是一种线性和顺序的软件开发方法,常用于项目管理。其名称来源于开发过程像瀑布一样逐步向前推进。整个过程分为多个阶段,每个阶段必须完成后才能进入下一个阶段。这些阶段通常包括需求分析、系统设计、实现、集成与测试、部署、以及维护。

瀑布模型的优点在于其结构化和系统化的流程,使项目计划和管理相对简单,同时适合需求明确且变化较少的项目。然而,它的缺点在于灵活性不足,难以适应需求变化,可能导致后期问题修复的成本高昂。因此,瀑布模型适合于需求稳定且项目定义清晰的项目。

V-Model

V-Model,又称为V字模型,是一种软件开发流程模型,体现了开发和测试的紧密结合。它是瀑布模型的扩展,将测试阶段与开发阶段并行进行,形成一个V字形的结构。模型左侧是开发阶段,包括需求分析、系统设计、详细设计和编码,而右侧是与这些阶段对应的测试阶段,分别是单元测试、集成测试、系统测试和验收测试。

每个开发阶段都有相应的测试阶段,以确保每个部分都按预期工作。V-Model的优点在于,它强调了在早期阶段进行验证和验证,从而减少了后期的错误和修复成本。然而,与瀑布模型相似,V-Model不易适应需求频繁变化的项目,适用于需求明确、变更较少的项目。它通过早期测试规划提高了项目的质量和可靠性。

Sashimi Model

Sashimi(刺身)模型是一种项目管理方法论,与瀑布模型相似但更灵活。其核心思想是通过并行的方式逐步构建软件,将整个开发过程分成多个小的、可重叠的阶段,如同制作生鱼片时将鱼切成薄片。每个阶段包含了分析、设计、编码、测试等活动,允许团队在开发的不同阶段同时进行某些工作。这样,团队可以更快地发现问题,并在整个开发周期中保持灵活性和敏捷性。Sashimi模型适用于需要快速迭代和反馈的项目,并在应对需求变化时具有一定优势。

Iterative Model

Incremental Model

Unified Process Framework

(统一过程框架,简称 UP 或 RUP)是一个面向对象的软件开发过程框架,最初由 Rational Software 公司开发,因此常被称为 Rational Unified Process (RUP)。它是一个迭代的、面向架构的、以用例驱动的软件开发过程框架。RUP 的目标是帮助开发团队以结构化和规范化的方式开发高质量的软件系统。

主要特点

  1. 迭代和增量:
    • 迭代开发: RUP 强调在开发过程中进行多个迭代,每个迭代都会构建和验证部分系统功能。
    • 增量交付: 系统逐步构建,功能在多个迭代中逐渐完善并交付给用户。
  2. 用例驱动:
    • 以需求为中心: RUP 是用例驱动的开发方法,通过用例(Use Case)来捕获和管理用户需求,用例也指导系统的设计、实现和测试。
    • 需求跟踪: 每个用例都与系统的需求、测试用例和设计元素紧密关联,确保开发工作始终围绕用户需求进行。
  3. 架构为中心:
    • 重点关注架构: 在项目早期,RUP 强调构建和验证系统的架构,以确保系统具有良好的结构和可扩展性。
    • 架构基线: RUP 通过创建架构基线(Architecture Baseline)来管理系统的整体设计,减少开发中的重大变更风险。
  4. 以风险为导向:
    • 识别和管理风险: 在项目早期识别潜在风险,并通过迭代进行风险的管理和缓解。每个迭代都优先处理高风险部分,从而减少后期的项目风险。

核心工作流:(一个轴)

RUP 包含多种核心工作流(也称为活动流或流程),其中主要包括:

  1. 业务建模(Business Modeling): 理解和分析业务环境以及系统所需的业务功能。

  2. 需求(Requirements): 通过用例来捕获和定义系统的需求。

  3. 分析与设计(Analysis and Design): 创建系统的架构,并设计实现需求的解决方案。

  4. 实现(Implementation): 编写代码,将设计转化为实际的软件系统。

  5. 测试(Test): 验证系统是否符合需求,并找出和修复缺陷。

  6. 部署(Deployment): 将系统交付给最终用户并进行安装、配置和用户培训。

生命周期阶段:(另一个轴)

RUP 将整个软件开发过程分为四个阶段,每个阶段由多个迭代组成:

  1. 初始阶段(Inception):
    • 目标:定义项目范围,确定关键需求,评估项目的可行性和风险,制定项目计划。
    • 产出:项目愿景文档、初步用例模型、项目计划、业务风险评估。
  2. 细化阶段(Elaboration):
    • 目标:定义并基线系统的体系结构,详细设计关键用例,并进一步识别和缓解风险。
    • 产出:详细的用例模型、架构基线、更新的项目计划。
  3. 构建阶段(Construction):
    • 目标:逐步开发和测试系统功能,构建并集成系统各部分,达到可部署的状态。
    • 产出:可工作的系统版本、测试用例和结果、用户文档。
  4. 移交阶段(Transition):
    • 目标:将系统移交给用户,包括安装、配置、用户培训、并解决任何出现的问题。
    • 产出:最终的系统版本、用户培训材料、系统文档、支持计划。

RUP 的优势

Unified Process Framework(特别是 RUP)是一种结构化的、面向对象的软件开发框架,强调迭代开发、用例驱动、架构为中心以及风险管理。它适用于需要高质量软件开发的中大型项目,通过其灵活和结构化的流程,有助于管理复杂性并确保项目成功。

Spiral Model

是一种风险驱动的软件开发模型,结合了瀑布模型的系统性和迭代模型的灵活性,特别适用于大型、复杂和高风险项目。其核心特点是通过多次迭代进行开发,每个迭代包含需求分析、设计、实现、测试和评估等阶段,并在每个阶段进行明确的风险评估和管理。与其他模型相比,Spiral Model强调风险控制和客户反馈,每个迭代结束后都会根据反馈调整开发计划,使项目能够灵活应对变化和不确定性。

Agile

Agile开发是一种灵活、迭代的软件开发方法,强调在不断变化的需求下,通过小步快跑的方式快速交付高质量的软件产品。它起源于2001年发布的《敏捷宣言》,核心理念包括以人为核心、协作为重、适应变化和持续交付。

Agile开发的主要特点(敏捷宣言)

  1. 迭代和增量开发
    • 项目分为多个短周期(通常为2-4周)的迭代,每个迭代都会交付一个可以工作的产品增量。
  2. 客户参与和反馈
    • 在整个开发过程中,客户和开发团队保持密切的沟通,客户的反馈会及时融入到后续迭代中。
  3. 自组织团队
    • 开发团队自组织并具有高度的自主权,团队成员共同决定如何最好地完成任务。
  4. 适应变化
    • Agile开发能够迅速适应需求变化,即使是在开发后期,团队也可以通过不断调整方向来满足客户需求。

与传统的瀑布模型相比,Agile开发更具灵活性和响应速度,适合需要快速适应变化并且注重客户满意度的项目。


Kanban是一种视觉化的工作管理方法,起源于制造业,特别是丰田生产系统,后来被广泛应用于软件开发和其他领域。Kanban的核心理念是通过可视化的任务流动和持续改进,帮助团队高效管理工作、减少浪费、优化流程。

Kanban的核心要素

  1. 可视化工作
    • Kanban板是Kanban方法的核心工具,通常由多个列组成,每列代表工作流中的不同阶段(如“待办”、“进行中”、“已完成”)。每个任务用卡片表示,卡片在不同列之间移动,反映工作进展情况。
  2. 限制在制品(WIP)
    • 为了避免团队过载,Kanban通过限制每个工作阶段的在制品(Work in Progress, WIP)数量,确保团队只专注于少量任务,避免多任务切换带来的效率下降。
  3. 管理流程
    • 通过持续监控和分析工作流,识别瓶颈和问题,团队可以不断调整和优化工作流程,提升效率和质量。
  4. 明确流程
    • Kanban强调明确和标准化的工作流程,确保每个团队成员都了解任务如何从一阶段流向另一阶段,促进团队协作和一致性
  5. 持续改进
    • Kanban提倡通过定期的回顾和分析(如卡片流动时间、周期时间)来识别改进机会,推动团队持续进步。

Kanban的特点

Kanban特别适合持续交付环境、维护和支持团队,或需要灵活应对变化和多样化需求的项目。它可以单独使用,也可以与其他敏捷方法(如Scrum)结合使用,帮助团队实现更高的工作效率和质量。


Lean Startup是一种创业方法论,旨在通过持续创新、快速实验和数据驱动的决策来创建成功的创业公司。由埃里克·莱斯(Eric Ries)在其同名书籍《The Lean Startup》中提出,Lean Startup的核心理念是以最小化资源浪费为目标,通过快速验证市场需求和迭代开发来打造产品。

Lean Startup的核心要素

  1. 最小可行产品(MVP)
    • MVP是指在产品开发的早期阶段,以最少的功能和资源构建的产品原型,目的是快速验证市场需求。MVP允许创业者通过最小的投入获取用户反馈,从而判断产品的潜力。
  2. 构建-测量-学习循环
    • 这个循环是Lean Startup的核心过程。创业者首先构建MVP,然后通过用户测试和反馈来测量其市场反应,最后根据反馈学习并调整产品或策略。这一循环可以帮助团队迅速调整方向,避免浪费时间和资源在不符合市场需求的产品上。
  3. 基于数据的决策
    • Lean Startup提倡通过实验证明而非假设来指导产品开发。每一次迭代都以数据为依据,确保每个决定都是基于用户的实际需求和市场情况,而不是单纯的直觉或假设。
  4. 快速迭代
    • 通过快速的构建-测量-学习循环,Lean Startup鼓励创业者迅速响应市场变化,不断改进产品,以便更快找到产品市场匹配(Product-Market Fit)。
  5. “Pivot” 或 “Persevere”
    • 在每个迭代结束时,创业团队要评估结果并决定是“转型(Pivot)”还是“坚持(Persevere)”。“转型”意味着对产品或商业模式进行重大调整,以更好地适应市场需求,而“坚持”则意味着当前方向有效,可以继续推进。

Lean Startup的特点

Lean Startup的适用场景:

Lean Startup方法特别适合初创公司,以及希望在不确定环境中快速验证和开发新产品的大型企业。通过这种方法,团队能够快速确定市场需求,降低失败的风险,提高成功的可能性。


Scrum是一种敏捷开发框架,广泛用于软件开发中以管理复杂项目。它通过短周期的迭代(称为“Sprint”)来促进持续改进和交付高质量产品。Scrum强调团队合作、自组织和灵活应对变化。

Scrum 框架 - 最广泛应用的框架

  1. 角色(Roles)
    • 产品经理(Product Owner):负责定义产品愿景、管理产品待办事项(Product Backlog),确保团队工作与客户需求一致。他们对产品很懂。目的是降低cost,提高profit。总之很像是PM。
    • Scrum经理(Scrum Master):负责确保Scrum流程顺利进行,移除障碍,帮助团队遵循Scrum原则。更像是周边support,包括硬件,软件,甚至精神支持。
    • 开发团队(Dev Team):跨职能团队,通常由5-9人组成,负责在每个Sprint(冲刺)内完成工作。真正在做技术的人,讨论,合作,解决问题。
  2. 工件(Artifacts)
    • 产品待办事项(Product Backlog):一个动态的任务列表,包含所有需要完成的工作项,由产品负责人管理和优先排序。
    • Sprint待办事项(Sprint Backlog):从产品待办事项中挑选出在当前Sprint中要完成的任务,由团队负责完成。
    • 产品增量(Product Increment):每个Sprint结束时,完成的工作将组成一个可以发布的产品增量。
  3. 事件(Events)
    • Sprint:一个固定的迭代周期,通常为2-4周,每个Sprint结束时交付一个可工作的产品增量。意为冲刺
    • Sprint计划会(Sprint Planning):在每个Sprint开始时,团队与产品负责人一起确定本Sprint的工作目标。
    • 每日站会(Daily Scrum):每天15分钟的快速会议,团队成员同步进度,讨论遇到的问题。
    • Sprint回顾会(Sprint Review):在每个Sprint结束时,展示完成的工作,收集反馈。
    • Sprint回顾(Sprint Retrospective):反思和讨论团队在Sprint中的表现,以便改进下一个Sprint。
  4. 价值观(Values)
    • 专注(Focus)在每个Sprint期间,团队的注意力集中在Sprint目标上,不被外部干扰分心。专注于当前的任务,避免多任务处理,确保团队高效完成工作。Scrum框架通过限制在制品(WIP)来帮助团队保持专注。
    • 尊重(Respect)团队成员相互尊重,理解并尊重彼此的意见和专业知识。尊重意味着认可每个成员的贡献,鼓励多样性和包容性,建立一个信任的工作环境。尊重有助于团队内部形成良好的合作氛围,促进更有效的沟通和协作。
    • 承诺(Commitment):团队成员承诺全力以赴完成Sprint目标。每个成员都对自己承担的任务负责,并尽最大努力在Sprint结束前交付高质量的工作。承诺不仅仅是对任务的承诺,更是对团队的承诺,确保团队目标的实现。
    • 勇气(Courage)团队成员有勇气面对挑战,提出问题并积极解决问题。勇气意味着不畏惧失败,敢于尝试新的方法和技术。团队成员要有勇气接受反馈,并在需要时推动变革,确保项目的成功。
    • 开放(Openness)团队成员之间以及团队与外部利益相关者之间保持开放透明的沟通。开放意味着坦诚面对项目中的问题、挑战和进展。通过开放的态度,团队能够更好地合作,及时调整策略,适应变化。
  5. 经验主义(Empiricism)是一种认识论理念,主张知识主要来源于感官经验和观察,而不是依赖先天的逻辑或理论推理。在实践中,经验主义强调通过观察、实验和实际操作来获得理解和洞察。这个理念在科学方法中占有核心地位,因为科学家们通过观察自然现象、进行实验,并基于经验数据得出结论。

在Scrum中,经验主义是其核心原则,强调通过实际经验和持续反馈来指导决策和行动。Scrum基于“试验-观察-调整”的循环,通过透明性、检视和适应这三个支柱来实施经验主义。

经验主义在Scrum中体现为一种以数据和实际经验为基础的工作方式,团队不断通过实践获得反馈,并根据这些反馈做出调整。这种方法确保了团队能够在不确定和复杂的环境中灵活应对变化,持续改进并交付高质量的产品。

Scrum通过明确的角色分工和周期性迭代,帮助团队在不确定和变化的环境中高效工作,是敏捷开发最广泛使用的框架之一。