当前位置: 首页 > news >正文

技术债 笔记

目录

  • 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&#xff0c;spring配置多数据源问题 首先引入pom.xml依赖 <!--测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.3.12.RE…...

日常BUG—— SpringBoot项目DEBUG模式启动慢、卡死。

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 我们调试程序时&#xff0c;需要使用DEBUG模式启动SpringBoot项目&#xff0c; 有时候会发…...

Linux网络编程(TCP状态转换关系)

文章目录 前言一、TCP状态转换图二、TCP连接状态转换解析三、TCP断开状态转换解析四、为什么需要有2MLS时长总结 前言 本篇文章来讲解一下TCP的状态转换关系&#xff0c;学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。 一、TCP状态转换图 二、TCP连接状态转换…...

tauri-vue:快速开发跨平台软件的架子,支持自定义头部UI拖拽移动和窗口阴影效果

Tauri Vue Typescript 一个使用 taurivuets 开发跨平台软件的模板&#xff0c;支持窗口头部自定义 UI 和拖拽和窗口阴影&#xff0c;不用再自己做适配了&#xff0c;拿来即用&#xff0c;非常 nice。而且已经封装好了 tauri 的 http 请求工具&#xff0c;省去很多弯路。开源…...

做好以下几点,可以让我们延长周末体验感,好好放松!!!

工作以后常常容易感到疲于奔命&#xff0c;让我们找到适合自己方式&#xff0c;来让我们度过一个充实放松的周末! 方向一&#xff1a;分享你周末的时间规划 我们可以把每个月当做一个周期&#xff0c;制定一个简单的计划&#xff0c;如&#xff1a;第一周&#xff0c;锻炼身体…...

Python 学习笔记——代码基础

目录 Python基础知识 变量 赋值 数据类型 print用法 print格式化输出 运算符 if-else 数据结构 元组 in运算符 列表 切片 [ : ] 追加 append() 插入 insert&#xff08;&#xff09; 删除 pop() 字典 循环 for循环 for循环应用——遍历 for循环应用——累加…...

Android Studio 无法正常导入项目

Android Studio 无法正常导入 model&#xff0c;运行按钮边出现“Add Configuration”&#xff0c;可进行以下方法处理&#xff1a; 解决办法&#xff1a; 1、点击Run三角按钮左边紧挨的下拉按钮&#xff0c;选择Edit Configuration&#xff0c;选择 Default 新建一个Android…...

Grafana+Prometheus技术文档-进阶使用-监控spring-boot项目

阿丹&#xff1a; 之前已经实现了使用Prometheus来对服务器进行了监控和仪表盘的创建&#xff0c;现在就需要对这些监控方法使用在spring-boot中去。 实现思路&#xff1a; 1、集成Actuator 2、加入Prometheus的依赖 3、配置开放端口、以及开放监控 4、配置Prometheus中的配置…...

PG常用SQL

数据库 创建数据库 PostgreSQL 创建数据库可以用以下三种方式&#xff1a; 1、使用 CREATE DATABASE SQL 语句来创建。2、使用 createdb 命令来创建。3、使用 pgAdmin 工具。 CREATE DATABASE 创建数据库 CREATE DATABASE 命令需要在 PostgreSQL 命令窗口来执行&#xff0…...

分模块开发的意义及开发步骤

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Maven进阶 一、分模块开发1.1分模块开发的意义1.2分模块开…...

vue-router中的一些 API

在Vue.js的vue-router中&#xff0c;一些重要api 1、RouterHistory&#xff1a;这是 vue-router 提供的路由历史记录对象。它可以跟踪当前页面的路由历史&#xff0c;并提供一些方法和属性来管理导航和历史记录。在 vue-router 中&#xff0c;有两种类型的路由历史记录对象&…...

go-zero 是如何实现令牌桶限流的?

原文链接&#xff1a; 上一篇文章介绍了 如何实现计数器限流&#xff1f;主要有两种实现方式&#xff0c;分别是固定窗口和滑动窗口&#xff0c;并且分析了 go-zero 采用固定窗口方式实现的源码。 但是采用固定窗口实现的限流器会有两个问题&#xff1a; 会出现请求量超出限…...

Oracle/PL/SQL奇技淫巧之ROWNUM伪列

ROWNUM伪列 ROWNUM是一个伪列&#xff0c;它是根据每次查询的结果动态生成的一列递增编号&#xff0c;表示 Oracle 从表中选择该行的顺序&#xff0c;选择的第一行ROWNUM为1&#xff0c;第二行ROWNUM为2&#xff0c;以此类推。 注意1&#xff1a; ROWNUM伪列是在WHERE子句之…...

“MongoDB基础知识【超详细】

"探索MongoDB的无边之境&#xff1a;沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界&#xff01;在这个博客中&#xff0c;我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者&#xff0c;MongoDB都将为您带来一场令人心动…...

腾讯24届校招内推

校招开始啦&#xff5e;有兴趣的话可以扫我的码投&#xff0c;也可以分享给身边找工作的同学&#xff5e; ❤投递攻略 1️⃣腾讯校招步骤&#xff0c;先微信扫码绑定内推关系&#xff0c;后在电脑上上传更改简历和部门投递 2️⃣投递时将选择投递部门&#xff0c;投递后将在…...

星际争霸之小霸王之小蜜蜂(二)--类的使用

目录 前言 一、将设置内容写在一个类里 二、设置小蜜蜂的造型 三、设置猫蜜蜂的参数 四、绘制猫蜜蜂到窗口 总结 前言 昨天我们设置好了窗口&#xff0c;下面我们需要向窗口中添加元素了。 一、将设置内容写在一个类里 我个人理解书上的意思是要创建一个类&#xff0c;将所有需…...

Yokogawa AAI835-H50/K4A00模拟输入/输出模块

Yokogawa AAI835-H50/K4A00 模拟输入/输出模块产品特点&#xff1a;通道配置&#xff1a;共8个通道&#xff0c;含4路模拟输入和4路模拟输出。信号类型&#xff1a;所有通道均支持4-20mA标准电流信号。HART通信&#xff1a;支持HART协议&#xff0c;可与智能现场设备双向数字通…...

告别拍脑袋规划!用ArcGIS做绿道选线:如何科学量化坡度、水域、道路成本并加权计算

科学规划绿道的ArcGIS高阶技法&#xff1a;从成本栅格构建到最优路径生成绿道规划从来不是简单的"两点之间直线最短"&#xff0c;而是需要综合考虑地形、生态、人文等多维因素的复杂决策过程。传统规划中常见的"拍脑袋"决策方式&#xff0c;往往导致建成后…...

AI时代程序员职业发展与个人创业可行性研究报告

一、行业宏观变革&#xff08;2026核心趋势数据佐证&#xff09; 1.1 开发范式已彻底重构&#xff08;行业不可逆拐点&#xff09; 2026年正式进入AI Agent智能体开发时代&#xff0c;传统CRUD编码价值持续崩塌。 核心权威数据&#xff1a; Gartner预测&#xff1a;2026年75%企…...

FT231XQ USB串口桥接板设计解析与实战应用指南

1. 项目概述&#xff1a;从FT232R到FT231XQ的USB串口桥接板演进在嵌入式开发和硬件调试的日常工作中&#xff0c;一个可靠、小巧且功能清晰的USB转串口&#xff08;UART&#xff09;桥接板&#xff08;Breakout Board&#xff0c; 简称BoB&#xff09;几乎是工程师手边的标配工…...

Burp Suite拦截与替换机制深度解析:从协议层到规则链

1. 这不是“点开就能用”的功能&#xff0c;而是你和目标系统之间的一道可编程闸门很多人第一次在Burp Suite里点开Proxy → Intercept&#xff0c;看到HTTP请求被拦下来&#xff0c;兴奋地改个User-Agent、删个Cookie就点Forward&#xff0c;以为自己已经掌握了“拦截与替换”…...

厨房空调技术白皮书:从风冷到水冷,制冷系统在厨房场景中的工程化演进

厨房空调是暖通行业近三年技术迭代最密集的细分品类。从最初的"凉霸"&#xff08;本质是风扇&#xff09;&#xff0c;到风冷分体式&#xff0c;再到水冷一体式&#xff0c;每代技术都在解决上一代没有覆盖的用户痛点。本文以工程技术视角&#xff0c;梳理四代厨房制…...

别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)

ESP32蓝牙HID实战&#xff1a;零基础打造自定义键盘鼠标 手里那块吃灰的ESP32开发板终于能派上用场了&#xff01;上周我用它做了个无线演示控制器&#xff0c;在会议室里走着就能翻PPT&#xff0c;同事们都问是怎么实现的。其实秘诀就在于ESP32的蓝牙HID功能——不需要任何USB…...

总线式智能提示灯系统设计:从恒流驱动到模块化架构

1. 项目概述&#xff1a;从传统到智能的剧场提示灯系统革新在剧场、演播室或者大型活动现场的后台&#xff0c;如果你待过&#xff0c;一定对那套“红灯停&#xff0c;绿灯行”的提示灯系统不陌生。导演或舞台监督通过对讲机喊“Standby”&#xff08;准备&#xff09;&#xf…...

告别手动预约:i茅台自动预约系统5分钟部署指南

告别手动预约&#xff1a;i茅台自动预约系统5分钟部署指南 【免费下载链接】campus-imaotai i茅台app自动预约&#xff0c;每日自动预约&#xff0c;支持docker一键部署&#xff08;本项目不提供成品&#xff0c;使用的是已淘汰的算法&#xff09; 项目地址: https://gitcode…...

Noto字体终极指南:告别“豆腐块“,让全球文字清晰显示

Noto字体终极指南&#xff1a;告别"豆腐块"&#xff0c;让全球文字清晰显示 【免费下载链接】noto-fonts Noto fonts, except for CJK and emoji 项目地址: https://gitcode.com/gh_mirrors/no/noto-fonts 在数字世界中&#xff0c;你是否经常看到那些令人困…...