Elevatus: منصة توظيف SaaS بالذكاء الاصطناعي متعددة المستأجرين
قاد تنفيذ خارطة الطريق وترحيل microservices لـElevatus - منصة توظيف سحابية تخدم مؤسسات وحكومات في الشرق الأوسط.
Elevatus حقيقية. تعمل اليوم على elevatus.jobs. حكومات في الشرق الأوسط تستخدمها لجولات التوظيف في الخدمة المدنية. مؤسسات بفريق موارد بشرية من ألف شخص تستخدمها. كلاهما - مستأجرون مختلفون، أطر امتثال مختلفة تماماً - يعملان على نفس المنصة الأساسية.
كنت Technical Team Leader وIC Architect في فريق Roadmap في Talentera (الآن Elevatus) من 2018 إلى 2020. ما بنيته، وما قدته، وأين أخطأت - هذا ما تدور حوله دراسة الحالة هذه.
نقطة البداية: Tcl/TK على AOL/Navi Servers
لا، هذا ليس خطأً إملائياً.
حين انضممت، كان جزء من قاعدة الكود لا يزال يعمل على Tcl/Tk فوق خوادم ويب AOL/Navi - منظومة تكنولوجية كانت تفقد دعمها بينما كان المنتج يُتوقع منه التعامل مع مستويات خدمة (SLA) مؤسسية. كنا نحمل أيضاً monolith بـPHP 7، وواجهة أمامية Vue.js متنامية، وخدمات Java 8 مبكرة بلا عقد موحّد بين الخدمات.
الترحيل لم يكن من الصفر. لا يكون أبداً. أنت تخدم مستأجرين حيّين - وزارات حكومية لا تتحمل انقطاعاً صباح الاثنين - بينما تفكّك في آنٍ واحد نظاماً لم يُصمَّم للتفكيك من الأساس. النهج كان Strangler Fig: قدرات جديدة هبطت كـmicroservices ببياق سياق من اليوم الأول؛ الأسطح القديمة استُبدلت تدريجياً. طبقة التوجيه (Nginx، ثم لاحقاً API gateway) جعلت التقطيعات غير مرئية للعملاء.
Domain-Driven Design كقوة إجبار
DDD كانت اللغة التي استخدمناها للتفاوض على حدود الخدمات مع فريق المنتج. لم يكن تمريناً أكاديمياً - كان الآلية التي أتاحت للمهندسين القول “لا، تلك الميزة تنتمي إلى نطاق المرشح، وإن وضعتها في نطاق المُوظِّف سنقضي عامين نفكّ تشابكها.” في بيئة متعددة المنتجات ومتعددة الفرق، تلك المفردات تساوي أكثر من مخططات الهندسة المعمارية.
السياقات المحدودة التي ظهرت - المرشح والطلب وسير العمل والهوية والتحليلات - تُطابق ملكية الفريق بشكل نظيف. حين طلب عميل حكومي مرحلة توظيف مخصصة، فريق سير العمل يملكها دون لمس المرشح أو التحليلات. هذا هو الفوز الذي تبحث عنه: عزل التغيير.
Camunda BPMN: سير عمل لكل مستأجر، لا بشكل عالمي
هذا هو القرار الذي أرضى عنه أكثر من تلك الفترة.
سير عمل التوظيف متغيرة فعلاً. قد يكون لدى وزارة حكومية لتوظيف الخدمة المدنية 14 مرحلة وثلاث لجان موافقة وفترة انتظار إلزامية يفرضها القانون. قد يكون لشركة ناشئة 5 مراحل وتنتهي في أسبوع. لا يمكنك ترميز أي منهما. لا يمكنك بناء واجهة تكوين تغطي كليهما دون أن تُعقّد أحدهما.
ما يمكنك فعله هو نمذجة كليهما كتعريفات عملية BPMN، وتخزينها لكل مستأجر، وتنفيذها على محرك Camunda مشترك. أصبح إضافة سير عمل جديد لعميل مؤسسي جديد نشر ملف BPMN، لا sprint. تلك الجملة تحمل ثقلاً كبيراً حين وعد فريق المبيعات عميلاً حكومياً كبيراً بأن المنصة مرنة بما يكفي لتلبية متطلبات المشتريات الخاصة به.
قرار Camunda منحنا أيضاً قابلية التدقيق مجاناً. العملاء الحكوميون يهتمون بقابلية التدقيق بطريقة لا يفعلها العملاء المؤسسيون، ليس لأن مطوريهم أكثر تطلباً بل لأن فرقهم القانونية تجعله سؤالاً تعاقدياً. كل انتقال في سير العمل هو حدث Camunda. مسار التدقيق هو استعلام، لا تحقيق جنائي.
Keycloak ومشكلة الهوية الموحّدة
Multi-tenancy تتعقد في اللحظة التي يوجد فيها المستخدم في أكثر من سياق مستأجر.
في سوق توظيف منطقة الشرق الأوسط وشمال أفريقيا، المرشح يتقدم على نطاق واسع. قد يكون مهندس مؤهّل نشطاً في ثلاث جولات توظيف متزامنة - واحدة في شركة تقنية، وواحدة في وزارة حكومية، وواحدة في بنك إقليمي - كل ذلك على نفس المنصة. نفس عنوان البريد الإلكتروني. نفس الشخص. ثلاثة سياقات مستأجرين منفصلة تماماً، وثلاث حالات طلبات منفصلة تماماً، ومتطلب صريح بأن لا يمكن لأي من المستأجرين الثلاثة معرفة أن المرشح يتقدم أيضاً للآخرين.
الجواب كان Keycloak مع realms لكل مستأجر وتبادل رموز عبر realms. ملف تعريف المرشح الأساسي يعيش في مساحة هوية مشتركة. بيانات طلبه تعيش في realm المستأجر. المصادقة محدودة النطاق بالمستأجر - لا يمكنك بطريق الخطأ حمل بيانات اعتماد من جلسة مستأجر إلى آخر. federation realm في Keycloak جعل هذا قابلاً للإدارة دون بناء federation الهوية من الصفر، وهو نوع العمل الذي يُنتج حوادث أمنية في السنة الثانية حين تظهر الحالات الحافة.
”مدعوم بالذكاء الاصطناعي” في 2018، بصدق
عرض Elevatus تضمّن توظيفاً مدعوماً بالذكاء الاصطناعي. كان صحيحاً. كان أيضاً أكثر تعقيداً مما يبدو.
GPT-3 لم يكن موجوداً. ما لدينا كان تحليل CV وتسجيل مدفوعَين بالتعلم الآلي، وترتيب المرشحين على معايير مُرجَّحة، وتحليل مبكر لمقابلات الفيديو. كان تحليل CV هو القطعة التي عملت بشكل جيد في الإنتاج - استخراج منظَّم من سير ذاتية غير منظَّمة بالعربية والإنجليزية والفرنسية والهندية، موحَّدة في ملفات تعريف مرشحين يمكن لنموذج الترتيب تسجيلها مقابل معايير الوظيفة.
تخصيص النموذج لكل مستأجر كان الجزء المثير معمارياً. قرارات المُوظِّف في وزارة حكومية (التحقق من الشهادات والامتثال التنظيمي يهيمنان) شكّلت نموذج ترتيب مختلفاً اختلافاً جوهرياً عن النموذج المدرَّب على قرارات شركة تقنية (المحفظة والمهارات المُثبَتة تهيمنان). هذه النتيجة الصحيحة - لكنها أيضاً مشكلة تخزين وتقديم غير موجودة إن أدرت نموذجاً عالمياً واحداً. Multi-tenancy مطبّق على بنية تحتية للتعلم الآلي طبقته المستقلة من القيود.
نجح تحليل مقابلات الفيديو. وكان أيضاً، في نظرة إلى الوراء، نظاماً احتاج أدوات تحيّز وإنصاف أكثر صرامة مما كان لدينا في 2018. عملاؤنا الحكوميون طلبوا إجابات صريحة على “هل يعامل هذا النموذج المرشحين بإنصاف عبر المجموعات الديموغرافية” - ليس لأنهم متقدمون فلسفياً، بل لأن تعاهداتهم في التنوع جعلتها سؤالاً تعاقدياً. “النموذج قال ذلك” ليست إجابة يقبلها مكتب وزير. تعلمنا هذا مبكراً. اللحقت الصناعة بعد ذلك.
الطبقة المحمولة: الشيء الذي كنت سأفعله بشكل مختلف
Ionic أولاً، Flutter لاحقاً. كلاهما تكيّفات لتجربة الويب على الهاتف، وكان ذلك واضحاً.
تجربة المرشح على الهاتف - التقدم وتتبع الحالة وإجراء مقابلات الفيديو عبر الهاتف - لها قيود UX مختلفة عن تجربة المُوظِّف على سطح المكتب: مراجعة مئات المرشحين واتخاذ قرارات دفعية وإدارة جولات توظيف. بنينا الهاتف كنقل. لم يكن بجودة منتج مصمَّم بـmobile-first.
لو كنت أفعل هذا اليوم، كانت تجربة المرشح وتجربة المُوظِّف منتجَين منفصلَين يشتركان في backend. كان طبقة API ستُصمَّم مع كلا المستهلكَين في الاعتبار من البداية. هذا هو درس API-first الذي يتعلمه الجميع مرة واحدة، بالطريقة الصعبة. لقد تعلمته الآن.
ما تملكته
- تنفيذ خارطة الطريق وتخطيط الـsprint عبر فرق متعددة
- تيسير DDD وقرارات حدود السياق المحدود
- معمارية تكامل Camunda BPMN ونموذج سير العمل لكل مستأجر
- تصميم federation realm لـKeycloak
- تسلسل ترحيل Microservices (تنفيذ strangler fig)
- طوبولوجيا أحداث RabbitMQ للتواصل عبر الخدمات
- توحيد مسارات Jenkins عبر الفرق
الحكومات تستخدم هذا فعلاً. تلك الجملة تهبط بشكل مختلف حين مررت بعملية الشراء ومراجعات الأمن وتفاوضات التخصيص وعمل التكامل الذي تتطلبه “تستخدم فعلاً”. ليس MVP مع متبنٍ أول ودود. إنه برمجيات إنتاجية تدير عمليات حرجة لمؤسسات لا تتحمل التوقف.
هذا ما بنيناه.