技术债 笔记
目录
- 1. 技术债 笔记
- 1.1. 什么是技术债
- 1.2. 讨论
- 1.3. 国内技术从业者怎么看?
1. 技术债 笔记
1.1. 什么是技术债
1992 年, Ward Cunningham 在敏捷宣言中首次提出了"技术债"概念, 主要指有意或无意地做了错误的或不理想的技术决策所累积的债务。随后, 《重构》一书的作者 Martin Fowler 基于 Cunningham 的比喻, 创建了一个"技术债务四象限", 包括:
- 鲁莽/有意: “我们没有时间去设计”;
- 谨慎/有意: “我们必须现在交付, 之后再处理因为追求速度所产生的结果”;
- 鲁莽/无意: "什么是分层? ";
- 谨慎/无意: “我们现在知道应该怎么做了”。
1.2. 讨论
前段时间, Reddit 上有关技术债的话题再次引起程序员的广泛讨论。用户 spo81rtyOP 表示, “大多数软件的实际使用寿命也就 5 到 10 年。即便软件能幸存下来, 完全由过时技术栈编写这一现实也会让它的路子变得很窄。这就是软件工程师的真实命运。”
与此同时, 在过去的 20 多年里, 很多编程语言也都"失宠"了, 比如 Perl、Delphi、Fortran、FoxPro、ColdFusion。也许这些古老的编程语言还存在某些应用程序中, 但大多数情况下, 还应用这些编程语言的公司必须要对旧的应用程序进行现代化改造, 并将其淘汰。如果你用这些过时的编程语言构建程序, 最终的结果可能只有重写, 因为很难再找到使用这些语言的程序员了。
在 21 世纪初, 人们认为 Adobe ColdFusion 是最热门的产品, 但在今天呢? Ruby on Rails 也可能走上 Adobe ColdFusion 的老路, 它已经失宠了, 并且很难找到使用它的开发人员。曾经 Ruby on Rails 独有的东西, 现在也可以在其他语言中使用了。
Watson 表示, 编程语言来来往往, 开发人员不希望学习工作中不需要的技能。同时, 开发人员跳槽的速度也很快, 他们总是希望自己的简历上有一些热门的新东西。
Watson 预测, WebAssembly 最终会超越当今的前端开发, 一个全新的世界将不断发展。
用户 chesterriley 则想象了一个极端可能: 也许未来终有一天, 人们会继续使用 100 年前就编写出来的代码。最终的大赢家可能会是 Unix 实用程序或者 TCP/IP 代码之类, 又或者是某些编译器、运行时引擎或解释器。还有来自 Linux 或 Windows 等操作系统的代码。人们可能突然发现, 自己修复的错误居然诞生自 100 多年前。
当然, 也有些代码并没真正受到当今炒作的影响。有趣的是, 这类代码大多集中在服务器端。虽然一直有强大的力量在 “颠覆” 微服务、Lambda 函数等服务构建方式, 但如果忽略掉这些实现细节, 那服务器的内存空间里肯定还有 db+ 服务在运行、也还有空闲周期没有利用起来。
“我希望看到当下诞生的新项目能始终牢记长期可维护性的重要意义, 甚至把它当作一项基本设计前提。毕竟真的没多少人有能力维护陈旧软件项目。尽管地球人口仍在增加, 但掌握足够技能来维护这些古早软件的开发者数量一直都跟不上。”
1.3. 国内技术从业者怎么看?
百分点 CTO 刘译璟认为, 判断技术债务的重点在于"哪些事情是应该做的", 它是一个因组织而异、因项目而异、因人而异的过程, 例如以下一些方面:
- 组织上要求做但没做的: 制度、流程、规范、分享学习等;
- 业务和技术上要求做但没有做的: 功能、性能、安全、高可用、扩展、监控、辅助工具等。
如果按照软件工程环节分类, 技术债务可以分为: 需求分析、方案设计、架构设计(逻辑架构、功能架构、数据架构、部署架构、运行架构等等)、编码、测试、发布等。如果按照产出物类型分, 可以分为:
- 文档类: 管理过程文档、需求分析文档、设计文档、测试案例文档等;
- 代码类: 代码、脚本、规范等;
- 软件包类: 产品软件包、依赖软件、依赖资源等;
- 环境类: 开发环境、测试环境、预上线环境、生产环境等。
至于如何决定要重写还是继续维护, 需要判断"继续维护的收益"和"重写的收益"哪个更大, 来决定继续维护还是重写。可以综合考虑如下几方面的收益:
- 开源: 提升现有业务收入、支持新业务的开拓;
- 节流: 节省维护人员、节省运营费用;
- 组织: 人员结构调整、组织能力培养。
债务是避免不了的, 时刻判断"持有债务的价值", 当价值很低时要尽快处理。
腾讯研发总监王辉表示, 如果人力、物力和工期等资源丰富, 能去优化的就都可以做到极致。但通常, 资源都是不丰富的, 或者说是捉襟见肘的, 那就要根据实际业务情况来看。腾讯一向的方式是"先抗住再优化", 项目是否真的到了非优化不可的地步, 是否真的到了不优化随时都可能宕机的时候, 如果先抗住了, 就等业务占领了市场, 站住了用户, 到了项目进度慢下来之后, 一些优化再开展起来, 此时可以要求高可用、高性能、高并发等。
"如果项目资源允许, 一些稍微过度的优化和重构, 个人认为是可以被接受的, 保持团队的技术热情是不错的, 但如果资源不允许, 就要数着钱花, 判断技术债务的合理性, 如何更好的还债, 是否真的到了非还不可, 是否真的到了影响业务发展, 需要与业务优先级一起看, 业务错过一个时间窗就可能永远错过, 有些技术债务还可以后期再还。"王辉总结道。
相关文章:
技术债 笔记
目录 1. 技术债 笔记1.1. 什么是技术债1.2. 讨论1.3. 国内技术从业者怎么看? 1. 技术债 笔记 1.1. 什么是技术债 1992 年, Ward Cunningham 在敏捷宣言中首次提出了"技术债"概念, 主要指有意或无意地做了错误的或不理想的技术决策所累积的债务。随后, 《重构》一书…...
【Leetcode】102.二叉树的层序遍历
一、题目 1、题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例2: 输入:root = [1] 输出:[[1]]示例3: 输入:root = [] 输出:[]…...
上传文件报413Request EntityToo Large错误解决办法
产生这种原因是因为服务器限制了上传大小 1、nginx服务器的解决办法 修改nginx.conf的值就可以解决了 将以下代码粘贴到nginx.conf内 client_max_body_size 20M 可以选择在http{ }中设置:client_max_body_size 20m; 也可以选择在server{ }中设置:cli…...
Neo4j之MERGE基础
在 Neo4j 中,MERGE 语句用于根据指定的模式进行创建或匹配节点和关系。它可以在节点或关系不存在时创建它们,并在已存在时进行匹配。 创建或匹配节点: MERGE (p:Person {name: John});这个查询会检查是否已经存在一个具有 "Person&quo…...
AbstractRoutingDataSource,spring配置多数据源问题
AbstractRoutingDataSource,spring配置多数据源问题 首先引入pom.xml依赖 <!--测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.3.12.RE…...
日常BUG—— SpringBoot项目DEBUG模式启动慢、卡死。
😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 我们调试程序时,需要使用DEBUG模式启动SpringBoot项目, 有时候会发…...
Linux网络编程(TCP状态转换关系)
文章目录 前言一、TCP状态转换图二、TCP连接状态转换解析三、TCP断开状态转换解析四、为什么需要有2MLS时长总结 前言 本篇文章来讲解一下TCP的状态转换关系,学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。 一、TCP状态转换图 二、TCP连接状态转换…...
tauri-vue:快速开发跨平台软件的架子,支持自定义头部UI拖拽移动和窗口阴影效果
Tauri Vue Typescript 一个使用 taurivuets 开发跨平台软件的模板,支持窗口头部自定义 UI 和拖拽和窗口阴影,不用再自己做适配了,拿来即用,非常 nice。而且已经封装好了 tauri 的 http 请求工具,省去很多弯路。开源…...
做好以下几点,可以让我们延长周末体验感,好好放松!!!
工作以后常常容易感到疲于奔命,让我们找到适合自己方式,来让我们度过一个充实放松的周末! 方向一:分享你周末的时间规划 我们可以把每个月当做一个周期,制定一个简单的计划,如:第一周,锻炼身体…...
Python 学习笔记——代码基础
目录 Python基础知识 变量 赋值 数据类型 print用法 print格式化输出 运算符 if-else 数据结构 元组 in运算符 列表 切片 [ : ] 追加 append() 插入 insert() 删除 pop() 字典 循环 for循环 for循环应用——遍历 for循环应用——累加…...
Android Studio 无法正常导入项目
Android Studio 无法正常导入 model,运行按钮边出现“Add Configuration”,可进行以下方法处理: 解决办法: 1、点击Run三角按钮左边紧挨的下拉按钮,选择Edit Configuration,选择 Default 新建一个Android…...
Grafana+Prometheus技术文档-进阶使用-监控spring-boot项目
阿丹: 之前已经实现了使用Prometheus来对服务器进行了监控和仪表盘的创建,现在就需要对这些监控方法使用在spring-boot中去。 实现思路: 1、集成Actuator 2、加入Prometheus的依赖 3、配置开放端口、以及开放监控 4、配置Prometheus中的配置…...
PG常用SQL
数据库 创建数据库 PostgreSQL 创建数据库可以用以下三种方式: 1、使用 CREATE DATABASE SQL 语句来创建。2、使用 createdb 命令来创建。3、使用 pgAdmin 工具。 CREATE DATABASE 创建数据库 CREATE DATABASE 命令需要在 PostgreSQL 命令窗口来执行࿰…...
分模块开发的意义及开发步骤
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Maven进阶 一、分模块开发1.1分模块开发的意义1.2分模块开…...
vue-router中的一些 API
在Vue.js的vue-router中,一些重要api 1、RouterHistory:这是 vue-router 提供的路由历史记录对象。它可以跟踪当前页面的路由历史,并提供一些方法和属性来管理导航和历史记录。在 vue-router 中,有两种类型的路由历史记录对象&…...
go-zero 是如何实现令牌桶限流的?
原文链接: 上一篇文章介绍了 如何实现计数器限流?主要有两种实现方式,分别是固定窗口和滑动窗口,并且分析了 go-zero 采用固定窗口方式实现的源码。 但是采用固定窗口实现的限流器会有两个问题: 会出现请求量超出限…...
Oracle/PL/SQL奇技淫巧之ROWNUM伪列
ROWNUM伪列 ROWNUM是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,表示 Oracle 从表中选择该行的顺序,选择的第一行ROWNUM为1,第二行ROWNUM为2,以此类推。 注意1: ROWNUM伪列是在WHERE子句之…...
“MongoDB基础知识【超详细】
"探索MongoDB的无边之境:沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界!在这个博客中,我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者,MongoDB都将为您带来一场令人心动…...
腾讯24届校招内推
校招开始啦~有兴趣的话可以扫我的码投,也可以分享给身边找工作的同学~ ❤投递攻略 1️⃣腾讯校招步骤,先微信扫码绑定内推关系,后在电脑上上传更改简历和部门投递 2️⃣投递时将选择投递部门,投递后将在…...
星际争霸之小霸王之小蜜蜂(二)--类的使用
目录 前言 一、将设置内容写在一个类里 二、设置小蜜蜂的造型 三、设置猫蜜蜂的参数 四、绘制猫蜜蜂到窗口 总结 前言 昨天我们设置好了窗口,下面我们需要向窗口中添加元素了。 一、将设置内容写在一个类里 我个人理解书上的意思是要创建一个类,将所有需…...
深度学习从心电信号中解码呼吸频率:原理、实现与临床价值
1. 项目概述:从心电信号中“听”到呼吸声呼吸频率,这个我们每分钟都在进行却很少被精确量化的生命体征,在临床医学中扮演着至关重要的角色。它不仅是评估呼吸系统功能的直接指标,更是反映全身代谢、循环乃至神经系统状态的“窗口”…...
AMLP:基于大语言模型的自动化机器学习势函数构建平台
1. 项目概述:当AI遇见原子模拟,AMLP如何重塑机器学习势函数构建在计算材料科学和化学物理领域,分子动力学模拟是我们窥探微观世界动态行为的“显微镜”。无论是研究新材料的相变过程,还是探索生物大分子的折叠机制,其核…...
DMA-330地址空间限制与扩展方案解析
1. DMA-330地址空间限制解析DMA-330作为Arm CoreLink系列中的直接内存访问控制器,其物理寻址能力直接由AxADDR信号宽度决定。这个32位地址总线宽度意味着它原生仅支持4GB(2^32字节)的物理地址空间访问。在实际嵌入式系统设计中,这…...
第二周(第12周)
1.单电源供电的二阶低通滤波器2.功率放大电路...
【紧急预警】92%的DeepSeek测试用例生成失败源于这4个隐性配置缺陷——资深SDET连夜整理修复清单
更多请点击: https://codechina.net 第一章:DeepSeek测试用例生成的现状与危机本质 当前,DeepSeek系列大模型(如DeepSeek-Coder、DeepSeek-VL)在代码生成与理解任务中展现出强大能力,但其测试用例自动生成…...
Veo 2提示词性能瓶颈诊断:基于1726组AB测试的token敏感度热力图与阈值红线预警
更多请点击: https://kaifayun.com 第一章:Veo 2提示词编写最佳实践总览 Veo 2 是 Google 推出的高性能视频生成模型,其对提示词(prompt)的语义精度、结构清晰度和上下文控制能力高度敏感。高质量提示词并非简单堆砌关…...
2026 文章代码高亮方案选型
将基于 Prism.js 或 Highlight.js 的传统高亮方案与基于 Shiki 的现代化高亮方案进行对比,其核心区别在于底层解析原理的不同(正则表达式 vs. TextMate 语法树)。 以下是两种方案的底层原理、各自优缺点、核心对比矩阵以及适用场景的详细分析…...
LaTeX公式一键转Word:3步告别数学公式编辑烦恼
LaTeX公式一键转Word:3步告别数学公式编辑烦恼 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 还在为Word文档中的数学公式编辑而抓狂…...
LVGL多页面开发避坑:用内部Timer替代轮询,解决页面切换时的内存踩踏问题
LVGL多页面开发中的内存安全实践:用Timer机制替代轮询的工程解决方案 在嵌入式UI开发中,LVGL因其轻量级和跨平台特性成为热门选择。但当项目复杂度提升到多页面交互时,开发者往往会遇到一个棘手问题:如何在频繁切换页面的同时保证…...
量子纠错码VarQEC:原理、实现与硬件优化
1. 量子纠错码基础与实验背景量子纠错码(Quantum Error Correction Codes, QEC)是量子计算中保护量子信息免受噪声影响的核心技术。与经典纠错码不同,量子纠错需要应对量子态特有的退相干和纠缠特性。传统QEC如[[5,1,3]]完美码虽然理论完备&a…...
