Programming - FrankNine/franknine.github.io GitHub Wiki

講者推薦

一切的根源:SICP

筆記

  • 大型軟體系統工程不像其他工程受材料物理特性限制,僅受人類心智處理複雜度能力限制
    • 人類心智能力有限才需要分層與抽象,機器自己不需要整理程式,Program Counter 一直跳就能執行
      (甚至切分對機器還是累贅所以才有 Compiler Inlining)
  • 三個抑制複雜度的方法
    • 黑箱抽象
      • 將人承受的資訊量減少,隔絕下層資訊對人心智造成的負擔
      • 要素
        • 基礎元素(Primitive Elements)
        • 合成的方法(Means of Combination)
        • 抽象的方法(Means of Abstraction)
          • 把複雜的東西裝進黑箱
          • 加以命名使其像是基礎元素
          • 繼續往上構建(使用者應該要無法區分基礎元素跟抽象過的合成元素)
    • 通用介面
    • Metalinguistic Abstraction
  • Wishful thinking
    • 想像還沒動工的下層,已經做成上層最想要的介面
      • (Top-down Approach,重見於 Programing to Interface、TDD)
  • 從沒有狀態的 Lisp 進到有狀態的 Lisp,感受狀態有多難實作跟處理
    • 狀態在硬體是自然,在計算理論是難以維護。什麼地方要給機器自然取硬體的力量,什麼地方要給人推論自然?

OO:Sandi Metz

  • Nothing is Something
    • if 關鍵字可以以對物件送 if_true Message 替代
      if ( 1==1 )
        puts 'true'
      end
      
      class TrueClass
        define if_true
          yield
          self
        end
      end
      (1==1).if_true { puts 'true' }
      
    • if 對 Procedure 自然,對 OO 不自然(重構:以多型取代條件表示式)
    • Null Object Pattern
      • Active Nothing
      • if null then do something => 在 null 的位置放一個收到共通 Message 會跟 null 一樣 do something 的物件
    • Inheritance is for specialization, not for sharing code
    • 將繼承到卡在多重繼承的程式,觀察出有演算法跟 "沒做事演算法" 兩種行為,抽出這兩者改成可 Composition 物件替代繼承
      Object plays as the thing that varies
    • 0 的概念類似於這裡的 Nothing
  • 99 Bottles of OOP
    • 以小歌唱遊戲逐步加入規則示範 TDD 跟 Refactor 應對需求改變

Test:Ian Cooper

  • TDD, Where Did It All Go Wrong
    • 有寫測試的人就是比 Move Fast and Break Things 的人慢交付商業價值
      • Duct Tape Programmer 短期更受青睞,非技術人員就是愛 Shipping,不管 Code 好不好
    • 以 Developer Test 代稱 Unit Test。Unit 的定義已經混砸,原本是指 Test 不是指一個 Class
    • 用到 Mock 就是測到實作細節,Refactor 定義上只改實作細節不改行為,理不應造成測試需要修改
    • 沒有非技術客戶願意跟你一起讀 Fitness、Gherkin、SpecFlow
      • 在整個 Feature 開發週期 ATDD 都是紅的,沒有在過程提供任何幫助
      • 開發者也不想寫,他們只想建構程式,ATDD 沒有可見的好處
    • 回到 Kent Beck 的 TDD,移除後來加的違建
    • 原初 TDD:避免測試實作細節,測試行為(Avoid testing implementation details, test behaviours)
      • 以加入一個 Method 開始 TDD 循環是錯的,TDD 觸發條件應該是實作一個 需求 (我想要軟體做到的事、Use Case、Stroy)(客戶沒有給你希望某個內部實作 Utility 方法執行結果正確的需求)
      • 測 Public(Exported)API (API 非 HTTP 或是 ATDD)
      • 測試單位不是一個 Class(Class 不是 Unit,太在意要單獨測 Class 導致 Mock 過度),是整個模組向外的 Export
    • BDD 名詞不應該存在,一開始 TDD 就該測 Behaviour,而不是測錯成實作再喊 Test Behaviours 繞回來。BDD 名詞本身只是重造 Kent 的輪子
    • Test First 等於是預先設想還不存在的 API 該怎麼樣才好互動(SICP 的 Wishful Thinking
    • 隔絕的單位(Unit of Isolation)是測試,測試間隔絕影響,不是把單位當成一個 Class 把它 Mock 到出來(也不要把非 API 的欄位弄成 Public 或是使用 InternalsVisibleTo,測試就是只到 API
    • Red-Green-Refactor
      • Red:證明沒有實作測試會失敗,寫的測試有鑑別力
      • Green:求測試通過,手段多髒都可以,速度要比美上面討人厭的 Duct Tape Programmer。過程中學習該如何實作(Speed Trumps Design)
      • Refactor:把 Duct Tape 在有測試保障的情況下理成好 Code,速度完不要留垃圾禍害人
        • 不能寫任何新測試,Refactor 照定義沒有改並沒有改變行為,沒有新行為就不應該有新測試
        • Refactor to Pattern,知道怎麼做到功能(Green),才能 Apply Pattern
      • 你很難同時寫對跟跟寫好,改求分開兩次:一次寫對/探索理解問題的答案(Green),一次寫好(Refactor)
    • 在 Port and Adaptor 的 Port Unit 測試(以測試夾住 Impure-Pure-Impure 的 Pure)
      • 往外以 Integration Test 處理 Impure
      • 最後使用者最外層 End-to-End System Test
      • 不應該測試時使用 IoC Container,有需要代表結構不對沒有做到 Dependency Rejection
    • 檔位,高檔位程式太簡單直接寫,低檔位問題困難要寫額外測試輔助(寫實作的輔助測試,完成後要刪除,不能留下,理由同上沒有新行為不應追加測試)
  • TDD Revisited

Functional (業界):Kevlin Henney

  • Refactoring to Immutability - Kevlin Henney
  • Structure and Interpretation of Test Cases
    • 如同 SICP 的引言,測試應該為了想要理解程式的人寫,剛好能被機器執行跟驗證
      • 測試如同文件,SOLID Refactor 測試過頭會妨礙文件的功能,測試跟 Production Code 不一樣
    • Unit Test 執行成功與否應該只取決於 Unit Test 本身跟 Unit under Test 的正確性
      • 才對測試有功效有信心,才能加速開發
      • 引入 Side Effect(檔案讀寫、網路...)後就無法滿足這個定義,系統一定有 Side Effect 所以一定有無法 Unit Test 部分
    • 如何用程式傳達觀念?
    • 反對 Test Case 三段命名,改以類似說故事方式撰寫

Dependency Injection 的替代:Mark Seemann

Functional (學界):James Koppel

Functional DDD:Scott Wlaschin

Optimization:Casey Muratori

Design Pattern:Bob Nystrom

名人對談(戰)

語言

Lisp

Scheme

遊戲應用

Haskell

Objective-C

JavaScript

Python

Unicode

Category Theory

Optimization

Monad

Free Monad

Effect

測試

  • Automated testing for Call of Duty
    • Per-commit build 約 30 分,會平行建置,真的塞車會 skip
    • 自己用 Python 撰寫,Build script 是 Python 直接在目標機器執行
    • 問題做 ID 分 Bucket,有些問題 Auto-retry、有些重開測試機或是禁用,避免 Error 太多
      什麼能 Auto-retry 很看情況
    • 控制使用者安裝軟體:Puppet
    • 主機比 PC 穩定適合截圖或比較數據

技術

  • Choose Boring Technology
    • 未知有分 已知的未知未知的未知,使用新技術容易在 未知的未知 上出意外
    • 將採用新技術當作消費創新代幣,限制你專案的代幣用量
    • 總成本 = 維護成本 - 加速的效益,一切還是求利大於弊
  • 一窩蜂驅動開發
    • 潮流未必可信
    • 投資報酬率,還是求 Z > B
    • 短時間低成本試毒
  • The compiler will optimize that away
    • 現在流傳的語言設計在 Memory Latency 跟 CPU Latency 差不多的年代
    • 新的語言應該處理降低 Random Access 次數
    • 語言等級的 Array of Structure to Structure of Array 轉換 (JAI)
    • Twitter:處理器跟記憶體的速度落差越來越大,已經是以前的 400 倍差距。當初覺得 Random Access Object 造成 Cache miss 是可接受的妥協,現在是無比的浪費。後面也拋出由語言做 AoS 變 SoA 的可能

  • Legacy • Chad Fowler

演算法

紀錄片

  • React.js: The Documentary
    • https://twitter.com/aaefiikmnnnr/status/1644345389204795398
      React 的訪談紀錄片,算是蠻完整記錄一個新的 Library 如何在公司體系存活下來、由少量的先行者說服公司投資人力、在 Library 之外完善 Documentation 以求 Buy-in、撐過公司使用既有技術的人的阻力、開源(不太順利)、最後到慢慢改變與外界互動方式建立起社群的過程。
  • Kubernetes: The Documentary Part 2
    • 最接近使用者的 Orchestration 介面最有價值
    • 成立 Cloud Native 基金會避免原來條款寫要給 Google Re-license 權利造成 Contributor 遲疑