上週五公司邀請了 Clean Code (中文翻譯書︰無瑕的程式碼) 一書的作者 Robert C. Martin,也就是大家常稱呼的 Uncle Bob 到場演講。主題是向大家介紹,工程師要撰寫出 Clean Code,應該要建立的觀念或是技巧。

演講的內容非常棒,可惜是公司內部的 talk,無法分享給大家錄影檔。在這邊記錄,我在演講中聽到的一些重點項目,也算是幫自己留個筆記。

1. 引言

  • There are so many devices are driven by softwares. (醫療系統、ATM 等等)
  • 軟體寫不好可能會造成很大的損失。
  • 我們怎麼可以讓這事情發生呢?

2. We will not ship crap (垃圾).

  • 著重程式碼品質

3. We will always be ready.

  • 如果團隊是走 Scrum,每個 sprint 週期應該為 2 ~ 4 週。
  • We will be ready all the time.
  • 每個 sprint 結束,都有 feature 被完成,software 處在隨時可被 deploy 的狀態

4. Stable Productivity

  • 生產力不會因為系統變大/變舊,而降低
  • 一開始寫 code 很快,後來越寫越慢?why?
  • Mess code slow you down! (因為雜亂/爛 code 開始拖慢你的開發速度)

5. Inexpensive Adaptability

  • 軟體比硬體好的優勢,就是可以快速因應需求變更
  • 無法快速因應?mess code slow you down!

6. Continuous Improvement

  • 童子軍守則 - 讓離開時的營地比進去時更乾淨
  • 為什麼我們會開始用 legacy code 稱呼舊程式碼?因為我們寫了爛 code,改不動

7. Fearless Competence

  • 我們常怕改別人的 code?怕改爛了自己要收拾
  • 不應該出現這種情形,我們不應該畏懼程式碼 (Should not be afraid of the code)

8. Extreme Quality

  • Small step to clean you code.
  • Tradeoff in features, not quality
  • I don’t expect bugs

9. We will not dump in QA

  • I expect QA will find nothing!
  • 如果 QA 還有找到問題,我們應該要問自己一個問題︰why?

10. Automation Test

  • Manual testing is expensive!
  • I can run automation test everyday!

11. Nothing is fragile

  • 系統具備強固性
  • 我們改變了系統一部份的元件,而其他元件不會受到影響
  • 降低 Side effect

12. We cover for each other

  • 棒球比賽,一個守位球員受傷了,應該要有替補可以補上
  • Do more pair programming! Learn the know-how from each other.
  • Be A-team!

13. Honest Estimates (個人最喜歡這點)

  • Accurate and precise to the best of your ability.
  • I do not expect a date.
  • 了解需求
  • 了解自己的技能水平
  • 誠實回報不懂/不確定的地方

14. Say "No"

  • Tell those managers who demand a date, I expect you do say “No”
  • Why you are hired? You are hired to say "No".
    • 針對不合理的時程、需求,勇於說「不」
  • 「我晚點才能告訴你時間」
  • 管理者控管成本、預算,工程師控管 品質

15. Continuous Aggressive Learning (持續積極的學習)

16. Mentoring

  • Teach each other.
  • Senior teach junior.

17. TDD (測試驅動開發)

  • The code tell you truth.
  • You are not allowed to write production codes before you write a failing unit test!
  • TDD force you design your system to be testable.
    • TDD 強迫你將系統設計得具備「可測試性」