Elevatusは本物のプロダクトだ。今日elevatus.jobsで動いており、中東全体のエンタープライズクライアントと政府省庁の採用を処理している。2018年から2020年のTalenteraでの在籍中、私はその上で動くマルチテナントアーキテクチャを構築したチームの一員だった。これはそれが実際に何を意味するかについての投稿だ — Stripeのエンジニアリングブログにあるようなマルチテナントの抽象的な話ではなく、政府省庁と小売チェーンが同じコードベース、同じデータベースアーキテクチャ、同じワークフローエンジンを共有し、どちらも互いの存在を決して知ることができないプラットフォームを構築する具体的で、恥ずかしい、魅力的な詳細。

テナント分離問題は主にデータ問題ではない

エンジニアがマルチテナントについて考えるとき、たいていまずデータについて考える:共有テーブル対分離スキーマ対分離データベース。これは本物で重要だ。Elevatusでは、すべての行にテナントIDを付けた行レベル分離モデルを使い、特定の機密設定テーブルにはスキーマレベルの分離を組み合わせた。それで基本はできる。

実際の難しい問題はIDとアクセスだ。「テナントAはテナントBのデータを読めるか」ではなく — それはクエリフィルターだ。難しい問題は:同じメールアドレスが三つの異なるテナントにポジションを応募した求職者に属する可能性があるプラットフォームで、ユーザーのIDをどう管理するかだ。その人が「ログインしている」とはどういう意味か?どのテナントの設定がそのセッションを管理するか?テナントAとテナントBが同じポジションで同じ採用ラウンドを実行していて、同じ候補者が両方に応募したらどうなるか?

これらは仮説的なエッジケースではない。MENAの採用市場では、大きな候補者は広く応募する。集中して大規模に実行される政府採用ラウンドは、何万人もの応募者を持つことがあり、その多くは同じプラットフォームでプライベートセクターの求人にも応募している。

私たちがKeycloakを中心に構築した答え:各テナントが独自のレルムを持つフェデレーションIDモデルで、候補者はクロスレルムIDタイプとして存在する。候補者のコアプロフィールは共有IDスペースに存在した。応募データはテナントレルムに存在した。認証フローはテナントスコープだった — テナントBのクレデンシャルでテナントAのインターフェースにログインできない — しかし候補者はプラットフォームが競合するIDレコードを作ることなく複数のテナントに同時にアクティブな応募を保持できた。Keycloakのレルムフェデレーションとクロスレルムトークン交換がこれを実現可能にした。なければ、IDフェデレーションを手作業で解決していた。それはセキュリティインシデントを生み出す作業の種類だ。

「AIパワード」が2018年に意味したこと

Elevatusのピッチには「AIパワード採用」が含まれていた。これは2018年に真実の声明だったが、多くの真実の声明と同様に少し複雑に聞こえる。

大規模言語モデルはやっていなかった。GPT-3はまだ存在しなかった。やっていたのは、ML駆動のCV解析とスコアリング、重み付けされた基準マッチングに基づく候補者ランキング、ビデオ面接分析の初期実験の組み合わせだった。CV解析は実際に本番でうまく機能していた部分だった — 五言語(アラビア語、英語、フランス語、ヒンディー語、その他少し)にわたる非構造化履歴書から構造化データを抽出し、そのデータをシステムが求人基準に対してランク付けできる候補者プロフィールに正規化した。当時の課題はMLが難しいことではなかった — アラビア語CV解析のラベル付き訓練データが本当に希薄で、モデル品質がそれを反映していた。採用担当者の決定(採用/不採用/次のステージに進む)がランキングモデルにフィードバックし、テナントごとに時間とともに改善するフィードバックループを構築した。

その最後の部分 — テナントごとのモデルパーソナライゼーション — はアーキテクチャ的に面白く、オペレーション上は面倒だった。テナントごとのモデルバリアントは、政府省庁の採用担当者の決定(規制準拠と資格認証が採用基準を支配する)が、テック企業の決定(ポートフォリオと実証されたスキルが支配する)で訓練されたものとは意味のある形で異なるモデルを形成することを意味した。それは正しい結果だ。一つのグローバルモデルだけを実行していれば存在しないストレージとサービングの問題でもある。MLインフラへのマルチテナントの適用は制約の完全に追加されたセットだ。

ビデオ面接分析はあまり本番準備ができていなかった。ビデオ録画された面接レスポンスの自然言語処理で、採用担当者向けのサマリー評価を生成する。機能した。しかし振り返れば、2018年に持っていたツールよりも偏見と公平性に関してより慎重な設計が必要な種類のシステムだった。分野はかなり成熟した。私が言えることは:「このモデルは採用プールの多様性を公平に反映しているか」という質問を、それらの質問がメインストリームになる前にしていた。なぜなら、明示的な多様性の任務の下で運営されている政府省庁はAIの出力について具体的な質問をするからだ。「モデルがそう言った」は大臣室への容認できる回答ではない。

テナントごと、グローバルではないワークフローオーケストレーション

Camunda BPMNインテグレーションは、その期間で最も満足している構造的決定の一つだ。採用ワークフローは本当に複雑だ:条件分岐(役割がセキュリティクリアランスを必要とするなら、これらのステップを追加する)、並行トラック(技術スクリーンとHRスクリーンを同時に実行できる)、時間依存の状態(候補者が7日間応答しなければリマインダーをトリガーし、その後エスカレートし、その後応募を終了する)があり、テナント間で根本的に異なる。

公務員職の政府省庁採用ワークフローは14ステージあり三つの承認委員会が関与するかもしれない。スタートアップのワークフローは5ステージあり一週間で走るかもしれない。どちらもハードコードできない。どちらもカバーするコンフィグ可能なUIを作れない。できることは両方をBPMNプロセス定義としてモデリングし、テナントごとに保存し、Camundaが同じエンジンで実行することだ。

これは、プラットフォームのワークフローレイヤーがプロセス定義レベルでテナント固有だが、実行インフラレベルでは共有されることを意味した。新しいクライアントのための新しいワークフローバリアントを追加することはBPMNファイルのデプロイであり、コードデプロイではなかった。この区別は、特定の要件を持つエンタープライズクライアントがいてプラットフォームがそれを処理できると約束した営業チームがいるとき、非常に重要だ。

オンボーディング問題

エンタープライズと政府クライアントはどちらも長くて痛いオンボーディングプロセスを持っている。しかし、異なる方法で痛い。

エンタープライズクライアントはインテグレーションを望む:既存のIDプロバイダー経由のSSO、ATSやHRISへのWebhook、カスタムブランディング、内部ツール向けのAPIアクセス。彼らはデベロッパーを持つ。Webhookペイロードをデバッグできる。オンボーディング問題はコンフィグラビリティだ — プラットフォームが公開するノブの数とそれらがどれほど十分に文書化されているか。

政府クライアントはコンプライアンスを望む:データ残留ドキュメント、セキュリティ評価、特定の機能の正式な承認。SaaSより前から存在するプロキュアメントプロセスを持つことが多い。専用のクラウドではなく、オンプレミスデプロイオプションや専用インフラを必要とするかもしれない。予想していなかった質問をする法務チームを持つ。

両方のタイプを同時にオンボードできるプラットフォームを構築することは、プラットフォームをより設定可能にすることで解決できないプロダクトとアーキテクチャの問題だ。プロキュアメントを理解する、政府のセキュリティレビューが必要とするドキュメントを作成できる、「ローカルデータ主権法に準拠したデータ処理契約が必要だ」を実際のプラットフォーム制約に変換できる人々との共に組織的な筋力が技術的能力に加えて必要だ。コードが簡単な部分だ。

違う方法でやること

モバイルレイヤー — 最初はIonic、後でFlutter — は別のプロダクトサーフェスとして追加されたが、それが見えた。採用のモバイルファーストUXパターンはデスクトップパターンとは本当に異なる。モバイルでの候補者体験(応募、応募状況の追跡、スマートフォンでのビデオ面接)はデスクトップでの採用担当者体験(何百人もの候補者のレビュー、バッチ決定、採用ラウンドの実行)とは異なる制約を持つ。モバイル体験をウェブ体験の適応として構築した。それはネイティブモバイルファーストのプロダクトほど良くはなかった。

今日これを設計するなら、候補者体験と採用担当者体験はバックエンドを共有しながら別々の設計制約を持つ別々のプロダクトとして扱われるだろう。APIレイヤーは後からモバイルをサポートするために後付けするのではなく、最初から両方のコンシューマーを念頭に置いて設計されただろう。これはすべての人が一度は難しい方法で学ぶ標準的な「APIファースト」の教訓だ。

政府は実際にElevatusを使っている。その文章は、プロキュアメントプロセス、セキュリティレビュー、カスタマイズ交渉、「実際に使う」に到達するために必要なインテグレーション作業を経験した後では違う意味で響く。これは親切な初期採用者が使っているMVPではない。ダウンタイムを許容しない機関にとって重要なプロセスを実行している本番ソフトウェアだ。

それが私が構築したものだ。