三回目の記事を担当させて頂くことになった2016年度新卒のYMとYYです。
今回は、社内で企画から作成・運用をしている書籍管理のwebアプリ「Liber(リベル)」をご紹介します。
初めに
この「Liber」ですが、新卒メンバーの2名だけで企画から運用フェーズに入るまで全ての作業を行ったものとなっています。
Liberができる前はスプレッドシートで管理をしていました。しかしもっと改善していきたいという意見が多く、それなら研修の一環として制作しようとなり題材として選ばれました。
候補は幾つかあったのですが、OJT担当の先輩エンジニアと相談し、規模やレベルを踏まえての選出です。
ただ研修なので、好き勝手作れるというわけではなく課題や条件は出されました。 その条件は下記のようなものです。
制作期間:2ヶ月弱 サーバー:AWS(EC2使用) 使用言語:Ruby フレームワーク:Ruby on Rails 使用DB:PostgreSQL 課題:Dockerを使用、最低限動くものまで作り上げる
新卒だけでやるには難しそうに見えますが、実際に難しかったです。
当初実装したいと考えていた機能をどれくらい見送ったことか……ですが、先輩エンジニア方もフォローや質問などには快く答えてくれるので、プロジェクトが破綻するということはなかったです。ここについては、感謝してもしきれないです……。
Liber(リベル)について
始めに 「Liber」の実装にあたっての環境と機能について説明したいと思います。
詳細な構築環境
「Liber」はDockerを使って環境を構築しています。
構成としましてはdocker-composeを利用して以下の4つのコンテナを立ち上げています。
アプリケーションコンテナ:Rails5.0.0.1+Ruby 2.3.1 サーバーコンテナ :Nginx1.11.5 データベースコンテナ:Postgres9.6.0 データコンテナ:BusyBox
アプリの機能
システム開発部のメンバー10人程で利用しており、社内にある100冊以上の技術書が登録されています。 イメージとしては図書館などのDBでしょうか。
現在は以下のような機能を実装しています。
- ユーザー管理などは Google ログインを実装
- ユーザーはログインを行った後に各自、書籍を登録と貸出、返却を行える
- 書籍の検索や予約
- 書籍に対して評価やコメントを残せる
時間の都合で研修ではできませんでしたが、他にも以下のような実装を計画をしていました。
- 外部のapiを利用して書籍情報取得を自動化する
- 通知機能の強化
- レイアウトの調整
- アプリ側での管理機能の強化
実際のスクリーンショットがこちら。
貸し出しボタンから書籍を借りることができます。
研修にあたっての苦労
ここからは、プロジェクトを進行している上で出た苦労話をYMからご紹介したいと思います!
DBの設計について
まずはじめに取り掛かったのはデータを管理するためには必須となるデータベースの設計です。データベースの設計には最初から最後まで苦戦することになりました。
カラムやテーブルの名称、Null制約や一意制約、テーブル同士の連携など今まで触れてくることが限りなく少なかった部分のため、悩むことが多かったです。
最初の段階では、命名規則を明確にしたり、他社のアプリ参考に
必要なカラムを想定、洗い出しをして設計を行いました。
しかし機能を実装しているとあれが足りない、設定が間違っているなど多くの問題がありました。
一意制約やNULL制約は何度変更を行ったことか……この時に「DBの設計は難しい」ということを痛感しました。
サーバーの用意
DBの設計がある程度進んできた段階でサーバーの用意も行いました。ウェイブではAWS上に用意するのが主流になっているため、研修ではAWSのEC2を使用しました。
サーバーの立ち上げだけなら比較的すぐに行えるAWSですが、
大変だったところは、セキュリティの設定やAWS内の機能を使用する部分でした。
AWSは様々な要件に対応しており、社内ではAWSをうまく活用できないかと調査や試験導入を積極的に行っており
「Liber」ではDockerとの連携や、elastic beanstalkなどのAWS上の機能を活用し、自動デプロイの環境を構築できないか挑戦してみると言うこととなりました。
自動デプロイなど行えるようにしたかったのですが、十分な学習時間を確保することができずに断念……。
このままだと間に合わないと判断し、手動でデプロイを行う手段に切り替えました。
今でも手動デプロイのままですが、機会があれば自動でデプロイをできるような形で実装したいと考えています。
アプリ側の環境構築
ここからはYMに代わり、YYからお話ししたいと思います。
ここまでで設計が終わり、AWSを利用できる環境が整いました。 次は実際にアプリを開発するにあたってのお話しになります。
Dockerで環境を作っていますが、研修当時はDockerに関して名前を知っている程度でわからないことばかりでした。 そのためなかなか進まず苦労した思い出があります。
幸いにも過去にウェイブ内でDockerを利用したプロジェクトがありましたので、そちらを参考にしながらなんとか構築を進めることができました。
しかし知ってみるとDockerは便利ですね。
今まではベースとなるような設定を変更するとなると、影響が大きく気軽に変更できません。しかしDockerでは環境を丸ごと保存し、立ち上げることができるので色々と試すことができます。
色々試せるという環境は学習において大事ですね。
Dockerでの実装でいいことばかりでしたが、一点だけうまくできない箇所がありました。
YMの話にも出てきた自動デプロイができなかったことと被りますが、ホットデプロイの実装ができなかったことです。
今回は社内で使用するだけなので問題ありませんが、実際のサービスではサービスを止めないということは重要な箇所なので、機会があれば触れてみたいです。
アプリの作成
環境構築に手間取り研修期間の折り返しの時期となっていましたが、いよいよアプリ本体の開発に着手です。スムーズとまではいきませんが、環境構築と違い多少は知識のある箇所でしたので実装が進んでいきました。ここでは思う存分手を動かすことができて楽しかったです。
ただし勝手が違った点としてRailsのバージョン問題がありました。
普段触っているのが別バージョンのRailsでしたので、使えなかった機能が使えたりといいこともありました。
しかしRails5系を触っていると細かい箇所で違いがあったりと、大変な思いをすることのほうが多かったです。慣れって怖いですね……。
研修終了後
最近は着手できていませんが、研修終了後も修正を入れたり機能追加を行いました。
また他の人の研修の一環として、「Liber」の開発コードのコードレビューが行われたり、デプロイの実験として「Liber」の環境が用いられたりすることがありました。こういったアプリとしての機能以外にも活用されています。
しかし運用を始めて見ると、「あの機能が欲しい」、「この箇所が不便」など色々とわかってくることが出てきます。拡張性を考慮したコードとは言い難い現状、なかなか修正が厳しかったりすることもあります。先を見据えて実装する力も必要不可欠なことだと実感しました。
研修を終えての感想
YM感想
新卒でありながら、一つのプロジェクトを企画から運営まで行うこととなりとてもいい経験となっています。
今でも、ここで培った経験が生きる場面がとても多いです。
まだ、改修したい部分や追加したい機能、実際使用した人からの要望など上がってきているのでまずはそこから対応して、クオリティを上げていきたいと思います!
YY感想
この研修に着手する前に、業務で他のプロジェクトに携わっていました。そこで実際の動いているプロジェクトに関わり、様々なことを学ぶことができました。
しかし環境構築や設計など途中からプロジェクトに関わるとなかなか経験できないことがあります。
「Liber」の開発を通じて、その辺りを学ぶことができました。
また今後利用機会が増えるであろうDockerについて勉強できたのも良かったです。