技術債 筆記

目錄

  • 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.pswp.cn/news/41059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41059.shtml
英文地址,請注明出處:http://en.pswp.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…