CVAIWriter

    مطور/ة Back Endإجابات المقابلة

    أسئلة مقابلة شائعة

    A.

    أتبع مبادئ REST: الموارد أسماء (وليس أفعال)، وURIs هرمية وتمثل علاقات الموارد، وتُستخدم طرق HTTP منطقياً (GET للقراءة، POST للإنشاء، PUT/PATCH للتحديث، DELETE للإزالة). أُراعي إصدار الواجهات منذ البداية (/v1/) لتمكين التطور دون كسر التوافق. أصمم صيغ استجابة متسقة، وأكواد خطأ، وأنماط ترقيم الصفحات. أوثق باستخدام OpenAPI/Swagger. أفكر في احتياجات العميل أثناء التصميم — واجهة برمجة تقنية صحيحة لكنها صعبة الاستخدام تعتبر واجهة سيئة. كما آخذ في الاعتبار تحديد المعدل (rate limiting)، المصادقة، والتحقق من المدخلات كقضايا من الدرجة الأولى.

    A.

    أصمم المخططات (schemas) اعتماداً على أنماط الوصول — أعتمد التطبيع (normalising) بشكل افتراضي، وألجأ إلى عدم التطبيع (denormalising) عندما يتطلب أداء الاستعلام ذلك. أستخدم المؤشرات (indexes) استراتيجياً: كل استعلام بطيء يحصل على خطة تفسير (explain plan)، وتُضاف المؤشرات بناءً على الانتقائية وتكرار الاستعلامات. أتجنب مشكلة N+1 من خلال تصميم التحميل المبكر (eager loading) في طبقة البيانات. أكتب الترحيلات (migrations) بعناية — تغييرات متوافقة مع الإصدارات السابقة حيثما أمكن، واستراتيجيات النشر الأزرق-الأخضر (blue-green deployment) للتغييرات التي تكسر المخطط. كما أصمم من أجل تكامل البيانات: قيود المفتاح الأجنبي (foreign key constraints)، قيود عدم السماح بالقيم الفارغة (not-null constraints)، وقيود الفحص (check constraints) تفرض الاتساق على مستوى قاعدة البيانات.

    A.

    أصمم خدمات بدون حالة (stateless) منذ البداية — الحالة تُخزن في قاعدة البيانات أو الكاش، وليست في ذاكرة التطبيق. أستخدم المعالجة غير المتزامنة (async) عبر قوائم الرسائل: RabbitMQ، Kafka، SQS للعمليات التي لا تحتاج أن تكون متزامنة. أطبق الكاش بشكل مكثف في الطبقة المناسبة: نتائج استعلامات قاعدة البيانات (Redis)، التجميعات المحسوبة، والموارد الثابتة. أصمم واجهات برمجة قابلة للتوسع أفقياً وأفضّل الخدمات المدارَة (RDS، ElasticCache) التي تتوسع بشكل مستقل. كما أصمم مع مراعاة تحديد المعدل ومعالجة الضغط العكسي (backpressure) — يجب أن تتدهور الخدمات بشكل رشيق تحت الحمل.

    A.

    المصادقة: OAuth 2.0 / OIDC لمصادقة المستخدم، ومفاتيح API أو JWT للتواصل بين الخدمات. أتحقق وأنقح كل المدخلات — لا إنشاء SQL مباشر من مدخلات المستخدم. أطبق تحديد المعدل والاختناق (throttling) لمنع الإساءة. أستخدم HTTPS/TLS في كل مكان وأفرض التحقق من الشهادات. أطبق مبدأ الأقل صلاحية: لكل خدمة ومستخدم الحد الأدنى من الأذونات المطلوبة. أقوم بتدقيق استخدام الصلاحيات. أفحص التبعيات بحثاً عن ثغرات (OWASP Dependency-Check، Snyk) ضمن CI. وأسجل أحداث الأمان — محاولات المصادقة الفاشلة، تصعيد الصلاحيات — مركزياً للمراقبة.

    A.

    أتبع مبدأ أن الأخطاء يجب تسجيلها، وتصنيفها، وإرجاعها بشكل ذي معنى. أستخدم السجل المهيكل (JSON) بمستوى تسجيل مناسب ليكون من الممكن الاستعلام عن السجلات. أنفذ تتبع موزع (OpenTelemetry) حتى يمكن تتبع الطلبات عبر الخدمات. أحدد أكواد الأخطاء بشكل متسق عبر الواجهة وأوثقها. أعد تنبيهات على شذوذ معدل الأخطاء، وليس فقط المقاييس التقنية مثل CPU. في معماريات الخدمات المصغرة (microservices)، أطبق قواطع الدائرة (circuit breakers) مثل Resilience4j أو Hystrix لمنع فشل السلسلة عندما تكون إحدى التبعيات متدهورة.

    A.

    بنيت وحافظت على كلاهما. المونوليثات (Monoliths) مُستهان بها أحياناً: فهي أبسط للتطوير والاختبار والنشر، ومعظم الفرق لا تحتاج microservices حتى تواجه قيوداً محددة في التوسع أو تنسيق الفرق. عندما انتقلت إلى microservices، طبقت نمط Strangler Fig — استخراج الخدمات تدريجياً من مونوليث عامل بدلاً من تفكيك شامل دفعة واحدة (big-bang). الخدمات المصغرة تُدخل تعقيداً تشغيلياً كبيراً (مثل اكتشاف الخدمات، والتتبع الموزع، وأنماط فشل الشبكة، وتناسق البيانات عبر الخدمات) — لا أقبل هذا التعقيد إلا عندما تفوق الفوائد بوضوح التكاليف.

    A.

    أكتب اختبارات وحدة (unit tests) للمنطق التجاري بشكل معزول (مع محاكاة قاعدة البيانات والتبعيات الخارجية). أكتب اختبارات تكاملية تتحقق من الخدمة مقابل قاعدة بيانات حقيقية (اختبارية) — هذه تختبر دورة الطلب-الاستجابة كاملة وتكتشف أخطاء SQL، ومشكلات أداء الاستعلامات، ومشاكل مطابقة البيانات التي تغفلها اختبارات الوحدة. أستخدم اختبار العقود (contract testing) مثل Pact عندما تنشر الخدمات واجهات استهلاك من قبل فرق أخرى. أكتب أيضاً اختبارات تحميل (k6، Locust) للنهايات الحرجة للأداء. تغطية الاختبارات ذات معنى فقط إذا كانت الاختبارات ستكتشف أعطالاً حقيقية.

    A.

    صممت أنظمة مدفوعة بالأحداث باستخدام RabbitMQ وApache Kafka. أفهم المقايضات: التسليم على الأقل مرة (at-least-once) مقابل التسليم بالضبط مرة واحدة (exactly-once)، نماذج مجموعات المستهلكين (consumer group patterns)، قوائم الرسائل الميتة (dead letter queues)، وضمانات ترتيب الرسائل. أصمم مخططات الرسائل بعناية — تطور المخطط المتوافق مع الإصدارات السابقة ضروري في الإنتاج. أنفذ مستهلكين متسامحين مع التكرار (idempotent) حتى لا تتسبب الرسائل المكررة في تلف البيانات. أراقب عمق الطابور (queue depth) وتأخر المستهلك (consumer lag) كمقاييس تشغيلية رئيسية. المعماريات المعتمدة على الأحداث تُمكّن من قابلية توسع وفصل عاليين، لكنها تتطلب إدارة مخططات صارمة ومعالجة للخطأ.

    هل أنت مستعد لإنشاء سيرتك الذاتية؟

    ارفع سيرتك الذاتية ووصف الوظيفة لإنشاء نسخة مخصصة في أقل من 60 ثانية.

    احصل على إجابات مقابلة مخصّصة لطلب التوظيف الخاص بك

    قم بتحميل سيرتك الذاتية و/أو وصف الوظيفة