سر عداء الـ Backend والـ Frontend !
السلام عليكم ورحمة الله وبركاته
المقدمة
في عالم البرمجة، هناك علاقة غريبة بين مطوري الـ Backend ومطوري الـ Frontend
أحيانًا تشعر وكأنهما في معسكرين منفصلين، كل منهما يعمل بشكل مستقل دون أن يكون هناك تواصل حقيقي بينهما
وكل منهما يعتقد أن الآخر هو السبب في المشاكل التي تواجه المشروع
وكلايهما يظن أنه أهم شخص في الفريق وتجد من يقول أن الـ Backend هو أساس كل شيء، ومنهم من يقول أن الـ Frontend أهم شيء في المشروع
حتى وإن كانت الشركة بها مطور Backend واحد ومطور Frontend واحد فقط، تجد بينهما صدامات ومشاكل في التواصل
وتجد هذا يحمل فأسه الحادة أينما ذهب والآخر يسن سيفه ويجهز للمعركة
فما سر هذا العداء المستمر وكيف نستطيع أن نحد من هذا الأمر ونحله
وكيف تتعامل الشركات أو الفرق البرمجية مع هذا التحدي ؟
في هذه المقالة المميزة، سأشارككم تجربتي الشخصية في هذا الموضوع
المقالة مميزة لأنها ليست من منظوري الخاص فقط، بل شارك في هذه المقالة مجموعة من المطورين
من خلال آرائهم وتجاربهم الشخصية في هذا الموضوع
هذه المقالة ستوفر عليك تكلفة شراء الفأس والسيف وتعلمك كيف تتعامل مع الطرف الآخر كشريك وليس كعدو
لماذا يحدث الصدام ؟
في البداية لدينا العديد من النقاط التي يجب أن نفهمها جيدًا
وكل نقطة تمثل جانب من جوانب المشكلة
من هذه النقاط:
- انعزالية الطرفين
- جهل طبيعة عمل الطرف الآخر والصعوبات التي يواجهها
- عدم فهم مسؤوليات كل طرف
- غياب النقاش المبكر قبل التنفيذ
- التعامل مع الـ
User Storyأو المطلوب من زاوية واحدة فقط - عدم وضوح الـ
APIأو طريقة التعامل معها - التغييرات المفاجئة في الـ
APIأو الـUI - غياب المعايير الموحدة أي عدم اتباع الـ
Standards - الأنانية والكبرياء واتهام الطرف الآخر
هذه أهم النقاط التى أراها تسبب هذه المشكلة
وسأحاول توضيحها في أربع محاور رئيسية وهى:
- فهم دور كل طرف والصعوبات التي يواجهها
- التعامل مع الـ
User Storyمن زاوية واحدة - التغييرات المفاجئة وكيفية التعامل معها
- غياب المعايير الموحدة
Standards
فهم دور كل طرف والصعوبات التي يواجهها
من المهم أن نفهم طبيعة عمل كل طرف ودوره في المشروع
وما الصعوبات التي يواجهها في عمله لنعرف كيف يمكن لكل منهما أن يدعم الآخر
فكرة أن كل طرف سواء كان مطور Backend أو Frontend يعمل في فراغ منفصل عن الآخر هي فكرة خاطئة تمامًا
دعونا نسمع أراء أحد الأصدقاء حول هذا الموضوع ونتناقشها
أظن أن سبب وجود المشكلة بين الاثنين هو جهل كل طرف بمهمة الطرف الآخر
- فتجد أن الـ
Backendيقوم بإرجاع الـAPI Responseبالشكل الذي يراه مناسبًا دون مراعاة قدرة الـFrontendعلى التعامل معه
فينتج لناAPI Responseغير مرن أو معقد جدًا أو يحتاج إلى عمليات حسابية كثيرة في الـFrontend- في حالة ارجاع الـ
Backendللبيانات بشكل مرن وبسيط تجد أن الـFrontendأحيانًا يستسهل أن يقوم ببعض العمليات والـmappingفيطلب من الـBackendأن يرجع البيانات بشكل مخصص جدا بما يتناسب مع هوى الـFrontendوينتج لناAPI Responseغير مرن ومعقد أو مخصص جدًا لاحتياج واحد يتناسب مع شكل معين في الـUI
وهذا الكلام صحيح جدًا ونقطة مهمة جدًا تحتاج لتفصيل
يجب أن نعرف هنا أنه ليس هناك ضرر في أن يكون لدى الـ Backend معرفة بطبيعة عمل الـ Frontend والعكس صحيح
ليعرف كل منهما كيف يفكر الآخر وما هي الصعوبات والتحديات التي يواجهها في عمله
وما هي الحدود التي لا يستطيع تجاوزها وكيف يمكننا التعاون معًا لتجاوز هذه الحدود
صديقنا هنا نوه إلى نقطتين مهمتين:
النقطة الأولى: طبيعة عمل الـ Backend
الـ Backend مهمته الأساسية هى أن يكون حلقة الوصل بين الـ Database والـ Client ويحتوى على الـ Business Logic بشكل عام
والـ Client هنا قد يكون الـ Frontend سواء كان Website App أو Mobile App أو أي Client آخر
بالتالي الـ Backend يجب أن يرجع البيانات بشكل عام ومرن لكي يستطيع أي Client مهما كان أن يستخدم هذه الـ API ويعرضها في الـ UI بما يناسبه
وأهم شيء أن يكون الـ API Response بسيط وسهل الفهم والاستخدام
ومن الجيد أحيانًا أن يقوم الـ Backend بوضع نفسه مكان الـ Frontend ويتخيل كيف سيستخدم هذه البيانات في الـ UI
لأن هناك شخص لديه أسرة وبيت وأطفال سيقوم باستخدام هذه الـ API ويحتاج أن تكون سهلة الفهم والاستخدام
لا نريد أن نعقد الأمور على الـ Frontend ونصيبه بأزمة قلبية بسبب تعقيد الـ API Response
فدائمًا يجب أن يسأل الـ Backend نفسه:
- ما هي طبيعة البيانات التي يحتاجها الـ
Frontendلعرضها في الـUI؟ - هل يستطيع الـ
Frontendالتعامل مع هذه البيانات بسهولة ؟ هل يستطيع عملMappingأوTransformationبسهولة ؟ - هل الـ
Frontendيحتاجindicatorsمثلis_best_sellerأوis_new_arrivalوهل يحتاج لعملfiltersأوsortingعليها أم لا - هل يحتاج معلومات صلاحيات مثل
can_editأوcan_deleteلإظهار أو إخفاء الأزرار
النقطة الثانية: طبيعة عمل الـ Frontend
الـ Frontend مهمته هو عرض البيانات في الـ UI بالشكل المناسب بما يتناسب مع تجربة المستخدم الـ UX
وبما يتوافق مع متطلبات الـ Business Analyst
الـ Frontend يجب أن يفهم حدود الـ Backend وما الذي يستطيع فعله وما الذي لا يستطيع
ويدرك أن الـ Backend يستطيع أن يعطيك البيانات بشكل خام لتكون مرنة في عرضها في أي UI
بالتالي يجب أن يقوم الـ Frontend بعمل Mapping وTransformation على هذه البيانات لتناسب احتياجات الـ UI الخاصة به
ولا يجب على الـ Frontend أن يطلب من الـ Backend أن يرجع له بيانات مخصصة جدًا لاحتياج معين في الـ UI
بمعنى عمليات الـ Mapping أو الـ Transformation الـ Grouping التى تخص الـ UI ليس من مسؤولية الـ Backend
فهذا يجعل الـ API Response غير مرن ويصعب استخدامه في حالات أخرى وخصوصًا في حالة وجود أكثر من Client يستخدم نفس الـ API
الـ Backend يستطيع أن يساعدك في ارجاع بيانات بشكل معين لكن في حدود المعقول لأن وظيفة الـ Backend أن يرجع لك البيانات بشكل عام ومرن
لكي يمكن عرضها في الـ Website App أو الـ Mobile App أو أي Client آخر يريد استخدام هذه الـ API ليعرضها بما يناسبه
أما عمليات الـ Mapping أو الـ Transformation التى تخص الـ UI فهي من مسؤولية الـ Frontend
وبالنسبة لنقطة هل من مسؤولية الـ Backend أن يرسل indicator في الـ API Response مثل can_edit, can_delete
للـ Frontend ليستخدمها في إظهار أو إخفاء الأزرار بناءً على صلاحيات المستخدم
أم هذه من مسؤولية الـ Frontend ؟
أحد الأصدقاء اعترض على هذا الأمر لي وقال لي:
الـ
Frontendيستطيع أن يخفي الأزرار بناءً على صلاحيات المستخدم ولا حاجة لأن يرسل له الـBackendهذه المعلومات
لأن الـFrontendسيكون لديه معلومات عن الـUser Roleوالصلاحيات الخاصة به
وبالتالي يستطيع أن يحدد هل يظهر هذه الأزرار أم لا بناءً على هذه الصلاحيات
وهذا كلام صحيح في بعض الحالات، لكن في حالات أخرى قد يكون من الأفضل أن يرسلها الـ Backend لتقليل التعقيد في الـ Frontend
وخصوصًا عندما يتعقد المشروع فتتعقد الشروط والصلاحيات ويصبح من الصعب على الـ Frontend أن يدير كل هذه التعقيدات بمفرده
لذا من الأسهل أن يرسلها الـ Backend لتسهيل عمل الـ Frontend وخصوصًا أنه في أغلب الأحيان الـ Backend لديه معلومات أكثر عن صلاحيات المستخدم
وهناك بعض الصلاحيات تحتاج لعمل queries معقدة في الـ Database لتحديدها
التعامل مع الـ User Story من زاوية واحدة
من المشاكل الشائعة التي تحدث هي أن كل طرف يتعامل مع الـ User Story أو مع متطلبات الـ Business Analyst من زاوية واحدة فقط
بمعنى أن الـ Backend ينظر إلى الـ User Story من زاوية الـ Backend فقط ثم يقوم مباشرًا بتنفيذ الـ API
وكذالك الـ Frontend ينظر إلى الـ User Story من زاوية الـ Frontend فقط ثم يقوم بتنفيذ الـ UI برمجيًا
دون أن يرجع كل منهما للطرف الآخر ليفهم كيف يرى الطرف الآخر الـ User Story وكيف يفكر في تنفيذها
حتى وإن كان كل طرف منهما يفهم وظيفة الآخر كما ذكرنا في الفقرة السابقة
يظل من المهم أن يكون هناك تواصل بين الطرفين لفهم المطلوب بشكل أفضل قبل الشروع في التنفيذ
هنا يأتي تعليق مهم من أحد الأصدقاء أصحاب الخبرة:
في رأيي أن هذا الأمر يعتمد بشكل أساسي على الفهم الصحيح للـ
User Story
لذلك نقوم بمرحلة الـPlanningحيث يشرح فريق الـBusiness Analystما هو المطلوب بشكل واضح
وبعد ذلك يجتمع الـFrontendوالـBackendويتفقان على شكل الـAPI Responseوكيفية التعامل معها
لهذا السبب يأتي دور أدوات مثلOpenAPIالتي تعمل كعقدcontractبين جميع الأطراف
حتى في بعض الأحيان يكون من المفيد أن يقوم فريق الـBusiness Analystبمراجعته والموافقة عليه
قبل شروع أي طرف في التنفيذ
هذا هو الحل الأمثل، النقاش المبكر قبل التنفيذ
هنا لدينا الكثير من الفوائد والأمور التي يجب أن نلتزم بها
أولها وأهمها هو النقاش المبكر قبل التنفيذ
بمعنى أن هناك اجتماع مشترك بين الـ Backend والـ Frontend والـ Business Analyst أو الـ Product Owner أول صاحب الـ User Story بشكل عام
هذا الإجتماع يسمى Planning أو Grooming أو Refinement حسب تسميات الشركات المختلفة
في هذا الاجتماع يتم مناقشة الـ User Story بشكل مفصل من جميع الأطراف
الـ Business Analyst يشرح المطلوب بشكل واضح ويتأكد أن كل شخص فهم المطلوب بشكل صحيح
ثم يقوم الـ Frontend والـ Backend بسؤال أي أسئلة أو استفسارات حول المطلوب
بعد الانتهاء من شرح الـ User Story، يبدأ الـ Backend والـ Frontend في مناقشة كيفية تنفيذ المطلوب
ويحددان الصعوبات التي قد تواجه كل منهما في تنفيذ المطلوب
ويبحثان عن حلول لهذه الصعوبات معًا
ويتفقان على شكل الـ API Response وكيفية التعامل معها في الـ UI
وهنا يتم عمل API Contract باستخدام OpenAPI أو أي أداة أخرى
يلتزم بها الجميع في تنفيذ المطلوب
هذه الاتفقات تكون مبدئية وقابلة للتغيير لاحقًا إذا دعت الحاجة
لكن هذا النقاش المبكر يوفر الكثير من الوقت والجهد لاحقًا
ويمنع الكثير من المشاكل التي قد تحدث لاحقًا بسبب سوء الفهم أو التغييرات المفاجئة
التعاون بين الـ Backend والـ Frontend مهم جدًا في فهم المطلوب من الـ User Story وكيفية تنفيذها بشكل صحيح
أحيانًا الـ Frontend يخدم الـ Backend في بعض الأشياء والعكس صحيح
فهم طبيعة عمل كل منهما وكيفية التعاون معًا هو ما يجعل المشروع ناجحًا
أحيانًا يكون صعوبة تقنية في تنفيذ المطلوب من الـ User Story
سواء من الـ Backend أو الـ Frontend وقد يتتطلب تنفيذها تغيرات و refactor في الكود
بالتالي يتم أخذ هذه الأمور في الاعتبار أثناء المناقشة الـ User Story
ويتم تبليغ الـ Business Analyst بأي صعوبات قد تواجه التنفيذ
بالتالي قد يتم تعديل الـ User Story أو تقسيمها إلى أكثر من User Story لتسهيل التنفيذ وامداد الوقت اللازم
من المهم جدًا أن يكون هناك تواصل مستمر بين جميع الأطراف طوال فترة تنفيذ الـ User Story
ليعرف كل شخص لماذا يتأخر التنفيذ أو ما هي المشاكل التي تواجهه وهل يمكننا الإستغناء عن جزء معين من المطلوب أو تأجيله لوقت لاحق
قصة واقعية من تجربتي الشخصية
دعوني أشارككم قصة حقيقية حدثت لي، كنت مطور Backend في أحد المشاريع
كان هناك User Story بسيطة وسهلة، فقط أقوم بإرجاع بيانات معينة ليتم عرضها في جدول في الـ UI
لنتخيل أن هذا الجدول هو جدول منتجات يقوم بمقارنة الأسعار المعروضة لكل منتج
بمجرد أن قرأت الـ User Story، قلت في نفسي إن هذا المطلوب بسيط جدًا واعتيادي ونفذناه أكثر من مرة من قبل
فقمت سريعًا بتنفيذ الـ API بكل سهولة ومررتها إلى مطور الـ Frontend دون أن أركز في شكل الـ UI أو كيف سيتم عرضها في الجدول
كل ما يهمني أن هناك بعض البيانات التي يجب أن أرجعها في الـ API
بعد انتهائي من تنفيذ الـ API، فوجئت بأن الـ Frontend لا يستطيع عرضها في الجدول بالشكل المطلوب
وكنت أحيانًا أتجادل وأقول أنني أرجع لك المطلوب وأنت حاول أن تعرضها في الجدول
لكن ما زال الـ Frontend لا يستطيع عرضها في الجدول أو يواجه مشاكل في عرضها
ظننت أن المشكلة في الـ Frontend وفي قدراته التقنية
لكن بعد أن تدخل الـ Senior الذي يشرف علي وتناقشت مع الـ Frontend والـ Business Analyst الذي كتب الـ User Story
وانعقاد محكمة بين الجميع، تم الحكم بأنني لم أفهم الـ User Story بشكل صحيح
وأنني لم أقم بمناقشتها مع الـ Frontend قبل تنفيذ الـ API ولم اهتم حتى برؤية شكل الـ UI
اتضح أن الجدول الذي يريدونه في الـ UI يحتاج إلى أن أرجعه بشكل معين وأن أكرر بعض البيانات بشكل معين
لكي يستطيع الـ Frontend عرضها في الجدول على شكل مقارنات
لو كنت قد ناقشت الـ User Story مع الـ Frontend قبل تنفيذ الـ API
ما كنت لأقع في هذا الخطأ ولم نكن لنضيع كل هذا الوقت في الجدال وتأخير المشروع
لذا النقاش المبكر قبل التنفيذ هو الحل الأمثل لتجنب هذه المشاكل
التغييرات المفاجئة وكيفية التعامل معها
دائمًا أثناء تنفيذ الـ User Story أو بعد انتهائها، قد تحدث تغييرات مفاجئة في الـ API أو الـ UI
وهذا الأمر له أكثر من حالة
الحالة الأولى: التغييرات التي تحدث أثناء تنفيذ الـ User Story
تعليق من أحد الأصدقاء:
أحيانًا بعد التفاهم بين الـ
BackendوالـFrontendوبدء كل شخص بعمله، فجأة يقوم الـBackendبتغيير الـAPIبالكامل ويبلغ الـFrontendبشكل مفاجئ مما يسبب مشاكل كبيرة في الـFrontend
قلنا سابقًا أن النقاش المبكر قبل التنفيذ هو الحل الأمثل لتجنب المشاكل
لكن هذا لا يعني أن كل شيء سيكون مثاليًا ولن تحدث تغييرات أثناء التنفيذ
لذا في حالة أننا قمنا بعمل Planning و Grooming جيد وفهمنا المطلوب بشكل صحيح
وقمنا بالتزام بـ API Contract وبدأ كل شخص في تنفيذ المطلوب
قد تحدث تغييرات أثناء التنفيذ لأي سبب من الأسباب سواء من طرف الـ Backend أو الـ Frontend
لكن لو التزمنا بالنقاش المبكر قبل التنفيذ، ستكون هذه التغييرات أقل بكثير أو بسيطة
على أي حال في حالة حدوث تغييرات، يجب أن يكون هناك تواصل مستمر بين الطرفين
ونسأل أنفسنا بعض الأسئلة المهمة:
- وهل هذه التغييرات ضرورية أم لا، بالتالي يمكننا تجاهلها في الوقت الحالي مع اعلام الطرف الآخر بها
- هل هذه التغيرات ستؤثر على الـ
User Storyالحالية أم لا
بالتالي يجب أن نبلغ الـBusiness Analystليقرر:- هل نؤجل هذه التغييرات لوقت لاحق أم لا
- هل يمكننا فصل هذه التغييرات إلى
User Storyجديدة أم لا
- هل هذه التغييرات ستؤثر على الـ
UIأو على الـAPI Contractأم لا- بالتالي علينا اعادة مناقشة الـ
API Contractمع الطرف الآخر
- بالتالي علينا اعادة مناقشة الـ
كل هذه الأسئلة يجب أن نجيب عليها قبل تنفيذ أي تغييرات
لأنه مع النقاش المبكر قبل التنفيذ ستجد نفسك في موقف أفضل لفهم تأثير هذه التغييرات
في معظم الحالات قد نقرر تأجيل هذه التغييرات لوقت لاحق أو فصلها إلى User Story جديدة
الحالة الثانية: التغييرات التي تحدث بعد الانتهاء من تنفيذ الـ User Story
بعد الانتهاء من تنفيذ الـ User Story وتسليمها للـ QA أو الـ Business Analyst للمراجعة والاختبار، قد تظهر بعض التغييرات أو الملاحظات
وهذا أمر طبيعي جدًا في أي مشروع برمجي
قد يطلب الـ Business Analyst أو الـ QA بعض التغييرات في الـ UI أو في الـ API بناءً على الملاحظات التي يجدونها أثناء الاختبار
في هذه الحالة، يجب أن نتعامل مع هذه التغييرات على أنها User Story جديدة أو يقال عليها Change Request وتكون Sub Task من الـ User Story الأصلية
وبالتالي يتم مناقشتها مرة أخرى بين الـ Backend والـ Frontend في وقت لاحق بحسب الأولويات
أحيانًا قد يضطر الـ Backend بعد أشهر من تنفيذ الـ User Story إلى عمل refactor أو تغييرات جذرية في الكود ويأثر هذا على الـ API Contract لـ ‘User Story قديمة
في هذه الحالة يقوم الـ Backend بإبلاغ الـ Frontend بهذه التغييرات ويشرح لهم السبب قبل تنفيذها
ثم يقوم بالحديث مع الـ Business Analyst ليقوم بكتابة User Story جديدة توضح هذه التغييرات لكي يتم متابعتها واعطاء أولوية لها أو تأجيلها لوقت لاحق
وبهذا النظام لا نؤثر على سير المشروع الحالي بل كل تغير يتم التعامل معه كـ User Story جديدة
خلاصة القول في التغييرات المفاجئة
في شركتي، بعد أن أتفق أنا كـ Backend مع الـ Frontend على شكل الـ API
لا يحق لأي أحد في الفريق أن يغير الـ API إلا بعد مناقشة مع الطرف الآخر والموافقة على التغيير
والموافقة هنا قد تشمل تأجيلها أو كتابتها كـ User Story جديدة أو تعجيلها حسب الأولويات
فيما بعد إذا قرر أحد الأطراف التغير سواء أراد الـ Frontend عرض بعض من مهارته في الـ UX وطلب تغييرات في الـ API Contract
أو أراد الـ Backend تحسين الكود أو عمل refactor لتحسين الـ performance أو لأي سبب آخر وهذا سيؤثر على الـ API Contract
أو أراد صديقنا العزيز صاحب الـ Business Analyst إضافة بعض المتطلبات الجديدة التي تسبب تغيرات جزرية في كل شيء
على كل فرد أن يقوم بالخطوات التالية:
- كل طرف يبلغ الطرف الآخر ويشرح له السبب
- يتم ابلاغ الـ
Business Analystحتى وإن كان التغيرات تقنية وتحسين فقط في الأداء ولن تأثر على الـUI - يتم كتابة
User Storyجديدة توضح التغييرات الجديدة واعطاء أولوية لها أو تأجيلها حسب الأولويات
بالتالي لا نؤثر على سير المشروع ونعطي أولوية لأمور و User Stories أخرى
وطريقة إبلاغ الـ Business Analyst أن يكتب User Story جديدة مستقلة بالتغييرات الجديدة أو المقترحة
دون أن نؤثر على الـ User Story الحالية التي يقوم الـ Backend والـ Frontend بتنفيذها
ملحوظة: ليس شرطًا أن أن يكون دايمًا الـBusiness Analystهو الذي يكتب الـUser Storyالجديدة
في بعض الأحيان قد يكون الـBackendأو الـFrontendهو الذي يكتبها بناءً على التغييرات التي يريدها وخصوصًا إذا كانت تغييرات تقنية بحتة
لكن برغم هذا على الـBusiness Analystأن يراجعها ويعطي أولوية لها أو يؤجلها حسب الأولويات
غياب المعايير الموحدة Standards
المحور الرابع والأخير من محاور المشكلة هو غياب المعايير الموحدة Standards
كل النزاع يكون مبنيًا على آراء شخصية لكل طرف دون وعي بضرورة تطبيق الأشياء وفق معايير
Standardsموحدة
لأنه من الطبيعي أنك في يوم من الأيام ستترك هذا العمل وسيعمل عليه شخص آخر غيرك
وهذا كلام في غاية الأهمية ويحتاج لتفصيل لأنه من أكثر الأسباب التي تسبب مشاكل بين الـ Backend والـ Frontend
وهذا المحور تحديدًا حظى باهتمام كبير من الأصدقاء الذين شاركوا في هذه المقالة
سأستعرض بعض الأمثلة والأراء ونناقشها معًا
تخيل معي أن تعمل مع Backend كل endpoint له شكل مختلف في إرجاع الـ errors
أحيانًا يرجع لك error بهذا الشكل:
{
"error": "Invalid input"
}
وأحيانًا بهذا الشكل:
{
"message": "Invalid input",
"code": 400
}
وأحيانًا بهذا الشكل:
{
"errors": [
{
"field": "email",
"message": "Invalid email"
}
]
}
كيف ستتعامل مع كل هذه الأشكال المختلفة في الـ Frontend ؟
ستحتاج إلى كتابة كود معقد جدًا للتعامل مع كل هذه الحالات
وستقضي وقتًا طويلاً في التعامل مع الـ errors بدلاً من التركيز على الـ UI
وهذا ما حدث بالفعل مع أحد الأصدقاء:
أنا كـ
Frontendأعمل معBackendلا يلتزم بشكل موحد للـerrors
بعض الـendpointsترجعerrorبشكل معين وبعضها بشكل مختلف
مما يسبب لي مشاكل في التعامل مع الـerrorsفي كامل التطبيق
وهذه مشكلة شائعة جدًا ليس فقط في الـ errors بل في كل شيء
أحد الأصدقاء قال لي:
معظم الخلافات تكون على شكل الـ
Responseدايمًا ما تكون مختلفة برغم من أنها تنتمي لنفس الـModel
فعلى سبيل المثال لديناModelيدعىOfferالمشكلة أن صديقنا الـBackendيقوم بارجاعه بشكل مختلف في كل مرة مع كلendpointبرغم أنه نفس الـModelونفس هيكل البيانات
فنبدأ في الجدال لأننا نقرأ منModelواحد ونبني عليه عمليات مثل الـParsingلكي نستطيع عرضها
فمن غير المنطقي أن يكون هناك أكثر من شكل لـModelالـOfferوأضطر لعملParsingمختلف لنفس البيانات
وتعليق أخر من أحد الأصدقاء:
المشكلة ليست في شكل الـ
Responseلكن أيضًا في التسمية الخاصة بالبيانات
فمثلاً في بعض الـendpointsتجد أن الـBackendيستخدمsnake_caseفي أسماء الحقول
وفي بعض الـendpointsيستخدمcamelCase
أو يرجع حقول بتسميات لا تعبر عن محتواها بشكل واضح فمثلًا يرسل ليreward_pointsوهى في الحقيقة تعنيused_points
ويرفض تغيرها لأي سبب غير مفهوم
لاحظ أن بعض هذه المشاكل تحدث بسبب غياب النقاش المبكر قبل التنفيذ
وانعزالية الطرفين وعدم فهم دور كل طرف كما ذكرنا في المحاور السابقة
لكن معظم هذه المشاكل تحدث بسبب غياب المعايير الموحدة Standards
مثل توحيد الـ API Response والـ Errors والتسميات وغيرها
وهذه من بديهيات تعلم الـ Restful API والالتزام بها على قدر الإمكان
وهذه تعد من المشاكل التنظيمية التي تحدث في كثير من الشركات والفرق البرمجية
كيف نحل مشكلة غياب المعايير ؟
الحل بسيط جدًا، وضع معايير موحدة Standards يلتزم بها الجميع
سواء معايير متعارف عليها كـ Restful API Standards أو معايير خاصة بالشركة أو الفريق البرمجي يتم الاتفاق عليها
ومحاولة عمل Documentation لهذه المعايير لكي يلتزم بها الجميع وحتى يراها الأعضاء الجدد الذين ينضمون للفريق لاحقًا
من المهم وجود شخص ذو خبرة في الفريق يكون مسؤول عن وضع هذه المعايير ومتابعة الالتزام بها
جعل كل طرف يقوم بـ Code Review للطرف الآخر
بمعنى أن الـ Backend يراجع كود الـ Frontend والـ Frontend يراجع كود الـ Backend
هذا يفيد في فهم كيف يفكر الطرف الآخر وما هي الصعوبات التي يواجهها
وأيضًا يساعد في الالتزام بالمعايير الموحدة Standards
ومعرفة هل كل شخص استطاع التعامل مع الـ API Contract بشكل صحيح أم لا
بالطبع عليك أن تعلم أن المعايير ليست ثابتة
أي أن نفهم أن الـ Standards أو المعايير الخاصة بالشركة والفريق التقني ليست ثابتة
قد نحتاج لتعديلها أو تحديثها مع الوقت أو نتغاضى عن بعضها في حالات معينة فنحن لا نغصب أحد عليها
لكن المهم أن نلتزم بها في الوقت الحالي
وإذا احتجنا لتعديلها، نناقشها مع الفريق ونتفق على التعديلات الجديدة
ثم نقوم بتحديث التوثيق ونبلغ الجميع بالتغييرات
لذا اتبع الـ Standards الموحدة لكي تسهل على من سيأتي بعدك
الخاتمة
بعد كل ما ناقشناه في هذه المقالة، نستطيع أن نقول:
أن العلاقة بين الـ Backend والـ Frontend ليست علاقة عداء، بل هي شراكة
كلاهما يحتاج الآخر لإنجاح المشروع، ولا يمكن لأي منهما العمل بمفرده
المشاكل التي تحدث بينهما ليست حتمية، بل هي نتيجة لسوء الفهم وغياب التواصل ما بينهما
ناقشنا في هذه المقالة أربع محاور رئيسية تسبب الصدام بين الـ Backend والـ Frontend:
- الجهل بطبيعة عمل الطرف الآخر: عدم فهم دور ومسؤوليات وصعوبات كل طرف
- التعامل مع الـ
User Storyمن زاوية واحدة: عدم النقاش المبكر قبل التنفيذ - التغييرات المفاجئة: عدم التواصل عند حدوث تغييرات في الـ
APIأو الـUI - غياب المعايير الموحدة: عدم وجود
Standardsواضحة يلتزم بها الجميع
وبعض حلول هذه المشاكل وغيرها هي:
- النقاش المبكر قبل التنفيذ:
- اجتماعات
PlanningأوGroomingمشتركة بين الجميع - مناقشة الـ
User Storyبشكل مفصل من جميع الأطراف - الاتفاق على
API ContractباستخدامOpenAPIأو أدوات مشابهة
- اجتماعات
- التواصل المستمر بين كل الأطراف طوال فترة تنفيذ الـ
User Story:- إبلاغ الطرف الآخر بأي تغييرات قبل تنفيذها
- كتابة
User Storyجديدة لأي تغييرات جذرية أو حتى تحسينات بسيطة
- اتباع المعايير الموحدة:
- وضع
Standardsواضحة للـAPI ResponsesوالـErrors - استخدام شكل موحد للتسمية مثل
camelCaseأوsnake_case - وتوحيد الـ
ModelsوالـResponsesبين جميع الـendpoints - محاولة كتابة
Documentationلهذه المعايير - عمل
Code Reviewبين الطرفين لمراجعة الكود
- وضع
- فهم دور كل طرف:
- الـ
Backendيفهم كيف ستعرض البيانات في الـUI - الـ
Frontendيفهم حدود وإمكانيات الـBackend - كل منهما يضع نفسه مكان الآخر
- الـ
- التواضع وقبول الخطأ:
- لا تتعامل بأنانية أو كبرياء مع الطرف الآخر
- فكر قبل أن تتهم الآخر بالخطأ، ربما أنت المخطئ
- الهدف هو نجاح المشروع وليس إثبات أنك على صواب
على أي حال بالنسبة لنقطة غياب المعايير الموحدة Standards وأن نعظم حلها هو وضع معايير موحدة يلتزم بها الجميع
وخصوصًا أن يكون كلا الطرفين على علم بمعايير الـ API المتعارف عليها مثل Restful API
بكتابة مقالتين عن هذا الموضوع الأولى هى التعامل مع أي RESTful API وفهم مكوناته كتبتها لصديق لي مطور Frontend أراد أن يفهم كيف يتعامل مع أي API
والثانية هى بناء RESTful API متوافق مع المبادئ كتبتها لأصدقائي مطوري الـ Backend لكي يفهموا كيف يصمموا API بشكل صحيح