مقابلة تصميم الأنظمة: صمّم Twitter

«صمّم Twitter» هي المسألة الكلاسيكية لتوليد الموجزات. تبدو بسيطة — نشر تغريدة، قراءة خط زمني — لكن الجزء المثير للاهتمام هو توليد الخط الزمني الرئيسي لكل مستخدم على نطاق واسع، حيث تكون الإجابة الصحيحة استراتيجية تفرّع هجينة. يريد القائم بالمقابلة أن يراك تكتشف أن كلا النهجين البسيطين يفشلان، وتستدل حتى تصل إلى المزيج.

تقدّم بتعمد: وضّح المتطلبات، قدّر نسبة القراءة إلى الكتابة، صمّم تخزين التغريدات، ثم الخط الزمني — مقارنًا بين التفرّع عند الكتابة والتفرّع عند القراءة، والوصول إلى الهجين الذي يعالج مشكلة المشاهير. يتبع الشرح أدناه هذا المسار.

1. توضيح المتطلبات

حدّد النطاق عند مسألة الموجز الأساسية. يقوم المستخدمون بنشر تغريدات، ومتابعة آخرين، وقراءة خط زمني رئيسي يدمج تغريدات كل من يتابعونه، من الأحدث إلى الأقدم.

  • وظيفي: نشر تغريدة، متابعة/إلغاء متابعة، الخط الزمني الرئيسي (من تتابعهم)، الخط الزمني للمستخدم (كاتب واحد)؛ البحث الأساسي خارج النطاق إلا إذا طُلب.
  • غير وظيفي: مكثف القراءة جدًا، قراءات خط زمني منخفضة الكمون، توافر عالٍ؛ الاتساق النهائي للخط الزمني مقبول.
  • يحتاج إلى توضيح: الوسائط، الردود/السلاسل، والترتيب — أقرّ بها، وحدّد موجزًا زمنيًا تسلسليًا لهذه الجولة.

2. تقدير الحجم ونسبة القراءة إلى الكتابة

هذه النسبة توجّه التصميم بالكامل. القراءات تتجاوز الكتابات بكثير — يتنقّل المستخدمون في خطهم الزمني أكثر بكثير من نشرهم. مع مئات الملايين من المستخدمين، يجب أن يجعل النظام قراءات الخط الزمني رخيصة، حتى لو جعل ذلك الكتابة أكثر تكلفة. هذه الملاحظة الواحدة تشير إلى حساب الخطوط الزمنية مسبقًا.

3. تخزين التغريدات

التغريدات نفسها بيانات بسيطة وكثيفة الإضافة. خزّنها في مخزن مقسّم أفقيًا، بمفتاح هو رقم التغريدة (مع رقم قابل للترتيب زمنيًا مثل Snowflake ID لكي يكون الترتيب مضمّنًا). مخزن منفصل للرسم البياني الاجتماعي يحتفظ بعلاقات المتابعين/المتابَعين.

  • التغريدات: مخزن موزّع، مجزّأ برقم التغريدة؛ الأرقام القابلة للترتيب زمنيًا تمنح ترتيبًا زمنيًا رخيصًا.
  • الرسم البياني الاجتماعي: من يتابع من، مُحسَّن لـ «جلب جميع متابعي X» و«جلب جميع من يتابعهم X».
  • ذاكرة تخزين مؤقت (Redis) تحتفظ بالبيانات النشطة — التغريدات الأخيرة والخطوط الزمنية المحسوبة مسبقًا.

4. توليد الخط الزمني: التفرّع عند الكتابة مقابل عند القراءة

هذا هو جوهر المسألة. التفرّع عند الكتابة (دفع) يُدرج كل تغريدة جديدة في قائمة الخط الزمني المحسوبة مسبقًا لكل متابع وقت النشر — تصبح قراءات الخط الزمني بحثًا رخيصًا في ذاكرة التخزين المؤقت، لكن منشورًا من شخص لديه ملايين المتابعين يُطلق ملايين عمليات الكتابة. التفرّع عند القراءة (سحب) يبني الخط الزمني وقت القراءة بدمج التغريدات الأخيرة من كل من تتابعهم — كتابة رخيصة، لكن قراءة بطيئة وغالية للمستخدمين الذين يتابعون حسابات كثيرة.

  • التفرّع عند الكتابة: قراءات سريعة، كتابة غالية؛ مناسب للمستخدمين العاديين.
  • التفرّع عند القراءة: كتابة رخيصة، قراءات غالية؛ ضروري للحسابات ذات أعداد متابعين ضخمة.

5. مشكلة المشاهير والنهج الهجين

لا ينجح أي نهج نقي بمفرده، فامزج بينهما. استخدم التفرّع عند الكتابة للغالبية العظمى من المستخدمين، لكن بالنسبة للحسابات «المشهورة» ذات أعداد المتابعين الضخمة، لا تفرّع تغريداتهم عند الكتابة. بدلًا من ذلك، وقت القراءة، ادمج الخط الزمني المحسوب مسبقًا للمتابع مع سحب مباشر لعدد قليل من المشاهير الذين يتابعهم. هذا يحدّ من تضخم الكتابة بينما يحافظ على سرعة القراءة — وهذه الإجابة التي يستمع إليها القائمون على المقابلات.

6. مقايضات يجب التصريح بها

اختم بذكر التوترات: تضخم الكتابة مقابل كمون القراءة (قرار التفرّع بالكامل)، تكلفة تخزين الخطوط الزمنية المحسوبة مسبقًا مقابل إعادة حسابها، والاتساق — تأخير بضع ثوانٍ قبل ظهور تغريدة في خطوط زمنية المتابعين مقبول، فالاتساق النهائي يتيح لك التوسع. ذكر عتبة النهج الهجين بوضوح (كيف تصنّف «المشهور») يُظهر حكمًا على مستوى أعلى.

تدرّب على تصميم نظام Twitter بمساعدة فورية

يمكن لـمساعد مقابلات تصميم الأنظمة من Natively أن يحافظ على تنظيمك خلال جولة مباشرة — يقترح البُعد التالي الذي يجب تغطيته ويعرض المقايضات في الوقت الفعلي، كل ذلك على جهازك الخاص.

Put it on your own machine.

A live-conversation assistant that runs locally. Nothing leaves your machine.

macOS 12+ · Windows 10/11

© 2026 Natively AI Private Limited

Source-available under the Natively Personal Use Source License v1.0 · IP geolocation by DB-IP