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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Kent OHASHI
January 24, 2025
Programming
0
110
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
Property-Based Testing with test.check and clojure.spec
lagenorhynque
0
25
🐬の推し本紹介2025: 『コーディングを支える技術 ――成り立ちから学ぶプログラミング作法』
lagenorhynque
0
82
KotlinでミニマルなResult実装による関数型エラーハンドリング
lagenorhynque
0
37
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
lagenorhynque
1
320
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
lagenorhynque
1
170
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
lagenorhynque
1
200
From Scala/Clojure to Kotlin
lagenorhynque
0
91
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
lagenorhynque
1
160
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
lagenorhynque
0
120
Other Decks in Programming
See All in Programming
RubyとGoでゼロから作る証券システム: 高信頼性が求められるシステムのコードの外側にある設計と運用のリアル
free_world21
0
210
Unity6.3 AudioUpdate
cova8bitdots
0
110
浮動小数の比較について
kishikawakatsumi
0
380
JPUG勉強会 OSSデータベースの内部構造を理解しよう
oga5
2
230
AI時代のソフトウェア開発でも「人が仕様を書く」から始めよう-医療IT現場での実践とこれから
koukimiura
0
130
Rubyと楽しいをつくる / Creating joy with Ruby
chobishiba
0
200
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
920
メタプログラミングで実現する「コードを仕様にする」仕組み/nikkei-tech-talk43
nikkei_engineer_recruiting
0
160
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
410
あなたはユーザーではない #PdENight
kajitack
4
300
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
520
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
380
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
9.7k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
230
The Mindset for Success: Future Career Progression
greggifford
PRO
0
270
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Odyssey Design
rkendrick25
PRO
2
530
A better future with KSS
kneath
240
18k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
The Cult of Friendly URLs
andyhume
79
6.8k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.4k
Being A Developer After 40
akosma
91
590k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
430
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