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
3k
Clojureという言語が私逹にもたらしたもの
Hackers Champloo 2018の資料
ayato
June 30, 2018
Tweet
Share
More Decks by ayato
See All by ayato
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
240
Re:REPL-Driven Development
ayato0211
3
1.3k
Meta Template Engine
ayato0211
2
1.1k
超変換! Hiccup data structure!!
ayato0211
2
580
About Integrant
ayato0211
0
530
Muscle Assert
ayato0211
0
250
Clojureを用いたWebアプリケーション開発
ayato0211
2
3.1k
翻訳にまつわるエトセトラ
ayato0211
6
1.2k
Ring Middleware の基礎
ayato0211
2
270
Other Decks in Programming
See All in Programming
UMAPをざっくりと理解 / Overview of UMAP
kaityo256
PRO
3
1.4k
個人開発の学生アプリが企業譲渡されるまで
akidon0000
2
1.1k
Instrumentsを使用した アプリのパフォーマンス向上方法
hinakko
0
230
Jakarta EE Meets AI
ivargrimstad
0
770
On-the-fly Suggestions of Rewriting Method Deprecations
ohbarye
1
4.7k
Dissecting and Reconstructing Ruby Syntactic Structures
ydah
3
2k
RubyKaigi Dev Meeting 2025
tenderlove
1
1.3k
エンジニア向けCursor勉強会 @ SmartHR
yukisnow1823
3
12k
ニーリーQAのこれまでとこれから
nealle
2
160
Road to RubyKaigi: Making Tinny Chiptunes with Ruby
makicamel
4
540
Beyond_the_Prompt__Evaluating__Testing__and_Securing_LLM_Applications.pdf
meteatamel
0
100
RuboCop: Modularity and AST Insights
koic
2
2.4k
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
Designing for humans not robots
tammielis
253
25k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
How to Think Like a Performance Engineer
csswizardry
23
1.6k
Code Reviewing Like a Champion
maltzj
523
40k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.4k
The World Runs on Bad Software
bkeepers
PRO
68
11k
Embracing the Ebb and Flow
colly
85
4.7k
KATA
mclloyd
29
14k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2k
For a Future-Friendly Web
brad_frost
177
9.7k
How GitHub (no longer) Works
holman
314
140k
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