ما هو الفرق بين الـ releases والـ iterations في منهجية عمل الـ Agile؟

أو بتعبير آخر: ما هو الفرق بين الـ increment development والـ iterative development في منهجية عمل الـ Agile؟

كلمة release تمثل دورة عمل بالتطوير ينتج عنها مخرجات (إصدارات) للنظام أو البرامج المطلوب للعميل. (وكلمة increment فيها معنى الإضافة أو الازدياد أو باللسان العربي الأصيل الـ "الفضل")

بينما كلمة iterate فيها معنى الإعادة والتكرار أي معنى "دورة عمل" كذلك، ولكن يا ترى كيف تختلف عن دورة الـrealse في منهجية التطوير آجيل؟

ما الفرق هنا يا ترى حقا بالفعل؟

تصور معي هذا السيناريو البسيط:

أنت رسام ويأتيك عميل يريدك أن ترسم له لوحة زيتية لقصره بالريف المصري مثلا على ضفاف النيل ثم يشرع لك في شرح مواصفات (متطلبات) محتوى الصورة كما يتصورها وكما يريدها ويدفع فيها هذا القدر من المال.

فأنت ماذا ستفعل؟

أنت رسام أجيل وتعي أن التواصل السريع المستمر مع العميل مهما للغاية حتى تأخد منه feedback أولا بأول حتى لا تنغمس في عمل يستغرق وقتا وجهدا طويلا بعيد عن العميل ثم لما تريه العمل تفاجيء أنه ليس سعيدا بمخرجات العمل (ليس الذي ينتظره أو أن خطا ما في المواصفات أو حتى غير رأيه بعدما اطلع على صور أو أفكار أخرى وهكذا) 

جميل أنت "أجيلي" صميم وتفهم هذا وتحرص عليه (لابد من التواصل المتواصل مع العميل أولا بأول) ولكن السؤال هنا بقى:

كيف تقسم الشغل؟

ما هي التقسيمات التي سوف تقسمها بحيث تري العميل جانبا منها بكل لقاء مرتقب؟ (وركز معي جيدا هنا بسم الله)

هل تقسم اللوحة والتي ستحوي جانبا من القصر مع حديقته مع إطلالته على النيل إلخ، هل ستقسمها أسداسا مثلا فتجعل سُدسا لشرفة القصر، وسدسا لسلالم المدخل تحتها، وسدسا فيه جزء من الحديقة وهكذا. أسداسا فيه الرسم والألوان والزيت بالجودة والإخراج النهائي (بحيث إذا أعجبته قد يستلمها جزءا جزءا ويستخدمها في بيئة التشغيل أي يعلقها على حائط القصر؟) (وهذا مفهوم الـ release أنك تسلم العميل جزءا جزءا من المنتج ككل جزءا كامل التشغيل جاهز للإنتاج والعمل) 

ولكن ماذا إذا رفض الباشا العميل releaseتك هذه فتضطر أن ترميها بالألوان والزيوت والتكاليف المادية والمعنوية التي بذلت فيها!؟

فالأوقع أنك إذًا تقسم شغلك أن تبدأ ترسم اللوحة (كاملة) ولكن على هيئة سكيتش بالقلم الرصاص والظلال الطفيفة (بعمل تبذل فيه جهدا بسيطا لا تتعلق به أنت وتتعب) ثم تريه ياه بغرض مراجعات الأفكار والأطروحات وتراجع مفاهيم المتطلبات التي طلبت نظريا فتأخذ منه feedback مبدئي على ذلك؟ 

ثم لما تنتهي معه من هذا الاسكتش (ممكن بعد عدة مرات عادي) ستدخل في iteration جديدة تركز فيها على إدخال الألوان مثلا ومن ثم تأخد رأيه في اختيار الألوان وتناسقها إلخ، وقد تأخذ منك عدة iterations.

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

فغرض الـ releases هو الـ delivery تطور المنتج وتسلمه للعميل أجزاء كاملة شغالة جاهزة للعمل يستفيد منها (ولا ينتظر طوال فترة المشروع ككل ليفعل ذلك) 

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

وهكذا ففي الأجيل الأصلي: الـrelease الواحدة (والـ increment) تقسم داخليا إلى عدة iterations. 

فها إذا وضحت الفكرة الآن شيئا واستبان الفرق ولو بشكل مبدئي فأخبرنا كم نسبة هذا وذاك في مشاريع عملك التقني على المستوى الفردي أو المؤسسي؟ (أو ماذا تنوي أن تخطط له وتراعيه لهذا المفهومين المتباينين مستقبلا إن شاء الله؟)