Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHP 也有 Day #50:處理前人的遺產—聊 legacy code
Search
Star Rocket
November 26, 2019
Programming
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHP 也有 Day #50:處理前人的遺產—聊 legacy code
- 什麼是 legacy code
- 重構和重寫的選擇
- 避免寫出新的 legacy code
Star Rocket
November 26, 2019
More Decks by Star Rocket
See All by Star Rocket
PHP 也有 Day #51:高效能框架的曙光 - 以 Laravel 經驗開發 Hyperf 應用
starrocket
1
370
PHP 也有 Day #49:邊緣人救星!用 Laravel 打造私人定製的聊天機器人
starrocket
0
460
PHP 也有 Day #48:我是誰?我在哪?
starrocket
0
100
PHP 也有 Day #48:我是誰?我在哪?
starrocket
0
95
API-整合測試
starrocket
0
160
How we talk about Engineering Culture at Phase
starrocket
0
55
PHP 也有 Day #47:打造好維護的 PHP 程式碼專案
starrocket
0
390
全端起手就用 Laravel+Vue.js 現場實作給你看
starrocket
0
230
PHP 也有 Day #45: VS Code 實戰料理 PHP 套件網站佐 Azure Pipelines
starrocket
0
150
Other Decks in Programming
See All in Programming
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
110
iOSDC2026登壇資料.pdf
riofujimon
0
160
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
280
wkhtmltopdfの次どうするか問題2026
willnet
1
100
App Intentsのビルドプロセスを支える技術
kntkymt
0
370
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
190
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
370
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
160
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
170
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.3k
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
620
スマート反転とウェブアクセシビリティ
camiha
0
210
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
570
エンジニアに許された特別な時間の終わり
watany
109
250k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The Pragmatic Product Professional
lauravandoore
37
7.4k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
520
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Test your architecture with Archunit
thirion
2
2.4k
Exploring anti-patterns in Rails
aemeredith
4
510
Transcript
處理前人的遺產 聊 legacy code
• 前人的遺產 • 重構 v.s. 重寫 • 開始重構 • 分析現況與進度
• 避免寫出新遺產
前人的遺產
工作不是只有 coding
$ whoami • 遊戲公司開發 • 小公司官網開發 • 廣告 DSP 系統開發
• 補習系統開發
什麼是 legacy code
None
什麼是 legacy code 年代久遠 結構龐大
什麼是 legacy code 經歷很多迭代 幾乎沒有文件
什麼是 legacy code (例外)
當 legacy 品質太差時的二選一
重構 v.s. 重寫
約耳趣談軟體(Joel on Software) • Microsoft Excel PM • Stack Overflow
CEO • Trello 作者
約耳趣談軟體 - 你絕對不應該做的事 之一 他們決定把程式從頭重寫過(Netscape)
None
然後就有了 Mozilla(?
重寫的問題
重寫的問題 風險 開啟專案成本
耗費時間 重寫的問題 市場變動
重寫的好處
自由度 重寫的好處 可測試性
有時候逼不得已 • 換語言(Java to PHP) • 換成不相容的框架(yii1 to laravel) •
⋯⋯etc 除了這些狀況之外,盡可能避免重寫整個專案
確認一下,為什麼要重構?
重構的原因 • 這樣程式碼比較簡潔 • 這樣才是好的工程做法
不要對主管這麼說
主管面對的問題 耗費時間成本 耗費人力成本
重構的原因 • 這樣程式碼比較簡潔 • 這樣才是好的工程做法 • 這樣之後修改更快(減少時間成本) • 這樣之後接手的人更好處理(減少人力成本)
長官聽不懂程式碼品質怎麼辦?
重構的原因 • 這樣之後修改更快(減少時間成本) • 這樣之後接手的人更好處理(減少人力成本) 不要聊程式碼品質
為什麼不聊程式碼品質 作為工程師 撰寫程式碼是你的工作,不是主管的工作
為什麼不聊程式碼品質 同理 作為工程師 維護程式碼品質是你的工作,不是主管的工作
開始重構
None
開始重構 先寫測試
先寫測試 不要為了重構,結果搞到離職
利用自動測試保護原有功能
可是舊有架構測試很難寫⋯⋯
先補上功能測試 在 legacy 上面加上測試
隨著重構逐漸補上單元測試 在 legacy 上面加上測試
開始重構
None
開始重構 先補文件
為什麼要先補文件 沒有文件,就算寫得多清楚,後來的人還是不懂 (包括未來的你)
最重要的文件是
README.md
README.md 檔案位置最明顯
README.md 每個人都會看到
README.md 要寫 • 專案用途 • 相依元件 • 建置方式 ◦ 本地
◦ 遠端 • 測試方式
其他文件
不放進 readme.md 的文件 放 repo wiki
不放進 readme.md 的文件 放 docs/ 資料夾
開始重構
分析現況與進度
分析現在的處境有多嚴重
回報重構進度
所謂的重構 就是不會有新功能的
所以 老闆會討厭你
不要為了重構,結果搞到得離職
怎麼辦
逐步改進
逐步改進 維持撰寫新功能(老闆按讚)
逐步改進 重構前人程式(包含測試,文件⋯⋯等)
時間的部分怎麼辦?
提升自己實力 效率不比一般工程師還差
提升自己實力 懂得說「不」
提升自己實力 維持專業
避免寫出新 legacy
避免寫出新 legacy (專案的)資訊並不想要自由
避免寫出新 legacy 開發者並不喜歡寫文件
避免寫出新 legacy 花時間維護文件
避免寫出新 legacy 時常和同事討論文件內容
避免寫出新 legacy 避免將功能塞入單一大專案
避免寫出新 legacy 建立方便修改的小專案
避免寫出新 legacy 時常和同事做 code review
避免寫出新 legacy 多溝通避免資訊遺失
• 花時間維護文件 • 時常和同事討論文件內容 • 建立方便修改的小專案 • 時常和同事做 code review
避免寫出新 legacy
None
tl;dr • 冷靜評估重構和重寫的風險與效益 • 重構之前先補測試和文件 • 隨時使用各種工具分析現況,確認重構進度 • 避免寫出新遺產
問答 • legacy code 的常見特徵(共四點) • 重構之前先補(共兩點) • 避免寫出新遺產(共四點)
問答 • legacy code 的常見特徵 ◦ 年代久遠 ◦ 結構龐大 ◦
經歷很多迭代 ◦ 幾乎沒有文件
問答 • 重構之前先補 ◦ 文件 ◦ 測試
問答 • 避免寫出新遺產 ◦ 花時間維護文件 ◦ 時常和同事討論文件內容 ◦ 建立方便修改的小專案 ◦
時常和同事做 code review
套件程式討論團
@ReccaChaoWebDev
網路技術討論區
投影片網址
None