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
Clojureという言語が私逹にもたらしたもの
Search
ayato
June 30, 2018
Programming
6
3.1k
Clojureという言語が私逹にもたらしたもの
Hackers Champloo 2018の資料
ayato
June 30, 2018
Tweet
Share
More Decks by ayato
See All by ayato
マイクロサービス内で動くAPIをF#で書いている
ayato0211
1
960
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
270
Re:REPL-Driven Development
ayato0211
3
1.3k
Meta Template Engine
ayato0211
2
1.1k
超変換! Hiccup data structure!!
ayato0211
2
620
About Integrant
ayato0211
0
570
Muscle Assert
ayato0211
0
280
Clojureを用いたWebアプリケーション開発
ayato0211
2
3.2k
翻訳にまつわるエトセトラ
ayato0211
6
1.2k
Other Decks in Programming
See All in Programming
開発生産性が組織文化になるまでの軌跡
tonegawa07
0
160
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
1.6k
アーキテクチャと考える迷子にならない開発者テスト
irof
8
2.9k
MCPサーバー「モディフィウス」で変更容易性の向上をスケールする / modifius
minodriven
8
1.5k
モデル駆動設計をやってみよう Modeling Forum2025ワークショップ/Let’s Try Model-Driven Design
haru860
0
150
オフライン対応!Flutterアプリに全文検索エンジンを実装する @FlutterKaigi2025
itsmedreamwalker
2
210
JJUG CCC 2025 Fall: Virtual Thread Deep Dive
ternbusty
3
410
AIエージェントでのJava開発がはかどるMCPをAIを使って開発してみた / java mcp for jjug
kishida
4
640
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
150
Chart.jsで長い項目を表示するときのハマりどころ
yumechi
0
110
Flutterアプリ運用の現場で役立った監視Tips 5選
ostk0069
1
450
GraalVM Native Image トラブルシューティング機能の最新状況(2025年版)
ntt_dsol_java
0
140
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
GitHub's CSS Performance
jonrohan
1032
470k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Producing Creativity
orderedlist
PRO
348
40k
Automating Front-end Workflow
addyosmani
1371
200k
Typedesign – Prime Four
hannesfritz
42
2.9k
Mobile First: as difficult as doing things right
swwweet
225
10k
GraphQLとの向き合い方2022年版
quramy
49
14k
Bash Introduction
62gerente
615
210k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Transcript
#hcmpl Clojureという言語が 私達にもたらしたもの あやぴー@Cybozu Startups, inc. Twitter: _ayato_p GitHub: ayato-p
ちょっと気になる
#hcmpl あやぴー •Cybozu Startups, inc. •Shibuya.lisp •Clojure/Emacs/筋トレ •沖縄"は修学旅行以来 •ロイズ石垣島の塩チョコレートが好き
#hcmpl こんなの書いてました✍️ •中の人です
#hcmpl サイボウズスタートアップス 情報サービスをとおして 世界の豊かな社会生活の 実現に貢献する
#hcmpl サイボウズスタートアップス •サイボウズさんの子会社ではない' •B向けのサービスをいくつか提供しています •安否確認サービス •kintone連携サービス •国内有数のClojure企業 •Lisp Meetupの会場提供 •Shibuya.lispなのに五反田
#hcmpl 今日話すこと •Clojureの簡単な紹介 •Clojureを使った開発の現場 •フレームワークがないWebアプリ開発 •REPL駆動開発 •マイナー言語起用の裏話 •Clojureを採用した理由 •エンジニア採用の話
#hcmpl Clojureの紹介
#hcmpl Clojureとは •Lisp •関数プログラミングのための言語 •確立されたプラットフォームと共存できる言語 •並行処理のために設計された言語 $MPKVSFࢲ͕ͭͬͨ͘ɻ Rich Hickey(@richhickey)
#hcmpl Clojureの読み方 (inc 1) ;;=> 2 (map inc '(1 2
3)) ;;=> (2 3 4) 演算子(≒関数)
#hcmpl Clojureの読み方 (inc 1) ;;=> 2 (map inc '(1 2
3)) ;;=> (2 3 4) 被演算子(=引数)
#hcmpl Clojureの読み方 (inc 1) ;;=> 2 (map inc '(1 2
3)) ;;=> (2 3 4) フォーム(≒式)
#hcmpl Clojureの読み方 (defn rename-keys [map kmap] (reduce (fn [m [old
new]] (if (contains? map old) (assoc m new (get map old)) m)) (apply dissoc map (keys kmap)) kmap)) (rename-keys {:foo 1} {:foo :bar}) ;;=> {:bar 1}
#hcmpl 特徴 •動的な開発 => REPL駆動開発 •関数プログラミング => 第一級関数 •Lisp =>
S式 •実行時ポリモーフィズム => マルチメソッド •並行プログラミング => STM、イミュータブル •JVMにホストされた言語 => Java
#hcmpl IUUQTDMPKVSFPSHBCPVUSBUJPOBMF Object Orientation is overrated
#hcmpl – Alan J. Perlis "It is better to have
100 functions operate on one data structure than to have 10 functions operate on 10 data structures."
#hcmpl 今日イチバン推したい特徴 •データと関数が完全に分離されている •Clojureプログラムでは、データを関数で操作して、 目的のデータに変換していく •ほとんどのコレクション型はSequentialまたは Associativeとして扱える データ 関数 関数
データ データ
#hcmpl Clojureを使った 開発の現場
#hcmpl 合言葉は… グッバイWAF!グッバイORM!
#hcmpl 時代の選択 IUUQTTQFBLFSEFDLDPNEBJLTZBORVBOOBQMBZGSBNFXPSLGBMTFCB[JZPOBUVQVGBMTFTIJGBOH
#hcmpl 時代の選択 IUUQTTQFBLFSEFDLDPNLLVCVOIPXUPTBGFMZVQHSBEFSBJMT
#hcmpl フレームワークの問題 •バージョンアップに苦労している •メジャーバージョンが変わる度に破壊的な変更が入る •どんな言語、どんなフレームワークにもある問題 •どんなに優れたチームでもある程度苦労する •フレームワークから外れると途端につらくなる •実はフレームワークに依存しない方がよいのでは…?
#hcmpl ClojureにはWAFがない •正確に言えば、そういう試みはいくつか存在する •Duct, Arachne, etc... •いずれも決定打に欠けるという印象 •Ringを中心としたライブラリの組み合わせが主流 •ほとんどのライブラリはWebアプリケーションの ためだけのものではない
•例えば、バリデーションライブラリはHTML フォームと分離されている方がよい * WAF = WebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
#hcmpl Ring •RubyのRack, PythonのWSGIのようなもの •HTTPの詳細を隠蔽し、リクエストとレスポンスの情報を シンプルで統一された抽象化することが目的 )551ϦΫΤετΛϚοϓʹม 3JOH ϋϯυϥʔ ؔ
リクエスト レスポンス ϚοϓΛ)551Ϩεϙϯεʹม
#hcmpl Ringハンドラー •いわゆるコントローラー •マップを受けてマップを返す"ただの関数" •アノテーションや暗黙的なルールなどが必要ない •明示的でシンプル、わかりやすい (defn handler [req] {:status
200 :headers {"Content-Type" "text/html"} :body "Hello, world"})
#hcmpl 自分のコード ライブラリの組み合わせ •ライブラリ選択、組み合わせの自由がある •フレームワークの場合、FWがシステムの起動/ 停止に責任を持つ •ライブラリの場合、自分のコードがシステムの 起動/停止に責任を持つ 自分のコード フレームワーク
ライブラリ
#hcmpl IUUQUPNBTQOFUCMPHMJCSBSZGSBNFXPSLT
#hcmpl ORMが流行らない土壌 •デファクトなJDBCラッパーでは、問い合わせ結果と してマップのシーケンスが返却される •任意のテーブルに対応したクラスなどではなく、 ただのマップなので通常のデータと変わらない •Rich Hickeyがコミュニティに影響を与えている •Simplicity Matters,
Effective Programs, etc •metabase/toucanなどの試みはある
#hcmpl REPL駆動開発
#hcmpl ClojureのREPLぽいこと •実行中のプログラムに影響を与えることができる •プログラムを調査するのが簡単 •ファイルに保存しないでプログラムを変更できる •エディタとREPLを統合することができる •ブラウザと接続することができる(ClojureScript)
#hcmpl 編集 保存 実行, テスト コンパイル 一般的な言語 Clojure ?
#hcmpl 編集 保存 実行, テスト コンパイル 編集 評価 一般的な言語 Clojure
#hcmpl REPL DEMO
#hcmpl マイナー言語起用 の裏話
#hcmpl 小さな会社の生存戦略 •↓良いサービス作りたい✨ •↓優秀なエンジニアが必要✨ •↓ブランドを構築しないといけない✨ •技術マーケティングが必要なのでは!?
#hcmpl 条件 •採用面で競合が少ないこと •日本で一番になれる可能性があるテーマであること •すぐに廃れないこと(FWやライブラリで選択しない) •エンジニアが成長出来るテーマであること •テーマに対するチャレンジにワクワクできること •テーマにアンテナを張るエンジニアが優秀である場合が 多いこと •ニッチでも良い(大量の採用は考えてない)
#hcmpl 選ばれたClojure •条件に当てはまっていた •社内にClojureに関する知見を持った メンバーがいた •当たり前だけど使えそうかどうかとい うのもしっかり考慮されてます
#hcmpl 採用できてる?
#hcmpl
#hcmpl 成功…? •PHPエンジニアの採用に比べると応募はある •どうしても未経験が多いので難しい •育てる気があればわりとなんとかなる •興味を持ってくれる層は優秀そうな人が多い印象 •母数は圧倒的に少ない、けど競合も少ない
#hcmpl ビジネス的には?
#hcmpl 順調 •この3年でふたつのシステムを開発 •どちらも保守や機能開発がうまくいっている •今年は新しく開発を始めるシステムがある
#hcmpl まとめ
#hcmpl もたらされたもの •オブジェクト指向言語以外でのプログラミング •フレームワークに依存しないシステム •シンプルさの重要性 •REPLによる素早いフィードバックループ •Clojureコミュニティとの関係 •Rich Hickeyの考え方 •採用面での優位性
#hcmpl Enjoy Clojure