$30 off During Our Annual Pro Sale. View Details »

Clojureという言語が私逹にもたらしたもの

ayato
June 30, 2018

 Clojureという言語が私逹にもたらしたもの

Hackers Champloo 2018の資料

ayato

June 30, 2018
Tweet

More Decks by ayato

Other Decks in Programming

Transcript

  1. #hcmpl
    Clojureという言語が
    私達にもたらしたもの
    あやぴー@Cybozu Startups, inc.
    Twitter: _ayato_p
    GitHub: ayato-p
    ちょっと気になる

    View Slide

  2. #hcmpl
    あやぴー
    •Cybozu Startups, inc.
    •Shibuya.lisp
    •Clojure/Emacs/筋トレ
    •沖縄"は修学旅行以来
    •ロイズ石垣島の塩チョコレートが好き

    View Slide

  3. #hcmpl
    こんなの書いてました✍️
    •中の人です

    View Slide

  4. #hcmpl
    サイボウズスタートアップス
    情報サービスをとおして
    世界の豊かな社会生活の
    実現に貢献する

    View Slide

  5. #hcmpl
    サイボウズスタートアップス
    •サイボウズさんの子会社ではない'
    •B向けのサービスをいくつか提供しています
    •安否確認サービス
    •kintone連携サービス
    •国内有数のClojure企業
    •Lisp Meetupの会場提供
    •Shibuya.lispなのに五反田

    View Slide

  6. #hcmpl
    今日話すこと
    •Clojureの簡単な紹介
    •Clojureを使った開発の現場
    •フレームワークがないWebアプリ開発
    •REPL駆動開発
    •マイナー言語起用の裏話
    •Clojureを採用した理由
    •エンジニア採用の話

    View Slide

  7. #hcmpl
    Clojureの紹介

    View Slide

  8. #hcmpl
    Clojureとは
    •Lisp
    •関数プログラミングのための言語
    •確立されたプラットフォームと共存できる言語
    •並行処理のために設計された言語
    $MPKVSF͸ࢲ͕ͭͬͨ͘ɻ
    Rich Hickey(@richhickey)

    View Slide

  9. #hcmpl
    Clojureの読み方
    (inc 1) ;;=> 2
    (map inc '(1 2 3)) ;;=> (2 3 4)
    演算子(≒関数)

    View Slide

  10. #hcmpl
    Clojureの読み方
    (inc 1) ;;=> 2
    (map inc '(1 2 3)) ;;=> (2 3 4)
    被演算子(=引数)

    View Slide

  11. #hcmpl
    Clojureの読み方
    (inc 1) ;;=> 2
    (map inc '(1 2 3)) ;;=> (2 3 4)
    フォーム(≒式)

    View Slide

  12. #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}

    View Slide

  13. #hcmpl
    特徴
    •動的な開発 => REPL駆動開発
    •関数プログラミング => 第一級関数
    •Lisp => S式
    •実行時ポリモーフィズム => マルチメソッド
    •並行プログラミング => STM、イミュータブル
    •JVMにホストされた言語 => Java

    View Slide

  14. #hcmpl
    IUUQTDMPKVSFPSHBCPVUSBUJPOBMF
    Object Orientation

    is overrated

    View Slide

  15. #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."

    View Slide

  16. #hcmpl
    今日イチバン推したい特徴
    •データと関数が完全に分離されている
    •Clojureプログラムでは、データを関数で操作して、

    目的のデータに変換していく
    •ほとんどのコレクション型はSequentialまたは
    Associativeとして扱える
    データ
    関数 関数
    データ データ

    View Slide

  17. #hcmpl
    Clojureを使った
    開発の現場

    View Slide

  18. #hcmpl
    合言葉は…
    グッバイWAF!グッバイORM!

    View Slide

  19. #hcmpl
    時代の選択
    IUUQTTQFBLFSEFDLDPNEBJLTZBORVBOOBQMBZGSBNFXPSLGBMTFCB[JZPOBUVQVGBMTFTIJGBOH

    View Slide

  20. #hcmpl
    時代の選択
    IUUQTTQFBLFSEFDLDPNLLVCVOIPXUPTBGFMZVQHSBEFSBJMT

    View Slide

  21. #hcmpl
    フレームワークの問題
    •バージョンアップに苦労している
    •メジャーバージョンが変わる度に破壊的な変更が入る
    •どんな言語、どんなフレームワークにもある問題
    •どんなに優れたチームでもある程度苦労する
    •フレームワークから外れると途端につらくなる
    •実はフレームワークに依存しない方がよいのでは…?

    View Slide

  22. #hcmpl
    ClojureにはWAFがない
    •正確に言えば、そういう試みはいくつか存在する
    •Duct, Arachne, etc...
    •いずれも決定打に欠けるという印象
    •Ringを中心としたライブラリの組み合わせが主流
    •ほとんどのライブラリはWebアプリケーションの

    ためだけのものではない
    •例えば、バリデーションライブラリはHTML
    フォームと分離されている方がよい
    * WAF = WebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ

    View Slide

  23. #hcmpl
    Ring
    •RubyのRack, PythonのWSGIのようなもの
    •HTTPの詳細を隠蔽し、リクエストとレスポンスの情報を
    シンプルで統一された抽象化することが目的
    )551ϦΫΤετΛϚοϓʹม׵
    3JOH
    ϋϯυϥʔ
    ؔ਺

    リクエスト
    レスポンス
    ϚοϓΛ)551Ϩεϙϯεʹม׵

    View Slide

  24. #hcmpl
    Ringハンドラー
    •いわゆるコントローラー
    •マップを受けてマップを返す"ただの関数"
    •アノテーションや暗黙的なルールなどが必要ない
    •明示的でシンプル、わかりやすい
    (defn handler [req]
    {:status 200

    :headers {"Content-Type" "text/html"}
    :body "Hello, world"})

    View Slide

  25. #hcmpl
    自分のコード
    ライブラリの組み合わせ
    •ライブラリ選択、組み合わせの自由がある
    •フレームワークの場合、FWがシステムの起動/
    停止に責任を持つ
    •ライブラリの場合、自分のコードがシステムの
    起動/停止に責任を持つ
    自分のコード
    フレームワーク
    ライブラリ

    View Slide

  26. #hcmpl
    IUUQUPNBTQOFUCMPHMJCSBSZGSBNFXPSLT

    View Slide

  27. #hcmpl
    ORMが流行らない土壌
    •デファクトなJDBCラッパーでは、問い合わせ結果と
    してマップのシーケンスが返却される
    •任意のテーブルに対応したクラスなどではなく、

    ただのマップなので通常のデータと変わらない
    •Rich Hickeyがコミュニティに影響を与えている
    •Simplicity Matters, Effective Programs, etc
    •metabase/toucanなどの試みはある

    View Slide

  28. #hcmpl
    REPL駆動開発

    View Slide

  29. #hcmpl
    ClojureのREPLぽいこと
    •実行中のプログラムに影響を与えることができる
    •プログラムを調査するのが簡単
    •ファイルに保存しないでプログラムを変更できる
    •エディタとREPLを統合することができる
    •ブラウザと接続することができる(ClojureScript)

    View Slide

  30. #hcmpl
    編集
    保存
    実行,

    テスト
    コンパイル
    一般的な言語 Clojure

    View Slide

  31. #hcmpl
    編集
    保存
    実行,

    テスト
    コンパイル
    編集
    評価
    一般的な言語 Clojure

    View Slide

  32. #hcmpl
    REPL DEMO

    View Slide

  33. #hcmpl
    マイナー言語起用
    の裏話

    View Slide

  34. #hcmpl
    小さな会社の生存戦略
    •↓良いサービス作りたい✨
    •↓優秀なエンジニアが必要✨
    •↓ブランドを構築しないといけない✨
    •技術マーケティングが必要なのでは!?

    View Slide

  35. #hcmpl
    条件
    •採用面で競合が少ないこと
    •日本で一番になれる可能性があるテーマであること
    •すぐに廃れないこと(FWやライブラリで選択しない)
    •エンジニアが成長出来るテーマであること
    •テーマに対するチャレンジにワクワクできること
    •テーマにアンテナを張るエンジニアが優秀である場合が

    多いこと
    •ニッチでも良い(大量の採用は考えてない)

    View Slide

  36. #hcmpl
    選ばれたClojure
    •条件に当てはまっていた
    •社内にClojureに関する知見を持った
    メンバーがいた
    •当たり前だけど使えそうかどうかとい
    うのもしっかり考慮されてます

    View Slide

  37. #hcmpl
    採用できてる?

    View Slide

  38. #hcmpl

    View Slide

  39. #hcmpl
    成功…?
    •PHPエンジニアの採用に比べると応募はある
    •どうしても未経験が多いので難しい
    •育てる気があればわりとなんとかなる
    •興味を持ってくれる層は優秀そうな人が多い印象
    •母数は圧倒的に少ない、けど競合も少ない

    View Slide

  40. #hcmpl
    ビジネス的には?

    View Slide

  41. #hcmpl
    順調
    •この3年でふたつのシステムを開発
    •どちらも保守や機能開発がうまくいっている
    •今年は新しく開発を始めるシステムがある

    View Slide

  42. #hcmpl
    まとめ

    View Slide

  43. #hcmpl
    もたらされたもの
    •オブジェクト指向言語以外でのプログラミング
    •フレームワークに依存しないシステム
    •シンプルさの重要性
    •REPLによる素早いフィードバックループ
    •Clojureコミュニティとの関係
    •Rich Hickeyの考え方
    •採用面での優位性

    View Slide

  44. #hcmpl
    Enjoy Clojure

    View Slide