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
130
0
Share
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
10
Property-Based Testing with test.check and clojure.spec
lagenorhynque
0
46
🐬の推し本紹介2025: 『コーディングを支える技術 ――成り立ちから学ぶプログラミング作法』
lagenorhynque
0
100
KotlinでミニマルなResult実装による関数型エラーハンドリング
lagenorhynque
0
57
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
lagenorhynque
1
400
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
lagenorhynque
1
230
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
lagenorhynque
1
260
From Scala/Clojure to Kotlin
lagenorhynque
0
110
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
lagenorhynque
1
170
Other Decks in Programming
See All in Programming
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
410
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
3
1.8k
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
1.3k
Oxlintのカスタムルールの現況
syumai
5
910
TypeSpec で繋ぐ複数プロダクトの型安全
maroon8021
1
270
関係性から理解する"同一性"の型用語たち
pvcresin
2
620
Migrations : C'est une question d'hygiène !
vinceamstoutz
0
2.5k
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
540
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.8k
ビジネスモデルから紐解く、AI+型駆動開発
hirokiomote
2
4.6k
iOS26時代の新規アプリ開発
yuukiw00w
0
220
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
1.4k
Featured
See All Featured
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
590
The Spectacular Lies of Maps
axbom
PRO
1
770
How GitHub (no longer) Works
holman
316
150k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
370
Design in an AI World
tapps
1
220
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Color Theory Basics | Prateek | Gurzu
gurzu
0
320
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
820
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
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