Skip to content

Instantly share code, notes, and snippets.

@matstani
Created December 28, 2017 01:11
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matstani/fa7fdd4417372c55ecdc5b0722a66163 to your computer and use it in GitHub Desktop.
Save matstani/fa7fdd4417372c55ecdc5b0722a66163 to your computer and use it in GitHub Desktop.
Clojureで業務システムを作ったメモ

Clojureを仕事で使った経験をメモしておきます。 2015年の冬に本番稼働したシステムのため、使用したライブラリ等については、必ずしも現在の流行に沿っていないと思います。

作ったもの

  • スタッフがウェブブラウザによりアクセスし、ログインして使用する業務システム
    • 商品管理、売上管理、支払管理etc..

規模

  • DBテーブル数80程度
  • 画面数200程度
  • コード行数40,000行程度

開発体制

  • 業務外でClojureの勉強をしていた筆者と、初めてClojureに触れる若手3名
  • 筆者がまずディレクトリ構成を決め、ログイン、DB検索、DB更新を含む小さな機能を作り、簡単な解説ドキュメントを作りました。メンバーにはそれを参考に類似の機能から担当してもらいました。

主な使用ライブラリ

  • Duct
    • REPL内でWebアプリケーションの起動・停止・リロードを行う枠組みとして利用
  • Stencil
    • テンプレートエンジン。mustacheのClojure実装
  • Honey SQL
    • SQLビルダー。Clojureのマップ、ベクタからSQLを生成します。DB接続の管理機能やO/Rマッパー的な機能はありません。(それがよい)
  • Validateur
    • バリデーションライブラリ。フォームバリデーションに利用。バリデーションエラーが、例外でなくエラーメッセージとして取得できることと、1つのフィールドが複数のルールに抵触した場合に、全てのエラーを検知できることから採用
  • buddy-auth
    • 認証・認可ライブラリ。ログイン認証に利用

結果

筆者以外のメンバーは、それまでに経験のある言語がほぼPHPとJavaScriptのみだったため、Lisp系の構文にも、JVM環境にも馴染みが無く、最初は大変だったようです。
既存のコードとドキュメントを眺めて雰囲気を掴み、最初のコミットがあるまで、1週間程度はかかりました。
Clojureに慣れたプロジェクトの中盤以降は、PHPと同等以上の開発スピードが出せていたと思います。
メンバーが活躍してくれたおかげで、概ねスケジュールどおりに開発完了し、本番稼働にいたりました。
稼働後しばらくはバタバタしたものの、一旦落ち着いてからは、大きな問題なく今日まで稼働継続中です。
社内のこれまでのプロジェクトと比較しても、品質は良いのではないかと思います。

反省点

メンバー開発環境のサポート不足

筆者のClojure開発環境がEmacs+inf-clojureであったため、メンバーにも勧めるべく、簡単な導入ドキュメントを用意したのですが、言語とエディタ両方に馴染みが無い状態から開発を始めるのはハードルが高かったようで、結局誰も使っていませんでした。
(1名Vim、1名ATOM、1名サクラエディタ)
Clojureでは、エディタの支援が得られるかどうかが快適性に大きく影響するため、Emacs以外のより馴染みやすい選択肢についてもサポートが必要だったと思います。

その後

この開発をとおして、Clojureの「イミュータブルなデータが基本であること」「if分岐やループを含むプログラムのほぼ全てが式であること」という特徴がプログラムの見通しを良くし、業務システムの開発においても非常に有効であることを確認できたのですが、社内に利点を十分にアピールすることができず、残念ながら、その後仕事でClojureを採用することはできていません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment