困難を極めた既存コードのメンテナンス
――「FINDJOB!」がリニューアルを行った理由を、開発視点から教えてください。
佐々木:理由はいくつかありますが、まず旧システムをメンテナンスし続けることが困難になってきたからです。旧システムはPerlで開発されていたのですが、Perlを扱えるエンジニアは徐々に少なくなっています。Perlエンジニアを採用するのも一苦労ですし、私も関もこの言語にはそれほど詳しくありません。
また、「FINDJOB!」は1997年に開始したサービスなのですが、23年ほどの間にさまざまな機能拡張が行われた結果、いわゆるスパゲティコードのような状態になっていました。改修の難易度が高いプログラムを、Perlのスキルが低いエンジニアがメンテナンスしていくのは困難です。旧システムにユニットテストがほとんど書かれていなかったことも、メンテナンスの難しさに拍車をかけていました。
関:長年続くサービスにはありがちなことではありますが、コード修正がどの箇所に影響するかわからず、大きなバグが発生しないよう改修のたびに労力を費やす状態でした。かつ、データベースの構造が正規化されておらず、同じようなデータが複数テーブルに存在しているなどシステムの仕様を読み解くのが困難でした。他にも運営していく中での課題が山積みで、抜本的な開発方針の見直しが必要になったのです。
佐々木:どのような方針で開発を続けるか社内で議論が行われました。既存コードを読み解いてサービスをリプレースする案も出たのですが、難解なスパゲティコードを元に仕様を把握することは無理だろうという判断が下されたのです。
そのため、リプレースではなくフルリニューアルを行う方針になりました。この背景には、サービスの未来を見据えてコンセプトを抜本的に変えたい、CX(Candidate Experience:候補者体験)が高いサービスを提供したいというビジネス要望もありました。
もちろん、旧システムはメンテナンス性に難があったとは言ったものの、これまで事業やシステムを支えてきてくれた歴代のメンバーたちにはただただ畏敬の念しかありません。私たちにもっとPerlの開発力があれば、コードを読み解いてリファクタリングし、モダンに書き換えていく選択肢もあったとは思います。
フロントエンドとバックエンドを疎結合にするためSPAを採用
――リプレース後のシステムは、どのような技術を採用すると決めたのでしょうか?
佐々木:WebアプリケーションをSPA的なアーキテクチャにし、バックエンドにはDjango(Python)を、フロントエンドにはNuxt.js(Vue.js)とTypeScriptを採用する方針にしました。
――どのような理由から、その技術選定を行ったのですか?
佐々木:「FINDJOB!」では画面のデザインリニューアルを数年おきに行っています。もしバックエンドとフロントエンドが密結合なアーキテクチャになっていれば、片方の変更がもう片方に影響してしまい、修正の工数が非常に大きくなってしまうでしょう。SPAにすることで両者を疎結合にしたいと考えました。
また、Djangoは機能の後方互換性を重視するフレームワークであることが魅力的でした。
「FINDJOB!」はIT・Web業界の激しい環境のなか23年以上、IT・Web業界をはじめ多数の方々にご利用いただいているサービスなので、今後も長期にわたり開発・運用が続いていくはずです。もしも、バージョンアップに伴い後方互換を切り捨てることの多いフレームワークを使ってしまうと、メンテナンスが大変になってしまう。バージョンアップに伴う作業の負担を軽減できるフレームワークの方がいいと考えました。
関:かつ、過去に「FINDJOB!」で開発を行っていたいくつかのプロジェクトで、Djangoの採用実績がありました。それらの開発資産をそのまま流用できるため、開発効率も良くなります。
Nuxt.jsを採用した理由としては、SPA的な開発スタイルとの親和性はもちろんのこと、フロントエンドの開発効率性も考慮しています。プロジェクト開始当時、開発チームにはフロントエンドのエンジニアがおらず、エンジニアはみなバックエンドを専門としていました(開発初期のチーム構成はディレクター:1人、バックエンド: 4人、デザイナー: 2人)。
バックエンドエンジニアがデザインに関する改修に携わるよりも、デザイナーがフロントエンドのコンポーネントを作成し、システムに組み込むところまで一気通貫で担う方が効率がいい。Nuxt.jsならばその開発スタイルを実現しやすいと考えました。
開発効率向上のために取り組んだ工夫
――開発効率を向上させるために工夫したことはありますか?
関:CI環境(CIツールとして現在はJenkinsを使用しており、今後はAWS CodeBuildへの移行を予定している)を佐々木が整備してくれたおかげで、開発をとてもスムーズに進められました。APIの自動テストが実施しやすかったり、テスト環境を誰でもすぐに利用できる状況だったりと、テストに関する課題が解消されていたのが大きかったです。また、タスク管理を全てGitHubに集約し、IssueとPull Requestをひもづけることで、プロジェクトの状況を誰でも把握しやすい状態にしていました。
佐々木:さらに、このプロジェクトでは関がTypeScriptの型定義ファイルやバックエンドのAPIドキュメントを自動生成するような仕組みを開発してくれて、それも開発効率の向上に寄与していますね。
――開発において苦労したことはありましたか?
関:いくつもありましたが、例えばサービスの仕様がなかなか固まらなかったことやデザインが決まらなかったこと。そして、前述のとおりフロントエンド専任のエンジニアがプロジェクト初期はいなかったため、画面の開発が思うように進まなかったことが挙げられます。
――仕様が固まらない状況を、どのように乗り越えていったのでしょうか?
関:少しでもプロジェクトを前に進めるため、6割程度決まっている仕様に基づいて、バックエンドのエンジニアでAPIとモック画面を開発。アプリを動かしながら仕様を詰めていく作業に取り組みました。このとき、エンジニア全員がNuxt.jsを用いた開発方法を学習できたことは、結果的に見ればチームの開発力の底上げに結びついたと思います。
メンバーの協力のおかげで、仕様も少しずつ固まっていき、デザインも徐々に完成していきました。その後、業務委託のフロントエンドエンジニアを採用できたことで、画面の開発はさらに順調に進むようになりましたね。大変なリニューアルプロジェクトでしたが、無事ローンチできたのは一緒に働いてくれたメンバーたちのおかげだと思っています。
目指すのは、企業も求職者も幸せになれる転職体験
――今後、「FINDJOB!」によって採用の課題をどのように解決していきたいですか?
佐々木:現時点では、まだまだ「FINDJOB!」のリニューアルは道半ば。転職サイトのコア機能ができたに過ぎません。多くのユーザーに使っていただけるように「FINDJOB!」の価値を高めるためのUX改善をしていきます。
Slackなどのコミュニケーションツールや各種SNSとのシステム連携を行うことで、よりサービスの利便性を高めたい。それに、求職者のプロフィール入力や希望条件に沿った求人検索などを、AI Chatbotとの会話で実現できるような機能も実装していきたいです。転職時のメンタルサポートをしてくれるAI Botの開発も構想していますね。
採用企業側の機能もより使いやすくしていきたいです。各種コミュニケーションツールや人事労務ツールとの連携拡大、求職者のポートフォリオ情報をより取り扱いやすくするための機能改善など、さまざまな改修を今後も予定しています。
それから、CXを向上させるために最新の技術や手法を貪欲に取り入れていきたいです。直近では、企業と求職者とのマッチングを最適化させるために、データ分析や機械学習を用いることを構想しています。当社ではマッチング前のデータと結果データのいずれも保有していますから、精度の高い分析・学習ができるのではないかと考えています。
――ワクワクするような改善が今後も予定されているのですね。
佐々木:これは私の個人的な目標ですが、「FINDJOB!」を使うと、まるで転職エージェントを利用するかのように快適に転職できる世界観を実現したいです。転職エージェントを利用すると、求職者に合っていそうな会社を教えてくれたり、今後のキャリアをふまえたアドバイスをくれたりしますよね。要するに、転職サイトがユーザーの特性に合わせて最適なサービスを提供してくれる。「FINDJOB!」でそんな未来を実現していきたいです。
関:採用のミスマッチを減らすため、テクノロジーを活用して企業と求職者の情報を相互にオープンにし、より適切な転職活動ができるようにしていきたい。そして、みんなが幸せになれるような転職活動を「FINDJOB!」で実現していきたいです。まだまだ開発すべき機能はたくさんありますが、候補者体験にこだわって開発しているので、エンジニアをはじめ、IT・Web業界の人材の採用にお困りの方はぜひ使ってほしいです。また、転職を検討する際もぜひ「FINDJOB!」を使ってみてください。