<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; 技术成本</title>
	<atom:link href="https://www.phppan.com/tag/%e6%8a%80%e6%9c%af%e6%88%90%e6%9c%ac/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 25 Apr 2026 00:56:17 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>架构师必备：技术债务的识别、管理与解决之道</title>
		<link>https://www.phppan.com/2024/09/architect-guide-technical-debt-identification-management-solutions/</link>
		<comments>https://www.phppan.com/2024/09/architect-guide-technical-debt-identification-management-solutions/#comments</comments>
		<pubDate>Sat, 14 Sep 2024 23:06:04 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[技术债务]]></category>
		<category><![CDATA[技术成本]]></category>
		<category><![CDATA[架构师]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2276</guid>
		<description><![CDATA[1 技术债务是什么 1992 年，沃德·坎宁安首次将技术的复杂比作为负债。它借用了金融中的「债务」概念，描述了 [&#8230;]]]></description>
				<content:encoded><![CDATA[<section id="nice" style="color: #000000;" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1 技术债务是什么</span></h1>
<p data-tool="mdnice编辑器">1992 年，沃德·坎宁安首次将技术的复杂比作为负债。它借用了金融中的「债务」概念，<strong style="color: #0e88eb;">描述了开发过程中因短期的技术妥协而带来的长期成本</strong>。</p>
<p data-tool="mdnice编辑器">技术债务是为了快速交付功能或应对业务需求，开发团队可能会采取一些「临时」方案，忽略最佳技术实践，如代码质量、架构设计、测试覆盖率等。这些技术上的妥协会在短期内提高开发速度，但会为未来的系统演进和维护增加负担。</p>
<p data-tool="mdnice编辑器">在技术上，「债务」意味着你欠系统的维护与改进工作；而类似金融债务，技术债务也会「<strong style="color: #0e88eb;">累积利息</strong>」，即随着时间的推移，未偿还的技术债务会让系统变得越来越难以维护和扩展，甚至影响系统的稳定性。</p>
<p data-tool="mdnice编辑器">技术债务是一个概念或者说是一个比喻，它将处理这些个技术架构中不太好的部分过程比作处理财务债务。添加新功能时所需的额外工作量就像是偿还债务的利息，比如添加一个新功能正常需要 4 天完成，因为技术债务导致现在需要 6 天完成，那多出来的 2 天就是偿还的债务利息。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2 技术债务的分类</span></h1>
<p data-tool="mdnice编辑器">技术债务可以按<strong style="color: #0e88eb;">意图</strong>、<strong style="color: #0e88eb;">时间</strong>、<strong style="color: #0e88eb;">引入阶段</strong>和<strong style="color: #0e88eb;">风险</strong>等多个维度进行分类：</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.1 按意图分类</span></h2>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">有意技术债务</strong>：开发团队在短期时间压力下故意做出的技术妥协。这种债务通常是为了快速交付产品或应对紧急业务需求。团队清楚这种技术债务的存在，并计划在未来某个时候偿还。如为了赶上发布期限，团队没有编写足够的测试用例或者没有输出详细的设计方案，但计划在下一次迭代中补充这些测试和文档。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">无意技术债务</strong>：由于缺乏经验、知识或对系统未来发展的错误预测而引入的债务。这类债务通常是在开发过程中无意中产生的，开发人员可能没有意识到已引入技术债务。如在初期设计数据库架构时未考虑到未来业务数据增长的需要，导致后期频繁进行查询优化或者存储架构调整。</p>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.2 按时间维度分类</span></h2>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">短期技术债务</strong>：指的是可以在短期内解决的技术债务，通常是代码上的小问题或结构上的简单重构。如某个功能模块的代码重复较多，可以通过简单的重构来提高代码的复用性。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">长期技术债务</strong>：需要系统化的重构或重新设计才能解决，通常涉及到架构层面的调整，例如将单体应用拆分为微服务架构。如系统最初采用了单体架构，但随着业务规模的增加，项目开发人员的增加，单体架构难以支持系统扩展和变更，需要进行微服务化重构。</p>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.3 按引入阶段分类</span></h2>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">设计债务</strong>：由于设计时的欠缺或不合理的设计决策，导致系统难以维护或扩展。例如，系统设计时没有考虑业务增长，导致后续扩展性不足。又或者系统没有设计为模块化或面向服务，导致新功能的引入需要大量的代码修改。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">代码债务</strong>：在代码实现阶段产生的技术债务，代码质量差导致的技术债务。代码债务往往表现为代码冗余、命名不规范、逻辑复杂等，增加了维护难度。这往往是开发人员在项目中没有遵守代码风格和最佳实践，导致代码难以阅读和维护。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">测试债务</strong>：缺乏足够的测试用例或测试覆盖率不足所形成的债务。测试债务会导致系统的可靠性和稳定性降低，增加了系统崩溃和错误的风险。</p>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.4 按风险类型分类</span></h2>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">高风险技术债务</strong>：对系统的稳定性和可扩展性有重大影响，容易引发系统故障或导致严重的后果。应优先处理。如数据库瓶颈导致系统性能下降，影响用户体验和业务运营。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">低风险技术债务</strong>：对系统的日常运行影响较小，可以推迟处理。如某个不常用的功能模块存在代码冗余问题，但不会影响核心业务流程。</p>
</section>
</li>
</ul>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3. 从前端和后端来看技术债务</span></h1>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.1 前端架构师视角下的技术债务</span></h2>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">3.1.1 <strong>代码复杂度与可维护性</strong></span></h3>
<p data-tool="mdnice编辑器">前端代码通常受到多种因素的影响，特别是用户界面的变化、浏览器兼容性等。由于前端开发经常面临频繁的需求变更，快速实现功能往往导致代码复杂度增加，从而形成技术债务。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">代码结构混乱</strong>：由于快速迭代和需求变化，前端代码容易变得混乱，特别是当缺乏良好的代码组织和模块化设计时。开发人员可能会在现有代码中添加「临时」功能，而不重构现有代码，导致未来的维护变得更加困难。如没有遵循组件化或模块化设计，导致 UI 组件的代码高度耦合，修改一个小功能可能需要修改多个文件或部分代码，增加了维护难度。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">CSS 技术债务</strong>：CSS 代码由于其全局性，容易积累大量的冗余样式。当开发团队在不同时间段引入不同的 CSS 框架（如Bootstrap、Tailwind）或没有统一的 CSS 命名规范时，可能会导致样式冲突、覆盖问题，最终导致CSS文件变得庞大和难以维护。如，多个开发者在不同阶段对同一页面的样式进行修改，结果导致页面中充斥着大量的冗余 CSS 规则，影响渲染性能，并且很难确定哪些规则是可以安全移除的。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">JavaScript 技术债务</strong>：前端应用程序越来越依赖 JavaScript 来实现复杂的交互和动态内容。为了快速交付，团队可能会忽略代码的重用性和可扩展性，结果导致大量的重复代码、难以调试的逻辑和不一致的状态管理。如，为了实现一个临时的交互效果，开发人员在多个组件中复制粘贴了相似的代码，而没有将其提取为一个可复用的函数或模块。随着时间推移，重复代码的维护成本增加，并且容易引入 Bug。</p>
</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">3.1.2 前端技术栈的老化</span></h3>
<p data-tool="mdnice编辑器">前端技术栈更新非常快，框架、库和工具不断涌现。如果长期不进行技术栈升级，技术债务会逐渐积累，导致后续无法高效开发和维护。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">依赖的老旧库和框架</strong>：前端项目中经常依赖大量的第三方库和框架。如果技术债务积累过多，长期不进行依赖升级，可能会导致这些库和框架不再兼容新版本的浏览器或操作系统，甚至存在安全漏洞。如，一个项目使用了已经不再维护的 JavaScript 框架（如AngularJS），但由于业务压力，团队未能及时升级到更现代的框架（如React或Vue），导致新功能开发受限，并且团队难以找到合适的开发者来维护这一老旧技术栈。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">构建工具的过时</strong>：前端通常依赖构建工具（如Webpack、Vite）来进行打包和优化。如果这些工具没有定期更新或配置不当，可能会导致打包速度缓慢、产出文件过大，影响页面加载性能。</p>
</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">3.1.3 性能债务</span></h3>
<p data-tool="mdnice编辑器">前端架构师需要时刻关注页面的性能表现，技术债务可能导致性能问题的累积。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">未优化的资源加载</strong>：为了快速交付，前端代码可能没有经过优化，导致页面加载时需要加载大量无用的 JS、CSS或图片资源，影响性能。如开发人员没有将不常用的模块按需加载，导致整个应用程序的JavaScript包过大，严重影响页面的初次加载时间。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">图像与媒体处理</strong>：没有对图像进行压缩、延迟加载或适配不同设备，可能导致图像加载缓慢，影响用户体验，尤其在移动设备上。</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.2 后端架构师视角下的技术债务</span></h2>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">3.2.1 系统架构的复杂性</span></h3>
<p data-tool="mdnice编辑器">后端架构师更多关注系统的整体架构设计和数据流动。当后端架构为了快速实现业务需求而做出妥协时，系统的复杂性往往会增加，导致技术债务的积累。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">单体架构的扩展性不足</strong>：在系统初期，为了快速交付功能，后端架构师可能选择单体架构。然而，随着业务的增长，单体架构难以扩展，导致每次修改或部署都影响整个系统的稳定性。如：一个电商系统最初采用单体架构，所有功能模块（下单、支付、库存管理）耦合在一起。随着业务扩展，系统变得难以维护，微小的改动也可能导致整个应用程序出问题。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">微服务架构的过度拆分</strong>：另一方面，过早引入微服务架构，且没有合理划分边界，也可能造成技术债务。过多的微服务可能导致系统间通信复杂、数据一致性问题严重、维护成本上升。如：一个中型应用将其功能过度拆分为几十个微服务，但由于团队资源有限，导致服务之间的依赖关系错综复杂，难以协调部署和调试。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">团队规模缩减导致的拆分不合理</strong>：当一个后台团队从 50 号人缩减到 10 多人，微服务数保持在 200 左右，对于原有团队下合理的微服务拆分将变成得不再合理。</p>
</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">3.2.2 数据库技术债务</span></h3>
<p data-tool="mdnice编辑器">数据库设计和管理是后端架构师的重要职责，技术债务在数据库层面也可能对系统造成严重影响。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">数据库结构设计不合理</strong>：为了快速上线，可能会仓促设计数据库结构，忽略了后续的扩展性和性能问题。这种技术债务往往在数据量增长时变得尤为明显。如：一个系统初期没有考虑到数据量的增长，选择了单表设计。随着数据量的增加，查询变得极其缓慢，导致用户查询界面响应时间过长。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">缺乏索引或优化</strong>：为了快速实现功能，可能忽略了对数据库索引的设计或查询的优化，导致系统性能下降。这种还比较常见，如：某查询接口没有建立合理的索引，导致每次查询都需要进行全表扫描，随着数据量的增加，查询时间指数增长。</p>
</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">3.2.3 技术栈的老化和依赖管理</span></h3>
<p data-tool="mdnice编辑器">与前端类似，后端项目也可能面临技术栈老化的问题，特别是后端服务通常具有更长的生命周期。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">依赖库老化</strong>：后端服务可能依赖多个第三方库或框架。如果这些依赖长期不更新，可能导致安全漏洞、性能下降，甚至与新技术不兼容。如：一个 Spring Boot 项目长期未升级依赖，导致无法兼容最新的 JDK 版本，甚至某些库存在已知的安全漏洞。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">技术栈过时</strong>：后端架构师需要定期评估是否需要引入新的技术栈来替换老旧的技术栈。例如，企业选择的编程语言或框架可能不再适合当前的业务需求或技术趋势。</p>
</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">3.2.4 性能与扩展性债务</span></h3>
<p data-tool="mdnice编辑器">后端架构师通常需要对系统的性能和扩展性负责，技术债务会导致系统难以应对负载压力。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">性能瓶颈</strong>：为了快速上线，后端服务可能没有经过详细的性能调优和压测。随着用户量和数据量的增加，性能瓶颈会逐渐显现，导致系统响应缓慢甚至崩溃。如系统初期的负载较低，未进行缓存优化或数据库分片设计。但随着业务扩展，用户请求量大幅增加，导致数据库成为性能瓶颈。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">扩展性不足</strong>：如果系统设计时未考虑水平扩展，后续业务增长时可能无法通过增加服务器或服务实例来扩展系统容量，必须进行架构重构。如一个支付系统初期没有设计为支持多实例的分布式架构，导致在高并发情况下，系统无法通过增加实例来应对流量激增。</p>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.4 小结一下</span></h2>
<p data-tool="mdnice编辑器">从前端和后端架构师的视角来看，<strong style="color: #0e88eb;">技术债务的核心概念是相同的</strong>，即为了短期利益而做出的技术妥协会在长期内增加系统维护的复杂性和成本。然而，<strong style="color: #0e88eb;">技术债务的表现形式和影响在前端和后端是不同的</strong>：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">前端架构师</strong> 更关注代码的复杂度、用户体验、性能优化、以及技术栈的快速迭代。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">后端架构师</strong> 则更多地关注系统的架构设计、数据库性能、服务的扩展性和技术栈的长远稳定性。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">无论是前端还是后端，技术债务的积累都会对系统的可维护性、性能和业务扩展产生负面影响，因此前后端架构师都需要在设计和开发过程中审慎管理技术债务，防止其过度积累。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4. 从成本来看技术债务</span></h1>
<p data-tool="mdnice编辑器">技术债务落到研发团队经营的逻辑上，成本的增加是一个比较明显的点。</p>
<p data-tool="mdnice编辑器">我们可以将成本分为以下几类：<strong style="color: #0e88eb;">直接成本</strong>、<strong style="color: #0e88eb;">间接成本</strong>、<strong style="color: #0e88eb;">机会成本</strong> 和 <strong style="color: #0e88eb;">长期成本</strong>，每类成本都随着技术债务的积累而逐渐增加，影响企业的整体运营效率和市场竞争力。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4.1 直接成本</span></h2>
<p data-tool="mdnice编辑器">直接成本是与技术债务解决和维护相关的显性成本，通常是可以量化的。</p>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">4.1.1 开发和维护成本</span></h3>
<p data-tool="mdnice编辑器">随着技术债务的增加，系统的复杂性和不确定性也会增加。开发人员需要更多的时间和精力来理解和修改已有代码，解决遗留问题。这会导致：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">设计复杂度增加</strong>：在每个功能设计时，都需要考虑旧的系统，或者其它历史债务的情况，从而整体设计复杂度增加，设计的时间成本增加。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">开发时间增加</strong>：因为代码难以理解且结构复杂，开发人员需要花费更多时间来修复 Bug 或实现新功能。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">维护成本上升</strong>：技术债务会导致更多的系统故障或不可预见的问题，直接增加对系统维护和修复的投入。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">例如一个代码结构不清晰的系统可能需要两倍甚至三倍的时间来新增一项功能，而没有技术债务的系统则可能只需较短时间。</p>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">4.1.2 测试和质量保证成本</span></h3>
<p data-tool="mdnice编辑器">技术债务往往伴随着低质量的代码和缺乏适当的测试覆盖。因此，为了确保系统的稳定性，团队可能需要投入更多的资源进行手动测试或编写额外的测试用例。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">测试周期延长</strong>：遗留系统或代码的复杂度增加了测试难度，导致测试周期变长。在每一次测试回归过程中都需要考虑到旧系统或者技术债务的一些场景或情况，而这些历史的东西往往了解的人更少，更容易被忽略掉，从而导致出现问题。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">Bug 修复成本增加</strong>：由于欠缺自动化测试，Bug 的发现和修复可能需要更多的人力和资源。</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">4.1.3 基础设施和性能优化成本</span></h3>
<p data-tool="mdnice编辑器">技术债务可能导致系统在运行时的性能不佳，要求更多的基础设施资源来应对性能瓶颈和扩展性问题。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">硬件和云资源成本增加</strong>：如果系统设计不合理，可能需要更多的服务器、存储或网络资源来应对系统负载。如一个设计不合理的数据库查询可能会导致巨大的 CPU 和 I/O 开销，增加云服务的使用成本。或者有历史遗留的系统，又下线不掉，这样会增加多一套系统的部署成本。</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4.2 间接成本</span></h2>
<p data-tool="mdnice编辑器">间接成本是由于技术债务带来的效率降低和协作障碍，难以直接量化，但对整体生产力的负面影响非常明显。</p>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">4.2.1 开发团队的生产力下降</span></h3>
<p data-tool="mdnice编辑器">技术债务会导致开发人员在系统上花费越来越多的时间处理遗留问题，而不是专注于创新和新功能开发。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">认知负担增加</strong>：复杂的代码和架构让开发人员需要花费更多时间理解系统，降低了开发效率。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">上下文切换成本</strong>：当技术债务导致频繁的系统错误时，开发人员可能不得不频繁地从新功能开发切换到 Bug 修复，增加了上下文切换的成本。</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">4.2.2 团队协作成本增加</span></h3>
<p data-tool="mdnice编辑器">技术债务可能导致代码结构混乱，文档缺失，进而增加团队沟通和协作的成本。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">知识传递成本</strong>：技术债务往往与文档不全和代码难以理解相伴，导致新成员加入团队时需要更多的时间来适应和理解系统。如果存在人员规模收缩等情况，知识传递甚至会出现丢失的情况，即一个历史债务在整个团队没有一个人知道，可能在某一天出现系统性风险，从而出现线上的故障。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">开发与运维之间的摩擦增加</strong>：当系统频繁出问题时，开发团队和运维团队之间的沟通成本增加，可能会引发内部摩擦和责任推诿。</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">4.2.3 技术债务管理成本</span></h3>
<p data-tool="mdnice编辑器">管理技术债务本身也会产生间接的成本。识别、跟踪和评估技术债务需要专门的工具和时间。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">工具和流程成本</strong>：引入技术债务管理工具（如SonarQube）和流程（如代码审查、技术债务评估会议）会增加一定的运营成本。</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4.3 机会成本</span></h2>
<p data-tool="mdnice编辑器">机会成本是指由于技术债务的积累，企业失去了本可以实现的业务机会或创新能力。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">功能开发延迟</strong>：技术债务增加了新功能开发的难度和时间成本，导致企业无法快速响应市场需求。这可能会导致：<strong style="color: #0e88eb;">市场机会流失</strong>，竞争对手可能会因为技术上的灵活性和快速迭代能力而抢占市场份额。如一个电商平台由于技术债务无法快速推出新的支付方式，导致用户流失到竞争对手的平台。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">创新受阻</strong>：技术债务让开发人员花费大量时间处理历史遗留问题，减少了创新的时间和资源投入。如果大部分资源都用于修复 Bug 和维护现有系统，企业就没有足够的资源投入到新技术或新产品的研发上。如：一家金融科技公司由于技术债务，无法快速实现移动支付功能，错过了移动支付的市场潮流。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">业务扩展受限</strong>：技术债务可能限制系统的扩展能力，无法支持新的业务模块或整合新的第三方服务，导致业务扩展受到阻碍。过于复杂和僵化的系统架构可能会让企业难以快速拓展到新市场或推出新产品。</p>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4.4 长期成本</span></h2>
<p data-tool="mdnice编辑器">长期成本是由于技术债务长期积累，影响系统的稳定性、可维护性和企业的技术存续能力。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">系统崩溃与故障时间</strong>：技术债务可能导致系统频繁出现故障，甚至遭遇不可恢复的崩溃，导致业务故障。每次系统故障都会导致企业收入损失，特别是对于依赖实时交易的平台（如电商、金融系统）。如：一次因技术债务导致的系统崩溃，可能让一家电商公司损失数百万的销售额。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">架构重建成本</strong>：如果技术债务累积到一定程度，可能需要对系统进行彻底的重写或重构。这是一个代价极高的过程，可能涉及大量的开发时间和资源。彻底清理技术债务有时需要对现有系统进行大规模重构甚至推倒重来，这不仅耗时耗力，还可能需要暂停新功能开发。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">人才流失成本</strong>：技术债务长期得不到解决，会打击开发团队的士气，导致优秀的技术人才流失，从而增加<strong style="color: #0e88eb;">招聘与培训成本增加</strong>，技术人员的流失会增加企业在招聘、培训新人的成本，尤其是技术债务较重的系统，新人上手难度更大，培训周期更长。</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4.5 小结一下</span></h2>
<p data-tool="mdnice编辑器">技术债务对成本的影响是多维度的，涉及直接的开发和维护成本、间接的生产力下降和协作成本、潜在的机会成本以及长期的系统崩溃与重构成本。通过适当的技术债务管理，企业可以避免这些成本的累积，保持系统的健康性和可扩展性，确保业务的可持续发展。</p>
<p data-tool="mdnice编辑器">在实际操作中，企业应在业务目标与技术债务管理之间找到平衡，制定长期的偿还计划，并通过合理的技术规划和持续的技术改进，最大限度地减少技术债务带来的成本。（感觉这是一句正确的废话）</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5. 系统性治理技术债务</span></h1>
<p data-tool="mdnice编辑器">解决技术债务是架构师的重要职责之一。</p>
<p data-tool="mdnice编辑器">解决技术债务的思路从「债务」这个词可以看出部分。<strong style="color: #0e88eb;">当我们花了一部分时间来清理模块，梳理架构，修改代码，形象的说就是偿还本金</strong>。</p>
<p data-tool="mdnice编辑器">前面我们讲了技术债务的定义，引入分类、以及技术债务如果不及时解决，会导致系统的复杂性、维护成本和风险不断增加，从而影响团队的生产力和系统的长期健康等等。</p>
<p data-tool="mdnice编辑器">那如何解决技术债务，或者说系统性解决技术债务？我们需要有系统化的策略来管理和解决技术债务。以下是一个有效的解决技术债务的步骤和方法：</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5.1 识别和分类技术债务</span></h2>
<p data-tool="mdnice编辑器">在解决技术债务之前，首先需要<strong style="color: #0e88eb;">识别</strong>技术债务的来源和类型。技术债务通常隐藏在代码复杂度、架构设计缺陷、性能瓶颈、测试不足等方面。</p>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">5.1.1 技术债务的来源</span></h3>
<p data-tool="mdnice编辑器">Martin Fowler 提出了一个技术债务的四象限模型，用来分类技术债务的不同来源：</p>
<section class="table-container" data-tool="mdnice编辑器">
<table>
<thead>
<tr>
<th style="color: #000000;"></th>
<th style="color: #000000;"><strong style="color: #0e88eb;">鲁莽（Reckless）</strong></th>
<th style="color: #000000;"><strong style="color: #0e88eb;">谨慎（Prudent）</strong></th>
</tr>
</thead>
<tbody>
<tr style="color: #000000;">
<td><strong style="color: #0e88eb;">故意（Deliberate）</strong></td>
<td>“我们没有时间做设计。”</td>
<td>“我们必须马上交付，后果以后再说。”</td>
</tr>
<tr style="color: #000000;">
<td><strong style="color: #0e88eb;">疏忽（Inadvertent）</strong></td>
<td>“什么是分层（设计）？”</td>
<td>“现在我们才知道该如何做了。”</td>
</tr>
</tbody>
</table>
</section>
<p data-tool="mdnice编辑器">这个模型将技术债务分为四种不同的情境，帮助我们理解其形成原因。以下是常见的技术债务来源：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">不充分的事前定义</strong>：在开发开始之前，需求往往没有得到充分的定义，导致开发在设计之前就草草开始。这种方式看似可以节省时间，但由于需求在开发过程中不断变化，往往需要后期大量返工，增加了技术债务。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">商务压力</strong>：商业决策往往迫使开发团队在功能尚未完全实现前就发布产品。在这种情况下，技术债务包括那些未完成的功能或设计。这种债务是故意的（故意/谨慎象限），因为团队明知需要改进，但为了赶项目进度而暂时忽略这些问题。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">缺乏流程或理解</strong>：业务团队往往并不理解技术债务的后果，从而在做出决策时忽视了技术上的负担。这种情况属于“疏忽/鲁莽”象限，因为团队在不理解的情况下做出了不明智的选择，未能考虑到长远的技术影响。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">紧耦合的组件</strong>：当软件系统中的组件紧密耦合时，系统的灵活性会大大降低，难以适应未来的业务变化。这样的设计不够模块化，导致每次修改都会影响多个部分，从而增加维护和扩展的难度。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">缺乏测试包</strong>：没有足够的测试覆盖会刺激开发者采用“凑活式”的解决方案来修复问题，这种快速但高风险的修复方法往往会导致更多的潜在问题和技术债务的积累。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">缺少文档</strong>：代码虽然写好了，但没有配套的文档支持，导致后续开发者难以理解和维护现有系统。这种情况属于“疏忽/鲁莽”象限，因为开发者未能认识到文档的重要性，最终增加了技术债务。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">缺乏合作与知识共享</strong>：团队内部缺乏有效的知识共享与合作，尤其是对新手开发者缺乏必要的指导。这会导致系统设计和代码质量不统一，产生更多的技术债务。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">并行开发的累积债务</strong>：在多个分支上进行并行开发，最终需要将这些分支合并为一个统一的代码库。合并的难度和代价随着时间的推移而增加，导致技术债务的累积。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">拖延重构</strong>：重构是减少技术债务的重要手段，但如果重构被拖延得太久，待修改的代码量会大幅增加，导致后期的重构成本和难度也随之增加。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">缺少与标准的对齐</strong>：忽视行业标准、框架或技术规范，虽然可以在短期内节省时间和成本，但最终系统不得不遵从这些标准，越早遵循，代价越低。否则，随着时间的推移，技术债务将不断增加。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">知识欠缺</strong>：开发人员缺乏编写高质量代码的知识，导致代码质量差，系统设计欠佳。这通常属于“疏忽/鲁莽”象限，开发者在不具备足够的技术能力或知识的情况下，做出了不合适的设计和实现决策。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">缺乏所有权</strong>：当软件开发被外包时，外包团队可能不会考虑长远的维护和扩展问题，导致低质量的代码和设计，最终需要内部团队进行重构或重写，积累了大量的技术债务。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">技术领导力不足</strong>：技术领导者往往会在缺乏深思熟虑的情况下做出决策，这些决策通过指令链传递下去，导致整个团队在无意识中增加技术债务，而不是减少它。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">最后一分钟的规范变更</strong>：项目的需求在最后时刻发生了变化，导致开发团队没有时间或预算去充分文档化或测试这些变更。这种情况可能会渗透到整个项目中，导致技术债务的产生。</p>
</section>
</li>
</ol>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">5.1.2 技术债务常见表现</span></h3>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">代码质量问题</strong>：例如重复代码、糟糕的命名、过度嵌套、硬编码等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">架构设计缺陷</strong>：例如系统模块之间的高耦合、单体应用扩展性不足、微服务边界划分不合理等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">性能瓶颈</strong>：例如未优化的数据库查询、缺乏缓存策略、过多的网络请求等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">无效的技术栈</strong>：例如依赖老旧、不再维护的第三方库或框架。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">测试和文档不足</strong>：缺乏单元测试、集成测试或文档不全，导致后续维护困难。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">旧版系统</strong>：在系统演化过程中，因为各种原因导致的系统重构、升级等，从而会有旧的系统或者接口等存在，且因为各种原因而无法下线，如有旧版 APP 在使用，或者有客户引用了 SDK 在使用等等。</section>
</li>
</ul>
<h3 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">5.1.3 分类技术债务</span></h3>
<p data-tool="mdnice编辑器">技术债务可以根据<strong style="color: #0e88eb;">紧急性</strong>和<strong style="color: #0e88eb;">影响范围</strong>进行分类：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">短期可修复的技术债务</strong>：如代码风格不一致、简单的性能优化等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">长期债务</strong>：如架构级别的问题（单体架构需要重构为微服务）、数据库设计的缺陷。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">高风险债务</strong>：对系统稳定性、性能、可扩展性有重大影响的债务，应优先解决。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">低风险债务</strong>：对当前业务和系统影响较小的债务，可以延后处理。</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5.2 评估技术债务的优先级</span></h2>
<p data-tool="mdnice编辑器">并不是所有技术债务都需要立即偿还，架构师需要根据其对系统和业务的影响权衡优先级。可以使用以下几个标准来评估：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">业务影响</strong>：哪些技术债务直接影响到核心业务功能？优先解决影响业务稳定性的债务（如系统性能瓶颈、频繁发生的Bug）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">维护成本</strong>：哪些技术债务导致开发团队生产力下降？如果某部分代码维护成本高且开发人员频繁抱怨，应优先偿还。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">技术风险</strong>：哪些技术债务存在高风险（如安全漏洞、技术栈老化、架构瓶颈）？这些问题一旦发生，可能会导致系统停机或用户数据丢失，因此需要优先解决。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">长期影响</strong>：哪些债务在未来会导致更严重的问题？如果不立即处理，技术债务可能会随着时间的推移而成倍增长，增加未来的解决难度。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">通过对技术债务的影响和紧迫性进行评估，我们可以制定一个有序的偿还计划，优先解决影响最大的债务。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5.3 制定技术债务偿还计划</span></h2>
<p data-tool="mdnice编辑器">一旦确定了技术债务的优先级，接下来需要制定一个<strong style="color: #0e88eb;">偿还计划</strong>。这个计划既要现实可行，又要确保不会过多地影响现有的业务开发进度。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">将技术债务偿还纳入日常开发周期</strong>：如：<strong style="color: #0e88eb;">持续重构</strong>：在每次开发新功能时，分配一定的时间用于偿还相关的技术债务。比如，开发团队可以在代码提交时进行代码审查，重点关注重构机会。<strong style="color: #0e88eb;">小步快跑</strong>：将技术债务的偿还工作拆分为小任务，逐步在开发过程中完成，而不是等待系统大规模重构。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">设立专门的「技术债务冲刺」</strong>：可以定期（例如每个季度）安排一个专门的冲刺周期，用于专注偿还技术债务。这样可以确保技术债务不会被长期忽视。在「技术债务冲刺」期间，开发团队应暂停或减少新功能的开发，专注于重构、优化代码、测试和文档的补充。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">引入技术债务管理工具</strong>：使用代码质量和技术债务分析工具（如SonarQube、CodeClimate）来自动化检测代码中的技术债务，并生成相关报告。这些工具可以帮助量化技术债务，并持续跟踪其变化，从而为制定偿还计划提供数据支持。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">技术债务的 OKR</strong>：为团队设定明确的技术债务 OKR，例如减少一定比例的代码复杂度、提高测试覆盖率、减少关键路径的响应时间等。<strong style="color: #0e88eb;">通过 OKR 推动团队持续关注技术债务的偿还</strong>。</p>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5.4 合理平衡业务需求和技术债务偿还</span></h2>
<p data-tool="mdnice编辑器">技术债务的偿还通常需要与业务需求并行进行。作为架构师，必须在两者之间找到<strong style="color: #0e88eb;">平衡</strong>。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">向业务方透明化技术债务</strong>：向业务方展示技术债务的存在及其长期影响。通过量化技术债务的影响，如 Bug 率、开发时间的增加、系统故障次数等，帮助业务方理解技术债务的偿还是为了降低长期的开发和维护成本，<strong style="color: #0e88eb;">以争取到资源来完成技术债务的偿还</strong>。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">避免过度偿还</strong>：偿还技术债务是一个长期过程，过度专注于技术债务的偿还可能会影响业务的发展。因此，架构师必须决定哪些技术债务可以暂时保留，哪些必须立即偿还。寻找<strong style="color: #0e88eb;">最小必要重构</strong>，在不影响业务的前提下逐步减少债务。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">定期评估技术债务的偿还进度</strong>：定期回顾和评估技术债务的偿还进展，确保团队在持续减少债务的同时，业务开发没有受到严重影响。如果发现某些技术债务的偿还并没有显著效果，架构师需要重新评估偿还策略。</p>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5.5 建立预防技术债务的机制</span></h2>
<p data-tool="mdnice编辑器">除了偿还现有的技术债务，<strong style="color: #0e88eb;">预防新的技术债务</strong>积累同样重要。架构师需要在团队中建立良好的技术文化和流程，防止技术债务的进一步增加。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">代码审查和重构文化</strong>：推动团队定期进行代码审查，确保代码质量符合标准，并及时重构不良代码。建立一个持续改进的文化，鼓励开发人员在日常开发中发现并解决小额技术债务。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">自动化测试和持续集成</strong>自动化测试和持续集成（CI/CD）是预防技术债务的重要工具。通过增加单元测试、集成测试和端到端测试的覆盖率，确保每次代码变更不会引入新的问题。持续集成可以帮助团队及时发现问题，在问题变得严重之前解决它们，减少技术债务的积累。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">技术栈和依赖管理</strong>：定期对技术栈、框架和第三方库进行评估和升级，避免技术债务因依赖老旧技术而积累。可以设立专门的计划来处理依赖升级，确保系统始终保持在可维护的状态下。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">文档和知识管理</strong>：技术文档的缺失往往是技术债务的重要来源。架构师需要推动团队编写和维护高质量的文档，确保系统设计和代码逻辑清晰，方便后续开发人员理解和维护。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">架构规划与设计评审</strong>：在引入新技术或设计系统架构时，进行充分的评估和规划，避免因设计不当而引入新的技术债务。架构师应组织定期的设计评审会议，确保系统的设计符合长期扩展性和可维护性。</p>
</section>
</li>
</ul>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">6 小结</span></h1>
<p data-tool="mdnice编辑器">通过上述 5 个小节的描述，我们可以看到，技术债务不仅仅是编码或技术实现的问题，它是一个涉及策略、管理和前瞻性规划的复杂挑战。技术债务的管理和偿还需要团队的集体努力，包括技术人员、管理层乃至整个组织的协调一致。有效的技术债务管理不仅能提升系统的稳定性和性能，还能增强团队的士气，促进创新。</p>
<p data-tool="mdnice编辑器">且，技术债务并非全部是负面的。适当的技术债务可以<strong style="color: #0e88eb;">加速初期开发，帮助产品快速上市</strong>，抢占市场先机。关键在于如何控制和管理这种债务，确保它不会膨胀到难以控制的地步。因此，我们应当建立起一套系统性的技术债务管理策略，包括定期的审查、重构以及预防措施，以维持技术债务在可控范围内。</p>
<p data-tool="mdnice编辑器">技术债务是在业务发展和技术发展过程中不可避免的一部分，关键在于管理。在这个快速演变的技术世界中，唯有那些能够有效管理技术债务的组织，才能确保自身的持续成长和竞争力。因此，我们应当以积极的态度面对技术债务，将其作为持续改进和技术卓越的契机。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">7 参考资料：</span></h1>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">https://zh.wikipedia.org/wiki/%E6%8A%80%E6%9C%AF%E8%B4%9F%E5%80%BA</section>
</li>
<li>
<section style="color: #010101;">https://www.martinfowler.com/bliki/TechnicalDebt.html</section>
</li>
</ul>
<p data-tool="mdnice编辑器">以上</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2024/09/architect-guide-technical-debt-identification-management-solutions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再聊一下技术成本</title>
		<link>https://www.phppan.com/2022/12/technology-cost/</link>
		<comments>https://www.phppan.com/2022/12/technology-cost/#comments</comments>
		<pubDate>Sat, 03 Dec 2022 07:39:27 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[技术成本]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2087</guid>
		<description><![CDATA[上次我们聊到了技术成本的精细化运营，有点干，今天我们再聊一点不那么干的，聊一下做这个事情背后的逻辑。 企业存在 [&#8230;]]]></description>
				<content:encoded><![CDATA[<section id="nice" style="color: black;" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<p data-tool="mdnice编辑器">上次我们聊到了技术成本的精细化运营，有点干，今天我们再聊一点不那么干的，聊一下做这个事情背后的逻辑。</p>
<p data-tool="mdnice编辑器"><strong style="font-weight: border; color: #0e88eb;">企业存在的目的是在外部、市场上和经济体中创造成果，企业内部只有成本。</strong></p>
<p data-tool="mdnice编辑器">在德鲁克的《成果管理》中提到成本时说「大多数企业的年度降低成本热潮总会像春季的伤风感冒一样如期而至，往往 6 个月过后，成本又恢复到原有水平，企业又开始为下一轮降低成本运动做准备」。感觉确实是这么个节奏，当你的成本控制有一定成效后，你会发现成长慢慢又开始涨了，而且还是那种特别有理由的，不得不涨。</p>
<p data-tool="mdnice编辑器">不管是控制成本还是做其它事情，一些做事的方式变化不会太大，如要有重点，如要一事一议，如要有大局观，我们控制成本有如下原则：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">先处理大头的成本或者先控制能产生更大效果的成本点</strong>，特别是大的原则；</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">不同类别的成本要用不同的策略对待</strong>，如生产性成本考虑其投入产出比，监察类成本考虑不做会怎样，带来的成本是多少？</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">最有效的降本方式是把某块直接去掉</strong>，减少比不上直接清零，评估确实去掉会更好的可以直接干掉；</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">要有大局观</strong>，不能一个地方成本降低了，另一个地方成本增加了，不能这个月成本低了，但是整体成本却高了，有时我们可以容忍这个月成本高一些，接下来的成本低，总体成本低一些。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">在控制成本的过程中，要能识别出成本要素，找出每个要素的关键成本点，将成本定义为顾客付出的代价，根据成本的基本特性对其分类，输出成本诊断报告。在诊断成本时，主要成本可以分为：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">生产性成本</strong>，是企业为顾客提供他们想要的所愿意购买价值的各项活动而产生的成本，从企业层面来说包括制造成本、促销成本、知识工作和财务工作的成本、销售成本都算。从技术成本来看，服务于客户的线上环境、开发过程中的环境都算在里面；</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">支持性成本</strong>，如传统企业的运输成功，在技术成本中，服务于生产过程的项目管理系统、用于部署和发布的 DevOps 系统等等，他们是流程中不可避免的；</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">监察成本</strong>，不以完成某些任务为目的的活动，只是为了预防或发现问题，如一些监控系统、日志服务等，还有一些如衡量代码质量或产出的系统</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">纯浪费</strong>，没有收获的成本，如一些空转/负载低的机器，一些闲置没有人管的机器</section>
</li>
</ul>
<p data-tool="mdnice编辑器">对于以上的成本，我们的思考重点是如果是不花费这个成本，带来的成本会更高吗？</p>
<p data-tool="mdnice编辑器">当然，我们控制成本并不是不能有成本，并不是不能增加成本，成本本来就是不存在的，它是为获得成果而存在，至少最开始是这样。就成本控制而言，<strong style="font-weight: border; color: #0e88eb;">集中资源去获取成果才是最佳且最有效的成本控制方法，还是要业务有持续的增长</strong>。</p>
<p data-tool="mdnice编辑器">回到技术成本上，对于一个有多条业务线的公司来说，从商业模式的角度来看，我们希望精细化的核算成本，来辅助对业务商业模式的判断。</p>
<p data-tool="mdnice编辑器">业务商业模式是否成立，如长期收入无法覆盖成本，是否可以通过压缩或控制成本来实现商业模式成立。具体到业务细节：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">我们如何看待免费用户的行为，我们为免费用户投入的成本是多少？</section>
</li>
<li>
<section style="color: #010101;">我们对于付费用户投入的成本是多少，ROI 是多少？</section>
</li>
<li>
<section style="color: #010101;">对于重点客户/大客户的投入成本是多少，ROI 是多少？</section>
</li>
</ul>
<p data-tool="mdnice编辑器">从组织内业务目标达成的角度来看，组织的业务目标中包括成本，从财务层面需要提供更精细化的成本逻辑给到业务方以辅助其做业务判断。</p>
<p data-tool="mdnice编辑器">当从财务层面考察成本时，所有的业务为了实现目标，会寻求各种成本降低的措施，此时成本控制中不仅仅包括控制，对于成本的精确度量会变成一个重要的需求，而在技术上有些成本是无法区分的，此时需要我们和业务方一起协调分摊比例。</p>
<p data-tool="mdnice编辑器">从一个研发团队的负责人的角度来看，一个成熟的技术管理者，经营思维是一个非常重要的思维，而在经营思维中，成本占据很大比重。</p>
<p data-tool="mdnice编辑器">一个公司想要基业长青，除了增长，产生价值，对于成本的敏感和严谨也是非常重要的，对于一个技术团队来说，成本至关重要。</p>
<p data-tool="mdnice编辑器">在现在这个行情下，在业绩没有明显增长的情况下，一个团队如果成本太高，可能就会成为动手的主要对象之一，而这里的成本依据上面的 4 种分类，如何诊断，如何持续运营，是一个长期的事情。</p>
<p data-tool="mdnice编辑器"><strong style="font-weight: border; color: #0e88eb;">成本管理需要安排专人全职负责，是一项重要管理职能</strong>。月度成本复盘要持续搞，至少一个月复盘一次，这是最基本的操作。</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2022/12/technology-cost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
