てくのろじーたのしー

Haskellぺろぺろ

PIXIV SPRING BOOT CAMP2018に参加しました!

pixiv SPRING BOOT CAMP 2018とは

参加すると圧倒的猛者になれるようです。

f:id:techno_tanoC:20180307204459p:plain

pixiv SPRING BOOT CAMP 2018はピクシブ株式会社(以下ピクシブ)で行われた春のインターンシップで、今回は2/26から3/2までの5日間開催されました。

遠方からの参加者に対しては交通費の負担とホテルの手配をしていただける時点でかなり太っ腹だと思うのですが、その上もれなく全員に日給1万円まで支給される(つまり5日間で5万円!!)(圧倒的感謝!!)という、待遇の時点で「インターンシップとはなんなのか」と常識を覆されるインターンシップです。

このインターンシップには3つの部門から成る8つのコースが用意されています。

  • WEB開発
    • pixivコース
    • BOOTHコース
    • Pawooコース
  • アプリ開発
    • pixivコース
    • pixivコミックコース
    • pixiv PAYコース
  • サービス基盤

僕はRuby on Railsの経験があったため、この中のBOOTHコースを志望しました。

BOOTHを知らない方のために少し説明をします。

イラストがたくさん投稿されているサイトとしてpixivは有名だと思うのですが、ピクシブはpixiv本体以外にも多くの事業を行っています。 その中の一つにRuby on Railsで構築されているBOOTHというサービスがあります。BOOTHはpixivなどで活躍しているクリエーターの方が作った作品が多数出品されており、ユーザは好きな作品を購入することができます。イラストや漫画に限らず音楽やアクセサリーなども出品されており、作品の幅はとても広いです。

そして実はBOOTHには技術書も出品されており、僕も以前Elixirの本を買ったことがあります。エンジニアの方、エンジニア志望の方は探してみると自分の興味のある分野の本が見つかるかもしれません。

hayabusa333.booth.pm hayabusa333.booth.pm hayabusa333.booth.pm


選考

選考フローには提出書類でエントリーする通常選考とGitHubのアカウントでエントリーするGitHub選考があります。どちらの選考フローでも書類選考、GitHub選考の後に面接があります。 僕はGitHubに置いてあるコードにあまり自信がなかったので、通常選考でエントリーしました。

僕は薬学部なので選考の時点で何かしらマイナスになるかもしれないと思っていたのですが、選考を通過することができたので情報学部、工学部以外の方も開発やプロダクトに対する思いをぶつければちゃんと評価してもらえると思います。

そんなわけで僕は圧倒的猛者になるべく、ピクシブへと赴きました。

俺、ピクシブで圧倒的猛者になるんだ・・・(死亡フラグ


出社チャレンジ失敗

初日に遅刻しました(死亡フラグ回収

原因は開かずの踏切で20分足止めを食らったことです。 他のインターン参加者の方々、メンターの方々にはご迷惑をおかけしました。すみません・・・

僕と同じ轍を踏む人が現れないように詳細と対策を書きます。

問題の地点はここです。ここの踏切は運が悪いとずっと開きません。

そしてこちらのルートと通れば開かずの踏切を回避できます。

そんなわけで僕のインターンシップは遅刻で幕を開けることとなりました。出社チャレンジに失敗する奴が圧倒的猛者になれるのでしょうか?


インターンシップ開始!

参加者とメンターの方々の自己紹介が終わった後、一緒に食事を摂り、いよいよ各コースでインターンシップが始まります。

初日は主に開発環境の構築をしました。BOOTHではいくつかのミドルウェアを利用しており、その辺りのセットアップマニュアルがMac向けとなっていたため、Linuxを使っていた僕は若干苦労しました。夕方ごろにはDockerでミドルウェアを動かすことで手元でBOOTHが動きました。

僕のノートは中古で買ったThinkpadなのですが、メモリが4GBしかなく非常につらかったです。Chromeを使うとメモリをモリモリ食べ始めるのでFireFoxを使っていました。

普段はBOOTHほど大きいものを扱うことがないのでこのスペックで困ることはなかったのですが、メモリの必要性を強く感じました。メモリは人権。


開発開始

最初はView周りのの軽いissueを2つ解決しました。軽いというのは最終的なコードの変更が少ないという意味で、内容は色々と議論がなされました。どのように変更すればユーザは嬉しいのか、どのように変更すれば可読性や保守性が高まるのか、しっかりと議論とレビューがされるのでたくさんコメントをもらいながら開発をしました。

火曜日には1つ目のissueの修正がマージされ、デプロイされたのでテンションが上がりました。BOOTHはデプロイツールを使っており、GUIでポチポチと操作すればデプロイされ、本番環境に反映されていました。実際にサービスに反映された時はとても嬉しかったです。


野菜ジュースがおいしい

f:id:techno_tanoC:20180307214335j:plain

ピクシブにはフリードリンクがあり、冷蔵庫に入っている飲み物が飲み放題です。 常日頃から野菜不足を実感している僕はずっと野菜ジュースばかり飲んでいました。ぽっぴっぽー。

野菜ジュースがたくさん飲みたい人はピクシブに行きましょう。

(ちなみにピクシブに置いてあるのは野菜生○100ではないです)

でも野菜ジュースだけ飲めば栄養面で万事オッケーとなるかは知らないので食事はバランス良く摂ることが大事だと思います。


水曜日はイベントがいっぱい

水曜日にはラジオ体操、全体会議、全体ランチがあります。全社員が集まるのでちょっとしたイベントですね。

f:id:techno_tanoC:20180308181339j:plain

全体ランチのご飯


APIを生やす

View周りのissueを倒し終わったころ、大きめのタスクを任されました。モバイルアプリ向けのフォロー一覧APIを作るというタスクです。

当時、アプリではフォロー一覧を表示することができなかったため、フォローを解除するにはそれぞれのショップのページを開いて一つ一つフォローを外していく必要がありました。今回はフォローしているショップを一覧で返すことで、フォロー一覧を見たり、解除することができるようにするための機能追加です。

実装の手順をざっくりと分解すると

  • ルートを生やす
  • Controller追加
  • JSONを作るViewを作る
  • rspecのテストを追加
  • swaggerの作成

といったところです。railsrspecを使って開発する経験は多少あったのでこの辺の大まかな作り方は知っていました。

が、レビューが実際に通ったのは木曜日の昼過ぎ。意外と時間がかかりました。というのも開発に着手してから、色々と想定外、想定不足が発生したからです。

  • 生やしたルートが別のルートと干渉して到達不能になった
  • 変数名はもっと分かりやすい変数名があるのではないか
  • 返すデータの順番はどうするのか、ソートはどうやって行うべきか
  • テストをリファクタリングしたらなぜか動かなくなる
  • レスポンスのJSONに含まれるデータはこれで良いのか

と、ちゃんと考えていないがゆえに発生した問題が多々ありました。 予想では簡単に思えても実際にやってみると色々な問題が出てくるものですね。リアルワールドの問題は難しいです。

メンターの方に相談したり教えてもらったりしながら問題を解決し、その後無事マージ・デプロイされました。

事前にBOOTHのアプリを開発している方がデバッグビルドでそのAPIを使う部分を作ってくださっていたので、デプロイ後実機でその機能を見ることができました。なんか、自分が作ったものがちゃんと機能しているのを見るとテンション上がりますね。そのうちその機能が入ったもののアップデートが来ると思うので、自分のスマホで見てニヤニヤすることになりそうです。


leadsヘルパーの提案

僕が前から使っているRSpecのヘルパーにleadsというものがあります。

インターンシップ中にこのヘルパーの導入を提案、実装、一部導入をしました。インターンシップ中にマージまではされていないので、今後どうなるかは不明です。

これは「subjectにはテスト対象を書く場所として統一したい」という思いから生まれたもので、例えばコントローラーのテストが以下のようだったとします。

describe HogeController do
  describe 'index' do
    before { get :index }
    it { expect(response).to be_success }
  end

  describe 'create' do
    it do
      expect {
        post :create
      }.to change(Hoge, :count).by(1)
    end
  end
end

パラメータなどは省略したので雰囲気までに。

leadsを使うと以下のようにリファクタリングできます。

describe HogeController do
  describe 'index' do
    subject { get :index }
    it { leads{response}.to be success }
  end

  describe 'create' do
    subject { post :create }
    it { leads.to change(Hoge, :count).by(1)
  end
end

コントローラーのように本質的に副作用がメインとなる処理のテストでは非常に見通しが良くなります。is_expectedと併用することで、より「subjectはテスト対象を書く場所」と統一することができるようになると思います。


KPT

1日の最後にはKPTを書きます。KeepProblemTryの略らしいです。

簡単に言うと良かったこと問題今後することみたいなものです。

f:id:techno_tanoC:20180307221804p:plain f:id:techno_tanoC:20180307221811p:plain f:id:techno_tanoC:20180307221821p:plain f:id:techno_tanoC:20180307221825p:plain

「コロッケで学ぶgit」というのはのんさこ君が牛肉コロッケを食べて「じゃがいもが美味しい」と言った際に僕が「じゃがいもと牛肉がコンフリした結果牛肉が消えた」と言ったのが元ネタです。他の人がKPTで「コロッケで学ぶgit」と書いたので僕も書きました。

Rustとかアラビア人とかはRustやC++のすごい人と色々話した時のものです。 アラビア人ってどうやってコード書いているんでしょうね?普段読む文章が右から左だと、左から右に書くのがすごく大変そう。


まとめ

・野菜ジュースをたくさん飲んで野菜不足が多少解決された気がします。結局圧倒的猛者とは何なのかは分かりませんでしたが、ちょっと健康にはなれたかと思います。

※追記 総メンターのchocomelonさん曰く、「大きな規模のサービス/コードベースに一週間でデプロイまで達するのはかなり難しい。それをメンターがサポートしながら達成することで圧倒的な猛者になったことを実感して欲しい!というお気持ち」とのことです。

・メンターの人は優しいので分からないことがあったら長いこと悩まず、早めに質問をした方が良いです。密なコミュニケーションはやっぱり大事で、コンセンサスが取れていないと勘違いが発生したりします。

ピクシブに一週間いて思ったことは、とにかく社風がカジュアルで自由なことです。働いている方々もフレンドリーで、気軽に話すことができました。

最後に一言

ピクシブインターンはいいぞ」


写真

f:id:techno_tanoC:20180308181609j:plain f:id:techno_tanoC:20180308181612j:plain f:id:techno_tanoC:20180308181603j:plain f:id:techno_tanoC:20180308181710j:plain f:id:techno_tanoC:20180308181554j:plain