Hackers Champloo 2018の資料
#hcmplClojureという言語が私達にもたらしたものあやぴー@Cybozu Startups, inc.Twitter: _ayato_pGitHub: ayato-pちょっと気になる
View Slide
#hcmplあやぴー•Cybozu Startups, inc.•Shibuya.lisp•Clojure/Emacs/筋トレ•沖縄"は修学旅行以来•ロイズ石垣島の塩チョコレートが好き
#hcmplこんなの書いてました✍️•中の人です
#hcmplサイボウズスタートアップス情報サービスをとおして世界の豊かな社会生活の実現に貢献する
#hcmplサイボウズスタートアップス•サイボウズさんの子会社ではない'•B向けのサービスをいくつか提供しています•安否確認サービス•kintone連携サービス•国内有数のClojure企業•Lisp Meetupの会場提供•Shibuya.lispなのに五反田
#hcmpl今日話すこと•Clojureの簡単な紹介•Clojureを使った開発の現場•フレームワークがないWebアプリ開発•REPL駆動開発•マイナー言語起用の裏話•Clojureを採用した理由•エンジニア採用の話
#hcmplClojureの紹介
#hcmplClojureとは•Lisp•関数プログラミングのための言語•確立されたプラットフォームと共存できる言語•並行処理のために設計された言語$MPKVSFࢲ͕ͭͬͨ͘ɻRich Hickey(@richhickey)
#hcmplClojureの読み方(inc 1) ;;=> 2(map inc '(1 2 3)) ;;=> (2 3 4)演算子(≒関数)
#hcmplClojureの読み方(inc 1) ;;=> 2(map inc '(1 2 3)) ;;=> (2 3 4)被演算子(=引数)
#hcmplClojureの読み方(inc 1) ;;=> 2(map inc '(1 2 3)) ;;=> (2 3 4)フォーム(≒式)
#hcmplClojureの読み方(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
#hcmplIUUQTDMPKVSFPSHBCPVUSBUJPOBMFObject Orientation is overrated
#hcmpl– Alan J. Perlis"It is better to have 100 functionsoperate on one data structurethan to have 10 functions operateon 10 data structures."
#hcmpl今日イチバン推したい特徴•データと関数が完全に分離されている•Clojureプログラムでは、データを関数で操作して、 目的のデータに変換していく•ほとんどのコレクション型はSequentialまたはAssociativeとして扱えるデータ関数 関数データ データ
#hcmplClojureを使った開発の現場
#hcmpl合言葉は…グッバイWAF!グッバイORM!
#hcmpl時代の選択IUUQTTQFBLFSEFDLDPNEBJLTZBORVBOOBQMBZGSBNFXPSLGBMTFCB[JZPOBUVQVGBMTFTIJGBOH
#hcmpl時代の選択IUUQTTQFBLFSEFDLDPNLLVCVOIPXUPTBGFMZVQHSBEFSBJMT
#hcmplフレームワークの問題•バージョンアップに苦労している•メジャーバージョンが変わる度に破壊的な変更が入る•どんな言語、どんなフレームワークにもある問題•どんなに優れたチームでもある程度苦労する•フレームワークから外れると途端につらくなる•実はフレームワークに依存しない方がよいのでは…?
#hcmplClojureにはWAFがない•正確に言えば、そういう試みはいくつか存在する•Duct, Arachne, etc...•いずれも決定打に欠けるという印象•Ringを中心としたライブラリの組み合わせが主流•ほとんどのライブラリはWebアプリケーションの ためだけのものではない•例えば、バリデーションライブラリはHTMLフォームと分離されている方がよい* WAF = WebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
#hcmplRing•RubyのRack, PythonのWSGIのようなもの•HTTPの詳細を隠蔽し、リクエストとレスポンスの情報をシンプルで統一された抽象化することが目的)551ϦΫΤετΛϚοϓʹม3JOHϋϯυϥʔؔリクエストレスポンスϚοϓΛ)551Ϩεϙϯεʹม
#hcmplRingハンドラー•いわゆるコントローラー•マップを受けてマップを返す"ただの関数"•アノテーションや暗黙的なルールなどが必要ない•明示的でシンプル、わかりやすい(defn handler [req]{:status 200 :headers {"Content-Type" "text/html"}:body "Hello, world"})
#hcmpl自分のコードライブラリの組み合わせ•ライブラリ選択、組み合わせの自由がある•フレームワークの場合、FWがシステムの起動/停止に責任を持つ•ライブラリの場合、自分のコードがシステムの起動/停止に責任を持つ自分のコードフレームワークライブラリ
#hcmplIUUQUPNBTQOFUCMPHMJCSBSZGSBNFXPSLT
#hcmplORMが流行らない土壌•デファクトなJDBCラッパーでは、問い合わせ結果としてマップのシーケンスが返却される•任意のテーブルに対応したクラスなどではなく、 ただのマップなので通常のデータと変わらない•Rich Hickeyがコミュニティに影響を与えている•Simplicity Matters, Effective Programs, etc•metabase/toucanなどの試みはある
#hcmplREPL駆動開発
#hcmplClojureのREPLぽいこと•実行中のプログラムに影響を与えることができる•プログラムを調査するのが簡単•ファイルに保存しないでプログラムを変更できる•エディタとREPLを統合することができる•ブラウザと接続することができる(ClojureScript)
#hcmpl編集保存実行, テストコンパイル一般的な言語 Clojure?
#hcmpl編集保存実行, テストコンパイル編集評価一般的な言語 Clojure
#hcmplREPL DEMO
#hcmplマイナー言語起用の裏話
#hcmpl小さな会社の生存戦略•↓良いサービス作りたい✨•↓優秀なエンジニアが必要✨•↓ブランドを構築しないといけない✨•技術マーケティングが必要なのでは!?
#hcmpl条件•採用面で競合が少ないこと•日本で一番になれる可能性があるテーマであること•すぐに廃れないこと(FWやライブラリで選択しない)•エンジニアが成長出来るテーマであること•テーマに対するチャレンジにワクワクできること•テーマにアンテナを張るエンジニアが優秀である場合が 多いこと•ニッチでも良い(大量の採用は考えてない)
#hcmpl選ばれたClojure•条件に当てはまっていた•社内にClojureに関する知見を持ったメンバーがいた•当たり前だけど使えそうかどうかというのもしっかり考慮されてます
#hcmpl採用できてる?
#hcmpl
#hcmpl成功…?•PHPエンジニアの採用に比べると応募はある•どうしても未経験が多いので難しい•育てる気があればわりとなんとかなる•興味を持ってくれる層は優秀そうな人が多い印象•母数は圧倒的に少ない、けど競合も少ない
#hcmplビジネス的には?
#hcmpl順調•この3年でふたつのシステムを開発•どちらも保守や機能開発がうまくいっている•今年は新しく開発を始めるシステムがある
#hcmplまとめ
#hcmplもたらされたもの•オブジェクト指向言語以外でのプログラミング•フレームワークに依存しないシステム•シンプルさの重要性•REPLによる素早いフィードバックループ•Clojureコミュニティとの関係•Rich Hickeyの考え方•採用面での優位性
#hcmplEnjoy Clojure