技术债 笔记

目录

  • 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 刘译璟认为, 判断技术债务的重点在于"哪些事情是应该做的", 它是一个因组织而异、因项目而异、因人而异的过程, 例如以下一些方面:

  • 组织上要求做但没做的: 制度、流程、规范、分享学习等;
  • 业务和技术上要求做但没有做的: 功能、性能、安全、高可用、扩展、监控、辅助工具等。

如果按照软件工程环节分类, 技术债务可以分为: 需求分析、方案设计、架构设计(逻辑架构、功能架构、数据架构、部署架构、运行架构等等)、编码、测试、发布等。如果按照产出物类型分, 可以分为:

  • 文档类: 管理过程文档、需求分析文档、设计文档、测试案例文档等;
  • 代码类: 代码、脚本、规范等;
  • 软件包类: 产品软件包、依赖软件、依赖资源等;
  • 环境类: 开发环境、测试环境、预上线环境、生产环境等。

至于如何决定要重写还是继续维护, 需要判断"继续维护的收益"和"重写的收益"哪个更大, 来决定继续维护还是重写。可以综合考虑如下几方面的收益:

  • 开源: 提升现有业务收入、支持新业务的开拓;
  • 节流: 节省维护人员、节省运营费用;
  • 组织: 人员结构调整、组织能力培养。

债务是避免不了的, 时刻判断"持有债务的价值", 当价值很低时要尽快处理。

腾讯研发总监王辉表示, 如果人力、物力和工期等资源丰富, 能去优化的就都可以做到极致。但通常, 资源都是不丰富的, 或者说是捉襟见肘的, 那就要根据实际业务情况来看。腾讯一向的方式是"先抗住再优化", 项目是否真的到了非优化不可的地步, 是否真的到了不优化随时都可能宕机的时候, 如果先抗住了, 就等业务占领了市场, 站住了用户, 到了项目进度慢下来之后, 一些优化再开展起来, 此时可以要求高可用、高性能、高并发等。

"如果项目资源允许, 一些稍微过度的优化和重构, 个人认为是可以被接受的, 保持团队的技术热情是不错的, 但如果资源不允许, 就要数着钱花, 判断技术债务的合理性, 如何更好的还债, 是否真的到了非还不可, 是否真的到了影响业务发展, 需要与业务优先级一起看, 业务错过一个时间窗就可能永远错过, 有些技术债务还可以后期再还。"王辉总结道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql中union all、union、intersect、minus的区别图解,测试

相关文章 sql 的 join、left join、full join的区别图解总结,测试,注意事项 1. 结论示意图 对于intersect、minus,oracle支持,mysql不支持,可以变通(in或exists)实现 2.测试 2.1.创建表和数…

vue pc端项目el-upload上传图片时加水印

html代码&#xff1a; <a-uploadclass"avatar-uploader"list-type"picture-card":file-list"uploadFileList":custom-request"uploadDoneHandle":before-upload"beforeUpload":remove"removeHandle"v-decorat…

案例21 基于Spring Boot+Redis实现图书信息按书号存储案例

1. 案例需求 基于Spring BootRedis实现图书信息按书号存储和取出功能&#xff0c;数据存储至Redis。 2. 创建Spring Boot项目 创建Spring Boot项目&#xff0c;项目名称为springboot-redis02。 3. 选择依赖 ​ pom.xml文件内容如下所示&#xff1a; <?xml version&quo…

浏览器控制台调试代码和JavaScript控制台方法介绍

浏览器控制台调试代码和JavaScript控制台方法介绍 浏览器控制台调试代码 浏览器控制台&#xff08;Console&#xff09;是浏览器提供的一个开发工具&#xff0c;用于在浏览器中执行和调试 JavaScript 代码。它提供了一个交互式环境&#xff0c;可以输入 JavaScript 代码&#…

Qt:隐式内存共享

隐式内存共享 Many C classes in Qt use implicit data sharing to maximize resource usage and minimize copying. Implicitly shared classes are both safe and efficient when passed as arguments, because only a pointer to the data is passed around, and the data i…

C语言:每日一练(选择+编程)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;打印1到最大的n位数 示例1 思路一&#xff1a; 题二&#xff1a;计算日期到天数转换 示例1 思路一&#xf…

【JVM】如何判定一个对象已死以及“标记-清除”、“标记-复制”、“标记-整理”三种垃圾收集算法

文章目录 0、如何判定一个对象的生死&#xff1f;1、上文提到的引用又是什么1、强引用&#xff1a;2、软引用&#xff1a;3、弱引用&#xff1a;4、虚引用&#xff1a; 2、垃圾收集算法1、标记-清除2、标记-复制优化&#xff1a;&#x1f447; 3、标记-整理 0、如何判定一个对象…

Java面向对象程序设计——知识、概念、定义及作用(简答)

​专栏&#xff1a;《Java面向对象程序设计》学习笔记 问题是依据考纲整理的&#xff0c;稍微做了一些补充。大部分答案由GPT生成&#xff0c;部分内容摘选自书本。 内容太多了&#xff0c;目前懒得浓缩精炼了&#xff0c;以后再说吧。 如果有大佬可以帮忙精简一些文字、补充…

R语言实现神经网络(1)

#R语言实现神经网络 library(neuralnet) library(caret) library(MASS) library(vcd) data(shuttle) str(shuttle)#因变量use; table1<-structable(windmagn~use,shuttle) mosaic(table1,shadingT) mosaic(use~errorvis,shuttle) prop.table(table(shuttle$use,shuttle$stab…

计算机网络-物理层(二)- 传输方式

计算机网络-物理层&#xff08;二&#xff09;- 传输方式 串型传输与并行传输 串行传输:是指数据是一个比特一个比特依次发送的&#xff0c;因此在发送端和接收端之间&#xff0c;只需要一条数据传输线路即可 并行传输:是指一次发送n个比特而不是一个比特&#xff0c;因此发送…

【Uniapp】base64图片资源转为本地图片,解决canvas不支持base64问题

通过接口获取到base64类型的二维码&#xff0c;把二维码放到canvas里生成海报 遇到的问题&#xff1a; 在微信小程序开发工具中能够正常显示海报&#xff0c;到真机上测试就无法显示二维码 原因&#xff1a; 因为canvas不支持base64&#xff0c;其次在使用小程序 canvas 的 dr…

异常堆栈缺失与OmitStackTraceInFastThrow

目录 现象原因OmitStackTraceInFastThrow源码层面分析OmitStackTraceInFastThrow阈值是多少源码源代码解释 现象 异常没有堆栈信息。只有短短的异常类信息&#xff0c;例如java.lang.NullPointerException。 完整的异常堆栈示例&#xff1a; java.lang.NullPointerException…

爬虫逆向实战(十六)--某建筑市场平台

一、数据接口分析 主页地址&#xff1a;某建筑市场平台 1、抓包 通过抓包可以发现数据接口是list 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通过查看“响应”模块可以发现&#xff0c;返回的响应是…

MAUI+Blazor:windows 打包踩坑

文章目录 前言MSIX安装文件如何发布选择Windows平台旁加载自定义签名版本号安装 总结 前言 最近打算研究一下MAUIBlazor&#xff0c;争取在今年年底之前彻底搞懂MAUIBlazor的安装模式&#xff0c; MSIX安装文件 Windows 4种安装程序格式MSI&#xff0c;EXE、AppX和MSIX优缺点…

Java常用API---快速达到Java工作水准系列(1)

目录 1.集合 2.包装类 3.日期处理以及格式化 4.字符串处理类 5.数组 5.BigDecimal 6.Math 1.集合 毋庸置疑&#xff0c;集合在实际项目的使用概率几乎是百分之百。无论是用于数据存储和管理、去重和查找亦或是数据检索和遍历&#xff0c;都离不开集合的使用。任何一个项…

Spring Cloud Gateway系例—参数配置(CORS 配置、SSL、元数据)

一、CORS 配置 你可以配置网关来控制全局或每个路由的 CORS 行为。两者都提供同样的可能性。 1. Global CORS 配置 “global” CORS配置是对 Spring Framework CorsConfiguration 的URL模式的映射。下面的例子配置了 CORS。 Example 77. application.yml spring:cloud:gat…

【【STM32----I2C通信协议】】

STM32----I2C通信协议 我们会发现I2C有两根通信线&#xff1a; SCL和SDA 同步 半双工 带数据应答 支持总线挂载多设备&#xff08;一主多从&#xff0c;多主多从&#xff09; 硬件电路 所有I2C设备的SCL连在一起&#xff0c;SDA连在一起 设备的SCL和SDA均要配置成开漏输出模式 …

5.Vue_Element

文章目录 1 Ajax1.1 Ajax介绍1.1.1 Ajax概述1.1.2 Ajax作用1.1.3 同步异步 1.2 Axios1.2.1 Axios的基本使用1.2.2 Axios请求方法的别名 2 前端工程化2.1 前端工程化特点2.2 Vue项目开发流程 3 Vue组件库Element3.1 Element介绍 1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 Ajax: 全…

【Unity游戏开发】基于前缀树的红点系统构思与客户端方案

一、前言 前段时间负责了项目中红点系统的实现,和大家分享一下初期是设计思路 红点系统客户端业务的一般实现过程与方式: 数据管理:首先要在客户端建立一个数据管理系统,用于存储和管理各个业务模块的红点状态。可以是一个中央数据管理器或模块化的数据管理系统,具体根据游…

VUE中babel.config.js配置按需引入

VUE中babel.config.js配置 vue/cli-plugin-babel/preset是一款 babel 插件&#xff0c;它会在编译过程中将 import 引入自动转换为按需引入的方式。 module.exports {presets: [vue/cli-plugin-babel/preset],plugins: [[import, {libraryName: element-ui,libraryDirectory…