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
110
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
380
PHP 也有 Day #49:邊緣人救星!用 Laravel 打造私人定製的聊天機器人
starrocket
0
470
PHP 也有 Day #48:我是誰?我在哪?
starrocket
0
110
PHP 也有 Day #48:我是誰?我在哪?
starrocket
0
100
API-整合測試
starrocket
0
170
How we talk about Engineering Culture at Phase
starrocket
0
66
PHP 也有 Day #47:打造好維護的 PHP 程式碼專案
starrocket
0
400
全端起手就用 Laravel+Vue.js 現場實作給你看
starrocket
0
240
PHP 也有 Day #45: VS Code 實戰料理 PHP 套件網站佐 Azure Pipelines
starrocket
0
160
Other Decks in Programming
See All in Programming
一人だけ、Kiroが静止する日
hideg
0
130
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
690
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
300
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.5k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
18
17k
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
7
4.9k
App Intentsのビルドプロセスを支える技術
kntkymt
0
450
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
450
Building an Out-of-Order CPU
latte72
1
800
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
320
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.1k
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
540
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
330
Optimising Largest Contentful Paint
csswizardry
37
4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
What's in a price? How to price your products and services
michaelherold
247
13k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
370
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
540
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
A Soul's Torment
seathinner
8
3.6k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
490
The Curse of the Amulet
leimatthew05
3
15k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
560
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