الأحمال الثقيلة وبروفتك

البروفة: صمّم من الصفر

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

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

المشاوير: مليون يومياً ÷ 86,400 ≈ 12 حدث مشوار في الثانية كمتوسط؛ وعند ذروة مسائية بعشرة أضعاف، ‏~120/ثانية — قاعدة بيانات قوية واحدة لا تهتم. المواقع هي الوحش: 500 ألف سائق نشط يرسل كل منهم ping كل 4 ثوانٍ ≈ 125,000 كتابة في الثانية، باستمرار، طوال اليوم. والركاب يستعلمون عن المواقع أيضاً، فتصل القراءات على البيانات نفسها إلى مئات الآلاف في الثانية. التخزين هامش صغير — 100 بايت للـping × 125 ألف/ثانية ≈ 1 TB يومياً، أكثره بلا قيمة بعد دقائق. الخلاصة: بيانات المواقع لا يمكن أن تلمس قاعدة البيانات الرئيسية.

المبدأ

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

الخطوة 3 — الرسم

ستة صناديق. تطبيقا الراكب والسائق يتحدثان إلى طبقة API. خدمة مواقع تبتلع إشارات الـping في geo index وتجيب عن «من قريب من هذه النقطة؟». خدمة مطابقة تستقبل الطلب، تستعلم الـgeo index، وتعرض المشوار على السائقين بالترتيب. خدمة مشاوير تملك الرحلات في قاعدة بيانات علائقية — مطلوبة، جارية، مكتملة. والدفع والإيصالات تنطلق بشكل asynchronous عبر queue عند اكتمال المشوار، بينما تتدفق المواقع الحيّة إلى التطبيقين عبر اتصالات WebSocket. كل صندوق هو نمط تملكه مسبقاً.

الخطوة 4 — الغوص العميق: المطابقة مشكلة جغرافية

أصعب سؤال يختبئ داخل المطابقة: جِد السائقين المتاحين ضمن 2 كم، بسرعة. المسح الساذج يحسب المسافة إلى 500 ألف سائق مع كل طلب — ميت قبل أن يولد. الـgeohash يرمّز الإحداثي كنصّ تتشارك فيه النقاط المتقاربة بادئات مشتركة، فيصبح «السائقون القريبون» بحثاً عن بادئة، تضيف إليه الخلايا الثماني المجاورة لالتقاط الحالات الحدّية. والـquadtree يطبّق الفكرة نفسها مكانياً: قسّم الخريطة أرباعاً بشكل متكرر، واحفظ السائقين في الخلايا الطرفية، فيهبط البحث في الفروع المهمة فقط. كلاهما يحوّل مسحاً بحجم O(كل شيء) إلى بحث بحجم O(المحيط القريب).

المبدأ

في قاعة المقابلة، لن تصمّم مكتبة geohash من الصفر. تقول: PostGIS إن كان يعيش داخل القاعدة العلائقية، أو Redis GEO إن كان في الذاكرة، أو S2 إن كان الفريق يشغّله أصلاً — وتصرف دقائقك على المقايضة المهمة: ما مدى حداثة «القريب»، وماذا يحدث حين لا يردّ السائق المُطابَق أبداً. أن تعرف أن الأداة الأولية موجودة، وكم تكلّف، هي حركة المهندس المتمرّس.

تحقّق سريع

سؤال واحد يلخّص الدورة كلها: أمامك 45 دقيقة وسبورة بيضاء، ماذا تفعل — وما المبادئ التي يجب أن تسكن رأسك سلفاً؟ (نفّذ المنهجية بالترتيب: حدّد المتطلبات، قدّر بـ86,400 ثانية في اليوم ونِسَب صادقة، ارسم الصناديق، ثم اغُص في أصعبها. واحمل المبادئ: ضع cache لأسخن 20% التي تولّد 80% من القراءات، وضع CDN أمام المحتوى الثابت والشائع، ولا تلجأ إلى sharding إلا حين يعجز جهاز واحد عن استيعاب الكتابات أو البايتات، واضبط الـquorum بقاعدة R + W > N حين يجب أن ترى القراءاتُ الكتاباتِ، واختر بين الـfanout الدفعي والسحبي بحسب أين يجب أن تقع كلفة الكتابة. المنهجية هي الجواب؛ والأرقام وقودها.)

الخلاصة

خمس وحدات، وقوس واحد: أسس التوسّع علّمتك لماذا تنحني الأنظمة؛ والمنهجية أعطتك الخطوات الأربع؛ وأدوات البيانات الموزعة الأولية منحتك التكرير والتقسيم والإجماع؛ وأنظمة بحجم المنتجات أرَتْك الأنماط وهي تعمل معاً؛ والمهام الثقيلة — مع هذه البروفة — أثبتت أن الحركات تنتقل إلى سؤال لم تره من قبل. السبورة لم تكن الموضوع قط. حُكمك المهني هو الموضوع.

📌 افعل هذا الاثنين

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

الأحمال الثقيلة وبروفتك