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



