困難を極めた既存コードのメンテナンス
――「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ならばその開発スタイルを実現しやすいと考えました。