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アプリは作れる