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
0
100
TDD with RDD: Clojure/LispのREPLで変わる開発体験
テスト駆動開発(test-driven development)とREPL駆動開発(REPL-driven development)を組み合わせてより快適な開発フローを実現しよう!
Kent OHASHI
January 24, 2025
Tweet
Share
More Decks by Kent OHASHI
See All by Kent OHASHI
🐬の推し本紹介2025: 『コーディングを支える技術 ――成り立ちから学ぶプログラミング作法』
lagenorhynque
0
65
KotlinでミニマルなResult実装による関数型エラーハンドリング
lagenorhynque
0
24
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
lagenorhynque
1
200
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
lagenorhynque
1
140
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
lagenorhynque
1
170
From Scala/Clojure to Kotlin
lagenorhynque
0
79
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
lagenorhynque
1
140
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
lagenorhynque
0
100
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
lagenorhynque
0
100
Other Decks in Programming
See All in Programming
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
2k
AIエージェントの設計で注意するべきポイント6選
har1101
6
2.9k
Cap'n Webについて
yusukebe
0
160
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
160
Go コードベースの構成と AI コンテキスト定義
andpad
0
150
Basic Architectures
denyspoltorak
0
160
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
4
1.1k
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
160
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
180
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
7
4.2k
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
130
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
220
Featured
See All Featured
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
400
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Documentation Writing (for coders)
carmenintech
77
5.2k
The Language of Interfaces
destraynor
162
26k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Code Review Best Practice
trishagee
74
19k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
27
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
92
Leo the Paperboy
mayatellez
0
1.3k
Why Our Code Smells
bkeepers
PRO
340
58k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
58
41k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
1
220
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