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

YugaByte DB Internals - Storage Engine and Transactions
YugaByte DB Internals - Storage Engine and Transactions YugaByte DB Internals - Storage Engine and Transactions
YugaByte DB Internals - Storage Engine and Transactions Yugabyte
 
ふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかたふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかたYoshitaka Kawashima
 
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4SORACOM,INC
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC
 
Azure利用開始手順
Azure利用開始手順Azure利用開始手順
Azure利用開始手順Junji Yamamoto
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかAtsushi Nakada
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗toshihiro ichitani
 
Lychee Redmine最新機能紹介とLycheeの未来について
Lychee Redmine最新機能紹介とLycheeの未来についてLychee Redmine最新機能紹介とLycheeの未来について
Lychee Redmine最新機能紹介とLycheeの未来についてagileware_jp
 
從無到有建立一個敏捷開發團隊的經驗甘苦談
從無到有建立一個敏捷開發團隊的經驗甘苦談從無到有建立一個敏捷開發團隊的經驗甘苦談
從無到有建立一個敏捷開發團隊的經驗甘苦談TIM WANG
 
組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontendsPIXTA Inc.
 
グラフデータベース入門
グラフデータベース入門グラフデータベース入門
グラフデータベース入門Masaya Dake
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTakuto Wada
 
機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介Cloudera Japan
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022Yusuke Suzuki
 
Power BI - 概要と 新しい機能など
Power BI - 概要と 新しい機能などPower BI - 概要と 新しい機能など
Power BI - 概要と 新しい機能などTakeshi Kagata
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 

What's hot (20)

YugaByte DB Internals - Storage Engine and Transactions
YugaByte DB Internals - Storage Engine and Transactions YugaByte DB Internals - Storage Engine and Transactions
YugaByte DB Internals - Storage Engine and Transactions
 
ふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかたふつうの受託開発チームのつくりかた
ふつうの受託開発チームのつくりかた
 
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧
 
Azure利用開始手順
Azure利用開始手順Azure利用開始手順
Azure利用開始手順
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
Azure Search 大全
Azure Search 大全Azure Search 大全
Azure Search 大全
 
4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗
 
Lychee Redmine最新機能紹介とLycheeの未来について
Lychee Redmine最新機能紹介とLycheeの未来についてLychee Redmine最新機能紹介とLycheeの未来について
Lychee Redmine最新機能紹介とLycheeの未来について
 
從無到有建立一個敏捷開發團隊的經驗甘苦談
從無到有建立一個敏捷開發團隊的經驗甘苦談從無到有建立一個敏捷開發團隊的經驗甘苦談
從無到有建立一個敏捷開發團隊的經驗甘苦談
 
組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends
 
グラフデータベース入門
グラフデータベース入門グラフデータベース入門
グラフデータベース入門
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介
 
Zen of Akka
Zen of AkkaZen of Akka
Zen of Akka
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
 
Power BI - 概要と 新しい機能など
Power BI - 概要と 新しい機能などPower BI - 概要と 新しい機能など
Power BI - 概要と 新しい機能など
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 

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)
 

有效面對技術債