有效面對技術債
陳小風
自我介紹
• 陳鋒逸(陳小風)
• 講師經歷
• 微軟最有價值專家 (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
有效面對技術債

有效面對技術債