新卒が入社半年で社内サービスをリリースしてエンジニア楽しいってなったお話

[Classi Advent Calendar](https://qiita.com/advent-calendar/2019/classi) 22日目は、新卒でClassiに配属され、エンジニアをしている@ruru8がお送りします。

今回お話するのはClassiの社内研修のお話。からのその過程で作成したRailsアプリケーションのお話です。
作成したアプリケーションは『Classi BookBook(クラッシーブックブック)』と称し、社内で多くの人に利用してもらえるサービスとなりました。
なんの経験もスキルもない新卒エンジニアがいったいどのようにして社内で親しまれるサービスを作ったのか、自分の中での振り返りの意味も込めてお話したいと思います。

## Classi BookBookって？
社内での書籍購入を管理するアプリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533070/21cb1d4c-4b40-024d-e640-10af65a20d81.png)
書籍一覧で登録されている書籍を見ることができ、ステータスでその書籍の状態を確認します。
管理者によって書籍が購入されたら、購入者がステータスが購入済みに変更します。

左のサイドバーから検索をして該当の申請がない場合は右上の購入申請から購入したい本を申請します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533070/b646596f-1eec-3900-582f-f742c56be070.png)

以前はスプレッドシートによって書籍購入が管理されていました。

## きっかけ
社内研修では作成するサービスを自由に考えられる、というものでどうしようかなぁと考えていたところ、メンターであった@hailongさんに「現在の書籍購入がスプレッドシートで管理されていてちょっとわかりにくい」というお話をいただいて、「せっかくならこれ題材にして研修でサービス作って上手くいったら実際に使っちゃおうよ」という話になりました。そんな自分なんかが社内利用とはいえみんなが使うサービスを作っていいの！？と思いながらも、自分で作ったものを使って喜んでくれる人がいたら嬉しいかも、と思い割と燃えました。

## 研修で作る
「ゼロからわかるRuby超入門」の著者である[igaiga][1]さん、12/21のTokyoGirls.rbで登壇された[ただあき][2]さんの元で、万葉さんの研修カリキュラムを使用して研修を行いました。詳しい研修内容は@yukoonoの4日目([Classiの新卒エンジニア向け研修について](https://qiita.com/yukoono/items/f403718318abc9ba0c81))、@willsmileの16日目([Classiエンジニア新人研修での学び方の学び](https://qiita.com/willsmile/items/b1f261e8588b2a5a9b4b))の記事にあるのでぜひ見てみてください。

カリキュラムを通して、サービスの機能作成から細かい疑問点を丁寧に教えもらえ、ただ「サービスを作る」でもただ「教わる」でもなく、「作りながら教わる」ということをさせてもらいました。実際の業務の中でわからないことへの理解を深める時間というのはそんなに取れるものではないと思うのでとてもありがたかったです。

### 一番がんばったところ
カリキュラムの[STEP24](https://github.com/everyleaf/el-training/blob/master/docs/el-training.md#%E3%82%B9%E3%83%86%E3%83%83%E3%83%9724-%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AB%E3%83%A9%E3%83%99%E3%83%AB%E3%82%92%E3%81%A4%E3%81%91%E3%82%89%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%82%88%E3%81%86)に「ラベル機能を実装しよう」というものがあります。
購入したい書籍にラベルをつけられるようにして、より検索性を高めよう！と思い実装を始めました。

書籍登録時のラベル項目に「Ruby/Rails/プログラミング」と入力すれば、既に存在するRubyとRailsはそのまま結びつけ、まだ存在しないプログラミングというラベルは新しく作られ、結びつけられる、という実装にしたいと考えました。
この時初めて、`transaction`に触れ、初心者の私にとって一番苦労した実装でした...。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533070/5461cbc5-4ed4-afcb-38e7-3844082fa14f.png)
conversasionが一つだけ多すぎる...。この実装で[igaiga][1]さんと[ただあきさん][2]にたくさんのことを教わった証拠ですね。ここでの学びはまた別の機会に詳しく共有できたらと思います。

実際のコードはこちら(createのみ)

```book_controller.rb
# POST /books
  def create
    @book = Book.new(book_params)
    @back_url = params[:book][:back_url]
    labels_name = params[:book][:labels_name]
    begin
      ActiveRecord::Base.transaction do
        @book.save!
        Label.save(@book, labels_name)
      end
    rescue ActiveRecord::RecordInvalid => e
      render(:new) && (return)
    end
    redirect_to @back_url, notice: '登録しました'
  end
```
書籍登録とラベル登録を `transaction` にしました。

```label.rb
  def self.save(book,labels_name)
    raise ActionController::BadRequest if labels_name.nil?
    labels_list = labels_name.split('/')
    labels_list.each do |label_name|
      label = find_or_create_by(name: label_name)
      book.labels << label unless book.labels.include?(label)
    end
    book.save!
  end
```
`labels_name` を`/`で分割し `find_or_create_by` で想定の実装ができました。
(`find_or_create_by` を知らず、最初一生懸命 `if` で分岐していたので、めちゃくちゃ便利だなと思いました。)

実際の挙動はこちら
[![Image from Gyazo](https://i.gyazo.com/e1d13b37f19af9c4f4eed0c49083653b.gif)](https://gyazo.com/e1d13b37f19af9c4f4eed0c49083653b)


## 利用開始と研修卒業
アプリケーションを完成させAWSでのデプロイを行い、そして社内利用を開始しました。
(AWSも初めてで色々ありましたが今回は割愛)
社内利用の開始と同時にわたしは研修を卒業することになりました。研修卒業時には[igaiga][1]さんがslackで皆さんにお知らせしてくれます。このたくさんの装飾と皆さんのリアクションがめちゃくちゃ嬉しい。

![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533070/5b76bfa9-d29a-35f4-5958-e7bbb4ad4faf.png)

## 利用開始してから嬉しかったこと
### エンジニア以外の人の利用
以前は技術書の購入申請をするためのエンジニアさんの利用がほとんどで、そもそもそのスプレッドシートがあること自体知らなかったという人もいました。BookBookの利用を開始してから、多くの人に書籍購入管理の存在を認知してもらえ、エンジニアではない方の利用も格段に増えました！画面に沿って申請すればいいだけでわかりやすい、と言っていただけたりもしました。嬉しい限りです。

### ラベルの活用
こだわりを持って作成したラベルの反響が一番大きく、ラベルのおかげでめちゃくちゃ検索しやすい！と言っていただけました。こだわった分、より一層嬉しいです。自分の想定では書籍情報をラベルで登録するだけかと思っていたのですが、中には所属部署、所属チームのラベルを作成して登録している方もいて、そんな使い方もあったのか！と気づかされました。自分の想定以上の活用をしていただけていて、とてもありがたいです。

### 改修案やPRをもらえる
わたしの知識や力量が足りなかった部分を、先輩のエンジニアさんがissueとして出してくれたり、実際に改修をしてPRを出してくれたりもしました。やはり自分だけでは気づけないところがあって、そこにアドバイスをもらえることで自分自身まだまだ成長できる部分があるんだな、と感じました。
また、いただいた改修案をわたし自身で修正するだけではなく、9月に入社して同じく社内研修を受けた新卒の子も改修をしてくれました。研修を終えチーム配属の１つ前のステップとして、BookBookの改修を通してプロダクト開発の一連の流れを学ぶ目的で行なってもらいました。これからの新卒の方達の学びの場にもなれたらいいなと思います。

## まとめ
知識も経験もなかった自分にとって、1からアプリケーションを作成できた！という経験はすごく自信になりました。Webサービスのプログラミングがしたい、と思ったらまずは何か簡単なものでもいいから実際に作ってみる、というのを強くお勧めしたいです。

また今回は社内で利用する、ということで「どうやったらみんなが簡単に使えるか、どうしたら使いやすいと思うか」に重点を置いてアプリケーションを作成していました。これを「ユーザービリティ」って言うんですね。アプリケーション作成の中で、自分はエンジニアとして「コードを書いて想定通りに動かす」ことに楽しみを感じ、作ったものを使った人が「使いやすいと喜んでくれる」ことに嬉しさを感じるということに気づきました。それまではコードを書いていれば楽しい、だけだったのですが、使う人がいてその人が喜んでくれて初めて自分の書いたコードに意味が生まれるように思いました。そこに入社して1年目で気づけたということはとても恵まれていることだなぁと感じました。

今回の経験はこれからのエンジニア人生で壁にぶつかった時にも、この気持ちを思い出して励みにしたいと思います。まだ始まったばかりですが、これからも頑張っていきたいです。

明日の担当は@tomoyanamekawaさんです、お楽しみに。

[1]:https://twitter.com/igaiga555
[2]:https://twitter.com/tdakak