Programming - FrankNine/franknine.github.io GitHub Wiki

講者推薦

Structure and Interpretation of Computer Programs

筆記

  • 大型軟體系統工程不像其他工程受材料物理特性限制,僅受人類心智處理複雜度能力限制
    • 人類心智能力有限才需要分層與抽象,機器自己不需要整理程式,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 應對需求改變
  • Duplication is far cheaper than the wrong abstraction

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

Casey Muratori

Rich Hickey

  • Clojure 創造者
  • Simple Made Easy
    • 簡單和容易有所不同,容易可能是熟悉複雜東西後的結果。而簡單是客觀的,通常會導致容易的
    • simple is not small
      • Simple 與否跟程式大小無關
  • Open Source is Not About You
    • 在 Open Source license 的指引下,使用者甚至也不保證有貢獻的權利

Design Pattern:Bob Nystrom

Kent Beck

Martin Fowler

  • How AI will change software engineering
    • AI 是組合語言到高階語言等級的改變,寫程式從 Deterministic 變成 Non-deterministic
    • Vibe coding,不看產出結果地用 AI,移除了循環中的學習
    • Refactor 應該小步到個別不值得做,Compose 起來有價值
    • 工程師的價值還是在理解人並實作,AI 不會取代這點

Bryan Cantrill

名人對談(戰)

語言

Lisp

Scheme

遊戲應用

Haskell

Objective-C

JavaScript

Python

Kotlin

C

C#

C++

LLVM

Erlang

OCaml

Go

Prolog

UML

RPC

Mythbusting Remote Procedure Calls

Unicode

Turing Machine

Category Theory

Optimization

Fold

Monad

Free Monad

Effect

依賴

Inversion of Control Containers and the Dependency Injection pattern

測試

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

技術

  • Choose Boring Technology
    • 未知有分 已知的未知 跟 未知的未知,使用新技術容易在 未知的未知 上出意外
    • 將採用新技術當作消費創新代幣,限制你專案的代幣用量
    • 總成本 = 維護成本 - 加速的效益,一切還是求利大於弊
    • Boring tech is mature, not old
  • 一窩蜂驅動開發
    • 潮流未必可信
    • 投資報酬率,還是求 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

計算機結構

Functional

OAuth

Handle over Pointer

Async

Package Management

Backend API

演算法

紀錄片

  • 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 遲疑

Visual Programming

下雲

下美國雲

Database

歷史

工程

做預防性措施能見度不高

IDE

雜項

API