技术债 笔记
目录
- 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️⃣投递时将选择投递部门,投递后将在…...

星际争霸之小霸王之小蜜蜂(二)--类的使用
目录 前言 一、将设置内容写在一个类里 二、设置小蜜蜂的造型 三、设置猫蜜蜂的参数 四、绘制猫蜜蜂到窗口 总结 前言 昨天我们设置好了窗口,下面我们需要向窗口中添加元素了。 一、将设置内容写在一个类里 我个人理解书上的意思是要创建一个类,将所有需…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...