تشكل قصة المستخدم (User story) الوسيلة الأمثل للتعبير عن المتطلبات في المشروع الذي يعتمد على الإدارة الرشيقة (أجايل). لكن لهذه الوسيلة (أي قصة المستخدم) سمات يجب أن تتصف بها.
من أهم هذه الصفات التي تميز كتابة قصة المستخدم عن كتابة المتطلبات بالطريقة التقليدية أنها مختصرة وتركز على الهدف الذي يريد المستخدم النهائي تحقيقه.
ولكن كيف نضمن أن تكون قصة المستخدم مختصرة؟
ماهو الحجم المثالي لها؟
كيف يستطيع مالك المنتج تحديد الحجم المناسب لكل قصة؟
كون الحالة الأعم هي المعاناة من تضخم حجم قصة المستخدم، سأحاول ذكر بعض الأساليب المتبعة لتجزيء وتبسيط قصة المستخدم.
بداية لماذا يجب أن أسعى لتجزيء قصة المستخدم ؟
قصص المستخدم الكبيرة لها عدة مساوىء ومنها:
- يصعب القيام بوضع تقدير ومحاكمة كمية العمل اللازم لإنجازها، وغالباً ما ستتطلب زمناً أكثر لإنجازها
- ستصعب مهمة فريق التطوير في تجزيء العمل اللازم لها بين الفريق
- ستزيد احتمالية أن لا تنتهي ضمن دور العمل الواحدة (Sprint) وبالتالي يتم نقلها لدورة العمل التي تليها، بعبارة أخرى القصص الكبيرة سبب لزيادة احتمالية عدم إنهاء العمل في الموعد النهائي (Deadline)
- قصة مستخدم كبيرة يعني تأخر في الوصول لرأي الزبون وبالتالي زيادة في خطورة أن نبني شيئاً لايريده الزبون
- قصة مستخدم كبيرة يعني كتابة كود أكثر يعني احتمالية وجود أخطاء أكثر
- قصة مستخدم كبيرة يعني تأخر أكثر في وصولها لمرحلة الاختبار وبالتالي بطء في اكتشاف الأخطاء وبطء في حلها
إذن كتابة قصة مستخدم مختصرة له فوائد عديدة ولاشك أن الفائدة النهائية هي زيادة في جودة المنتج.
خاطرة! : كون كتابة قصة المستخدم تقع على عاتق مالك المنتج إذن هو أحد المسؤولين عن ضمان جودة المنتج
كيف أقوم بتجزيء قصة المستخدم؟
لندخل في صلب الموضوع!
سأذكر مثال عن قصة مستخدم شائعة جداً لضمان وصول الفكرة وسأستخدم الطريقة الشائعة لكتابة قصة المستخدم التي تدعى :
as a person [x] , I want to do [action] , so that [goal]
كمستخدم من نوع ما، أريد أن أقوم بعمل ما، لكي يتم الحصول على هدف أو نتيجة ما
المثال الشائع هو قصة المستخدم المتعلقة بتسجيل الدخول:
كمستخدم للنظام، أريد أن أقوم بتسجيل الدخول للنظام باستخدام بريدي الشخصي أو حسابي على الفيسبوك أوحسابي على شركة غوغل أو حسابي على تويتر، لكي أتمكن من الوصول إلى الموارد المتاحة لحساب المستخدم خاصتي بكل سهولة من أي حساب متوفر لدي على أي جهاز
الصورة التوضيحية التالية تحوي تصميم مبدئي لصفحة الويب الخاصة بهذه القصة
الحلول المقترحة لتبسيط قصة المستخدم أعلاه، أولاً يمكن تقسيمها بحسب الوظيفة إلى القصص التالية مع الحفاظ على بنيان القصة وسماتها الأساسية:
كمستخدم للنظام، أريد أن أقوم بتسجيل الدخول للنظام باستخدام بريدي الشخصي، لكي أتمكن من الوصول إلى الموارد المتاحة لحساب المستخدم خاصتي
كمستخدم للنظام، أريد أن أقوم بتسجيل الدخول للنظام باستخدام حسابي على الفيسبوك، لكي أتمكن من الوصول إلى الموارد المتاحة لحساب المستخدم خاصتي
كمستخدم للنظام، أريد أن أقوم بتسجيل الدخول للنظام باستخدام حسابي على شركة غوغل، لكي أتمكن من الوصول إلى الموارد المتاحة لحساب المستخدم خاصتي
كمستخدم للنظام، أريد أن أقوم بتسجيل الدخول للنظام باستخدام حسابي على تويتر، لكي أتمكن من الوصول إلى الموارد المتاحة لحساب المستخدم خاصتي
وهكذا يمكن إنجاز واختبار و عرض القصة على الزبون بشكل منفرد ، وسيكون تقييم العمل أسهل والمخاطر والعيوب المحتملة الناتجة عن التطوير أقل😎.
طريقة ثانية لتقسيم قصص المستخدم التي تحوي عدة مراحل كل مرحلة تؤدي إلى أخرى (Workflow):
لنبدأ بمثال شائع أيضاً وهو قصة المستخدم المتعلقة بتسجيل حساب جديد في موقع ويب مثلاً
كزائر للموقع من دون حساب، أريد أن أقوم بالتسجيل بالموقع عن طريق رقم الهاتف الخاص بي ثم سأقوم باستقبال رسالة نصية تحوي كود التحقق وسأقوم باضافته لتفعيل حسابي ثم سيقوم النظام بطلب تعبئة ما تبقى من معلومات اضافية في حسابي الشخصي مثل العمر و صورة شخصية و الاهتمامات و روابط وسائل الاجتماعي ثم في حال انهاء التسجيل سيتم تحويلي إلى الصفحة الرئيسية ،لكي أتمكن من الوصول إلى الموارد المتاحة لحسابي
مارأيك بهذه القصة أليست قصة طويلة 🙂 ويجب تجزيئها ؟
بهذه الحالة يجب أن نضمن بقاء الفائدة الأساسية للمستخدم النهائي وهي أن يتمكن من التسجيل والوصول للموارد المتاحة، وبعدها نستطيع إضافة باقي المراحل لعملية التسجيل بشكل تدريجي ومنفصل.
كزائر للموقع من دون حساب، أريد أن أقوم بالتسجيل بالموقع عن طريق رقم الهاتف الخاص بي ثم سأقوم باستقبال رسالة نصية تحوي كود التحقق وسأقوم باضافته لتفعيل حسابي ثم في حال التحقق بشكل سليم سيتم تحويلي إلى الصفحة الرئيسية ،لكي أتمكن من الوصول إلى الموارد المتاحة لحسابي
كزائر للموقع من دون حساب، أريد أن أقوم بالتسجيل بالموقع عن طريق رقم الهاتف الخاص وبعد التحقق من رقم الهاتف سأقوم بتعبئة ما تبقى من معلومات اضافية في حسابي الشخصي مثل العمر و صورة شخصية ثم سيتم تحويلي إلى الصفحة الرئيسية ،لكي أتمكن من الوصول إلى الموارد المتاحة لحسابي
كزائر للموقع من دون حساب، أريد أن أقوم بالتسجيل بالموقع عن طريق رقم الهاتف الخاص بي وبعد خطوات التحقق من رقم الهاتف و تعبئة العمر والصورة سأقوم بتعبئة الاهتمامات و روابط وسائل الاجتماعي ثم في حال انهاء التسجيل سيتم تحويلي إلى الصفحة الرئيسية ،لكي أتمكن من الوصول إلى الموارد المتاحة لحسابي
وبهذا تم تقسيم عملية تسجيل الحساب إلى ثلاثة قصص منفصلة يمكن تطويرها واختبارها بشكل منفصل تماماً، قد يصر الزبون على أن آلية التسجيل يجب أن تكون كاملة قبل رفع التعديلات الى المخدم وهذا مقبول ولا يتضارب مع آلية التقسيم من حيث المبدأ😎.
لأن من مبادىء الأجايل هو الوصول في نهاية كل دورة عمل إلى منتج بقصص مستخدم مكتملة قابلة للعرض على المستخدم النهائي من حيث المبداً.
تسليم برمجيات صالحة للاستعمال على فترات منتظمة، من أسبوعين إلى شهرين، مع استحسان المدة الزمنية الأقصر.
Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.
إعلان أجايل
المهم أن تكون صالحة للاستعمال أما قرار رفع التعديلات على المخدم الرئيسي فيمكن تأجيله حتى يتم إكمال كل القصص المرتبطة أعلاه
لا تجزء قصة المستخدم إلى أجزاء تقنية!
بعض الفرق تقوم بتقسيم القصة إلى أجزاء تقنية، قصة لتطوير واجهات الويب، وأخرى لبناء الجداول مثلاً في قاعدة البيانات وأخرى ثالثة لتطوير أكواد الخلفية مثلاً، لكن في ذلك سلبية كبيرة:
- أساس قصة المستخدم أن تؤدي إلى هدف محدد يريده المستخدم النهائي، ويساهم برفع قيمة للمنتج وهذا الأمر لايمكن في المثال أعلاه
- لايمكن اختبار قصة المستخدم من هذا النوع بشكل منفصل عن غيرها وبالتالي يجب إنتظار أن تنتهي باقي القصص المرتبطة بها
- يوجد احتمالية حدوث أخطاء عند دمج الأكواد الناتجة عن قصص تقنية مرتبطة ببعضها
- ستساهم في عزل المبرمجين عن بعضهم البعض فكل شخص سيعمل بقصة منفصلة وستقلل من التواصل والتعاون بينهم
- الغرض الأساسي من التجزيء هو تقليل المخاطر و السرعة بالإنجاز، وهذا النوع لن يقلل من المخاطر بل سيزيدها ولن يسرع من الإنجاز بل سيقلله
إذن لايفضل أبداً تجزيء قصص المستخدم إلى قصص تقنية لاتحمل هدف واضح من وجهة نظر المستخدم النهائي
هل لديك طرق أخرى لتجزيء قصص المستخدم؟