أسئلة المقابلات
أسئلة مقابلات مهندس البيانات
يمكنك التدرّب على أسئلة مقابلات مهندس البيانات التي تغطي تحويل البيانات باستخدام SQL، ونمذجة البيانات، وخطوط ETL، وتنسيق سير العمل، وأنظمة المعالجة الدفعية والمتدفقة، ومحرك Spark، وجودة البيانات، وقابلية المراقبة، وتصميم الأنظمة، والأسئلة السلوكية حول التعاون. يمكنك استخدام هذه القائمة المركّزة من الأسئلة إلى جانب دليل مقابلات مهندس البيانات.
21 سؤالًا
8 فئات
مهندس بيانات
آخر تحديث: مايو 2026
أسئلة SQL وتحويل البيانات
تدور أسئلة SQL في مقابلات مهندسي البيانات عادةً حول الدقة والجاهزية لبيئة الإنتاج: مستوى التفصيل، وإزالة التكرارات، والمنطق التزايدي، ودوال النافذة، والأقسام، والأداء.
المنهجية: دالة نافذة بترتيب حتمي
أستخدم دالة نافذة لإسناد رقم صف داخل كل قسم (partition) يضم السجلات ذات event_id نفسه، مع الترتيب تنازليًا حسب عمود الحداثة الأكثر موثوقية، مثل ingestion_timestamp أو updated_at. وإذا كان التساوي واردًا، أضيف معيارًا حتميًا لكسر التعادل مثل source_sequence_number أو raw_file_name. نمط الاستعلام كالتالي: أختار جميع الصفوف، وأحسب row_number() over(partition by event_id order by ingestion_timestamp desc, source_sequence_number desc)، ثم أصفّي النتائج بالشرط where row_number = 1. التفصيل المهم في المقابلة هو الحتمية: إذا تطابق الطابع الزمني لسجلين ولم يكن هناك معيار لكسر التعادل، فقد تختلف النتيجة من تشغيل إلى آخر. كما أوضّح المقصود بأحدث حدث: هل هو أحدث وقت استيعاب، أم أحدث وقت لوقوع الحدث، أم أحدث تحديث في المصدر؟ وفي بيئة الإنتاج، أراقب نسبة التكرار، والأحداث المتأخرة في الوصول، وعدد قيم event_id الفارغة، وما إذا كانت إزالة التكرارات تغيّر المقاييس في المراحل اللاحقة على نحو غير متوقع.
أسئلة متابعة محتملة
ماذا لو كان event_id مفقودًا؟
كيف تتعامل مع التصحيحات التي تصل متأخرة؟
كيف يتغير ذلك في المعالجة التزايدية؟
المنهجية: تصفية أحداث النشاط ← توحيد صيغة التاريخ ← التجميع حسب التاريخ والمستخدم
أبدأ بتعريف المستخدم النشط، فليس كل حدث جديرًا بالاحتساب عادةً، إذ قد يلزم استبعاد مشاهدات الصفحات، وأحداث برامج الروبوت، وعمليات التحديث في الخلفية، والمستخدمين الداخليين. وأختار أحداثًا ذات دلالة مثل session_start أو purchase أو message_sent أو feature_used بحسب طبيعة المنتج. ثم أبني تحويلًا يصفّي الأحداث المؤهلة، ويحوّل الطوابع الزمنية للأحداث إلى المنطقة الزمنية المعتمدة في الأعمال، ويجمّع النتائج حسب التاريخ (activity_date) والمستخدم (user_id)، ويُخرج صفًا واحدًا لكل مستخدم نشط في كل يوم. وإذا كان الجدول النهائي جدولًا تجميعيًا، أحسب عدد المستخدمين الفريدين يوميًا. أما إذا كان نموذجًا مخصصًا للاستهلاك المباشر، فأخزّن التاريخ، ومعرّف المستخدم (user_id)، والمنصة، والدولة، ووقت النشاط الأول (first_active_timestamp). ومن تفاصيل الإنتاج المهمة: المنطقة الزمنية، والأحداث المتأخرة، وتصفية أحداث الروبوتات والاختبار، والمستخدمون المحذوفون، والأحداث المكررة، والتقسيم حسب activity_date. وفي البناء التزايدي، أعيد معالجة الأقسام الحديثة لالتقاط الأحداث المتأخرة، ولا أكتفي باليوم الحالي. وأحرص كذلك على التحقق من النتائج: مقارنة عدد المستخدمين النشطين يوميًا (DAU) بأعداد الأحداث في المصدر، ومراقبة التغيرات من يوم إلى آخر، والتحقق من اتساق الأرقام على مستوى الشرائح.
أسئلة متابعة محتملة
ما الأحداث التي ينبغي احتسابها نشاطًا؟
كيف تتعامل مع الأحداث المتأخرة؟
هل ينبغي أن يكون DAU جدولًا أم استعلامًا لحساب المقياس؟
المنهجية: النطاق ← خطة الاستعلام ← نمو البيانات ← عمليات الربط ← الأقسام ← التغييرات الأخيرة
أتحقق أولًا مما إذا كانت المشكلة خاصة بهذا الاستعلام، أم تشمل مستودع البيانات بأكمله، أم تتعلق بالبنية التحتية. فإذا تباطأت استعلامات كثيرة، فقد يكون السبب سعة العنقود (cluster)، أو الضغط على المستودع، أو تراجع أداء الخدمة. أما إذا تباطأ استعلام واحد، فأفحص الاستعلام نفسه والبيانات. أراجع التغييرات الأخيرة: نمو حجم الجداول، وتغييرات المخطط، وعمليات الربط الجديدة، والفلاتر المعدّلة، وغياب استبعاد الأقسام (partition pruning)، والإحصاءات القديمة، وانحراف توزيع البيانات (skew)، وعمليات الربط التي تضاعف الصفوف بشكل هائل، أو إضافة عمليات distinct/order by. وأراجع خطة الاستعلام إن كانت متاحة. ومن الأسباب الشائعة: الربط على مستوى تفصيل خاطئ، وغياب فلاتر التاريخ، وعمليات الربط من نوع متعدد إلى متعدد، ومسح جميع الأقسام، ودوال النافذة غير الفعالة، وعمليات إعادة التوزيع الضخمة، أو تطبيق دوال على أعمدة التقسيم بما يمنع استبعاد الأقسام. وقد تشمل الحلول: التصفية في مرحلة مبكرة، والتجميع المسبق، وإضافة فلاتر الأقسام، والعنقدة أو الفرز (clustering/sorting)، وتجسيد النماذج الوسيطة، وتحديث الإحصاءات، وتقليل الأعمدة المختارة، وتصحيح منطق الربط. كما أضيف مراقبة لزمن التشغيل، وحجم البيانات الممسوحة، وأعداد الصفوف، والتكلفة.
أسئلة متابعة محتملة
ما المقصود باستبعاد الأقسام (partition pruning)؟
كيف يمكن لعملية ربط أن تضاعف عدد الصفوف بشكل هائل؟
كيف تمنع تكرار هذا التراجع في الأداء؟
أسئلة نمذجة البيانات ومستودعات البيانات
تختبر مقابلات نمذجة البيانات قدرتك على تصميم مخططات واضحة وقابلة للتوسع ومراعية للتكلفة، ومفيدة للتحليلات وتعلم الآلة والتقارير التشغيلية.
المنهجية: عمليات الأعمال ← الحقائق ← الأبعاد ← مستوى التفصيل ← المقاييس
أبدأ بعمليات الأعمال الأساسية: التصفح، وسلة التسوق، والطلبات، والمدفوعات، والشحنات، والمرتجعات، والمبالغ المستردة، والمخزون، وإسناد النتائج إلى قنوات التسويق. وقد تتحول كل عملية إلى جدول حقائق أو نموذج أحداث بحسب طريقة الاستخدام. ومن أهم جداول الحقائق: fact_orders (صف واحد لكل طلب)، وجدول fact_order_items (صف واحد لكل منتج في كل طلب)، إضافة إلى الجداول fact_payments، fact_refunds، fact_shipments، fact_inventory_snapshot. أما الأبعاد فتشمل الجداول dim_customer، dim_product، dim_date، dim_store أو warehouse، dim_channel، dim_campaign. وأحدد مستوى التفصيل صراحةً. فالإيرادات حسب فئة المنتج ينبغي عادةً أن تُحسب على مستوى بنود الطلب لا على مستوى الطلب. وقد تعتمد مقاييس دورة حياة العميل على مستوى العميل أو الاشتراك، بينما قد يحتاج تحليل المخزون إلى مستوى اللقطة اليومية. ومن اعتبارات النمذجة: السمات بطيئة التغير للعملاء أو المنتجات، والمبالغ المستردة والإلغاءات، والخصومات على مستوى الطلب مقابل مستوى البند، والعملة، والضرائب، والشحن، والشراء دون تسجيل حساب، والبيانات المتأخرة في الوصول. كما أحدد المقاييس المرجعية المعتمدة، وأبني نماذج دلالية أو مستودعات بيانات فرعية (data marts) لفرق المالية والتسويق والمنتج والعمليات. ويشمل التحقق مطابقة الإيرادات مع أرقام الإدارة المالية، وأعداد الطلبات مع أنظمة المعاملات، وإجمالي المبالغ المستردة مع أنظمة المدفوعات، والمخزون مع أنظمة المستودعات.
أسئلة متابعة محتملة
ما مستوى التفصيل في fact_order_items؟
كيف تنمذج المبالغ المستردة؟
كيف تتعامل مع تغيّر فئات المنتجات بمرور الوقت؟
المنهجية: النوع الأول مقابل النوع الثاني بحسب الحاجة إلى السجل التاريخي
يعتمد النهج الصحيح على مدى أهمية الدقة التاريخية. فالنوع الأول (Type 1) يستبدل القيم القديمة، وهو بسيط ومفيد حين لا تهم سوى أحدث قيمة. أما النوع الثاني (Type 2) فيحفظ السجل التاريخي بإنشاء صف جديد في البُعد عند كل تغيير في السمات، عادةً مع الحقول effective_start_date، effective_end_date، current_flag، إضافة إلى مفتاح بديل (surrogate key). مثال: إذا انتقل عميل من المنطقة الغربية إلى المنطقة الشرقية، فإن النوع الأول يحدّث صف العميل إلى «الشرقية». وعندها ستُظهر التقارير التاريخية الإيرادات القديمة تحت المنطقة الشرقية، وقد يكون ذلك خاطئًا. أما النوع الثاني فيحتفظ بالصف القديم للمنطقة الغربية وينشئ صفًا جديدًا للشرقية، ما يتيح ربط الحقائق بالنسخة الصحيحة وقت وقوع الحدث. لكن النوع الثاني يضيف تعقيدًا: المفاتيح البديلة، وعمليات الربط على نطاقات التواريخ، والحقائق المتأخرة في الوصول، والتمييز بين التقارير الحالية والتاريخية، وتضخم جداول الأبعاد. لذا أستخدمه حين يجب أن تعكس التقارير السمات كما كانت وقت وقوع الحدث. ولهذا أبدأ دائمًا بتوضيح حاجة الأعمال قبل اختيار نوع SCD.
أسئلة متابعة محتملة
متى يكون النوع الأول مقبولًا؟
كيف تُربط الحقائق ببُعد من النوع الثاني؟
ماذا يحدث مع الحقائق المتأخرة في الوصول؟
المنهجية: الحوكمة والمرونة مقابل بساطة الاستعلام والأداء
يفصل مخطط النجمة (star schema) بين الحقائق والأبعاد، وهو مفيد عند الحاجة إلى أبعاد قابلة لإعادة الاستخدام، ومقاييس متسقة، وحوكمة، ومستوى تفصيل واضح، ومرونة في التحليل. كما يقلل التكرار ويسهّل إدارة التغييرات على الأبعاد. أما الجدول العريض غير المُطبَّع فقد يفيد في تحليلات محددة كثيرة الاستخدام، أو ميزات تعلم الآلة، أو لوحات المعلومات التي تهم فيها بساطة الاستعلام والأداء. وهو يخفف تعقيد عمليات الربط على المستخدمين، لكنه قد يكرر البيانات ويخلق مخاطر على الحوكمة إذا تعددت الجداول العريضة وعرّف كلٌّ منها المقاييس بطريقة مختلفة. عمليًا، أحافظ غالبًا على جداول حقائق وأبعاد مرجعية نظيفة، ثم أنشر مستودعات فرعية منسّقة أو جداول عريضة لحالات استخدام محددة. فيجب أن يظل أساس المستودع موثوقًا، بينما تُحسَّن النماذج في المراحل اللاحقة وفق احتياجات المستخدمين. ويتوقف القرار على حجم البيانات، والجهات المستهلكة، وسلوك أداة ذكاء الأعمال (BI)، والتكلفة، وزمن الاستجابة، ومدى تكرار تغيّر تعريفات الأعمال.
أسئلة متابعة محتملة
أيهما أنسب للوحات معلومات ذكاء الأعمال (BI)؟
كيف تتجنب عدم اتساق المقاييس؟
ما الطبقة الدلالية (semantic layer)؟
تصميم خطوط البيانات وتنسيقها
تختبر مقابلات خطوط البيانات قدرتك على تصميم مسارات عمل ثابتة النتيجة عند إعادة التشغيل (idempotent)، وقابلة للمراقبة والاستعادة، وملائمة لمتطلبات حداثة البيانات والتكلفة.
المنهجية: الاستخراج ← حفظ البيانات الخام ← التحويل ← التحقق ← النشر ← المراقبة
أبدأ بتوضيح المتطلبات: حداثة البيانات، وحجم الطلبات، والتأخير المقبول، وقيود الحمل على قاعدة بيانات المصدر، والجهات المستهلكة، وما إذا كانت هناك تصحيحات تاريخية. تصميم بسيط: أستخرج الطلبات تزايديًا باستخدام updated_at أو CDC، ثم أحفظ البيانات الخام في تخزين الكائنات (object storage) أو في جدول خام داخل المستودع، وأحوّلها إلى جداول مرحلية، ثم أنشر جداول حقائق منمذجة مثل fact_orders إلى جانب fact_order_items. ولتنسيق سير العمل أستخدم Airflow أو Dagster أو dbt Cloud أو أداة سير عمل مُدارة. يجب أن يكون خط البيانات ثابت النتيجة عند إعادة التشغيل: فإذا أُعيد تشغيله لتاريخ أو دفعة معينة، ينبغي أن يستبدل البيانات أو يدمجها بشكل حتمي بدلًا من إلحاق نسخ مكررة. وأستخدم العلامات المائية (watermarks) بحذر، وأعيد معالجة نافذة زمنية سابقة لالتقاط التحديثات المتأخرة. فحوص التحقق: أعداد الصفوف، والمفاتيح الأساسية الفارغة، ومعرّفات الطلبات المكررة، وإجمالي الإيرادات، وتوزيع حالات الطلبات، وحداثة البيانات، ومطابقتها مع المصدر. وينبغي أن تُصدر المراقبة تنبيهات عند الأعطال، أو التغيرات غير المعتادة في الحجم، أو ارتفاع نسب التكرار، أو تأخر البيانات. كما أوثّق الجهة المالكة والتبعيات في المراحل اللاحقة.
أسئلة متابعة محتملة
لماذا لا يكفي updated_at دائمًا؟
كيف تتجنب تحميل طلبات مكررة؟
كيف تنفّذ التعبئة بأثر رجعي لسجل يمتد عامين؟
المنهجية: المدخلات نفسها مع إعادة التشغيل تُنتج المخرجات نفسها
خط البيانات الثابت النتيجة (idempotent) يمكن تشغيله مرات عدة بالمدخلات نفسها ليعطي المخرجات الصحيحة نفسها، دون تكرار أو آثار جانبية غير مقصودة. وهذا مهم لأن خطوط البيانات تتعطل، ويُعاد تشغيلها، وتحتاج إلى التعبئة بأثر رجعي. مثال: خط بيانات غير ثابت النتيجة يُلحق طلبات الأمس في كل مرة يعمل فيها. فإذا أُعيد تشغيله بعد عطل، تتضاعف الإيرادات. أما النسخة الثابتة النتيجة فتحذف القسم المستهدف وتستبدله، أو تدمج البيانات حسب المفتاح الأساسي، أو تكتب إلى جدول مؤقت ثم تبدّله بالجدول الأصلي في عملية ذرية واحدة. ويتطلب ثبات النتيجة مفاتيح واضحة، واستراتيجية تقسيم، وتحويلات حتمية، وتعاملًا دقيقًا مع الآثار الجانبية. وهو من أهم مفاهيم هندسة البيانات في بيئة الإنتاج، لأن القدرة على الاستعادة تعتمد عليه.
أسئلة متابعة محتملة
كيف تجعل خط بيانات يعتمد على الإلحاق فقط (append-only) ثابت النتيجة؟
ما التبديل الذري (atomic swap)؟
كيف يساعد ثبات النتيجة في التعبئة بأثر رجعي؟
المنهجية: الرصد ← التصنيف ← الحماية ← التواصل ← الترحيل
أبدأ برصد تغييرات المخطط تلقائيًا عبر سجل المخططات (schema registry)، أو فحوص البيانات الوصفية، أو اختبارات العقود، أو التحقق أثناء الاستيعاب. ثم أصنّف التغيير: عمود مضاف، أو عمود محذوف، أو عمود أُعيدت تسميته، أو تغيير في النوع، أو في قابلية القيم الفارغة، أو تغيير في الدلالة. الأعمدة المضافة التي تقبل القيم الفارغة آمنة عادةً. أما الأعمدة المحذوفة والحقول المعاد تسميتها وتغييرات الأنواع فقد تعطّل التحويلات ولوحات المعلومات في المراحل اللاحقة. وتغييرات الدلالة خطيرة بشكل خاص، لأن المخطط قد يبدو سليمًا بينما يتغير المعنى. أحمي خط البيانات بالاحتفاظ بالبيانات الخام، وفحوص التوافق، والتنبيهات، والعقود للمصادر الحرجة. وفي التغييرات الجذرية (breaking changes)، أنسّق مع مالكي المصدر، وأحدّث التحويلات، وأنفّذ التعبئة بأثر رجعي عند الحاجة، وأُبلغ الجهات المعتمدة على البيانات بالأثر المترتب. وعلى مستوى أنضج، أعتمد على عقود البيانات، وإدارة الإصدارات، وتتبّع مسار البيانات، والاختبارات، والملكية الواضحة، حتى لا تُفسد تغييرات المخطط التحليلات بصمت.
أسئلة متابعة محتملة
ما عقد البيانات (data contract)؟
كيف تتعامل مع تغيير نوع عمود؟
ماذا لو لم يُبلغك فريق المصدر مسبقًا؟
أنظمة المعالجة الدفعية والمتدفقة
تختبر أسئلة المعالجة الدفعية والمتدفقة فهمك لزمن الاستجابة، ومعدل المعالجة، وترتيب الأحداث، والحالة، والنوافذ الزمنية، وإعادة التشغيل، والمفاضلات التشغيلية بين البنى الأبسط والبنى الأقرب إلى الزمن الحقيقي.
المنهجية: سرعة اتخاذ القرار مقابل التعقيد
أختار المعالجة المتدفقة حين يحقق انخفاض زمن الاستجابة قيمة حقيقية. ومن الأمثلة: كشف الاحتيال، والتنبيهات التشغيلية، والتخصيص الفوري، وتحديثات المخزون، ومقاييس التجارب الحية، وميزات المنتج التي يتعامل معها المستخدمون مباشرة وتحتاج إلى أحداث حديثة. أما المعالجة الدفعية فغالبًا ما تكون أفضل للتقارير اليومية، والتحليلات التاريخية، والمطابقات المالية، والتحويلات التي يُقبل فيها تأخير يمتد لساعات. فهي أبسط تشغيلًا، وأسهل في إعادة المعالجة، وأقل تكلفة في الغالب. وينبغي أن يراعي القرار متطلبات الحداثة، وحجم الأحداث، والحاجة إلى الترتيب، والمعالجة ذات الحالة، والقدرة على تحمّل الأعطال، وخبرة الفريق، والتكلفة، والجهات المستهلكة. فالمعالجة المتدفقة ليست أفضل تلقائيًا، بل تضيف تعقيدًا في التعامل مع التكرارات، والأحداث المتأخرة، ونقاط الحفظ، وتطور المخطط، والمراقبة. والمبدأ الذي أتبعه: استخدام أبسط بنية تلبي متطلبات الأعمال. فإذا كانت الأعمال لا تحتاج إلا إلى مقاييس يومية، فلا داعي لبناء نظام معالجة متدفقة لمجرد الوجاهة التقنية.
أسئلة متابعة محتملة
ما الأحداث المتأخرة؟
كيف تتعامل مع التكرارات في المعالجة المتدفقة؟
ماذا تعني المعالجة لمرة واحدة بالضبط (exactly-once)؟
المنهجية: الأحداث ← التدفق ← الإثراء ← القواعد/النموذج ← الإجراء ← التخزين ← المراقبة
أبدأ بالمتطلبات: حجم الأحداث، وزمن الاستجابة المستهدف، ونوع قرار الاحتيال، ومدى تقبّل النتائج الإيجابية الكاذبة، وما إذا كانت القرارات توقف المعاملات أم تحيلها إلى المراجعة. تصميم محتمل: تُنشر أحداث الدفع إلى Kafka أو Kinesis، ويستهلكها معالج تدفق يتحقق من المخطط، ويزيل التكرارات حسب event_id، ويُثري الأحداث ببيانات المستخدم والجهاز والتاجر وميزات السرعة التاريخية (velocity features)، ثم يطبق القواعد أو النموذج. وتُحال الأحداث عالية المخاطر إلى خدمة قرار، أو طابور مراجعة يدوية، أو تحقق إضافي من الهوية (step-up authentication). وتُكتب الأحداث الخام والقرارات في تخزين دائم لأغراض التدقيق وتدريب النماذج. أبرز الاعتبارات الهندسية: الأحداث المكررة، والأحداث غير المرتبة، وحداثة الميزات، وحجم مخزن الحالة، والمعالجة لمرة واحدة بالضبط أو ما يعادلها فعليًا (effectively-once)، والضغط العكسي (backpressure)، وطوابير الرسائل الفاشلة (dead-letter queues)، وإعادة التشغيل، ومراقبة زمن الاستجابة، وإدارة إصدارات النماذج والقواعد. وتكتسب جودة البيانات والحوكمة أهمية كبيرة لأن قرارات الاحتيال تمس العملاء. لذا أسجّل رموز أسباب القرارات، وأراقب نسب النتائج الإيجابية الكاذبة، وأتيح التراجع السريع إذا جاء أداء قاعدة أو نموذج سيئًا.
أسئلة متابعة محتملة
كيف تحسب ميزات السرعة (velocity features)؟
كيف تعيد تشغيل الأحداث بأمان؟
ما الغرض من طابور الرسائل الفاشلة (dead-letter queue)؟
أسئلة Spark والمعالجة الموزعة
تختبر أسئلة Spark والمعالجة الموزعة فهمك للتقسيم، وعمليات إعادة التوزيع (shuffles)، وانحراف البيانات (skew)، والتخزين المؤقت، وعمليات الربط، وصيغ الملفات، وأسباب فشل المهام أو ارتفاع تكلفتها.
المنهجية: إعادة توزيع البيانات بين الأقسام
تحدث عملية shuffle حين يحتاج Spark إلى إعادة توزيع البيانات بين الأقسام، وغالبًا في عمليات مثل groupBy، join، distinct، orderBy، repartition. وهي مكلفة لأن البيانات يجب أن تنتقل عبر الشبكة، وأن تُسلسَل ثم يُفك تسلسلها، وأن تُكتب على القرص، مع تنسيق بين المنفذين (executors). كثيرًا ما تستحوذ عمليات shuffle على معظم زمن تشغيل المهمة، وقد تسبب أعطالًا عند انحراف البيانات أو تضخم البيانات الوسيطة. فمفتاح واحد شديد التكرار قد يرسل كمًّا هائلًا من البيانات إلى قسم واحد، فتنشأ مهام متأخرة (stragglers) أو أخطاء نفاد الذاكرة. ومن طرق خفض تكلفة shuffle: التصفية مبكرًا، واختيار الأعمدة اللازمة فقط، والتجميع المسبق، واستخدام ربط البث (broadcast join) مع الجداول الصغيرة، والتقسيم حسب مفاتيح الربط، وتمليح المفاتيح المنحرفة (salting)، وتجنب عمليات distinct/orderBy غير الضرورية، وضبط عدد الأقسام. وأربط المفهوم دائمًا بالتشخيص العملي: فحص Spark UI، والمراحل (stages)، وحجم القراءة والكتابة في shuffle، والانحراف، والانسكاب إلى القرص (spill)، ومدة المهام، وذاكرة المنفذين.
أسئلة متابعة محتملة
ما أسباب انحراف البيانات (skew)؟
متى تستخدم ربط البث (broadcast join)؟
كيف تشخّص مهمة Spark بطيئة؟
المنهجية: تحديد المرحلة ← تقليل البيانات ← معالجة الانحراف ← ضبط الأقسام ← تجنب العمليات المكلفة
أبدأ بتحديد موضع الفشل عبر Spark UI أو السجلات: أي مرحلة، وأي عملية، وأي قسم، وأي منفذ. فقد ينتج نفاد الذاكرة (OOM) عن انحراف البيانات، أو عمليات ربط ضخمة، أو عمليات collect، أو أقسام كبيرة الحجم، أو دوال UDF غير فعالة، أو تخزين كمية مفرطة من البيانات مؤقتًا. ثم أقلل البيانات مبكرًا: أصفّي الصفوف، وأختار الأعمدة الضرورية فقط، وأدفع شروط التصفية إلى مرحلة القراءة، وأتجنب قراءة الأقسام غير اللازمة. وأراجع عمليات الربط: إذا كان أحد الجداول صغيرًا، أستخدم ربط البث. وإذا كان أحد المفاتيح منحرفًا، أستخدم التمليح أو أفصل المفاتيح الثقيلة. وإذا كانت الأقسام كبيرة جدًا، أزيد عددها؛ وإذا كثرت الأقسام الصغيرة جدًا، أدمجها بالقدر المناسب (coalesce). وأتجنب collect() على البيانات الكبيرة، وأتجنب دوال UDF المكتوبة بلغة Python حين تتوفر دوال أصلية، ولا أستخدم التخزين المؤقت إلا عند إعادة استخدام البيانات وحين تسمح الذاكرة. وعند كتابة الملفات، أتجنب إنتاج عدد كبير من الملفات الصغيرة، وأختار صيغًا عمودية مثل Parquet مع الضغط. وإذا لزم ضبط الموارد، أعدّل ذاكرة المنفذين، وعدد الأنوية، وأقسام shuffle، والذاكرة الإضافية (memory overhead)، لكن دون الاعتماد على العناقيد الأكبر وحدها. فمعالجة شكل البيانات وخطة الاستعلام حل أكثر استدامة في الغالب.
أسئلة متابعة محتملة
كيف تكتشف انحراف البيانات؟
لماذا قد يكون العدد الكبير من الأقسام مشكلة؟
متى ينبغي تخزين DataFrame مؤقتًا؟
المنهجية: التخزين العمودي، والمخطط، والضغط، ودفع شروط التصفية (predicate pushdown)
تُعد Parquet صيغة ملفات عمودية، وهي فعالة في التحليلات لأن الاستعلامات كثيرًا ما تقرأ جزءًا فقط من الأعمدة. وتدعم الضغط، وترمّز أنواع البيانات، وتخزن المخطط، وتتيح في كثير من المحركات دفع شروط التصفية (predicate pushdown) واستبعاد الأعمدة غير المطلوبة (column pruning). أما CSV فنص عادي قائم على الصفوف. وهو مقروء للبشر وسهل النقل، لكنه يفتقر إلى أنواع بيانات صارمة، وقد يكون أكبر حجمًا وأبطأ في المسح، وأكثر عرضة للأخطاء بسبب الفواصل وترميز الرموز الخاصة (escaping)، ولا يمكنه تخطي الأعمدة غير ذات الصلة بكفاءة. في بحيرات البيانات ومستودعاتها، تقلل Parquet عادةً تكلفة التخزين وتحسّن أداء الاستعلامات. ويظل CSV مفيدًا للتصدير البسيط، أو الملفات الصغيرة، أو التوافق بين الأنظمة، لكنه ليس الخيار الأمثل صيغةً رئيسية لتخزين بيانات التحليلات.
أسئلة متابعة محتملة
ما المقصود بدفع شروط التصفية (predicate pushdown)؟
متى يظل استخدام CSV مقبولًا؟
كيف تؤثر الملفات الصغيرة في أداء الاستعلامات؟
جودة البيانات وقابلية المراقبة
تختبر أسئلة جودة البيانات قدرتك على اكتشاف البيانات الخاطئة قبل أن تُعطّل لوحات المعلومات، أو النماذج، أو ميزات المنتج، أو التقارير المالية، أو الأنظمة التي يتعامل معها العملاء.
المنهجية: الحداثة ← الاكتمال ← التفرد ← الصلاحية ← المطابقة
في خط بيانات الإيرادات، أضيف فحوصًا للحداثة، وعدد الصفوف، والمفاتيح الأساسية الفارغة، ومعرّفات المعاملات المكررة، وصلاحية الحالات والعملات، وعدم سلبية المبالغ حيثما ينطبق ذلك، ونطاقات التواريخ المقبولة، والتكامل المرجعي بين الطلبات والمدفوعات والمبالغ المستردة والعملاء. كما أضيف فحوص مطابقة: مقارنة إجمالي الإيرادات بأنظمة الدفع المصدر، أو التقارير المالية، أو الإصدار السابق من خط البيانات. وأراقب التغيرات اليومية والأسبوعية وفق حدود معينة، مع مراعاة الموسمية والأحداث المعروفة مسبقًا. وقواعد الأعمال مهمة: فالطلبات الملغاة لا تُحتسب ضمن الإيرادات، والمبالغ المستردة تُخفّض صافي الإيرادات، والمعاملات التجريبية تُستبعد، وتحويل العملات يجب أن يستخدم السعر الصحيح. وينبغي أن تكون التنبيهات قابلة للتنفيذ، وموجّهة إلى جهة مالكة، ومصحوبة بالسياق: الفحص الذي فشل، والجدول المتأثر، ودرجة الخطورة، والتبعيات في المراحل اللاحقة، ودليل التشغيل المقترح (runbook). فكثرة التنبيهات المزعجة تنتهي بتجاهلها.
أسئلة متابعة محتملة
كيف تختار حدود التنبيه؟
ماذا لو فشل أحد الفحوص أثناء إقفال نهاية الشهر؟
كيف تمنع احتساب الإيرادات مرتين؟
المنهجية: تقييم الأثر ← مقارنة الإصدارات ← فحص مسار البيانات ← احتواء المشكلة ← تحديد السبب الجذري
أبدأ بتقييم الأثر: أي لوحة معلومات، وأي مقياس، ومن المستخدمون المتأثرون، وما النطاق الزمني، وما القرارات المتأثرة. وأحدد ما إذا كان الرقم خاطئًا، أم أن التحديث صحّح مشكلة سابقة. ثم أقارن المخرجات الجديدة بالإصدار السابق على مستوى الجدول، والقسم، وعدد الصفوف، وعدد القيم الفريدة، وإجماليات المقاييس، والشرائح الرئيسية. وأستخدم تتبّع مسار البيانات (lineage) لتحديد التغييرات في المراحل السابقة. وأفحص تغييرات الكود، وتغييرات المخطط، والفلاتر، وعمليات الربط، وإزالة التكرارات، ومنطق التواريخ. إذا كان المقياس خاطئًا ومستخدمو الأعمال متأثرين، أحتوي المشكلة بسرعة: أتراجع عن التحويل، أو أستعيد الإصدار السابق من الجدول، أو أعطّل لوحة المعلومات، أو أضيف تحذيرًا. ثم أجري تحليلًا للسبب الجذري، وأنفّذ التعبئة بأثر رجعي بالبيانات المصححة عند الحاجة. والتواصل لا يقل أهمية: أُبلغ أصحاب المصلحة بما تغيّر، وما المتأثر، ومستوى الثقة، والموعد المتوقع للإصلاح، وما إذا كانت القرارات السابقة تحتاج إلى مراجعة.
أسئلة متابعة محتملة
كيف تعرف أيّ الرقمين هو الصحيح: القديم أم الجديد؟
ما خيارات التراجع التي ينبغي أن تكون متاحة؟
كيف يساعد تتبّع مسار البيانات؟
تصميم أنظمة هندسة البيانات
تقيّم مقابلات تصميم أنظمة هندسة البيانات حسن تقديرك المعماري: المصادر، والاستيعاب، والتخزين، والتحويل، وتقديم البيانات، والجودة، وتتبّع المسار، والحوكمة، والتكلفة.
المنهجية: التتبع البرمجي ← الاستيعاب ← التخزين ← المعالجة ← النمذجة ← التقديم ← الحوكمة
أبدأ بالمتطلبات: حجم الأحداث، وزمن الاستجابة، والجهات المستهلكة، ومدة الاحتفاظ، وتطور المخطط، والخصوصية، والموثوقية. فأحداث تحليلات المنتج قد تغذي لوحات المعلومات، والتجارب، والتخصيص، وميزات تعلم الآلة. ترسل التطبيقات الأحداث عبر حزمة SDK، وتتضمن الأحداث الحقول event_name، user_id، session_id، timestamp، properties، إلى جانب إصدار التطبيق، والمنصة، والمعرّف المجهول (anonymous ID). ثم تنتقل الأحداث إلى واجهة API للاستيعاب أو جامع أحداث، ومنها إلى تدفق دائم مثل Kafka/Kinesis/Pub/Sub. وتُكتب الأحداث الخام في تخزين الكائنات لإتاحة إعادة التشغيل، وفي مستودع بيانات أو lakehouse للتحليلات. تشمل المعالجة التحقق من المخطط، وإزالة التكرارات، وتصفية الروبوتات والمستخدمين الداخليين، وتقسيم الجلسات، وتوحيد الهوية، والتحويل إلى جداول منمذجة مثل fact_events، fact_sessions، dim_users، إضافة إلى مستودعات فرعية خاصة بالمنتج. وقد تتعايش مسارات المعالجة الدفعية والمتدفقة بحسب متطلبات الحداثة. الجودة والحوكمة: عقود الأحداث، وسجل المخططات، والتعامل مع البيانات الشخصية المعرِّفة (PII)، وإنفاذ الموافقة، وتتبّع المسار، والملكية، وفحوص الحداثة، وتنبيهات الشذوذ في الحجم، والتوثيق. وتشمل طبقات التقديم لوحات معلومات ذكاء الأعمال، وتحليل التجارب، وأدوات reverse ETL، ومخازن الميزات. أما المفاضلات فتشمل تكلفة المعالجة الفورية مقابل الدفعية، والمخطط الصارم مقابل المرن، ومدة الاحتفاظ بالأحداث الخام، وتعقيد توحيد الهوية، ومقدار المنطق الذي ينبغي وضعه في مرحلة الاستيعاب مقابل مرحلة التحويل.
أسئلة متابعة محتملة
كيف تتعامل مع تطور المخطط؟
كيف تزيل التكرارات من الأحداث؟
ما الجداول التي سيستعلم عنها المحللون؟
المنهجية: اتساق الميزات الدفعية والفورية ← تعريفات الميزات ← الحداثة ← التقديم ← المراقبة
أرى أن مخزن الميزات يجب أن يوفر ميزات موثوقة وقابلة لإعادة الاستخدام في التدريب والتشغيل. وتشمل المتطلبات تعريفات الميزات، والصحة الزمنية (point-in-time correctness)، وبيانات التدريب الدفعية (offline)، والتقديم الفوري (online) بزمن استجابة منخفض، والحداثة، والتحكم في الوصول، والمراقبة. يمكن تخزين الميزات الدفعية في مستودع بيانات أو lakehouse، مقسّمة حسب التاريخ والكيان. أما الميزات الفورية فيمكن تقديمها من مخزن مفتاح-قيمة منخفض زمن الاستجابة. ويحفظ سجل الميزات (feature registry) البيانات الوصفية: اسم الميزة، والجهة المالكة، ومفتاح الكيان، ومنطق التحويل، واتفاقية مستوى الخدمة للحداثة (freshness SLA)، والجداول المصدر، والوصف. الصحة الزمنية أمر حاسم: يجب أن تستخدم بيانات التدريب قيم الميزات التي كانت متاحة وقت التنبؤ، لا قيمًا من المستقبل. ولضمان الاتساق بين المسارين الدفعي والفوري، أعيد استخدام منطق التحويل نفسه قدر الإمكان، أو أختبره بدقة إذا وُجدت خطوط بيانات منفصلة. وينبغي أن تغطي المراقبة حداثة الميزات، ونسب القيم الفارغة، وانجراف التوزيع، وزمن استجابة التقديم الفوري، والفجوة بين التدريب والتشغيل (training-serving skew)، والأثر على النماذج في المراحل اللاحقة. وتشمل الحوكمة ضوابط البيانات الشخصية المعرِّفة، وتتبّع المسار، وإيقاف الميزات القديمة، والملكية.
أسئلة متابعة محتملة
ما المقصود بالصحة الزمنية (point-in-time correctness)؟
كيف تتجنب الفجوة بين التدريب والتشغيل (training-serving skew)؟
ما الميزات التي تحتاج إلى تقديم فوري؟
الأسئلة السلوكية وأسئلة التعاون
تركز المقابلات السلوكية في هندسة البيانات على تحمّل مسؤولية بيئة الإنتاج، والاستجابة للأعطال، والتواصل مع الفرق متعددة التخصصات، وتحديد الأولويات، وبناء أنظمة تثق بها الفرق الأخرى.
المنهجية: الأثر ← الفرز الأولي ← الاحتواء ← السبب الجذري ← الوقاية
يُفضَّل اختيار عطل كان له أثر حقيقي: بيانات مفقودة، أو مقاييس خاطئة، أو تأخر في خط البيانات، أو سجلات مكررة، أو لوحة معلومات معطلة، أو مشكلة في ميزات أحد النماذج، أو أثر على المنتج في المراحل اللاحقة. ومن المهم البدء بتوضيح من تأثر ولماذا كان الأمر مهمًا. بعد ذلك يأتي شرح طريقة الفرز الأولي: السجلات، وحالة أداة التنسيق، وحداثة المصدر، وعمليات النشر الأخيرة، وتغييرات المخطط، وأعداد الصفوف، والأقسام، وتتبّع المسار، والتبعيات في المراحل اللاحقة. ثم وصف طريقة احتواء المشكلة: إعادة التشغيل، أو التراجع، أو إصلاح سريع، أو التعبئة بأثر رجعي، أو تحذير أصحاب المصلحة. وأقوى الإجابات تتضمن الوقاية: هل أضفت فحوصًا لجودة البيانات، أو تنبيهات، أو آليات لإعادة المحاولة، أو عقودًا للمخططات، أو كتابة ثابتة النتيجة، أو أدلة تشغيل، أو تتبّعًا للمسار، أو ضوابط أفضل للنشر؟ ومن المهم تجنب إلقاء اللوم على فرق المصادر، وإظهار تحمّلك المسؤولية عن النظام وعن التواصل. ويُستحسن الختام بما تعلمته عن الموثوقية، وكيف تغيّرت طريقة عملك بعد ذلك.
أسئلة متابعة محتملة
كيف أوضحت الأثر للجهات المعنية؟
ما الذي كان سيكشف المشكلة في وقت أبكر؟
كيف منعت تكرار المشكلة؟
المنهجية: التوضيح ← إعادة إنتاج المشكلة ← تتبّع المسار ← الحل ← التوثيق
أبدأ بتوضيح ما يبدو خاطئًا بالضبط: المقياس، والجدول، والنطاق الزمني، ولوحة المعلومات، والفلتر، والقيمة المتوقعة، والمبرر من منظور الأعمال. فعبارة «البيانات خاطئة» يجب أن تتحول إلى مشكلة يمكن إعادة إنتاجها. ثم أقارن استعلام المحلل أو لوحة المعلومات بالجداول المصدر وتعريفات النماذج. وأتحقق من مستوى التفصيل، والفلاتر، وعمليات الربط، والمناطق الزمنية، وحداثة البيانات، وتعريفات المقاييس، والتغييرات الأخيرة. وأستخدم تتبّع المسار لتعقّب التبعيات في المراحل السابقة. إذا كانت البيانات خاطئة فعلًا، أصلحها وأوضح الأثر. وإذا كانت صحيحة لكن التعريف يختلف عن المتوقع، نتفق على تعريف المقياس ونوثّقه. وإذا بقي شيء من عدم اليقين، أوضح ما هو معروف، وما يجري التحقق منه، وموعد عودتي بالمستجدات. فالعلاقة مهمة: المحللون عملاء لمنصة البيانات، والثقة تُبنى بالاستجابات السريعة والواضحة والقائمة على الأدلة.
أسئلة متابعة محتملة
ماذا لو كان المحلل يستخدم الجدول بطريقة غير صحيحة؟
كيف تمنع تكرار الالتباس؟
ما أكثر أنواع التوثيق فائدة؟
المنهجية: الأثر ← الموثوقية ← الإلحاح ← التبعيات ← قوة التأثير
أحدد الأولويات بناءً على أثر الأعمال، ومخاطر الموثوقية، ومدى الإلحاح، والتبعيات في المراحل اللاحقة، وقوة التأثير. فتعطّل خط بيانات الإيرادات أو مشكلة امتثال يتقدم عادةً على نموذج لوحة معلومات من الكماليات. وقد يتقدم تحسين في المنصة على طلب لمرة واحدة إذا كان يزيل العوائق أمام فرق كثيرة. كما أميّز بين الأعطال العاجلة، والعمل الاستراتيجي على المنصة، وطلبات أصحاب المصلحة، والدَّين التقني، والأعمال التشغيلية الروتينية المتكررة. فإذا اقتصر الفريق على معالجة التذاكر، تتراجع الموثوقية وجودة المنصة. وإذا انشغل فقط ببناء تجريدات المنصة، فقد تتعطل فرق الأعمال. وتتضمن عملية تحديد الأولويات القوية: الملكية الواضحة، واتفاقيات مستوى الخدمة (SLAs)، ومستويات الخطورة، والتوافق مع خارطة الطريق، والشفافية في المفاضلات. وأحرص على إيضاح ما يجري تنفيذه، وما أُجّل، وسبب ذلك، وما المخاطر المترتبة عليه.
أسئلة متابعة محتملة
كيف تبرر العمل على الدَّين التقني؟
ماذا لو أرادت القيادة لوحة معلومات بشكل عاجل؟
كيف توازن بين الأعطال وخارطة الطريق؟
التدرّب على هذه الإجابات في المقابلات المباشرة
يقدّم لك Interview Pilot اقتراحات إجابات من Copilot في الوقت الفعلي خلال مقابلاتك المباشرة، لتتمكّن من الإجابة بوضوح عند طرح هذه الأسئلة.