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
5
2.9k
Clojureという言語が私逹にもたらしたもの
Hackers Champloo 2018の資料
ayato
June 30, 2018
Tweet
Share
More Decks by ayato
See All by ayato
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
230
Re:REPL-Driven Development
ayato0211
3
1.2k
Meta Template Engine
ayato0211
2
1k
超変換! Hiccup data structure!!
ayato0211
2
550
About Integrant
ayato0211
0
490
Muscle Assert
ayato0211
0
210
Clojureを用いたWebアプリケーション開発
ayato0211
2
3k
翻訳にまつわるエトセトラ
ayato0211
6
1.2k
Ring Middleware の基礎
ayato0211
2
240
Other Decks in Programming
See All in Programming
リリース8年目のサービスの1800個のERBファイルをViewComponentに移行した方法とその結果
katty0324
2
2.8k
hotwire_or_react
harunatsujita
6
2.8k
推し活の ハイトラフィックに立ち向かう Railsとアーキテクチャ - Kaigi on Rails 2024
falcon8823
6
1.7k
生成 AI を活用した toitta 切片分類機能の裏側 / Inside toitta's AI-Based Factoid Clustering
pokutuna
0
530
WEBエンジニア向けAI活用入門
sutetotanuki
0
290
ピクシブ百科事典のWebフロントエンドパフォーマンス改善
higara
0
230
Vue3の一歩踏み込んだパフォーマンスチューニング2024
hal_spidernight
3
2.9k
From Subtype Polymorphism To Typeclass-based Ad hoc Polymorphism- An Example
philipschwarz
PRO
0
110
デプロイを任されたので、教わった通りにデプロイしたら障害になった件 ~俺のやらかしを越えてゆけ~
techouse
50
31k
Vue SFCのtemplateでTypeScriptの型を活用しよう
tsukkee
3
1.4k
Vitest Browser Mode への期待 / Vitest Browser Mode
odanado
PRO
2
1.6k
僕がつくった48個のWebサービス達
yusukebe
17
16k
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
272
40k
Navigating Team Friction
lara
183
14k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.6k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
Art, The Web, and Tiny UX
lynnandtonic
296
20k
GitHub's CSS Performance
jonrohan
1030
460k
Six Lessons from altMBA
skipperchong
26
3.4k
Into the Great Unknown - MozCon
thekraken
31
1.5k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.6k
Practical Orchestrator
shlominoach
186
10k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
5
140
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
3
360
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