ハウテレビジョン開発者ブログ

『外資就活ドットコム』を日夜開発している技術陣がプログラミングネタ・業務改善ネタ・よしなしごとについて記していきます。

半年でエンジニア4人→12人に急増したチームで、iOSアプリ(ReactNative)とAPI(Golang)を作り直して無事リリースした話(前編)

はじめに

どうも。 先日行われた開発合宿に自転車(ロード)で行こうと思ったら台風の中120kmも走るハメになった O里 です。(開発合宿については別記事にて書きます)

さて、去る2018年5月中旬に、外資就活ドットコムiOSアプリを全面リニューアルしました🎉

prtimes.jp

このプロジェクトでの僕の役割は、バックエンド側の設計・実装・進捗管理とメンバーの採用で、それに加えてアプリリニューアル以外の開発案件のとりまとめなども並行してやってました。

今回のリリースはiOSアプリのデザインを根本的に見直すことでもっともっと使いやすいアプリにすることが最大の目的でしたが、ReactNativeGoDockerを使うという、技術的に大きな挑戦も含んでいました。

外資就活はWebアプリケーションとスマホアプリ向けのAPI、iOSアプリとandroidアプリを提供していますが、WebとAPIはCakePHP(2.x) で、iOSアプリはSwift、androidアプリはJavaでそれぞれ書かれており、開発環境の構築には VirtualBOX+Vagrant+Chefを使っていました。(一部今も使ってます)

f:id:bumcru0310:20180713110538p:plain

今回の記事では、この大きな技術的転換点をどのように乗り切ったのか、チームビルディングの観点から振り返りたいと思います。超大作になりそうなので2〜3記事に分けて書きます。

序章 ~ プロジェクト発足の背景 ~

スマホアプリからのアクセスが急増

https://img.esa.io/uploads/production/attachments/5008/2017/07/26/5972/3fada706-08f0-449e-baaa-5f1dec3d7280.png

スマホアプリをリリースしたばかりの2015年頃はスマホよりPCからのアクセスが大勢を占めていた外資就活も、いつしかスマホからの利用が上回るようになり、特にアクティブ率の高いユーザーが多いスマホアプリ改善への要望も高まっていました。

リニューアル前の外資就活アプリはログインしないとほとんどの機能が使えない仕様で、「すでに会員登録済みのユーザーにより便利に使ってもらうアプリ」という代物。デザイン的にも最新のAppleUIガイドラインに準拠していませんでした。

これを、「とりあえずアプリをDL→めっちゃ便利→面倒だけど会員登録してみよう」という順番にUXを入れ替え、さらにデザインも直感的に使えてより便利なUIに作り変えようという声が高まり、iOSアプリのリニューアルが外資就活の最重要ミッションになりました。2017年8月の話です。(ちなみにandroidよりiOSユーザーの方が圧倒的に多いため、まずiOSから作り直すことになりました)

iOS専門のエンジニアがいない → ReactNativeだ!!!!

しかし当時の開発チームにはWeb出身のエンジニアしかおらず、スマホアプリネイティブの改修となると腰が重たい状況が続いていました。小さな開発チームでは各社課題になっていることですね。 当時は開発リソースが少なかったこともあり「ネイティブアプリだけど中身はWebViewの箱のようなアプリにしてしまおう!」という企みも検討されましたが、結局は「ユーザーにぬるぬるサクサク快適に使ってもらうアプリを作る上でネイティブでの開発が必須」という結論に至りました。

そうは言ってもWebとiOSとandroid全部修得してその後もメンテし続けるのはやはり現実的ではありません。 そこで当時にわかに人気が高まっていたReactNativeの導入を検討するようになりました。この背景には、スマホアプリだけでなく何ならWeb側もバックとフロントのコードを完全に分離し、フロントはReactで固めたら最高だぜ!という企みがありました。(まだ企んでます)

このブログを執筆時点でもReactNativeの最新バージョンは 0.56 で、「メジャーバージョンがまだ 0 のもの使って本当に大丈夫か!?」という懸念はありましたが、メルカリさんがReactNativeの開発案件で求人を出し始めたのを見て背中を押され「よし、RNで行こう!」と決意が固まったのを覚えています。

ちなみに僕はJS大好きっ子なので、この選択を心から歓迎していました。

アプリ作り直すならバックも作り直さないとしんどい… → Goだ!!??

外資就活のバックエンドは複数に分かれたWebアプリ(本体のWebアプリ、スマホ向けのAPI、社内向けの管理システムなど)がDBにつながっており、そのWebアプリ同士が一部無秩序に相互参照していたり、それぞれがほとんど同じコードを重複して持ってしまっていたり(コピペコード問題)、CakePHP2系のサポートが切れそうだったり、そもそもPHPを使っていたり、と、いくつもの課題を抱えていたため、かねてから技術的負債解消への糸口を探していました。

最大の課題はDB設計の不味さ(外部キーが無い、良くないポリモーフィック、今は使われていないテーブルやカラム達、命名規則バラバラ…など)なのですが、前述のような状況では手の出しようがありません。

また、スマホアプリを大幅に作り直すにあたりユーザー認証周りの仕様を大幅に変える必要があったのですが、既存のバックエンドのコードに新仕様でのコードを追加していくのは影響範囲が広すぎて設計が難しく、何よりお世辞にも楽しい作業とは言えませんでした。

こうして既存APIを拡張するのではなく、新APIを構築して徐々に既存処理を統合していく方針が決まり、技術選定へ。Java、Go、Kotlin、PHP7など、いくつかの言語やフレームワークでAPIのサンプルを作成し、どれにするか検討しました。

負債解消は先が長いプロジェクトで、しかも非エンジニアのメンバーからはその必要性が理解されづらいものです。そこで、今回の技術選定ではエンジニア目線での「楽しさ」を重視することにしました。 楽しければそのプロジェクトは勝手に進むし、やりたい人も自ずと集まってくるものだと確信したからです。(※ 後で書きますが、素敵なエンジニアが勝手に集まってくることはありません。相応のアクションは必要です。)

そんな中でGoを選んだのは以下のような理由からです。

  • 漠然とした「イケてる」感
  • シンタックスがシンプルで取っつきやすい親近感
  • 静的型付けがある安心感(PHPのふわふわ感にいい加減 辟易していた)
  • コンパイル言語で動作が高速
  • コードフォーマッタが予め組み込まれているのでコードの質を担保しやすい
  • ginでAPI作るだけならnginxとか無くても1ファイルに数行書くだけでOK
  • エンジニア採用においても優位性を出せるかも
  • Java家系じゃない

ちなみに、Goの中でさらにどのFWを使うかを決める際は gin にするか echo にするか悩みましたが、botmanの鶴の一声でサクッと決まりました。

Hello, Docker. Goodbye Chef.

また、開発環境および本番環境のインフラ構築にはDockerを使いました。「今どきコンテナ環境使わないのやばい」という世の中の見えない圧力を感じ、当たり前のようにDockerで環境を作り始めました。

実際Chefと比べても、各コンテナごとに何をやっているのかシンプルに記述されているため、インフラが苦手な自分でも理解しやすいという印象でした。

第2章 ~ メンバー集め ~

こうしてプロジェクトが始動したのが2017年8月下旬。当時の開発チームにはエンジニアが4人しかおらず、ReactNativeやGo、iOSアプリ開発の経験がある人はいませんでした。Dockerはかろうじて開発環境で使ったことがありましたが、本番運用の経験はありません。ここまで聞くとあまりに無謀過ぎて「アホなの(^ν^)?」と自分でも思います。

10月: iOSネイティブの超ベテラン降臨

何はともあれエンジニアを採用しないと翌年5月のリリースに間に合わない!そんな逼迫感からまず募集をかけたのはiOSアプリのネイティブエンジニアです。

前述の通り、リニューアル前のiOSアプリはSwiftで書かれているのですが、新アプリの開発に加え、既存のアプリのメンテや緊急度の高い機能追加もやる必要がありました。 また、RNで開発するとは言え、Webとは違うアプリ開発の常識を心得ていて、一部のネイティブとのブリッジコードを書いてくれるネイティブエンジニアの存在は必要不可欠でした。

このときジョインしてくれたNさんは、iOSアプリの開発案件が日本で出始めたばかりの頃(10年前くらい)からアプリ開発を専門でやっている超ベテランでした。 10月から8ヶ月間ともに働くことが出来ましたが、他のメンバーからも「Nさんみたいなエンジニアになりたい」と憧れられるような偉大な存在でした。

Nさんを紹介してくれたのはギークスさんという会社で、数人紹介してくれた中でNさんと出会い、約1ヶ月後から一緒に働き始めることになりました。業務委託という形式にも関わらず開発合宿にも参加してくれるなど柔軟に対応頂き、本当にありがたい限りでした。

geechs.com

10月: Webエンジニア2名ジョイン!!

iOSアプリのリニューアルが最重要案件だとしても、明らかな不具合や会員数を伸ばすためにどうしても試したい施策、売上を達成するための新商品開発など、サービスを運営し続けている以上目先の開発タスクは山のように降って湧いてきます。本当に優先度の高いものだけに絞ったとしても、いくつかの案件には対応せざる終えません。「アプリはリニューアルして良くなったけど、その間にユーザーが離れてました」では本末転倒です。

しかし、腰を据えて新しい技術を習得する上では、これらの細々とした案件が障害となり、リニューアルプロジェクトを停滞させてしまいます。 明らかにエンジニアの手が足りなくなり、「バリバリ手を動かしてタスクを片付けてくれる人が欲しい!」と切望した時、奇跡が起きました。

何と、若手のWebエンジニアの入社が1ヶ月たらずで決まったのです。しかも2名同日入社!

この時、採用に力を貸してくれたのはTECH::EXPERT(テックエキスパート)さん。迅速すぎる対応で、募集開始〜入社までが1ヶ月を切るという異例のスピード採用でした。

tech-camp.in

テックエキスパートについてざっくり説明すると「エンジニアに転職したい未経験者をみっちり育ててIT企業とマッチングする」というものです。 なので、業務経験のないエンジニアをある程度教育する必要はありますが、何より「エンジニアとして働きたい」というモチベーションの高いメンバーを採用することができます。

ここで入社した2人はその後、1人はリニューアルプロジェクトのバックエンドチームに参加しGoでAPIをバンバン実装し、もう1人はリニューアルプロジェクト以外の開発案件をほぼ1人で受け切るなど、それぞれ活躍してくれました。 本当にこのタイミングで入ってくれた2人には感謝しています。

次回予告

さて、リリースを半年後に控えた時点でエンジニアはまだ7名。GoとReactNativeの経験者はまだいません。

そろそろ長くなってきたので、続きは次のブログにて。

次回は「怒涛のフリーランス入社ラッシュ」「沖縄からの襲来者(Goエンジニア)」「錯綜する設計、終わらないモブプロ、狂う見積り」などの内容でお送りする予定です。

次号を待て!!

ハウテレビジョンでは絶賛エンジニア採用中です!

ここまで読んで頂きありがとうございます。ReactNativeやGo、Dockerを業務で使ってみたいエンジニアの方がいらっしゃいましたら、ぜひとも一度オフィスに遊びに来てお話しましょう!

ご連絡はこちらから。