リニューアルを控えた新生JOBドラフトを支える技術

株式会社人と未来グループ IT戦略室の荻原です。弊社のグループ会社である 株式会社ジンジブ の JOBドラフト という web サービスを開発しています。JOBドラフトは、4月に大幅なリニューアルを予定しており、ソフトウェアとしては新規で作り直しを行なっています。本記事では、まだ公開前の新生JOBドラフトの開発体制や技術について少しだけ紹介します。

新生JOBドラフトを支える開発体制

開発チーム構成

プロダクトオーナーはジンジブのメディア開発室長です。我々開発陣への要望発行や、ジンジブ社内のあちこちで飛び出す新生JOBドラフトへの要望を拾い上げて開発チームへ共有してくれています。

人と未来グループのIT戦略室からは、オーナーをサポートしながらプロダクトの全体運営を行う室長の はせ氏 と、web ディレクターとして高校生向けページの UI/UX 設計や web ビジネスのサポートを行う ほとけ島氏 、そして実際の開発業務を私と妻の2人で行なっています。我々は皆、それぞれが個人事業主一本の頃からJOBドラフトの開発に携わっており、それぞれのタイミングで社員になってからも個人事業主としての側面を持ち続けています。

その他、現行のJOBドラフトのデザインリニューアルからお世話になっている外部の web デザイナーさんにも引き続き開発チームに入って頂いています。

遠隔で進む開発

このチームで特徴的なのは、メンバーの仕事場所がバラバラだという点です。プロダクトオーナーはジンジブの東京オフィスに勤めていますが、私と妻は福岡県行橋市の自宅で勤務しています。ほとけ島氏は普段は沖縄に住んでいて必要時に東京に出てきます。web デザイナーのパートナーさんは大阪の自宅で働いています。はせ氏は自宅だったり福岡だったり人と未来グループのオフィスだったりジンジブのオフィスだったり、何処にいるのかよく分かりません。

普段のコミュニケーションは Chatwork を通じてテキストチャットにて行われており、必要に応じて  google meet でテレビ会議を行っています。一般的に、リモートワーカーで構成されたチームで開発プロジェクトを進めるのは難しいことですが、JOBドラフトの開発チームは皆が各々の役割を理解したそれぞれの分野のスペシャリストなので、プロジェクトは滞りなく進行しています。(多分)

新生JOBドラフトを支えるプロジェクトマネジメント

プロジェクトマネージャー不在

新生JOBドラフトの開発プロジェクトには、プロジェクトマネージャーが存在しません。プロダクトの仕様や方向性についてマネジメントするプロダクトオーナーはいますが、その仕様や方向性でプロジェクトを進行するにあたって、進捗を管理したり工数計算したりする人員は存在しません。全体の大まかなリリーススケジュールだけは決まっており、そこに向けて各人が自らの裁量でそこに間に合うように調整して生産性でぶん殴っています。

ゆるいスクラム開発

プロジェクトマネージャーが不在とはいえ、一応軽くプロジェクトマネジメントらしき取り組みは行なっていて、Jira というツールを利用してスクラム開発の真似事をしています。Jira の利用方法は、プロダクトオーナーに各人にやってほしい作業や忘れてほしくない作業を Jira のプロダクトバックログに投げ込んでもらって、毎週金曜日の夕方に開催しているスプリントミーティングで詳細といつやるかについて話し合うだけです。プロダクトオーナーが今週(次スプリント)に終わらせてほしい!と言ったものをとりあえずミーティングで定義して、その他のタスクは作業者それぞれの裁量と気分で進めていき、形になったものから検証環境にリリースしていきます。

この検証環境は、プロダクトオーナーやその他の関係者がいつでも見られるように公開しているので、開発の進捗をリアルタイムに反映すると共に、現場のリアルな声や要望をできるだけ早い段階で取り込むことができます。細かなタスクの進捗状況を逐一入力するのではなく、検証環境で実物の出来栄えを確認できるようにすることで、進捗を明らかにしています。

新生JOBドラフトを支えるインフラ

本記事の目的の1つはエンジニアへのリーチなので、少しだけ技術的な話もしましょう。さて、JOBドラフトのアプリケーションは Ruby on Rails で開発しており、インフラの大部分は Microsoft Azure のサービスで構築しています。今回行うリニューアルの最も大きなポイントは、データベースやストレージをアプリケーションの実行サーバーから切り離して、独立したサービスとして動かしたことです。

アプリケーションサーバー

アプリケーションの実行マシンは Azure Virtual Machines  (Cent OS) で構築しています。プロセッサやメモリやストレージ等のスペックは自由なタイミングで数秒の停止時間で変更することができます。JOBドラフトがメディアに露出するタイミングや、ビジネスの繁忙期だけ一時的にスペックを向上させることが可能です。webサーバーには nginx を使用し、アプリケーションサーバーには puma を使用しています。

最新アプリケーションを検証環境へ反映するのは CI 経由ではなく温かみのある手動デプロイで行なっています。ssh でログインし、GitHub から pull して、`assets:precompile` や `db:migrate` 等の必要作業を行なった後 `bundle exec pumactl restart` でホットリスタートします。

データベース

RDBMS には MySQL を使用しています。アプリケーションと同一のマシンに MySQL をインストールするのではなく、セキュリティやスケール、バックアップの機構を考慮して Azure Database for MySQL を利用しています。

ストレージ

JOBドラフトでは、多くの画像や PDF ファイルを扱うため、アプリケーションサーバー(public/uploads)に直接ファイルを保存せず、Azure Storage を利用することにしました。Azure Storage を利用するには多くの技術的課題がありました。1つの細かな問題は、blob ストレージがマルチバイト文字列に対応しておらず、日本語のファイル名のままアップロードできなかったことです。これはオリジナルのファイル名を別途データベースに保存しておくことで対処しました。

AzureStorage と WYSIWYG 問題

最も大きな問題は ActiveStorage に対応した WYSIWYG がなかったことです。これだけで Qiita に1記事書けそうな程の紆余曲折がありました。

JOBドラフトでは、お知らせ記事や求人等の様々なテキスト入力を ckeditor  で行なっています。開発当初は、AzureStorage との繋ぎこみを Ruby on Rails の 5.2 より実装された ActiveStorage を使用していたのですが、ckeditor の Gem は ActiveStorage に対応しようとする雰囲気が感じられませんでした。Issue で勇士が提供しているパッチ案を寄せ集めて何とか動くものを作ることはできましたが、新規のアプリケーションに気持ちよく入れられるような分量ではなかったので、別の方法を探すことにしました。

次に考えた選択肢は、ckeditor をやめて Ruby on Rails 6 から実装される予定の ActionText を利用することでした。結論から言うと、ActionText を Ruby on Rails 5.2 上で動かすことには成功したのですが、現段階では ActiveStorage と AzureStorage との繋ぎ込みを行うには自ら盛大なハックを行う必要があり、リアルタイムでゴリゴリ開発が進んでいるものにパッチを当てまくるのはメンテナンスでトラブルになる自信があったので、ActionText の利用も断念しました。

最終的な解決策は、ActiveStorage を使うことをやめて、CarrierWave を使って AzureStorage と繋ぎ込むことでした。本当は、せっかくの新しいアプリケーションなので ActiveStorage や ActionText 等の新しい機構を取り入れていきたかったのですが、残念ながら今後のメンテナンスやプロダクトの安定した運用のことを考えると、既存の技術の組み合わせで一旦逃げるのがベストだと判断しました。

メール配信

JOBドラフトでは、各種アカウントの管理や、アラート関連、そしてユーザーアクションを運営に通知する際等、様々な場面でメールを使用しています。メールサーバーには SendGrid を利用しており、Azure と提携されているため、格安で利用することができています。

リポジトリ

コードは GitHub のプライベートリポジトリで管理しています。妻と web デザイナーさんが書いたコードは pull request で私がコードレビューを行った上でマージし、私が書いたコードは私がセルフマージするという独裁リポジトリです。web デザイナーさんは、手元で Ruby on Rails の環境を構築した上で rspec のシステムテストまで修正して pull request を投げてくれており大変助かっています。

継続的インテグレーション

CircleCI 2系を利用しています。現状、コンテナが1つで月のビルド時間が1,500分(25時間)以内なら無料で利用できます。docker のイメージには circleci/ruby:2.5.1-node-browsers と circleci/mysql:5.7 を使用し、rubocop による静的なコーディングスタイルのチェックと、rspec による自動テストを行なっています。最初は brakeman によるセキュリティインシデントのチェックも行なっていたのですが、無視する警告を指定する際に、独自のインタラクティブな設定フローと、それにより吐き出される複雑で具体的すぎる設定ファイルの形式が肌に合わずに一旦除外しています。デプロイに関しても、上述の通り CI の手は借りずに手動で行なっています。役割としては、pull request をマージする前に、コーディング規約を違反していないかと、テストが fail していないかを確認することです。

新生JOBドラフトを支える俺

最後に、私が人と未来グループのエンジニアとして、どのような仕事をしているのかを紹介します。人と未来グループの事業内容は各グループ会社の業務支援を行うことで、私の役割はジンジブの業務を技術的に支援することです。これ以上技術に関するマニアックな話を書くと「他所でやれ」と言われてしまいそうなので、具体的な開発業務以外のことについて書きましょう。

要望や相談の受け口

私は、プロダクトオーナーやその他の関係者からの問い合わせを積極的に自分で受けるようにしています。システムの話をするにあたって技術的可否や難易度について最も正確に答えられますし、ビジネス全体を俯瞰して見られる立場でもありますし、レスポンスは早い方だと思いますし、仕様変更に対して発生するイレギュラーや設計の漏れに関して敏感であり、単純に適性が高いためです。天才。

インフラ周りの見積もりや承認依頼

JOBドラフトのビジネスの状態やスケールの見通しを考慮した上で、各種インフラ周りをどのようなプランで契約するのが良いかを考え、その妥当性についてジンジブに説明して承認を促す役目もしています。「この時期は就職活動が活発な時期でPVやサーバー負荷が跳ね上がるので仮想マシンのスペックをこれぐらいした方が良いですよ」とか、「ストレージの容量は現行環境とこれからの展望を見据えてどれぐらい使用することになるので月々◯◯円ぐらいのプランになりますよ」とかいった話をする仕事です。

アプリケーションの基礎構築

guard で rubocop(コーディング規約チェック) や rspec(自動テスト) を動かしながら開発できるようにしたり、それらの不備を pull request のマージ前に検出できるように CI を導入したりといった最低品質を確保した上でチームが開発できるようにしています。また、Salesforce との通信や上述のようなインフラと相性の良い WYSIWYG 探し等、技術的実現性を早めに知りたいものを優先的に片付けています。

その他、コードレビューや本記事の執筆等、細々した業務もありますが、これら以外の空いた時間で開発業務を行なっています。

終わりに

本記事では、4月にリニューアルオープンされる新生JOBドラフトを支える開発体制や技術についてお伝えしました。リニューアル後は、高校生の皆様には勿論、掲載企業様や高校の教職員の皆様にも、就職/採用活動を大きくサポートできるシステムとして進化しますので、是非ご期待ください。

ライター紹介

11517870

荻原 涼(Ogihara Ryo)

株式会社人と未来グループ IT戦略室
ソフトウェアエンジニア / 個人事業主 / Ruby on Rails / dvorak配列 / Ergodox EZ / ヘビーゲーマー

得意な人間力: 2. 自主的な行動
「任せておけば自分で勝手に何とかしてくれる人」と周りに認知されて、在宅勤務や自由な労働環境を獲得することが私の労働戦略です。