سنوي ادفع سنويًا واحصل على شهرين مجانًا في كل خطة مدفوعة. عرض الخطط
تسجيل الدخول ابدأ مجانًا

صفحة الاستهلاك أظهرت رقمًا أعلى، ولم يتحرك أي مال

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

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

ما تعطّل كان رقمًا على الشاشة. في بعض الحسابات، كان تفصيل الاستهلاك في صفحة حسابك يعرض رقمًا أعلى — وفي أسوأ حساب قِسناه، 2.4 ضعف الدفتر الذي يُفترض أن يلخّصه. الدفتر نفسه كان صحيحًا طوال الوقت. وكذلك السقوف الشهرية، التي تُقرأ من مكان آخر تمامًا. كان عيبًا في العرض، وقد أُصلح، وهذا سببه.

مفتاح يبحث عن شيء لم يكتبه أحد

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

الخطر في هذا الترتيب هو أداء العمل نفسه مرتين، لأن الوسيط يعيد تسليم الرسالة نفسها بسرور بعد أي تعثّر. الدفاع هو صندوق وارد: قبل المعالجة، يطالب المستهلك بالرسالة عبر كتابة سطر يحمل مفتاح تلك الرسالة، ويجعل فهرس فريد أي مطالبة ثانية مستحيلة.

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

أسطر المطالبة لم تكن تحمل أي معرّف مستأجر إطلاقًا. كلها فارغة، وكانت كذلك منذ البداية. توثيق الكيان نفسه كان يؤكد، بهذه الكلمات، أن إطار العمل يختمه عند الإدراج. لم يفعل ذلك أبدًا. قياسًا على بيئة الإنتاج يوم اكتشافنا: كل الأسطر الـ3344 في صندوق الوارد فارغة، بينما 1174 من أصل 1451 سطرًا في الجانب المُنتِج تحمل مستأجرًا حقيقيًا — وهذا بالضبط سبب عدم اشتباه أحد بالجانب القارئ.

فكان البحث يطلب (المستأجر، المفتاح)، والسطر المخزَّن هو (لا شيء، المفتاح)، ولا يمكن أن يتطابقا أبدًا.

لم يفشل شيء، ولهذا استمر أسابيع

بحث لا يمكن أن يتطابق أبدًا يبدو كشيء يُفترض أن يرفع خطأً من المحاولة الأولى. لكنه فعل العكس.

قررت المطالبة أن الرسالة جديدة. ثم اصطدم الإدراج بالفهرس الفريد ورُفض بوصفه تكرارًا — وهو رفض صحيح، لأن السطر كان موجودًا بالفعل. التقط فرعٌ احتياطي هذا الرفض وقرأه بحسن نية: لا بد أن تسليمًا آخر طالب بهذه الرسالة، فلا شيء نفعله هنا. بقي المظروف في حالة «لم يُعالَج بعد»، ولأنه لم يُعالَج بعد، التقطه التسليم التالي وأعاد العمل من جديد.

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

ما الذي تعطّل فعليًا

من بين هؤلاء المستهلكين الستة والعشرين، أربعة يراكمون بدل أن يكتبوا فوق البيانات. هؤلاء الأربعة هم إسقاطات الفوترة التي تقرأها صفحة الاستهلاك، وهناك ظهر الأمر.

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

ما لم يمسّه هذا يستحق تعدادًا دقيقًا، لأن «إسقاط الفوترة» يبدو مقلقًا بينما الوقائع ليست كذلك:

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

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

النصف الذي لم ينظر إليه أحد

البحث المعطوب نفسه كان في موضع ثانٍ: المسار الذي يعمل عند فشل رسالة. هناك لم يكن يجد أبدًا السطر الذي يفترض تحديثه، وتحته مباشرة كان يجلس فرع يحمل تعليق «غير قابل للوصول عمليًا» — وهو يعيد «هذا الفشل نهائي» عند كل فشل.

فلم يتقدم عدّاد إعادة المحاولة قط، ولم تصل أي رسالة مسمومة إلى طابور الرسائل الميتة. طبقة كاملة من معالجة الأخطاء كانت مُطفأة، خلف تعليق يخبر كل من يقرأه أنه لا يوجد هنا ما يُفحص.

الإصلاح

صار البحثان الآن يعتمدان مفتاح الرسالة داخل مجموعة المستهلكين، وهو ما يفرضه الفهرس الفريد أصلًا. مفاتيح الرسائل مشتقة من معرّف الشيء الذي أنتجها، فلا يمكنها التصادم بين المستأجرين بحكم التصميم.

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

تسعة اختبارات تثبّت السلوك. ستة منها تفشل مع الكود القديم، وهو ما أكدناه بإعادة الكود القديم مكانه.

التنظيف بعد ذلك

الأسطر المنتفخة تصلح نفسها. هناك عامل يعيد بناء الملخصات اليومية من الدفتر كل ساعة، عبر نافذة يومين. كان يعمل طوال الوقت ويخسر: مرة كل ساعة في مواجهة مستهلك يعيد التطبيق كل خمس وأربعين ثانية ليس سباقًا عادلًا.

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

ما خرجنا به

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

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