Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TDD with RDD: Clojure/LispのREPLで変わる開発体験
Search
Kent OHASHI
January 24, 2025
Programming
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TDD with RDD: Clojure/LispのREPLで変わる開発体験
テスト駆動開発(test-driven development)とREPL駆動開発(REPL-driven development)を組み合わせてより快適な開発フローを実現しよう!
Kent OHASHI
January 24, 2025
More Decks by Kent OHASHI
See All by Kent OHASHI
"Simple Made Easy" Made Easier: Clojureに学ぶsimplicity
lagenorhynque
0
14
Property-Based Testing with test.check and clojure.spec
lagenorhynque
0
51
🐬の推し本紹介2025: 『コーディングを支える技術 ――成り立ちから学ぶプログラミング作法』
lagenorhynque
0
110
KotlinでミニマルなResult実装による関数型エラーハンドリング
lagenorhynque
0
64
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
lagenorhynque
1
410
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
lagenorhynque
1
250
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
lagenorhynque
1
270
From Scala/Clojure to Kotlin
lagenorhynque
0
120
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
lagenorhynque
1
180
Other Decks in Programming
See All in Programming
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
790
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
590
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
190
Oxcを導入して開発体験が向上した話
yug1224
4
320
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
250
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
550
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
200
Creating Composable Callables in Contemporary C++
rollbear
0
150
スマートグラスで並列バイブコーディング
hyshu
0
150
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
260
New "Type" system on PicoRuby
pocke
1
970
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
270
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.5k
Unsuck your backbone
ammeep
672
58k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
180
Writing Fast Ruby
sferik
630
63k
A Tale of Four Properties
chriscoyier
163
24k
Paper Plane (Part 1)
katiecoart
PRO
0
9.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
First, design no harm
axbom
PRO
2
1.2k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
160
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
390
Faster Mobile Websites
deanohume
310
31k
Transcript
TDD with RDD Clojure/Lisp のREPL で変わる開発体験 #NextbeatTechBar 1
のシニアエンジニア スタートアップの起業家と投資家のための業務効 率化/ 連携プラットフォームを開発している 主要技術スタック: & TypeScript の運営企業 , などの関数型言語と関数型プログ
ラミングの実践が好き Java, , Clojure, Kotlin とJVM 言語での開発実務 に長く取り組んできた lagénorhynque 🐬カマイルカ 株式会社スマートラウンド Kotlin Server-Side Kotlin Meetup Clojure Haskell Scala 2
Clojure でRDD とTDD のハイブリッドな開発スタイル を実践しよう 3
1. TDD とRDD 2. TDD with RDD 3. Clojure での実践例
4
1. TDD とRDD 5
[IMO] プログラミングで体感的に大きな割合を占める 対話的プロセス 言語 対話の相手 ( 高度な型システムを持つ) 静的 型付き言語 コンパイラ
( 高度なREPL 開発環境と動的性質 を持つ) Lisp 系言語 REPL その他の多くの言語 ユニットテスト or/and ( ログ付 きの実行を含む) デバッガー 6
対話の延長上にある3 種類の開発スタイル コンパイラとの対話 → 型駆動開発(type-driven development) REPL との対話 → REPL
駆動開発(REPL-driven development, RDD) ユニットテストとの対話 → テスト駆動開発(test- driven development, TDD) 7
試行錯誤の探索的なプロセス ツールに助けられたり惑わされたりしながら進む 高速で高頻度なフィードバックループ 反応を見て、書き換えて、反応を見る繰り返し 設計の漸進的改善の機会でもある ユニットテストによるフィードバックと一定の動作 保証は高度なコンパイラやREPL を補完しうる 複数を組み合わせて実践しよう💡 8
2. TDD with RDD 9
テスト駆動開発(TDD) 0. 満たすべき仕様を整理する 1. 🟥 Red: 仕様に対応するテストコードを書いて( 想定 通り) テストをパスしないことを確かめる
2. 🟩 Green: テストをパスする最小限の実装を与えて テストをパスすることを確かめる 3. 🟦 Refactor: 内部実装( コード設計) を改善して引き 続きテストをパスすることを確かめる → 再び1. へ 10
コードを読み取り、評価し、出力する繰り返し REPL (read-eval-print loop) ;; [Clojure] REPL 内で素朴なrepl 関数を定義し実行してみる user=>
(defn repl [] (loop [] (-> (read) ; 入力の読み取り (eval) ; 評価 (prn)) ; 出力 (recur))) ; 再帰(= ループ) #'user/repl ; 関数定義式の評価結果 user=> (repl) (+ 1 2) ; 入力 3 ; 出力 (map inc [1 2 3]) ; 入力 (2 3 4) ; 出力 11
REPL 駆動開発(RDD) 1. ✍️ Write: 小さなコード( 任意の式) を書く 2. 🔍
Eval: 式を評価し結果を確かめる → 再び 1. へ 12
TDD with RDD 1. ✍🔍️ テスト対象の式を書いて評価する 2. ✍🔍 テスト用の式を書いて評価し結果を確かめる 🟥
意図通りでない → 再び 1. へ 🟩 意図通り → ( 適宜) テストケースに記録する 3. 🟦 内部実装を改善して評価結果が意図通りである (or テストをパスする) ことを確かめる → 再び 1. へ 13
3. Clojure での実践例 14
事前準備: プロダクトコード用ファイル (ns clj-tdd-with-rdd.core) ; 名前空間( モジュール) の宣言 (defn fizzbuzz
[n]) ; 関数の定義( ※ボディはまだ空) 15
事前準備: テストコード用ファイル (ns clj-tdd-with-rdd.core-test (:require [clj-tdd-with-rdd.core :as sut] ; テスト対象
[clojure.test :as t])) ; 標準のテストライブラリ (t/deftest test-fizzbuzz ; テスト関数の定義 (t/testing "3 の倍数ならFizz") ; テストケースの説明 (t/testing "5 の倍数ならBuzz") (t/testing "3 の倍数かつ5 の倍数ならFizz Buzz") (t/testing "3 の倍数でも5 の倍数でもなければ整数の文字列")) 16
エディタでファイルを開き、REPL に接続する 17
関数の定義と適用の式を評価してみる 18
関数定義を書き換えてそれぞれ評価してみる 19
テストケースに書き換えて評価してみる 20
類似のケースを追加してテスト全体を実行してみる 21
さらに続けて…… 22
プロダクトコードとテストコードを書き上げた 23
リファクタしてみた 24
リファクタリング後もテストをパスする😌 25
リッチなREPL は探索的な開発フローを加速する♾️ Lisp 系言語のREPL はいいぞ😈 ( 他言語でも同じような開発体験がしたい) 26
Further Reading cf. Clojure/ClojureScript 関連リンク集 > REPL 駆動開 発 『テスト駆動開発』
Type-Driven Development with Idris Idris: A Language for Type-Driven Development 型駆動開発|プログラング言語Idris に入門させた い(v0.9 ) 27