---
title: "软件：一个有生命的有机体 - 博客"
canonical: https://wavect.io/zh/blog/software-a-breathing-organism/
language: zh
description: "软件永远没有完成的一天。然而大多数公司还是这样定价和对待项目。如何避免烧光预算，同时让用户高兴到向朋友推荐。"
image: "https://wavect.io/img/blog/headers/header_software-a-breathing-organism.png"
---

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

16 分钟 阅读 · 2024年6月29日

[**下一篇**](/zh/blog/why-agencies-are-bad/)

# 软件是一个会呼吸的有机体

要点速览

软件永远没有"完成"，它像建筑一样要走完规划、分析、设计、实现、测试与集成、维护的完整生命周期，用户提出新需求时周期就再次开始。跳过任何一个阶段长期都更贵：敏捷不是不规划的借口，松懈的设计制造技术债，缺测试的软件会坏得最快，没有不需要维护的软件。请确认你的供应商理解这个周期，并愿意全程支持你。

软件永远没有“完成”。但大多数公司却照那样定价、那样对待项目。本文讲如何避免把预算烧掉、同时把用户做到他们会自发告诉朋友。

你知道科技领域有软件架构师这个职位吗？软件开发者也常被称作建造者或工程师（更资深的开发者）。科技与真实的土木工程（盖建筑等）之间有这么多平行词，是有原因的。

那有哪些平行点，我们能从中学到什么？

## 土木与软件工程的平行

想想盖一栋建筑 🏗️，你需要：

1. 规划你要建什么，做资源规划等。
2. 分析各种外部因素，确保项目在所处场景下可行。
3. 设计内外部，规划房间布局、窗户位置等。
4. 真正从地基开始把它建起来。
5. 接入既有基础设施（互联网、电网、给排水等），并测试一切是否安全、是否符合计划。
6. 维护这栋建筑，必要时翻新部件，或者随着需求增长扩建。

![Software Lifecycle](/img/blog/posts/sorg-software-lifecycle.svg) 我们开发软件方案的过程相当类似，这个过程不可避免地伴随同样的风险与挑战。 在插图中你看到的是典型的软件生命周期。每个功能、每个里程碑都要经历这一周期。它总是从“你要造什么”的计划开始，到维护当前功能集结束。 一旦用户提出新功能请求，或你的软件已老到无法在市场中竞争，周期就再次开始。

## 不要跳过任何一个阶段

软件生命周期里的每一步都对成功至关重要。我们一步步看。

### 1. 忽视规划阶段

你会没有计划就开建一栋楼吗？大概不会。

这一阶段定义项目范围、目标、客户需求，并制定详细的项目计划。建软件产品有两种主要方法：瀑布方法和 [敏捷](/zh/glossary/agile/) 项目管理。

瀑布方法要求软件外包和客户在写下第一行代码之前，列出穷尽的功能清单并准备好完整计划。可以想见这非常有挑战，特别是需求会在过程中因新的市场反馈或其他外部因素而变化。

![Waterfall project management](/img/blog/posts/sorg-Waterfall.svg)

大多数软件项目使用敏捷方法来留在预算内并应对未预见的挑战。但关键来了：大多数公司把敏捷当作不规划的借口。我们看一下。

![Agile project management without plan](/img/blog/posts/sorg-Agile-withoutPlan.svg)

把敏捷当作“先开干”不做合适需求工程的借口，毫无疑问会害死你的项目。开发者很可能无法正确排序最紧迫的功能。最差情况下，软件甚至跑不起来；即使能跑也会显著延迟。如果你和外部软件供应商合作，请确保他们有连贯的流程和上报机制。

![Agile project management with plan](/img/blog/posts/sorg-Agile-withPlan.svg)

敏捷项目管理仍然需要计划。和瀑布的主要差别是我们有定期反馈循环、迭代，并每天、每周、双周重新对齐优先级。

![Kevin Riedl](/img/team/kevin.webp)

"不规划就是规划失败。"

### 2. 跳过分析

这一阶段，软件外包与所有利益相关方一起定义软件应包含的具体功能。跳过这一阶段，很可能导致想要的功能在计划预算内做不出来。

简而言之，客户不满意。详细需求帮助合理预算项目，并对齐预期，这对长期项目成功至关重要。

### 3. 让设计松懈

![User Interface Mockup](/img/blog/posts/sorg-MockupDesign.svg) 软件中的设计有两类。第一类是设计用户如何与你的应用交互，包括简单线框图、“情绪板”和模型图。最好用、最易用的界面都被精心设计过，让应用尽可能易用。 和任何职业一样，如果你想要一个出色的东西，请和出色的人合作。如果你可以接受平庸或预算紧张，那这或许是起步阶段可接受的取舍。

第二类是软件设计。从鸟瞰角度看所有软件组件叫软件架构。

它是什么？想想 Netflix，那家著名的流媒体平台。Netflix 的软件架构由成千上万个互相交互的软件服务组成，覆盖了你在 Netflix 上能做的一切，例如注册新账户、登录、看电影、订阅付费等。

这些服务每一个都被精心设计，能够承受用户请求量并在意外错误时恢复。下面是一个想象功能的示例软件设计。

![Software Design](/img/blog/posts/sorg-SoftwareEngineering.svg)

正确地架构你的软件、设计其组件，可以决定你的软件会不会变得无法维护、非常难以扩展新功能。把合适的软件设计当作对项目未来的投资，能避免臭名昭著的技术债。

### 4. 急着实现

这一阶段软件开发者实际写代码。作为敏捷项目方法的一部分，开发者应定期向客户上报并给客户留出早期反馈的机会。这能带来短期内的变更，否则可能要等到很晚才能修改。你可能会喜欢我们关于此话题的博文： [《为什么人们觉得软件外包糟糕》](/zh/blog/why-agencies-are-bad/) 。

### 5. 在测试与集成上让步

![Cost of Testing](/img/blog/posts/tdd-cost-of-testing.svg)测试阶段和软件生命周期中的其他阶段一样，需要时间和资源。但没有什么会比缺乏足够的程序化测试更快地把你的软件搞坏。 我们也有一篇关于软件测试的博文： [《测试驱动开发》](/zh/blog/test-driven-development/) 。 作为测试的一部分，也要确保你的软件与它依赖的外部软件被充分集成。一个 [Web3](/zh/glossary/web3/) 的具体例子是预言机，把链下数据带进你的 [智能合约](/zh/glossary/smart-contract/) 。虽然这属于之前的阶段，但在真实主网区块链上的集成与测试也必须做。

### 6. 忘了维护

我们刚说过软件有依赖，那些不是你软件外包写的、而是成千上万独立开发者写的。此外，你自己的软件也在演化，用户会提出新功能需求，会发现bug，依赖也需要更新。

你的软件外包前几个阶段做得越好，尤其是需求收集和软件设计，维护就越简单、越便宜。地球上没有不需要维护的软件，除非根本没人用，但我想那不是我们想要的。有些软件外包不喜欢做维护，请确认你的供应商愿意做。

另请参见：维护一款活生生的软件产品需要持续的工程领导力，而不是一锤子项目。如果你不想全职雇佣，可以看我们的 [奥地利 Fractional CTO](/zh/services/fractional-cto/) 服务。

## 最终思考

请确保你合作的软件工程师或软件外包了解这些软件生命周期。最重要的是，他们愿意在整个过程中支持你。

你可以跳过或忽视某些阶段，但长期一定更贵，且会在后期拖慢新功能交付，前提是用一个有缺陷的流程还能完成最初的需求。

## 你可能也喜欢..

[**软件项目应该如何正确定价** 大多数人都知道按小时计费的缺点，因此转而要求固定价格。如果我们告诉你软件项目的固定价格其实也没好到哪里去呢？](/zh/blog/agile-fixed-pricing/) [**Wavect vs 内部招聘** 全职雇佣等于 12 个月加股权。我们是楔子，直到你知道正确的人。](/zh/compare/wavect-vs-in-house-hiring/)

架构与平台

## 继续浏览此集群

对长期交付产生影响的框架、平台与系统设计选择。

[从核心文章开始**智慧城市软件架构：MQTT、LoRaWAN、Kubernetes 与 Terraform**](/zh/blog/smart-city-architecture-best-practices-2026/)

- [AI 生成 3D 游戏模型：2026 工具与质量指南](/zh/blog/ai-3d-model-generators-game-development-2026/)
- [用 Tampermonkey 自动化业务工作流](/zh/blog/tampermonkey-workflow-automation-guide/)
- [AI 会让跨平台框架变得多余吗？](/zh/blog/will-ai-kill-cross-platform-frameworks/)
- [Floci 对比 LocalStack：2026 年 AWS 本地模拟器选型指南](/zh/blog/floci-vs-localstack-aws-emulator/)
- [Git Worktree 与 Jujutsu：AI 编程智能体版本控制决策指南（2026）](/zh/blog/git-worktrees-vs-jujutsu-ai-coding-agents/)

只收重要内容

## 关注与你相关的内容

每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

16 分钟 阅读 · 2024年6月29日

[**下一篇**](/zh/blog/why-agencies-are-bad/)

邮件订阅新文章 ×

×

通过邮件获取新文章

我们发布时给你一封简短邮件。免费，不做跟踪。

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/software-a-breathing-organism/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-07-07",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-07-07",
      "url": "https://wavect.io/zh/blog/software-a-breathing-organism/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "软件永远没有\"完成\"，它像建筑一样要走完规划、分析、设计、实现、测试与集成、维护的完整生命周期，用户提出新需求时周期就再次开始。跳过任何一个阶段长期都更贵：敏捷不是不规划的借口，松懈的设计制造技术债，缺测试的软件会坏得最快，没有不需要维护的软件。请确认你的供应商理解这个周期，并愿意全程支持你。",
  "articleBody": " 博客概览/交付与 QA/架构与平台 软件是一个会呼吸的有机体 要点速览 软件永远没有\"完成\"，它像建筑一样要走完规划、分析、设计、实现、测试与集成、维护的完整生命周期，用户提出新需求时周期就再次开始。跳过任何一个阶段长期都更贵：敏捷不是不规划的借口，松懈的设计制造技术债，缺测试的软件会坏得最快，没有不需要维护的软件。请确认你的供应商理解这个周期，并愿意全程支持你。 软件永远没有“完成”。但大多数公司却照那样定价、那样对待项目。本文讲如何避免把预算烧掉、同时把用户做到他们会自发告诉朋友。 你知道科技领域有软件架构师这个职位吗？软件开发者也常被称作建造者或工程师（更资深的开发者）。科技与真实的土木工程（盖建筑等）之间有这么多平行词，是有原因的。 那有哪些平行点，我们能从中学到什么？ 土木与软件工程的平行 想想盖一栋建筑 🏗️，你需要： 规划你要建什么，做资源规划等。 分析各种外部因素，确保项目在所处场景下可行。 设计内外部，规划房间布局、窗户位置等。 真正从地基开始把它建起来。 接入既有基础设施（互联网、电网、给排水等），并测试一切是否安全、是否符合计划。 维护这栋建筑，必要时翻新部件，或者随着需求增长扩建。 我们开发软件方案的过程相当类似，这个过程不可避免地伴随同样的风险与挑战。在插图中你看到的是典型的软件生命周期。每个功能、每个里程碑都要经历这一周期。它总是从“你要造什么”的计划开始，到维护当前功能集结束。 一旦用户提出新功能请求，或你的软件已老到无法在市场中竞争，周期就再次开始。 不要跳过任何一个阶段 软件生命周期里的每一步都对成功至关重要。我们一步步看。 1. 忽视规划阶段 你会没有计划就开建一栋楼吗？大概不会。 这一阶段定义项目范围、目标、客户需求，并制定详细的项目计划。建软件产品有两种主要方法：瀑布方法和敏捷项目管理。 瀑布方法要求软件外包和客户在写下第一行代码之前，列出穷尽的功能清单并准备好完整计划。可以想见这非常有挑战，特别是需求会在过程中因新的市场反馈或其他外部因素而变化。 大多数软件项目使用敏捷方法来留在预算内并应对未预见的挑战。但关键来了：大多数公司把敏捷当作不规划的借口。我们看一下。 把敏捷当作“先开干”不做合适需求工程的借口，毫无疑问会害死你的项目。开发者很可能无法正确排序最紧迫的功能。最差情况下，软件甚至跑不起来；即使能跑也会显著延迟。如果你和外部软件供应商合作，请确保他们有连贯的流程和上报机制。 敏捷项目管理仍然需要计划。和瀑布的主要差别是我们有定期反馈循环、迭代，并每天、每周、双周重新对齐优先级。 \"不规划就是规划失败。\" 2. 跳过分析 这一阶段，软件外包与所有利益相关方一起定义软件应包含的具体功能。跳过这一阶段，很可能导致想要的功能在计划预算内做不出来。 简而言之，客户不满意。详细需求帮助合理预算项目，并对齐预期，这对长期项目成功至关重要。 3. 让设计松懈 软件中的设计有两类。第一类是设计用户如何与你的应用交互，包括简单线框图、“情绪板”和模型图。最好用、最易用的界面都被精心设计过，让应用尽可能易用。 和任何职业一样，如果你想要一个出色的东西，请和出色的人合作。如果你可以接受平庸或预算紧张，那这或许是起步阶段可接受的取舍。 第二类是软件设计。从鸟瞰角度看所有软件组件叫软件架构。 它是什么？想想 Netflix，那家著名的流媒体平台。Netflix 的软件架构由成千上万个互相交互的软件服务组成，覆盖了你在 Netflix 上能做的一切，例如注册新账户、登录、看电影、订阅付费等。 这些服务每一个都被精心设计，能够承受用户请求量并在意外错误时恢复。下面是一个想象功能的示例软件设计。 正确地架构你的软件、设计其组件，可以决定你的软件会不会变得无法维护、非常难以扩展新功能。把合适的软件设计当作对项目未来的投资，能避免臭名昭著的技术债。 4. 急着实现 这一阶段软件开发者实际写代码。作为敏捷项目方法的一部分，开发者应定期向客户上报并给客户留出早期反馈的机会。这能带来短期内的变更，否则可能要等到很晚才能修改。你可能会喜欢我们关于此话题的博文：《为什么人们觉得软件外包糟糕》。 5. 在测试与集成上让步 测试阶段和软件生命周期中的其他阶段一样，需要时间和资源。但没有什么会比缺乏足够的程序化测试更快地把你的软件搞坏。 我们也有一篇关于软件测试的博文：《测试驱动开发》。 作为测试的一部分，也要确保你的软件与它依赖的外部软件被充分集成。一个 Web3 的具体例子是预言机，把链下数据带进你的智能合约。虽然这属于之前的阶段，但在真实主网区块链上的集成与测试也必须做。 6. 忘了维护 我们刚说过软件有依赖，那些不是你软件外包写的、而是成千上万独立开发者写的。此外，你自己的软件也在演化，用户会提出新功能需求，会发现bug，依赖也需要更新。 你的软件外包前几个阶段做得越好，尤其是需求收集和软件设计，维护就越简单、越便宜。地球上没有不需要维护的软件，除非根本没人用，但我想那不是我们想要的。有些软件外包不喜欢做维护，请确认你的供应商愿意做。 另请参见：维护一款活生生的软件产品需要持续的工程领导力，而不是一锤子项目。如果你不想全职雇佣，可以看我们的 奥地利 Fractional CTO 服务。 最终思考 请确保你合作的软件工程师或软件外包了解这些软件生命周期。最重要的是，他们愿意在整个过程中支持你。 你可以跳过或忽视某些阶段，但长期一定更贵，且会在后期拖慢新功能交付，前提是用一个有缺陷的流程还能完成最初的需求。 你可能也喜欢.. 软件项目应该如何正确定价 大多数人都知道按小时计费的缺点，因此转而要求固定价格。如果我们告诉你软件项目的固定价格其实也没好到哪里去呢？ Wavect vs 内部招聘 全职雇佣等于 12 个月加股权。我们是楔子，直到你知道正确的人。 架构与平台 继续浏览此集群 对长期交付产生影响的框架、平台与系统设计选择。 从核心文章开始智慧城市软件架构：MQTT、LoRaWAN、Kubernetes 与 Terraform AI 生成 3D 游戏模型：2026 工具与质量指南 用 Tampermonkey 自动化业务工作流 AI 会让跨平台框架变得多余吗？ Floci 对比 LocalStack：2026 年 AWS 本地模拟器选型指南 Git Worktree 与 Jujutsu：AI 编程智能体版本控制决策指南（2026） 集群中的上一篇LoRaWAN vs NB-IoT vs Sigfox：如何为 IoT 传感器试点编制预算 可选服务路径： 软件开发 MVP 开发 软件 QA Fractional CTO Fractional Co-Founder 看看生产环境中的应用: 债券分析平台 先做决定: 如何挑选软件开发公司 只收重要内容 关注与你相关的内容 每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。 Company 电子邮箱 你希望接收哪些内容？ 完整的 Wavect 博客接收六个主题下的每一篇新文章。 仅接收所选主题请在下方选择一个或多个分类。 选择主题 AI 与智能体 产品与 MVP 交付与 QA 领导力与团队 商业与监管 Web3 与隐私 我希望接收所选的 Wavect 博客邮件，并已阅读 隐私信息。我可以随时退订。 发送确认邮件→ 免费、双重确认、不使用跟踪像素。 ",
  "articleSection": "商业与法律",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "dateModified": "2026-07-07",
  "datePublished": "2024-06-29",
  "description": "软件永远没有\"完成\"，它像建筑一样要走完规划、分析、设计、实现、测试与集成、维护的完整生命周期，用户提出新需求时周期就再次开始。跳过任何一个阶段长期都更贵：敏捷不是不规划的借口，松懈的设计制造技术债，缺测试的软件会坏得最快，没有不需要维护的软件。请确认你的供应商理解这个周期，并愿意全程支持你。",
  "headline": "软件：一个有生命的有机体",
  "image": "https://wavect.io/img/blog/headers/header_software-a-breathing-organism.svg",
  "inLanguage": "zh",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/software-a-breathing-organism/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/software-a-breathing-organism/",
  "wordCount": 154
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/delivery-qa/",
      "name": "交付与 QA",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/architecture-platforms/",
      "name": "架构与平台",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/software-a-breathing-organism/",
      "name": "软件：一个有生命的有机体 - 博客 | ",
      "position": 5
    }
  ]
}
```
