Clojureを用いたWebアプリケーション開発
by
ayato
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
#ccc_m2 Clojureを用いた Webアプリケーション開発 普通のベンチャー企業編 2016.12.03 JJUG CCC 2016 Fall @_ayato_p ָ͍͠
Slide 2
Slide 2 text
#ccc_m2 (keyword "括弧 is ")
Slide 3
Slide 3 text
#ccc_m2 あやぴー •サイボウズスタートアップス株式会社 •一般的なClojureエンジニア •好きなもの: 前置記法、Emacs、SKK •得意料理: 唐揚げ、さばの味噌煮 •好きなwebサービス: 白ごはん.com •好きな料理研究家: 冨田ただすけ _ayato_p ayato-p
Slide 4
Slide 4 text
#ccc_m2 •Clojureの日本語ガイド •clojure.orgの翻訳(手伝い) こんなの書いてる人
Slide 5
Slide 5 text
#ccc_m2 サイボウズスタートアップス •社員数20名以下 •安否確認サービス、kintone連携サービスの提供 •(今までは)全部PHPで作られたシステム •よくある普通(?)のベンチャー企業
Slide 6
Slide 6 text
#ccc_m2 サイボウズスタートアップス 情報サービスをとおして、 世界の豊かな社会生活の 実現に貢献する
Slide 7
Slide 7 text
#ccc_m2 もくじ 1. 普通のベンチャー企業が何故Clojureを選んだのか 2. 安否確認サービスについて 3. Clojureを採用して良かったところ 4. Clojureを採用して苦労したこと 5. まとめ
Slide 8
Slide 8 text
#ccc_m2 普通のベンチャー企業が 何故Clojureを選んだのか (CTOに聞いてみた%)
Slide 9
Slide 9 text
#ccc_m2 背景 (何故、新しい言語?) ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠
Slide 10
Slide 10 text
#ccc_m2 背景 (何故、新しい言語??) ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠
Slide 11
Slide 11 text
#ccc_m2 背景 (何故、新しい言語???) ϒϥϯυͷߏங͕ඞཁ ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠
Slide 12
Slide 12 text
#ccc_m2 背景 (何故、新しい言語????) ٕज़ϚʔέςΟϯάͷඞཁੑ ϒϥϯυͷߏங͕ඞཁ ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠
Slide 13
Slide 13 text
#ccc_m2 条件 •すぐに廃れないこと(FWやライブラリで選択しない) •エンジニアが成長出来るテーマであること •テーマに対するチャレンジにワクワクできること •テーマにアンテナを張るエンジニアが優秀である場合が 多いこと •ニッチでも良い(大量の採用は考えてない) •採用面で競合が少ないこと •日本で一番になれる可能性があるテーマであること
Slide 14
Slide 14 text
#ccc_m2 選ばれたのはClojureでした •条件に当てはまっていた •社内にClojureに関する知見を持ったメンバーがいた •当たり前だけど使えそうかどうかというのも しっかり考慮されてます
Slide 15
Slide 15 text
#ccc_m2 安否確認サービス⛑ について
Slide 16
Slide 16 text
#ccc_m2 気象庁
Slide 17
Slide 17 text
#ccc_m2 •大災害を想定した堅牢なシステム構成 •気象庁の地震速報と連動 •地域/部署別の安否状況が確認できる •全社員または個別に対策支持が出せる •パケット通信による通信 •フィーチャーフォンやスマホからでも操作できる •安否確認システム
Slide 18
Slide 18 text
#ccc_m2 言い換えると… •企業向けのシステム •緊急時に高い可用性が求められている •外部サービスと連携している •モバイルアプリと連携している •レガシーブラウザやフィーチャーフォンをサポート
Slide 19
Slide 19 text
#ccc_m2 言い換えると… •企業向けのシステム •緊急時に高い可用性が求められている •外部サービスと連携している •モバイルアプリと連携している •レガシーブラウザやフィーチャーフォンをサポート どちらかと言えば 堅いサービス
Slide 20
Slide 20 text
#ccc_m2 Clojureでリプレース♻ •規模の大きいクライアントが増えてきた •根幹からの作り直し •2015年の初夏くらいから1.5人くらいで開発がスタート • 現在3人で開発中 •2016年12月中旬リリース予定!!
Slide 21
Slide 21 text
#ccc_m2 プロジェクト構成 •lein-modulesでマルチモジュールプロジェクト構成 anpi ├── lib // アプリ共通ライブラリ ├── db // データベース接続用のライブラリ ├── ymir // Quenoteクライアントライブラリ ├── web // メインのアプリ ├── worker // 非同期処理用アプリ ├── admin // 管理画面用アプリ └── project.clj
Slide 22
Slide 22 text
#ccc_m2 利用しているライブラリ •サーバー: Immutant Web •ルーティング: bidi •テンプレートエンジン: Enlive •SQLビルダー: stch.sql, HugSQL •ライフサイクル, DI: Component •フロントエンド: Reagent, re-frame •テスト: Midje, kerodon, clojure.test •ユーティリティ: Plumbing, Medley
Slide 23
Slide 23 text
#ccc_m2 Componentベース
Slide 24
Slide 24 text
#ccc_m2 ネームスペース間の依存
Slide 25
Slide 25 text
#ccc_m2 規模感 •総ファイル数: 650超 •総コード行数: 50000超 •含まれているライブラリの数: 400弱 •テーブルの数: 123 •uberjarのサイズ: 153MB •JavaScriptのサイズ: 852KB
Slide 26
Slide 26 text
#ccc_m2 インフラ概要
Slide 27
Slide 27 text
#ccc_m2 Clojureを採用して 良かったところ☀
Slide 28
Slide 28 text
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
Slide 29
Slide 29 text
#ccc_m2 シンプルさ https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html VS ?
Slide 30
Slide 30 text
#ccc_m2 シンプルさ https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html VS ()
Slide 31
Slide 31 text
#ccc_m2 https://www.youtube.com/watch?v=rI8tNMsozo0 Rails Conf 2012 Keynote: Simplicity Matters by Rich Hickey
Slide 32
Slide 32 text
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
Slide 33
Slide 33 text
#ccc_m2 不変性 •オブジェクトは不変(一部の参照型を除く) •関数を呼び出して引数を変更される恐れがない user> (def m {:username "ayato-p" :age "25"}) #'user/m user> (update m :age inc) {:age 26, :username "ayato-p"} user> m {:age 25, :username "ayato-p"}
Slide 34
Slide 34 text
#ccc_m2 σϑΥϧτͰϛϡʔλϒϧͳͷ ૣ͗͢Δ࠷దԽͩɻ Luminus作者 Dmitri Sotnikov(@yogthos) https://twitter.com/yogthos/status/688250762334343170
Slide 35
Slide 35 text
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
Slide 36
Slide 36 text
#ccc_m2 Java資産の活用 •Clojureで記述されたライブラリがなくても Javaのライブラリが使えるという安心感 •Clojureを書くように自然にJavaを呼び出せる
Slide 37
Slide 37 text
#ccc_m2 (import [com.orangesignal.csv Csv]) (defprotocol CsvLoader (load [this])) (extend-protocol CsvLoader com.orangesignal.csv.CsvReader (load [csv-reader] (->> (Csv/load csv-reader (str-ary-handler)) (map vec))))
Slide 38
Slide 38 text
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
Slide 39
Slide 39 text
#ccc_m2 Server/Clientを同一言語で •コンテキストスイッチがなくなる •プラットフォームに依存するようなコードがあっても 共通化できる •ReaderConditionals since Clojure 1.7 •Transit formatで流れるようにデータの受け渡し (defn str->int [s] #?(:clj (java.lang.Integer/parseInt s) :cljs (js/parseInt s)))
Slide 40
Slide 40 text
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
Slide 41
Slide 41 text
#ccc_m2 拡張性の高さ •ライブラリに拡張ポイントが残されている •clojure.java.jdbcなど •Protocols / Multimethods •既存のJavaクラスも拡張できる
Slide 42
Slide 42 text
#ccc_m2 (require [clojure.java.jdbc :as jdbc]) (import org.postgresql.jdbc4.Jdbc4Array org.postgresql.util.PGobject) (extend-protocol jdbc/IResultSetReadColumn Jdbc4Array (result-set-read-column [val rsmeta idx] (sequence (.getArray val))) PGobject (result-set-read-column [val rsmeta idx] (parse-pgobject val)))
Slide 43
Slide 43 text
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
Slide 44
Slide 44 text
#ccc_m2 高い後方互換性 •バージョンを上げても、ほとんど影響がない •Clojure 1.3で動けばだいたい動くはず •関数の名前が衝突することは稀にある •古いライブラリでもたいてい問題なく動作する
Slide 45
Slide 45 text
#ccc_m2 ݹͷϓϩδΣΫτͷϝδϟʔϦϏ δϣϯΛ্ͭ͛ͯյΕͳ͔ͬ ͨΑɻ$MPKVSFޓੑΛେࣄʹ ͨ͠ઃܭ͔ͩΒͶɻ Cognitectの偉い人 Stuart Halloway(@stuarthalloway) https://twitter.com/stuarthalloway/status/793614590781390852
Slide 46
Slide 46 text
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
Slide 47
Slide 47 text
#ccc_m2 組み合わせの容易性 •少ないデータ型に対して大量の関数がある •個々のライブラリは独立している •特定のフレームワークを前提に設計されていない
Slide 48
Slide 48 text
#ccc_m2 http://tomasp.net/blog/2015/library-frameworks/
Slide 49
Slide 49 text
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability and more
Slide 50
Slide 50 text
#ccc_m2 •覚えることが少ないのにパワフル •単純なマップやベクタを渡せばいいのでテストが容易 •Nil PunningによってNPEをある程度回避できる •REPLがあるので小さい粒度で確認ができる •マクロを適切に使えば一定の処理を一般化できる •Transducersを使うことで計算量が減らせることがある •Checkout Dependencyによってライブラリを同時開発可 •Emacsを使うことに大義名分がある
Slide 51
Slide 51 text
#ccc_m2 Clojureを利用していて 苦労したこと
Slide 52
Slide 52 text
#ccc_m2 •大きなアプリの作り方が分からなかった •フレームワークがなかった •スタックトレースが難しかった •Jar地獄に陥った •なんだかんだでJavaの知識が欲しくなる •日本のコミュニティが小さかった •日本語の情報が少なかった
Slide 53
Slide 53 text
#ccc_m2 まとめ
Slide 54
Slide 54 text
#ccc_m2 •Clojureを選んだのは良いサービスを作るため •弊社はStuart Sierra's Componentベースで 開発している •シンプルさは選ばないと手に入らない •WAFやORMを使わない(使えない)のは良い面も 悪い面もある •Clojureを使ってもWebアプリは作れる