SlideShare a Scribd company logo
1 of 47
Download to read offline
有效面對技術債
陳小風
自我介紹
• 陳鋒逸(陳小風)
• 講師經歷
• 微軟最有價值專家 (MVP)
• SkillTree兼任講師
• Techday 講師 (2014)
• JSDC 講師 (2013)
• 社群研討會講師
• AgileCommunity.tw
• Javascript.tw
• twMVC
粉絲團: 愛流浪的小風
有效面對技術債
陳小風
認識技術債
• 程式碼的壞味道
• 功能有靈異現象
• 難以維護的功能
• 改 A 壞 B
• 牽一髮而動全身
• But…It works!
什麼是技術債?
• 專案時程緊迫
• 對語言、架構熟悉度不足夠
• 多頭馬車、Context Switch
• 對產品的認知不足夠
• 複製 / 貼上
技術債是怎麼產生的?
時間少
功能多 成本低
貴
久
少
技術債
技術債是怎麼產生的?
技術債影響
時程
無法評估
質量下滑 影響開發
大量錯誤 滿意度下降 客戶流失
無法忽略的技術債
0
20
40
60
80
100
120
SPRINT 1 SPRINT 2 SPRINT 3 SPRINT 4
產能
產能
瞭解它
接受它
包容它
改變它
面對技術債
有效面對技術債
陳小風
瞭解負債狀況
功能正確性 測試涵蓋率 重複
安全性 撰寫風格 半成品
技術債種類
What is SonarQube
• 程式碼品質分析工具
• 結合版本控制
• 多維度分析
• 差異比較
• 儀表版
支援多語言
與其他工具比較
Simian FxCop
StyleCop
Source
Monitor
自動化
• 多語言
• 建置整合
• 結合 CI Server
Runner
• 視覺化圖表
• 數據呈現
• 版本比較
Dashboard
• Pull Request
• 省時間
• 關注點分離
• 負擔較輕
• 習慣養成
差異比較
有效面對技術債
Coverage
Duplication
Rules
Pull Request 整合
管理未完成項目
管理未完成項目
https://wiki.jenkins.io/display/JENKINS/TODOs+Plugin
有效面對技術債
陳小風
面對技術債
發生原因
時間 程式碼
時間 程式碼
解決問題
• 資源有限
• 專注在重要的
• 減少浪費
• 自動化
• 瞭解現況
• 確保正確性
• 提升品質
• 持續改善
• 時間永遠不夠
• 做得多不如做得巧
• 錯誤的需求 => 昂貴的成本
• 盡可能找出有價值的內容
• 從使用者的 Feedback 學習
• 一次到位,不如持續改善
接受現實
假設
實驗改善
需求很重要
• 大需求不斷
• 功能四處發散
• 時間壓力緊迫
• 技術債蔓延
• 惡性循環
• 找出真正的問題
• 產出有價值的功能
• 觀察用戶的行為
• 調整策略
• 最小化成本
瞭解使用者
使用者故事
地圖
影響地圖 實例化需求
用戶
Feedback
Page
Analytics
Funnel
處理技術債的步驟
量化技術債
撰寫測試
重構 or 重寫
自動化工作
追蹤、排序、修改
改善程式碼
• 瞭解目前的問題
• 撰寫測試,建立防護網
• 排出撰寫測試優先順序
• 功能重要性
• 最常異動的部分
• 阻礙最大的部分
Git Effort
找出最常變動的程式碼
對照測試涵蓋率
年久失修的技術債
• 重構 or 重寫
• 了解使用者如何使用
• 是否還在使用?
• 追蹤使用者如何使用
• 重新探索功能真正的需求
• 確認是否需要改寫
User Story
Mapping
Specification
by example
修正技術債
• 使用自動化測試
• 確保真正需要的功能正常
• 逐步改善,先把已知部分抽離
• 從外而內,補上單元測試
• 收復失地
Refactor Step
Legacy Code
• 加上整合測試
• 解除耦合性
• 重構熟悉部分
• 補上單元測試
• 逐漸重構全部程式碼
Integration Test
Dependency
Class A
Dependency
Class B
Interface
Function A
Unit Test
Function B
Unit Test
Test Covered
Rewrite Step
• Code Level
Function
Call
V1 Class
Factory
V2 Class
Test Covered
• Infrastructure Level
Rewrite Step
Request
V1 App
Load
Balancer
V2 App
讓工作自動化
• 持續整合伺服器
• 自動建置、測試、分析
• 提前發現問題
• 確保環境隔離
• 節省大量時間
• 專注在開發
Source
Code
Production
CI Server
Build Unit Test
Integratio
n Test
Code
Analysis
Deploy
Code
Review
Pair Programming
軟體開發流程
40
• 公司需要 生存,有商業目標
• 良好的開發流程
• 自動化測試
• 程式碼分析
• 優先償還影響大的技術債
• 定期清理嚴重問題
計畫性負債
定期清理
• 休耕期
• 週期性檢討產品程式碼現況
• 解決可能會影響開發的嚴重部分
• 持續改善團隊開發流程
• 增進團隊開發技能
• 補足測試或修正問題
有效面對技術債
陳小風
結論
資源有限,花在刀口
合理的需求
有效的產出
自動化流程
從經驗中學習
減少浪費
與技術債共處
• 瞭解目前產品的問題
• 專注在最需要解決的項目
• 控管可能發生的問題
• 定期檢討開發團隊的瓶頸
• 有效消除技術債並避免再次產生
有效面對技術債
陳小風
Q & A
有效面對技術債

More Related Content

What's hot

Why Scrum (敏捷式專案管理)
Why Scrum (敏捷式專案管理)Why Scrum (敏捷式專案管理)
Why Scrum (敏捷式專案管理)Yu Wei Shang
 
Dci vs aggregate_dddtw_2021-0.3-16-9
Dci vs aggregate_dddtw_2021-0.3-16-9Dci vs aggregate_dddtw_2021-0.3-16-9
Dci vs aggregate_dddtw_2021-0.3-16-9teddysoft
 
從系統思考看 DevOps:以 microservices 為例 (DevOps: a system dynamics perspective)
從系統思考看 DevOps:以 microservices 為例 (DevOps: a system dynamics perspective)從系統思考看 DevOps:以 microservices 為例 (DevOps: a system dynamics perspective)
從系統思考看 DevOps:以 microservices 為例 (DevOps: a system dynamics perspective)William Yeh
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
結果的に組織がAgileな状態であること #agile #scrum #leanstartup
結果的に組織がAgileな状態であること #agile #scrum #leanstartup結果的に組織がAgileな状態であること #agile #scrum #leanstartup
結果的に組織がAgileな状態であること #agile #scrum #leanstartupItsuki Kuroda
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
アジャイル開発の始め方
アジャイル開発の始め方アジャイル開発の始め方
アジャイル開発の始め方ESM SEC
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
漫談重構
漫談重構漫談重構
漫談重構teddysoft
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadogNaoya Nakazawa
 
如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案Paddy Huang
 
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpテストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpkyon mm
 
アジャイル開発の進め方
アジャイル開発の進め方アジャイル開発の進め方
アジャイル開発の進め方ESM SEC
 
SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方Yoichi Toyota
 
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2Alan Tsai
 
UTP(UML Testing Profile)概要紹介
UTP(UML Testing Profile)概要紹介UTP(UML Testing Profile)概要紹介
UTP(UML Testing Profile)概要紹介Noriyuki Mizuno
 
從限制理論角度談敏捷導入階段 (Agile transition: a TOC perspective)
從限制理論角度談敏捷導入階段 (Agile transition: a TOC perspective)從限制理論角度談敏捷導入階段 (Agile transition: a TOC perspective)
從限制理論角度談敏捷導入階段 (Agile transition: a TOC perspective)William Yeh
 
也許你需要的是多一點瀑布 - 敏捷八不
也許你需要的是多一點瀑布 - 敏捷八不也許你需要的是多一點瀑布 - 敏捷八不
也許你需要的是多一點瀑布 - 敏捷八不Yves Lin
 

What's hot (20)

Why Scrum (敏捷式專案管理)
Why Scrum (敏捷式專案管理)Why Scrum (敏捷式專案管理)
Why Scrum (敏捷式專案管理)
 
Dci vs aggregate_dddtw_2021-0.3-16-9
Dci vs aggregate_dddtw_2021-0.3-16-9Dci vs aggregate_dddtw_2021-0.3-16-9
Dci vs aggregate_dddtw_2021-0.3-16-9
 
從系統思考看 DevOps:以 microservices 為例 (DevOps: a system dynamics perspective)
從系統思考看 DevOps:以 microservices 為例 (DevOps: a system dynamics perspective)從系統思考看 DevOps:以 microservices 為例 (DevOps: a system dynamics perspective)
從系統思考看 DevOps:以 microservices 為例 (DevOps: a system dynamics perspective)
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
結果的に組織がAgileな状態であること #agile #scrum #leanstartup
結果的に組織がAgileな状態であること #agile #scrum #leanstartup結果的に組織がAgileな状態であること #agile #scrum #leanstartup
結果的に組織がAgileな状態であること #agile #scrum #leanstartup
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
アジャイル開発の始め方
アジャイル開発の始め方アジャイル開発の始め方
アジャイル開発の始め方
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
漫談重構
漫談重構漫談重構
漫談重構
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadog
 
如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案
 
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpテストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jp
 
アジャイル開発の進め方
アジャイル開発の進め方アジャイル開発の進め方
アジャイル開発の進め方
 
SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方
 
20110118 scrum 10 mins
20110118 scrum 10 mins20110118 scrum 10 mins
20110118 scrum 10 mins
 
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
 
UTP(UML Testing Profile)概要紹介
UTP(UML Testing Profile)概要紹介UTP(UML Testing Profile)概要紹介
UTP(UML Testing Profile)概要紹介
 
從限制理論角度談敏捷導入階段 (Agile transition: a TOC perspective)
從限制理論角度談敏捷導入階段 (Agile transition: a TOC perspective)從限制理論角度談敏捷導入階段 (Agile transition: a TOC perspective)
從限制理論角度談敏捷導入階段 (Agile transition: a TOC perspective)
 
也許你需要的是多一點瀑布 - 敏捷八不
也許你需要的是多一點瀑布 - 敏捷八不也許你需要的是多一點瀑布 - 敏捷八不
也許你需要的是多一點瀑布 - 敏捷八不
 

Similar to 有效面對技術債

邁向A+,談專案經理的跨界能力
邁向A+,談專案經理的跨界能力邁向A+,談專案經理的跨界能力
邁向A+,談專案經理的跨界能力gipi
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comdrewz lin
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comdrewz lin
 
從乙方PM的角度看敏捷
從乙方PM的角度看敏捷從乙方PM的角度看敏捷
從乙方PM的角度看敏捷KC Liu
 
DevOps的神鬼奇航
DevOps的神鬼奇航DevOps的神鬼奇航
DevOps的神鬼奇航Edward Kuo
 
Agile tour 2014 - Coding Dojo with C# and TDD
Agile tour 2014 - Coding Dojo with C# and TDDAgile tour 2014 - Coding Dojo with C# and TDD
Agile tour 2014 - Coding Dojo with C# and TDDAgileCommunity
 
Agile tour Taipei 2014 - coding dojo with CSharp and TDD
Agile tour Taipei 2014 - coding dojo with CSharp and TDDAgile tour Taipei 2014 - coding dojo with CSharp and TDD
Agile tour Taipei 2014 - coding dojo with CSharp and TDDJoey Chen
 
Discover agile(agile tour)-owen chen-iji
Discover agile(agile tour)-owen chen-ijiDiscover agile(agile tour)-owen chen-iji
Discover agile(agile tour)-owen chen-ijiOdd-e
 
一小時可以打造什麼服務Plus twMVC#18
一小時可以打造什麼服務Plus twMVC#18一小時可以打造什麼服務Plus twMVC#18
一小時可以打造什麼服務Plus twMVC#18twMVC
 
twMVC#18 | 一小時能做出什麼服務 Plus
twMVC#18 | 一小時能做出什麼服務 PlustwMVC#18 | 一小時能做出什麼服務 Plus
twMVC#18 | 一小時能做出什麼服務 PlustwMVC
 
初探工程師升級手冊 2022
初探工程師升級手冊 2022初探工程師升級手冊 2022
初探工程師升級手冊 2022Caesar Chi
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷oulan
 
我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術Li Hsuan Hung
 
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Kirk Chen
 
關於產品經理的角色與職責
關於產品經理的角色與職責關於產品經理的角色與職責
關於產品經理的角色與職責Cloud Chen
 
Progressive Enhancement
Progressive EnhancementProgressive Enhancement
Progressive Enhancementlifesinger
 
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)Calvin C. Yu
 

Similar to 有效面對技術債 (20)

邁向A+,談專案經理的跨界能力
邁向A+,談專案經理的跨界能力邁向A+,談專案經理的跨界能力
邁向A+,談專案經理的跨界能力
 
Kubernetes on gcp
Kubernetes on gcpKubernetes on gcp
Kubernetes on gcp
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.com
 
Djt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.comDjt22 justinliu djt.qq.com
Djt22 justinliu djt.qq.com
 
從乙方PM的角度看敏捷
從乙方PM的角度看敏捷從乙方PM的角度看敏捷
從乙方PM的角度看敏捷
 
DevOps的神鬼奇航
DevOps的神鬼奇航DevOps的神鬼奇航
DevOps的神鬼奇航
 
Agile tour 2014 - Coding Dojo with C# and TDD
Agile tour 2014 - Coding Dojo with C# and TDDAgile tour 2014 - Coding Dojo with C# and TDD
Agile tour 2014 - Coding Dojo with C# and TDD
 
Agile tour Taipei 2014 - coding dojo with CSharp and TDD
Agile tour Taipei 2014 - coding dojo with CSharp and TDDAgile tour Taipei 2014 - coding dojo with CSharp and TDD
Agile tour Taipei 2014 - coding dojo with CSharp and TDD
 
Discover agile(agile tour)-owen chen-iji
Discover agile(agile tour)-owen chen-ijiDiscover agile(agile tour)-owen chen-iji
Discover agile(agile tour)-owen chen-iji
 
一小時可以打造什麼服務Plus twMVC#18
一小時可以打造什麼服務Plus twMVC#18一小時可以打造什麼服務Plus twMVC#18
一小時可以打造什麼服務Plus twMVC#18
 
twMVC#18 | 一小時能做出什麼服務 Plus
twMVC#18 | 一小時能做出什麼服務 PlustwMVC#18 | 一小時能做出什麼服務 Plus
twMVC#18 | 一小時能做出什麼服務 Plus
 
初探工程師升級手冊 2022
初探工程師升級手冊 2022初探工程師升級手冊 2022
初探工程師升級手冊 2022
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷
 
我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術
 
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016
 
Nb的敏捷
Nb的敏捷Nb的敏捷
Nb的敏捷
 
專案開發實務
專案開發實務專案開發實務
專案開發實務
 
關於產品經理的角色與職責
關於產品經理的角色與職責關於產品經理的角色與職責
關於產品經理的角色與職責
 
Progressive Enhancement
Progressive EnhancementProgressive Enhancement
Progressive Enhancement
 
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
 

有效面對技術債