尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

循环工程实战:从概念到落地,构建AI驱动的软件价值闭环

循环工程实战:从概念到落地,构建AI驱动的软件价值闭环 如果你是一名开发者最近可能频繁听到“循环工程”Loop Engineering这个词。它不像“微服务”或“容器化”那样有明确的边界也不像某个具体的框架那样可以直接npm install。它更像一种理念一种正在重塑我们如何构建、迭代和交付软件的工作方式。很多人第一反应是“这不就是 DevOps 或者 CI/CD 的另一种说法吗” 这是一个典型的误区。DevOps 打通了开发和运维的墙CI/CD 自动化了构建和部署的流程。而循环工程关注的是从想法到代码再到用户反馈最后回归到新想法的完整价值闭环。它试图回答一个更根本的问题我们如何让软件的每一次变更都更精准地服务于业务目标并更快地验证其价值简单来说循环工程的核心是“构建-度量-学习”的快速、自动化循环。但它的关键突破在于通过一系列新兴的工具链尤其是 AI 驱动的工具将这个循环的“构建”和“学习”环节极大地加速和智能化了。过去一个功能从需求到上线可能需要数周现在借助 AI 辅助编码、自动化测试和实时监控反馈这个周期可能被压缩到几天甚至几小时并且每一次迭代都更有数据依据。本文将为你彻底拆解循环工程。我们不会停留在概念空谈而是会深入探讨它到底解决了传统研发流程中的哪些具体痛点它的核心架构和关键组件是什么如何从零开始搭建一个最小化的“循环工程”实践环境通过一个完整的全栈示例Node.js React展示自动化闭环如何运作。实践中最大的“坑”在哪里以及如何规避。无论你是团队的技术负责人寻找提效突破口还是一线开发者想了解最前沿的工程实践这篇文章都将提供可直接落地的思路和代码。1. 循环工程真正要解决的问题从“交付代码”到“交付价值”的转变在讨论具体技术之前我们必须先统一问题域。传统敏捷或 DevOps 流程其优化终点往往是“更快、更稳定地交付代码”。这当然重要但存在一个盲区我们交付的代码所产生的业务价值究竟如何我们可能每周发布多个版本但其中有多少功能是用户真正需要、或用起来顺手的循环工程要解决的正是这个“价值验证滞后”的问题。它将用户反馈和数据洞察直接、自动地注入到开发流程的起点形成一个持续的闭环。具体痛点体现在以下几个场景场景一功能上线即“沉睡”。团队耗时一个月开发了一个精心设计的新功能上线后数据平平用户很少使用。原因可能是需求理解偏差或交互设计不符合用户习惯。传统的做法是等到下一次季度复盘时才可能调整周期极长。场景二Bug 修复的“黑盒”。生产环境出现一个错误运维团队收到告警提交工单给开发。开发需要重现问题、定位代码、修复、测试、再上线。整个过程依赖人工沟通和排查反馈链路长。场景三技术决策缺乏数据支撑。选择 A 库还是 B 框架往往基于社区热度或团队熟悉度。但哪种选择对最终用户的性能体验、业务转化率提升更有效缺乏快速的、基于生产数据的验证手段。循环工程的思路是将每一个代码变更无论新功能还是修复都视为一个假设并通过自动化工具链快速将这个假设投入生产环境进行小范围或全量验证然后收集数据得出结论并自动触发下一步行动推广、优化或回滚。这个闭环的加速严重依赖于两大现代技术支柱云原生基础设施提供弹性、可观测的环境和AI 辅助开发加速构建与分析环节。接下来我们深入其核心原理。2. 核心概念与架构拆解“构建-度量-学习”自动化闭环理解循环工程可以将其想象为一个自动驾驶系统。传统开发是手动驾驶司机决定一切DevOps 是定速巡航自动化部分流程而循环工程则是具备环境感知、决策和行动能力的自动驾驶。核心三层架构智能构建层 (Intelligent Build)职责将需求或问题快速转化为可部署的代码。关键组件AI 编程助手如 GitHub Copilot、Cursor、通义灵码等。它们不是简单的代码补全而是能根据自然语言描述生成功能模块、单元测试甚至提交信息极大提升“从想法到代码”的速度。低代码/无代码平台对于标准化业务模块通过可视化搭建快速生成前端界面或后端逻辑。自动化代码生成根据 API 规范如 OpenAPI Spec自动生成客户端 SDK、服务端桩代码或数据库访问层。自动交付与运行时层 (Automated Delivery Runtime)职责安全、快速、可控地将代码变更交付到生产环境并提供可观测性。关键组件CI/CD 流水线这是基础。但循环工程强调更细粒度的流水线支持功能开关、蓝绿部署、金丝雀发布等。云原生环境Kubernetes 等容器编排平台使得应用的发布、回滚、扩缩容变得标准化和自动化。可观测性套件包括日志Logging、指标Metrics和链路追踪Tracing。这是“度量”环节的数据来源。需要集成像 Prometheus、Grafana、Jaeger、ELK 这样的工具。学习与优化层 (Learning Optimization)职责分析运行时数据产生洞察并自动触发优化动作。关键组件产品分析工具如 Amplitude、Mixpanel 或自建数据平台用于分析用户行为点击率、转化漏斗、功能使用率。A/B 测试平台能够将不同的代码版本UI、算法、策略分配给不同用户群并对比关键指标。AI 运维与告警不仅发现异常还能通过分析日志和指标初步定位根因甚至自动生成修复建议或工单。更进一步可以与构建层联动自动创建修复分支或任务。反馈收集自动化将用户通过应用内反馈、客服系统等渠道提交的问题自动分类、去重并关联到具体的代码模块或版本。闭环如何流动一个理想的循环流程如下想法产品经理提出一个优化用户注册转化率的想法假设将注册按钮颜色从蓝色改为绿色能提升 5% 的点击率。智能构建AI 助手帮助开发者快速修改前端按钮组件代码并生成对应的 A/B 测试分流逻辑。代码提交后CI/CD 流水线自动运行。自动交付流水线构建镜像并通过功能开关将新版本仅部署给 10% 的用户金丝雀发布。度量可观测性工具收集该版本的应用性能数据错误率、延迟。A/B 测试平台和分析工具收集用户行为数据绿色按钮的点击率、后续注册完成率。学习分析系统在预定的实验周期如 24 小时后得出结论绿色按钮的注册转化率提升了 6%。优化/决策系统自动触发决策① 如果效果正向自动将新版本全量发布② 如果效果负向或出现严重错误自动触发回滚到旧版本③ 将本次实验的“假设-结果”数据沉淀到知识库供下次决策参考。新的想法基于实验结果产生下一个优化想法例如绿色按钮配合新的文案是否效果更好循环再次开始。这个闭环的速度和自动化程度决定了工程效能的上限。3. 环境准备搭建最小化循环工程实验场理论需要实践验证。我们搭建一个最小化的环境来模拟上述闭环。这个环境将包含一个简单的全栈应用Node.js 后端 React 前端。本地 CI/CD使用 GitHub Actions 模拟。可观测性使用 Docker 运行 Prometheus Grafana。A/B 测试实现一个简易的客户端分流逻辑。自动化反馈模拟一个接收错误报告并自动创建 GitHub Issue 的流程。前置条件操作系统macOS、Linux 或 WSL2 (Windows)。Node.js版本 18 或以上。可通过node -v检查。Docker 与 Docker Compose用于运行监控组件。确保docker --version和docker-compose --version命令可用。Git版本控制。一个 GitHub 账号用于仓库和 Actions。项目初始化# 创建项目目录 mkdir loop-engineering-demo cd loop-engineering-demo # 初始化后端项目 mkdir backend cd backend npm init -y npm install express cors npm install --save-dev jest supertest # 用于测试 # 初始化前端项目 cd .. npx create-react-app frontend --template typescript cd frontend npm install axios # 用于调用后端API这个结构代表了我们即将构建和循环的“产品”。4. 核心流程拆解从代码提交到自动决策我们将实现一个完整的、简化的循环。假设我们的“产品”是一个简单的计数器应用我们要实验“不同的按钮样式对点击率的影响”。流程步骤步骤一代码变更与 AI 辅助。我们修改前端按钮组件支持两种样式A/B版本。我们可以利用 AI 助手快速生成组件变体和测试代码。步骤二提交与自动化测试。代码提交至 Git触发 GitHub Actions 流水线运行单元测试、集成测试和构建。步骤三自动化部署与发布。流水线通过构建 Docker 镜像并更新本地或测试环境的部署模拟生产发布。同时注入功能开关或环境变量来控制 A/B 版本的分流比例。步骤四数据收集与度量。前端应用将用户点击事件附带版本信息发送到后端。后端记录日志和指标。Prometheus 收集这些指标Grafana 进行可视化。步骤五模拟分析与决策。我们编写一个简单的决策脚本定期查询 Grafana/Prometheus 的 API根据预设规则如B版本点击率 A版本 10%判断实验成败。步骤六自动触发动作。如果实验成功决策脚本可以自动创建一个新的 Git 分支或 PR准备将 B 版本设为默认如果失败可以发送告警或自动回滚。下面我们通过代码来实现关键环节。5. 完整示例实现一个可度量的 A/B 测试实验5.1 前端实现带数据上报的 A/B 按钮组件首先在前端项目中创建组件。// frontend/src/components/ABButton.tsx import React, { useState, useEffect } from axios; import axios from axios; // 定义按钮样式变体 interface ButtonVariant { id: A | B; label: string; backgroundColor: string; color: string; } const variants: ButtonVariant[] [ { id: A, label: 点击我 (A), backgroundColor: #007bff, color: white }, { id: B, label: 快来点击 (B), backgroundColor: #28a745, color: white }, ]; // 模拟一个简单的用户分流逻辑 (可根据userId哈希等实现更复杂的逻辑) const getAssignedVariant (userId: string): ButtonVariant { const hash userId.split().reduce((acc, char) acc char.charCodeAt(0), 0); return variants[hash % 2]; // 简单按奇偶分配 50%/50% }; const ABButton: React.FC () { // 在实际应用中userId 应从登录态或设备ID获取。这里用固定值模拟。 const [userId] useStatestring(demo-user-123); const [assignedVariant, setAssignedVariant] useStateButtonVariant(variants[0]); const [clickCount, setClickCount] useStatenumber(0); useEffect(() { // 组件加载时确定用户的分组 const variant getAssignedVariant(userId); setAssignedVariant(variant); // 上报曝光事件 (可选) logEvent(button_impression, { userId, variantId: variant.id }); }, [userId]); const handleClick async () { const newCount clickCount 1; setClickCount(newCount); // 上报点击事件到后端 await logEvent(button_click, { userId, variantId: assignedVariant.id, clickCount: newCount, timestamp: new Date().toISOString(), }); }; const logEvent async (eventType: string, payload: object) { try { // 调用后端的上报接口 await axios.post(http://localhost:3001/api/events, { eventType, ...payload, }); console.log(Event logged: ${eventType}, payload); } catch (error) { console.error(Failed to log event:, error); } }; return ( div style{{ padding: 20px, textAlign: center }} h3A/B 测试按钮实验/h3 p你的用户ID: strong{userId}/strong/p p你被分配到的版本: strong版本 {assignedVariant.id}/strong/p button onClick{handleClick} style{{ padding: 15px 30px, fontSize: 18px, border: none, borderRadius: 5px, cursor: pointer, backgroundColor: assignedVariant.backgroundColor, color: assignedVariant.color, }} {assignedVariant.label} (已点击 {clickCount} 次) /button p style{{ marginTop: 10px, fontSize: 14px, color: #666 }} 点击按钮会向后端发送事件数据用于分析哪个版本更吸引用户。 /p /div ); }; export default ABButton;关键解释getAssignedVariant函数模拟了用户分流逻辑。生产环境会使用更均匀的哈希算法。logEvent函数将用户行为曝光、点击发送到后端/api/events接口。按钮样式根据分配的变体动态变化。5.2 后端接收事件数据并暴露指标接下来实现一个简单的 Node.js 后端来接收事件并生成 Prometheus 格式的指标。// backend/server.js const express require(express); const cors require(cors); const app express(); const PORT process.env.PORT || 3001; // 中间件 app.use(cors()); app.use(express.json()); // 内存存储事件和指标 (生产环境请使用数据库) let events []; const clickCounts { A: 0, B: 0 }; const impressionCounts { A: 0, B: 0 }; // 1. 接收事件上报的API app.post(/api/events, (req, res) { const event req.body; event.receivedAt new Date().toISOString(); events.push(event); console.log(Event received:, event); // 根据事件类型更新内存中的计数 if (event.eventType button_click) { clickCounts[event.variantId] (clickCounts[event.variantId] || 0) 1; } else if (event.eventType button_impression) { impressionCounts[event.variantId] (impressionCounts[event.variantId] || 0) 1; } res.status(200).json({ message: Event logged successfully }); }); // 2. 供 Prometheus 抓取的指标端点 app.get(/metrics, (req, res) { res.set(Content-Type, text/plain); let metrics ; // 暴露点击次数指标 metrics # HELP button_clicks_total Total number of button clicks per variant.\n; metrics # TYPE button_clicks_total counter\n; Object.entries(clickCounts).forEach(([variant, count]) { metrics button_clicks_total{variant${variant}} ${count}\n; }); // 暴露曝光次数指标 metrics # HELP button_impressions_total Total number of button impressions per variant.\n; metrics # TYPE button_impressions_total counter\n; Object.entries(impressionCounts).forEach(([variant, count]) { metrics button_impressions_total{variant${variant}} ${count}\n; }); // 计算点击率 (CTR) - Prometheus 通常建议在查询时计算这里仅作示例 // metrics # HELP button_ctr Calculated click-through rate per variant.\n; // metrics # TYPE button_ctr gauge\n; // Object.keys(clickCounts).forEach(variant { // const ctr impressionCounts[variant] 0 ? (clickCounts[variant] / impressionCounts[variant]) : 0; // metrics button_ctr{variant${variant}} ${ctr}\n; // }); res.send(metrics); }); // 3. 一个简单的管理端点查看所有事件 (仅用于调试) app.get(/api/admin/events, (req, res) { res.json(events.slice(-50)); // 返回最近50条事件 }); app.listen(PORT, () { console.log(Backend server listening on port ${PORT}); console.log(Event API: POST http://localhost:${PORT}/api/events); console.log(Metrics endpoint: GET http://localhost:${PORT}/metrics); });关键解释/api/events端点接收前端上报的行为事件。/metrics端点以 Prometheus 标准格式暴露指标这是可观测性的基础。Prometheus 会定期抓取这个端点。指标button_clicks_total和button_impressions_total都带有variant标签便于按 A/B 版本进行区分和聚合。启动后端服务cd backend node server.js5.3 配置可观测性Prometheus 与 Grafana创建docker-compose.yml文件来启动监控栈。# docker-compose.yml version: 3.8 services: prometheus: image: prom/prometheus:latest container_name: prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - --config.file/etc/prometheus/prometheus.yml - --storage.tsdb.path/prometheus - --web.console.libraries/etc/prometheus/console_libraries - --web.console.templates/etc/prometheus/consoles - --web.enable-lifecycle ports: - 9090:9090 networks: - monitoring grafana: image: grafana/grafana:latest container_name: grafana volumes: - grafana_data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORDadmin # 设置默认密码生产环境务必修改 ports: - 3000:3000 networks: - monitoring depends_on: - prometheus volumes: prometheus_data: grafana_data: networks: monitoring: driver: bridge创建 Prometheus 配置文件prometheus.yml让它抓取我们后端应用的指标。# prometheus.yml global: scrape_interval: 15s # 每15秒抓取一次 evaluation_interval: 15s scrape_configs: - job_name: node-backend static_configs: - targets: [host.docker.internal:3001] # 在Docker容器内访问宿主机服务 labels: app: ab-test-backend注意host.docker.internal适用于 macOS 和 Windows Docker Desktop。Linux 环境下可能需要改为宿主机的实际 IP 地址。启动监控栈docker-compose up -d现在你可以访问Prometheus: http://localhost:9090Grafana: http://localhost:3000 (用户名admin, 密码admin)在 Grafana 中添加 Prometheus 作为数据源地址为http://prometheus:9090然后创建仪表盘来可视化点击量和曝光量。5.4 自动化决策脚本示例当数据积累后我们可以编写一个简单的脚本例如一个 cron 任务或 GitHub Actions 的定时任务来分析数据并做出决策。# scripts/analyze_experiment.py import requests import json import sys # 配置 PROMETHEUS_URL http://localhost:9090/api/v1/query GITHUB_REPO your-username/loop-engineering-demo # 替换为你的仓库 GITHUB_TOKEN your-github-token # 需要具有创建 Issue 的权限 def query_prometheus(query): 查询 Prometheus API try: response requests.get(PROMETHEUS_URL, params{query: query}) response.raise_for_status() data response.json() return data[data][result] except Exception as e: print(fError querying Prometheus: {e}) return [] def calculate_ctr(variant): 计算某个版本的点击率 clicks_query fsum(button_clicks_total{{variant{variant}}}) imps_query fsum(button_impressions_total{{variant{variant}}}) clicks_result query_prometheus(clicks_query) imps_result query_prometheus(imps_query) clicks float(clicks_result[0][value][1]) if clicks_result else 0 imps float(imps_result[0][value][1]) if imps_result else 0 ctr clicks / imps if imps 0 else 0 return ctr, clicks, imps def create_github_issue(title, body): 在 GitHub 仓库创建一个 Issue url fhttps://api.github.com/repos/{GITHUB_REPO}/issues headers { Authorization: ftoken {GITHUB_TOKEN}, Accept: application/vnd.github.v3json } data {title: title, body: body} try: response requests.post(url, headersheaders, jsondata) response.raise_for_status() print(fIssue created: {response.json()[html_url]}) except Exception as e: print(fFailed to create issue: {e}) def main(): print(开始分析 A/B 测试实验...) ctr_a, clicks_a, imps_a calculate_ctr(A) ctr_b, clicks_b, imps_b calculate_ctr(B) print(f版本 A: 曝光{imps_a}, 点击{clicks_a}, CTR{ctr_a:.2%}) print(f版本 B: 曝光{imps_b}, 点击{clicks_b}, CTR{ctr_b:.2%}) # 决策逻辑如果 B 版本的 CTR 比 A 高 10% 以上且样本量足够则判定为成功 MIN_IMPRESSIONS 100 # 最小曝光量避免早期误判 SUCCESS_THRESHOLD 0.10 # 10% 的提升 if imps_b MIN_IMPRESSIONS and imps_a MIN_IMPRESSIONS: if ctr_b ctr_a * (1 SUCCESS_THRESHOLD): print(✅ 实验成功版本 B 显著优于版本 A。) # 触发成功动作例如创建 PR 将 B 版本设为默认 issue_title [实验成功] 按钮样式 B 表现更佳建议全量发布 issue_body f 实验分析报告 - 版本 A CTR: {ctr_a:.2%} - 版本 B CTR: {ctr_b:.2%} - 提升幅度: {(ctr_b/ctr_a -1):.2%} 结论版本 B 的点击率显著高于版本 A超过 {SUCCESS_THRESHOLD:.0%} 阈值。 建议操作 1. 将前端代码中默认变体改为 B。 2. 移除 A/B 测试分流逻辑。 3. 创建新的部署。 create_github_issue(issue_title, issue_body) elif ctr_a ctr_b * (1 SUCCESS_THRESHOLD): print(❌ 实验失败版本 A 显著优于版本 B。) # 触发失败动作例如发送告警或记录结论 issue_title [实验结束] 按钮样式 A 保持优势关闭 B 版本实验 issue_body f实验数据显示原版本 A 更优。建议关闭 B 版本实验分支。 create_github_issue(issue_title, issue_body) else: print(⏳ 实验进行中差异不显著需要继续收集数据。) else: print(f⏳ 数据量不足需要至少 {MIN_IMPRESSIONS} 次曝光继续等待。) if __name__ __main__: main()这个脚本模拟了“学习与优化层”的决策逻辑。在实际生产中这个逻辑可能更复杂并集成在更强大的实验分析平台中。6. 运行与验证观察闭环的形成启动所有服务后端cd backend node server.js前端cd frontend npm start监控docker-compose up -d(确保 Prometheus 配置正确抓取host.docker.internal:3001)模拟用户行为打开浏览器访问http://localhost:3000确保ABButton组件被渲染。多次点击按钮并在不同浏览器或匿名窗口中访问以模拟不同用户不同的userId会导致分流到 A 或 B 版本。观察后端控制台应该能看到事件接收日志。验证数据收集访问 Prometheus (http://localhost:9090)在 Graph 页面输入button_clicks_total或button_impressions_total进行查询应该能看到按variant标签区分的指标数据。可视化与决策在 Grafana (http://localhost:3000) 中创建图表展示 A/B 版本的点击率趋势。运行决策脚本python scripts/analyze_experiment.py。根据当前数据量它会输出实验状态进行中、成功、失败并在达到条件时自动创建 GitHub Issue。至此一个完整的、最小化的“构建改按钮-度量收集点击数据-学习分析 CTR-优化创建 Issue 建议行动”循环已经跑通。虽然简化但它清晰地展示了循环工程的核心链路。7. 常见问题与排查思路在实践中你会遇到各种问题。下表列出了一些典型问题及其解决方法问题现象可能原因排查方式解决方案Prometheus 抓取不到后端指标1. 网络不通。2.prometheus.yml中targets配置错误。3. 后端/metrics端点未启动或返回非200。1. 在 Prometheus Web UI 的Status - Targets页面查看抓取目标状态。2. 在容器内执行curl host.docker.internal:3001/metrics测试连通性。3. 直接访问http://localhost:3001/metrics看是否有数据输出。1. 确保后端服务运行。2. 根据宿主机系统调整targets如 Linux 用宿主机IP。3. 检查后端/metrics路由是否正确。前端事件上报失败 (网络错误)1. 后端服务未运行或端口不对。2. 跨域 (CORS) 问题。1. 打开浏览器开发者工具Network标签查看 POST 请求状态。2. 检查后端控制台是否有请求日志。1. 确保后端在3001端口运行。2. 确认后端已启用cors中间件并正确配置。A/B 分流不均衡分流逻辑过于简单如奇偶分配导致样本偏差。查看后端内存中的clickCounts和impressionCounts对象或查询 Prometheus 指标对比 A/B 的曝光量。实现更均匀的分流算法如基于用户ID的一致性哈希或使用专业的客户端 A/B 测试 SDK。决策脚本无法创建 GitHub Issue1. GitHub Token 无效或权限不足。2. 网络问题。3. 仓库名错误。1. 检查 Token 是否具有repo权限。2. 在脚本中加入更详细的错误打印。3. 手动用curl测试 GitHub API。1. 在 GitHub 生成具有足够权限的 Personal Access Token。2. 确保仓库存在且有写入权限。实验结论不置信波动大样本量太小统计显著性不足。查看曝光量指标是否达到预设的最小值如MIN_IMPRESSIONS。增加实验流量比例或延长实验周期直到收集到足够的数据。决策脚本中应加入样本量检验。8. 最佳实践与工程建议将循环工程从 demo 推向生产需要关注以下方面基础设施即代码 (IaC)整个环境Kubernetes 集群、网络策略、监控栈应用代码定义和管理如 Terraform, Pulumi确保环境一致性方便重建和复制实验环境。功能开关 (Feature Flags)不要将 A/B 测试逻辑硬编码在组件中。使用专业的功能开关服务如 LaunchDarkly, Flagsmith 或开源方案允许在不重新部署代码的情况下动态调整分流比例、开启/关闭功能。数据管道与质量事件数据应发送到可靠的数据管道如 Kafka, AWS Kinesis然后持久化到数据仓库如 Snowflake, BigQuery进行分析。确保数据不丢失、不重复并定义清晰的数据模式。实验的科学性假设先行在实验开始前明确假设、主要指标和成功标准。样本量计算使用统计工具预先计算达到显著结果所需的样本量避免过早下结论。多重检验校正如果同时运行多个实验需要校正显著性水平避免假阳性。安全与合规用户隐私收集用户行为数据必须符合 GDPR、CCPA 等法规。做好数据匿名化、去标识化处理。权限控制决策脚本、流水线、功能开关管理界面必须有严格的权限控制防止未授权变更。回滚预案任何自动化的全量发布决策都必须有快速、可靠的一键回滚机制。将 AI 深度集成到循环中构建阶段用 AI 编码助手生成代码、测试、甚至提交信息。学习阶段用 AI 分析日志和指标自动定位性能瓶颈或错误根因并生成修复建议。优化阶段用强化学习等 AI 模型自动调整功能参数如推荐算法权重、UI 元素位置以最大化目标指标。循环工程不是一蹴而就的银弹而是一个需要持续投入和演进的工程文化。建议从一个小而具体的实验开始就像本文的按钮示例打通端到端的闭环让团队亲身感受到“快速验证价值”的威力再逐步推广到更核心的业务流程中。它的终极目标是让每一个开发者的工作都能更直接、更快速地看到其对真实用户和业务产生的价值。
返回列表