動機

翻翻The Pragmatic Programmer 20週年紀念版的一些紀錄我感覺很重要的部分

節錄

  • Easy to change(ETC)
    • DRY: 在一個系統中,每一條知識都必須有一個、單一、明確、權威的表現
      • ex: code, API, schema, 功能, 文件
    • 正交性: 不互相影響,元件是self-contained
    • 可逆性: 可以變動
  • 曳光彈: 可以即時反饋、最簡化的系統
    • 原形主要用在proof of concept,用完即丟,但曳光彈可以繼續發展下去
  • 評估: 一項應該培養起來的技能
    • question -> build model -> design components -> give some assumed vals -> compute -> analyze estimates
  • 用VCS(like git)控管
    • user setting (like .bashrc)
    • editor setting (like .vimrc)
    • 已安裝的software列表
    • ansible腳本
    • 開發的repo
  • 工作日誌 (以天為單位)
    • 做了什麼
    • 突然出現的想法
    • debug的變數
    • 等等…
  • 合約式編程: precond, postcond, class invariant
    • 如果有cond被打破就要跑補救措施
  • 關於assertion
    • 用assertion寫下不可能發生的事
    • assertion不要有state
      • (X) assert(iter.next() != NULL)
      • (O) obj=iter.next(); assert(obj != NULL)
    • 除非這個assertion會有重大效能影響,不然就留著,可以對debug(from end-user)有很大的幫助
  • 將設定(setting)用成一種service不是只有text file,可以方便取得數值與控制access
  • 測試以attribute為基礎: 設定參數的範圍,之後random生,去測試
  • 需求是一種流程(沒有一次就定下來的): 想法 <=> 疑問(某些edge case之類) 之間的反覆來回
  • 不是跳出框框思考,而是找到框框 (邊界在哪)
  • 支撐project的三項支柱
    1. 版本控制: drive build, test, deploy 的流程
    2. 回歸測試
    3. 完全自動化

TODO

身陷TDD,把test當成考題的例子 Constraint Propagation,感覺很屌