اذهب إلى المحتوى

كل الأنشطة

تحدث تلقائيًا

  1. الساعة الماضية
  2. Dftjjditrddghncxhnmhccgghhhyyyyy6kldhdgdgjjjdgdgyiuddgjddggkxvxvfDKffdjGkzmznafsjtsyshlhzzvzkzgsksgidjafidgxvxxvgjutrwikdkxvnxvmxvxvdghfhskdfffgkdggkkxxvxxvmvxxxvxxxxvxvesssssffsgjryfgjgjkfkgfhryegjdgdgdggjdguhlsgsgdgckxkxdgdkdggkgkjzfsfdgl
  3. اليوم
  4. لوحظ على الكثير من الفرق التي تدّعي أنها تعمل بمنهجية أجايل عيوبٌ جسيمة، مثل الإجراءات المقيَّدة ودورات التطوير التي لا تنتهي وانسداد مسار ضمان الجودة. وتنشأ معاناة هذه الفرق من الهوّة الكبيرة بين ما يعتقدون أنها منهجية أجايل من جهة، وما هي منهجية أجايل الحقيقية من جهةٍ أخرى. لنتحدث بالتفصيل عن الأخطاء الشائعة التي تقع بها بعض الفرق التي تطبق منهجية أجايل معيبة، مع التطرق إلى الحلول الممكنة لتحسين تقديم البرمجيات ورفع معنويات المطورين. ما هو المفهوم الصحيح لمنهجية أجايل؟ أجايل هي منهجية تسعى للمساعدة على تقديم البرمجيات بالشكل الذي ترغب به الأطراف المعنية. نشأت هذه المنهجية على أنقاض العقبات والمصاعب التي كانت تواجه نماذج التطوير السابقة، والتي كانت تنص على أن البرنامج يجب أن يكون أولًا واضح المعالم ثم تجري هندسته، بعدها يقدَّم بشكله النهائي المكتمل. كانت النماذج السابقة لأجايل تحمل مخاطر كبيرة، فعند تقديم البرنامج بشكله المكتمل، قد تكون احتياجات العميل قد تغيرت بحلول نهاية المشروع، وربما يتبين أنها لم تكن مفهومةً جيدًا عندما تم افتراضها في البداية. لكن منهجية أجايل ليست كذلك، فمن خلال إبقاء قناة التواصل مفتوحة، يمكن تغيير المتطلبات قبل هدر الوقت والجهد في تنفيذ منتج خاطئ، ويمكن تقييم التعديلات الجديدة للتحقق من ملاءمتها. يجب أن تنبع جميع عمليات وهيكليات أجايل من القيم والمبادئ التي تنص عليها اتفاقية أجايل، كما يجب الاستفسار عن سبب كل قرار تقني وكل ممارسة ودور ضمن العمل، ليكون التبرير مرتبطًا بواحد أو أكثر من هذه القيم والمبادئ. مع ذلك يمكن القول أن فرق أجايل تنفذ جميع عمليات وهيكليات أجايل دون أن تحقق مكاسب بسهولة، والقاسم المشترك بين الفرق التي تعاني من صعوبات هي أنها تنتهج منهجية أجايل من خلال ممارسات مقيَّدة وصارمة، بدلًا من أن تستفيد من المرونة التي هي السمة العامة لهذه المنهجية كما يشير اسمها. تزييف أجايل: مخاطر التقليد السطحي ربما مرّت عليك بعض المتاجر التي يدّعي أصحابها أن لديهم منتجات مطابقة للعلامات التجارية الأصلية، يتركز هؤلاء البائعون في أسواق معينة، وتفتقر متاجرهم لعلامة تجارية ذات سمعة، إلا أن ميزتهم الوحيدة هي انخفاض أسعار منتجاتهم. على سبيل المثال، من الممكن أن تشتري سماعات لاسلكية لها نفس شكل سماعات آبل ونفس حجمها ولونها، لكن عندما تستلمها تلاحظ أن التشابه ينتهي عند الناحية الشكلية والجمالية، وذلك عندما تواجه صعوبةً بربطها بأجهزتك، كما تكتشف لاحقًا أن الصوت من خلالها رديء. صحيح أن السماعات مجهولة الاسم قلدت بشكلها الخارجي سماعات آبل من خلال استنساخ مواصفاتها الخارجية لكي تزداد فرص بيعها، إلا أن مواصفاتها لم تكن فعالة بما يكفي لتعطي منتجًا مفيدًا. هناك الكثير من فرق العمل التي تقع في فخ ملاحظة شيء يفعله الآخرون ويقودهم إلى النجاح ثم محاولة تقليده، لكن بطريقة خاطئة بسبب الفهم غير المكتمل؛ لذا يمكن القول أن الاستيعاب العميق لنطاق المشكلة هو المفتاح لإيجاد حلول ملائمة. وبغياب هذا الاستيعاب، يحصل الفريق على حلول غير متوافقة بدلًا من الحلول المدروسة. عندما تسبب حلول أجايل المقلَّدة مشكلات أو نتائج عكسية، من الشائع الاعتقاد بأن "الحل يجب أن يكون صحيحًا لأننا نسخناه من أشخاص ناجحين، لذا فإن المشكلة ببساطة تكمن في عدم قدرة الأشخاص على التكيف معه مما يجعله سببًا للتباطؤ أو الضرر". وللأسف فإن هذه العقلية منتشرة جدًا رغم فظاعتها. خصائص النسخة الزائفة من منهجية أجايل يحدث تزييف أجايل عندما يطبَّق إطار عمل أجايل شكلي على تطوير البرمجيات، أي يكون هذا الإطار مشابهًا شكليًا فقط لقيم ومبادئ أجايل الحقيقية. بمعنى آخر، فإن النسخة الزائفة من منهجية أجايل هي نسخة سطحية قد تبدو مشابهة لممارسات أجايل شكليًا، لكن دون أن تراعي حقيقةً تلبية هذه المبادئ. في منهجية أجايل الزائفة، يقيم مدرب إطار عمل سكرام Scrum دورات تطوير تستغرق وقتًا معينًا وتتضمن اجتماعات خلال أيام وأوقات محددة، ويكون مالك المنتج أو ما يقابله من مسميات الإدارة هو المرجع الوحيد لكل النقاشات ضمن الفريق أو بين الفريق والأطراف المعنية، وبذلك فإن كل ما تقدمه هذه الاجتماعات من مزايا تعزيز التواصل واكتشاف الحلول يكون موجَّهًا إلى مديري الفريق؛ مما يحدّ من قدرات المطورين بدلًا من تعزيز استنباطهم لنتائج أفضل. مؤشرات الخطورة التي تدل على تزييف أجايل فيما يلي مجموعة متنوعة من الحالات القصيرة عن قصص مبرمجين مستوحاة من تجارب الحياة الواقعية، والتي قد تذكِّر المطورين الخبراء بتجارب سابقة مروا بها؛ أما المستجدين من المطورين فقد يتعين عليهم دراسة هذه القصص بعناية ليتعرفوا من خلالها على مؤشرات الخطورة. المراسم تهدف مراسم أجايل إلى تخفيف العقبات وإبقاء المشاريع على المسار الصحيح، أما في منهجية أجايل الزائفة فتتحول المراسم بحدّ ذاتها إلى عقبات، حيث تسلط الحالات القصيرة التالية الضوء على مؤشرات الخطورة التي تنبه إلى تزييف منهجية أجايل في المراسم. الاجتماعات اليومية السريعة Stand-up: حالة أجايل الزائفة الأولى: يعتمد عقد الاجتماع اليومي لمناقشة الوضع على تفرُّغ مسؤول سكرام (وقد لا يُعقَد بالأساس)، ويختلف توقيت الاجتماع حسب الظروف اليومية؛ أما موعده المسجَّل فهو للاستئناس فقط، ويُتوقَّع من المطورين أن يكونوا متاحين في أي موعد يتغير إليه توقيت الاجتماع. وفي حال لم يكن أحد المطورين متفرغًا، فيجب أن يرسل تقرير تقدمه اليومي إلى مسؤول سكرام عبر رسالة خاصة. في بعض الأحيان يُطلب توثيق رقم كل مشكلة يعمل عليها المطور أو عالجها فعليًا، رغم أنه لا أحد يهتم بنظام تتبع المشكلات أثناء اجتماع التقدم اليومي. الدرس المستفاد: الاجتماع اليومي ليس مجرد تقرير يومي يقدَّم إلى الإدارة، بل إن هذه الاجتماعات أُعِدت من أجل المطورين، لضمان عدم تعطل عمل أي مطور بسبب مشكلات يمكن تلافيها، وللتحقق من أن تسليم العمل يسير على ما يرام. والنقطة الأهم أن الاجتماعات اليومية السريعة لا يُشترط أن يديرها شخص معين، وفي حال كان هناك حاجة لتغيير موعدها، فيجب أن يكون ذلك بالتوافق. حالة أجايل الزائفة الثانية: يجب عقد اجتماع يومي ثانٍ عبر اتصال هاتفي مع فريق المطورين في الهند، لأن الفريق يحتل مكانة أعلى من الفريق المحلي في التسلسل الهرمي للشركة، رغم أن الاجتماع اليومي الأول الذي لا يشارك فيه الفريق الخارجي هو الاجتماع الوحيد الذي تصدر عنه نتائج مفيدة. الدرس المستفاد: التوتر الناجم عن تنظيم الفريق من قِبل طرف خارجي يسبب خلافات. في الحالة السابقة، لم يكن هناك أي علاقة تربط الفريقين ببعضهما، وكان التواصل بينهما يجري نتيجة الضغوطات التنظيمية الخارجية فقط، وهذا ما قد يعطي انطباعًا للمهندسين بأنهم غير مؤهلين لتنظيم أنفسهم بأنفسهم، مما يقلل من سوية أدائهم. الاجتماعات الاسترجاعية Retrospectives: حالة أجايل الزائفة: يعقَد اجتماع استرجاعي بين الحين والآخر، ويكره الجميع حضوره. يتعين على كل مطور أن يقدم تعليقًا واحدًا على الأقل عن كل حالة سارت على ما يرام أو تحتاج إلى تحسينات. تُكتب هذه البنود في جدول بيانات جوجل، لكن لا يُحال أي منها إلى نظام تتبع المشكلات ليصبح قابلًا للتنفيذ، ناهيك عن وضعها قيد العمل في دورتي التطوير التاليتين. يُنسخ جدول بيانات الاجتماع الاسترجاعي من تقرير الاجتماع السابق مع وجود عنوانين ثانويين وهما "السابق" و"الجديد" في كل تقرير؛ والتي تشير إلى بنود الاجتماع السابق والحالي، إذ تنتقل المشكلات التي كانت "جديدة" في الاجتماع السابق لتصبح مشكلات "سابقة"، رغم أنها لم تخضع للمعالجة عندما كانت جديدة. والنقاش الوحيد الذي يدور حول البنود هو التفسير الشفهي الذي يتعين على كاتب البند تقديمه. الدرس المستفاد: يجب أن ينتج عن الاجتماع الاسترجاعي بنود قابلة للتنفيذ، وفي حال الاتفاق على إجراء تغيير ما، فيجب إعداد خطة لتطبيق هذا التغيير، ويجب إدراج هذه الخطة بعد ذلك ضمن المشكلات التي يجب تتبعها. لا يمتلك أحد في هذا السيناريو صلاحية تغيير طريقة الاجتماع الاسترجاعي لتصبح أكثر ملاءمة، في حين أن بيئة عمل أجايل الحقيقية تتيح إمكانية وضع أي أمر على طاولة عمل الاجتماع الاسترجاعي، ولا يستثنى من ذلك كيفية إجراء الاجتماع الاسترجاعي بحدّ ذاته. العروض التوضيحية Demos: حالة أجايل الزائفة: نادرًا ما تجرى عروض توضيحية، وهو أمر مفسَّر نظرًا لأن الكود البرمجي نادرًا ما يتجاوز مرحلة المراجعة. وعند إجراء عروض توضيحية، فإنها تُقدَّم عادةً من الجهاز المحلي للمطوِّر أو من خادم التطوير. ليس هناك تأكيد على ما إذا كان العميل بحاجة إلى الميزة التي يعمل المطور على توضيحها، وحتى العميل لا يكون متأكدًا من ذلك، ربما سيتمكن من الإجابة عن ذلك بعد ثلاثة أيام من هذه المرحلة. الدرس المستفاد: لا شك بأن الفريق غير القادر على إجراء عروض توضيحية يعاني من مشكلة أساسية تتمثل بنقص تسليم العمل، أي أن البنود لا تصل إلى مرحلة الإنتاج. يجب أن يشرح العرض التوضيحي "ميزات يمكن استخدامها في الوقت الحالي"، ولا بأس بأن يقرر العميل لاحقًا أنه لا يريد هذه الميزة، إذ يمكن إزالتها مرةً أخرى، لكن وضعها ضمن مسار الإنتاج يتضمن بالضرورة إعداد عروض توضيحية لجمع المعلومات من خلال اختبار المستخدم والملاحظات. اجتماعات تخطيط دورة التطوير Sprint Planning: حالة أجايل الزائفة: تعقَد اجتماعات تخطيط دورة التطوير في اليوم الذي يسبق بداية دورة التطوير، وتمتد إلى اليوم الذي من المفترض أن تبدأ فيه دورة التطوير. وبالنسبة لموعد الاجتماع فهو متفق عليه سابقًا، والهدف الوحيد من الاجتماع هو أن يحدد المطورون حجم العمل اللازم لحل المشكلات بمقياس نقاط القصة story points. الأمر المثير للاهتمام هو أن المشكلات المحددة لا تضاف إلى التزامات العمل، بل تُترَك لتجد طريقها لاحقًا إلى طاولة عمل دورة التطوير دون بذل أي جهد لتحقيق ذلك. من ناحية أخرى، عندما يُطلب من الجميع تحديد رقم لتقدير نقاط القصة من وجهة نظرهم (لتقدير حجم المهام)، فإن الشخص الذي وضع الرقم الأعلى لنقاط القصة هو الوحيد الذي يتعين عليه تبرير هذا الرقم، وتكمُن المشكلة هنا عندما يكون قد وضع رقمًا مرتفعًا ليس لشيء إلا لقلة خبرته بالموضوع؛ عندها سيُرغَم المطور قليل الخبرة على تقليل حجم العمل المقدر لحل المشكلات وسيُكلَّف بإنجاز هذا العمل عقوبة ً له. وكل ما سيحصل عليه هذا المطور هو عنوان المشكلة منسوخًا من ملف الإكسل الذي كتبه مدير المشروع، ولن يحصل على أي توصيف أو توضيح آخر. الدرس المستفاد: يجب أن ينعكس التخطيط لدورة التطوير مباشرةً على دورة التطوير، وربما من الأفضل تنفيذه في مرحلة متأخرة من دورة التطوير عندما تكون المشكلات قد تجاوزت مرحلة البرمجة ونجحت باختبار ضمان الجودة. بالنسبة للقصة أعلاه. يجب أن يتضمن الاجتماع الاسترجاعي التالي مناقشة المشكلات التالية: الحاجة لتغيير جدول عمل تخطيط دورة التطوير، وذلك ربما من خلال تخصيص مزيد من الوقت في اليوم الأخير من دورة التطوير أو توزيع الوقت المطلوب على مدار دورة التطوير. العيوب التي تعالَج بطريقة غير صحيحة باعتبار أنها غير مؤثرة على نطاق العمل. تقدير الوقت أو الجهد بطريقة غير دقيقة لتشجيع الالتزام بعبء أكبر من العمل. إدراج قضايا غير مكتملة على أنها جاهزة للتنفيذ. كل من النقاط السابقة هي مشكلة تحتاج إلى مناقشتها، لكن إذا لم يبذل الفريق جهده لإصلاح هذه المشكلات، فلن يقتصر التأثير عليها، بل إن آثارها ستمتد لتترتب عليها مشاكل أخرى: ستبدأ دورات التطوير بوقت متأخر أكثر فأكثر، أو تصبح غير محددة المعالم، أو كليهما. ستكون هناك حاجة دائمة لاستمرار دورات التطوير لأوقات إضافية، أو ستتراكم العيوب غير المعالجة، أو كليهما. ستتناقص السرعة التي تقاس بنقاط القصة. لن تلبى التزامات دورة التطوير. سيتطلب الأمر معالجة المشكلات مرة ثانية، ولن يلبي العمل الغايات المطلوبة من القصة، أو كليهما. الموظفون هناك حالتين زائفتين شائعتين هنا. حالة أجايل الزائفة الأولى هي أن يكون هناك مالك المنتج، ومالك المنتج التقني، ومدير المنتج، ومدير المشروع، ومسؤول سكرام، ومدرب أجايل، والمدير التقني، ومدير الهندسة، والمهندس المعماري؛ فضلًا عن المطورين العاديين. يستغرق اجتماع الوضع اليومي 40 دقيقة، ويجب أن يقف الجميع على شكل دائرة وأن يتحدثوا من خلال هاتف مكبر صوت موصول بخدمة Webex، ليتمكن المدير المسؤول عن المشروع عن بُعد من سماع الحالة اليومية، كما يتمكن بذلك أي شخص عالق في الزحام متأخر عن العمل من حضور الاجتماع. الدرس المستفاد: العدد المثالي للفريق هو 5 إلى 7 أعضاء، ويجب ألا يكون غالبيتهم من المديرين أو أصحاب السلطة، مع التأكيد مرةً أخرى على أن الاجتماعات اليومية لا تهدف إلى تقديم تقرير عن الوضع للمديرين، ولا تتطلب عادةً أن يتكلم فيها غير المطورين. وللتأكيد، إذا تجاوز الاجتماع اليومي 15 دقيقة، فإنه يفقد قيمته للجميع، لأن الغاية منه هي تركيز الأفكار لا تشتيتها. وإذا كان الاجتماع يُعقَد في وقت لا يزال فيه الأشخاص في طريقهم إلى المكتب، فلا بد من مراجعة توقيته. حالة أجايل الزائفة الثانية: يكون المطورون موزعين بخبرتهم بالتساوي بين موظفين بدوام كامل وموظفين بعقود، وفجأةً دون سابق إنذار تُنهى عقود جميع أصحاب العقود، ورغم ذلك يُتوقع أن تبقى سرعة الفريق على حالها. الدرس المستفاد: لا يقتصر الأمر على مشاريع أجايل، لكن يجب تجنب تغيير الموظفين في مشاريع البرمجيات عمومًا، فالثقة المطلوبة داخل الفريق من أجل تنفيذ مشروع أجايل فعال تتراكم مع الزمن، وفي حال تطلَّبَ الأمر إعادة بنائها مع موظفين جدد فلا بد أن يؤدي ذلك إلى نتائج عكسية. وفقًا لقانون بروكس Brooks's Law، فإن التأخير الناتج عن تغيير الموظفين يصبح مضاعفًا عندما يكون مشروع البرمجيات تحت ضغط زمني. المواعيد النهائية هناك حالتين زائفتين شائعتين فيما يخص المواعيد النهائية: حالة أجايل الزائفة الأولى هنا هي عندما يتم الضغط على زر الانطلاق الفعلي في دورة التطوير الحالية ضمن نظام تتبع المشكلات عند حلول اليوم الثالث من برنامج دورة التطوير، حين يُكمل مصدر هندسي واحد على الأقل مرحلة التطوير لكي يبدأ بمهمة جديدة بعد أن يتأكد من أنه لم يتبقَّ أي شيء من دورة التطوير السابقة ضمن قائمة الأعمال التي يجب القيام بها أو الجاهزة للتطوير، في الوقت الذي يكون فيه المطورون الآخرون لا يزالون يعملون على مهام دورة التطوير السابقة. وقد يضطر المطور الذي يبدأ بالعمل على مهام دورة التطوير الجديدة إلى التراجع في أي وقت إذا لم يجتَز الكود الذي تعهدَ بتسليمه مرحلةَ المراجعة بنجاح. الدرس المستفاد: يجب أن يُنهي جميع المطورين مهام التطوير في نهاية دورة التطوير، وكل أعمال تسلَّم متأخرة هي مؤشر على وجود مهام تطوير إضافية، والتي لا يمكن تخصيص وقت لها إلا من خلال تقليص نطاق دورة التطوير القادمة (تقليصًا مضاعفًا بالنسبة لدورة التطوير القادمة من أجل معالجة المشكلات الإضافية لدورة التطوير الحالية، وتقليصًا مفردًا بالنسبة للدورة اللاحقة حفاظًا على التوازن). إذا تكرر حدوث ذلك فهو مؤشر على وجود مشكلة بالالتزام بدورة التطوير أو توتر بين المطورين، وعندها يصبح تحديد نطاق دورة التطوير هدفًا أساسيًا يجب مناقشته في الاجتماع الاسترجاعي القادم. حالة أجايل الزائفة الثانية: دُمِجت الأعمال التي يجب تسليمها في دورة التطوير السابقة مع الأعمال التي يجب تسليمها في دورة التطوير الحالية، لأن فريق ضمان الجودة لم يبدأ بها بعد. ولم يُنشَر أي تحديث للمنتج منذ ثلاثة شهور. الدرس المستفاد: قد يكون تأخر فريق ضمان الجودة مؤشرًا على ثقل برنامج عمل دورات التطوير أو انخفاض جودة البرمجيات أو تراكم أعمال خط ضمان الجودة، أو توليفة من هذه الأسباب. يشير وجود عقبات أمام الإنتاج إلى وجود مشكلة في آلية التسليم المستمر إلى الإنتاج، والذي قد ينجم عن عدم اجتياز اختبار قبول المستخدم أو نقص الكوادر التي تعمل عليه، أو ربما يحدث ذلك رغم اجتياز اختبار قبول المستخدم بسبب اعتقاد مالك المنتج أن النشر ليس جاهزًا! يُعَد السعي نحو الكمال مشكلةً واقعيةً وشائعةً ضمن فرق أجايل، والعلاج الوحيد لها هو الرضا والقبول بتسليم عمل دون مستوى الكمالية إلى المستخدمين ومن ثم جمع ملاحظاتهم وإجراء تحسينات عليه. التواصل هناك أيضًا حالتي أجايل زائفتين بخصوص التواصل: حالة أجايل الزائفة الأولى: تعمل مجموعة صغيرة من مالكي المنتج ومديري سكرام على تحويل جميع عمليات التواصل من الأطراف المعنية إلى المطورين، وبذلك تصبح الأطراف المعنية مجهولة تقريبًا بالنسبة للفريق، مع عدم وجود طريقة للتواصل معهم، مما يؤدي إلى تعذر إجراء اختبارات المستخدمين (الذين يُعَدّون من ضمن الأطراف المعنية). الدرس المستفاد: يتعارض أسلوب التواصل هذا مع المبدأ الرابع من مبادئ أجايل الذي ينص على أن "أصحاب المشروع والمطورين يجب أن يعملوا على المشروع جنبًا إلى جنب يوميًا". عندما يكون مسار جميع عمليات التواصل موجهًا نحو نقطة ضيقة، فقد يتعذر التعاون مع العملاء (القيمة الثالثة من قيم أجايل). وبغياب التعاون يفوِّت الفريق فرص الاستجابة للتغيرات في احتياجات الأطراف المعنية أو تفاضيلاتهم. حالة أجايل الزائفة الثانية: فرق المحتوى المتعددة ضمن المؤسسة هي المسؤولة عن تعبئة المنصة التي يعمل المهندسون على إعدادها، وعندما لا يُملَأ المحتوى تنعدم فائدة التطبيق، ويقع اللوم على المهندسين؛ وعندما يترأس الفريق نائب جديد ويجمع الفريق ليخبرهم بتكليفه، يهمل تقصير النائب السابق ويطرد مدير الهندسة الذي يحظى بسمعة طيبة، ويبقى المحتوى مفقودًا. الدرس المستفاد: الحاجة إلى التعاون لا تقتصر على العملاء، وفي هذا المثال كان من الضروري أن يجري التواصل بين المطورين وفرق المحتوى من أجل الحد من ترددهم في نشر محتواهم ضمن النظام الجديد. بسبب عدم حدوث هذا التواصل، حدث تأجيل في توفير محتوى بالتنسيق الذي يتطلبه النظام الجديد على نطاق واسع. وقد أدت القيود الصارمة التي فُرضت على التواصل مع فرق المحتوى إلى تعذر تواصل المهندسين معهم، مما انعكس سلبًا على المشروع برمّته. العمليات التقنية حالة أجايل الزائفة هنا هي عندما يجري تغيير قاعدة البيانات المحلية للمطورين إلى آلية مختلفة عن بيئة التحضير والإنتاج. ويكون هناك مشروعان واحد منهما فقط لديه محرك لترحيل قواعد بيانات، أما المشروع الآخر فيتعين عليه توجيه جميع طلبات التغيير عبر المستشار التقني لإجراء تحديثات يدوية، لكن المستشار التقني لا يتمتع بأي خبرة بإدارة قواعد البيانات. الدرس المستفاد: التكامل المستمر والنشر المستمر CI/CD ونموذج DevOps هما عنصران أساسيان من مسار عمل أجايل، لكن يمكن أن تعرقلهما عمليات بشرية تسبب التباطؤ. بالنسبة لحالة قواعد البيانات، من الأفضل وضع شروط لترحيل البيانات قبل البدء بأي مشروع، ومع ذلك فيمكن تطبيق شروط ترحيل البيانات على أي مشروع يأتي فيما بعد، يجب أيضًا الاهتمام بشكل خاص باختيار سياسات السحابة، نظرًا لأن المطورين يحتاجون إلى تراخيص الاستخدام الفردي أو تكنولوجيا مكافئة من أجل التطوير المحلي. الخلاصة تتمثل أولويات منهجية أجايل الحقيقية بتقديم برمجيات فعالة قائمة على التواصل المستمر والقدرة على التكيف، مع الالتزام بقيم ومبادئ اتفاقية أجايل. مع ذلك فإن الكثير من الفرق تقع في فخ تزييف منهجية أجايل، وذلك من خلال تطبيق نسخ ظاهرية من ممارسات أجايل دون الالتفات إلى مبادئه الأساسية. للاستفادة من مزايا أجايل كما يجب، لا بد وأن يبدي الفريق استيعابًا عميقًا لنطاق المشكلة، وأن يوفر المناخ الملائم للمطورين لتنظيم عملهم؛ مع الحرص على التواصل الفعال، وإعطاء الأولوية لتسليم العمل والحصول على ملاحظات المستخدمين، وضمان أن تدعم العمليات التقنية استمرارية التكامل والنشر. لا بد من الالتزام بهذه المبادئ لكي تتمكن الفرق من تحقيق النجاح عبر منهجية أجايل. ترجمة -وبتصرّف- للمقال You're Doing Agile Wrong لصاحبه Bradley Momberger. اقرأ أيضًا دليل المبتدئين لمنهجية أجايل Agile دليلك إلى أشهر أطر عمل منهجية أجايل المراسم الأربعة لمنهجية أجايل Agile ceremonies ما هي إدارة المنتجات؟ ما هي إدارة المشاريع؟ تعرف على إطار عمل سكرام scrum أشهر أطر منهجية أجايل
  5. أولاً ستحتاج إلى شراء رخصة للمحتوى غير ذلك يعتبر أمر غير قانوني. وستحتاج إلى مناقشة التكلفة مع مبرمج لديه معرض أعمال جيد وتجنب من لديه معرض أعمال ضعيف، عامًة لو احتسبنا الأمر على سعر ساعة 10 دولار، والتطبيق يحتاج تطويره كتقدير مبدئي لمدة 3-6 أشهر، أي 600 ساعة في 10 يصبح السعر 6000 دولار. لكن عامًة تستطيع الحصول على سعر جيد في حال قمت بعرض مشروعك على موقع العمل الحر مثل مستقل، وستستقبل العروض ويمكنك الإختيار من بينها بناءًا على السعر وجودة معرض الأعمال، مثل تكلفة 1500 إلى 3000 دولار.
  6. حاليًا لا تتوفر عروض، لكن أحيانًا يوجد كوبونات خصم متوفرة أرجو التحدث لمركز المساعدة والسؤال عن ما إن كانت متوفرة أم لا. وعامًة من وقت لآخر يوجد عروض مثل اشتري دورتين بسعر دورة واحدة. ويتم توفير عروض في المناسبات مثل رمضان وأحيانًا في فترة الإجازات الصيفية وأحيانًا في فترة التخفيضات السنوية الخاصة بالجمعة البيضاء، وفي بعض الأحيان يتم توفير كوبونات.
  7. لا يتم العثور على رابط binder بين تطبيق Flutter وخدمة Android. حاول إضافة التالي إلى دالة main() لديك في السطر الأول: WidgetsFlutterBinding.ensureInitialized();
  8. لديك الوقت الكافي إذن، تعلم الأساسيات أولاً ابحث عن دورة علوم الحاسوب ويوجد بالأكاديمية هنا دورة مخصصة لذلك، بعد ذلك تعلم لغة برمجة قوية مثل C++ أو جافا أو C#. وإن كانت تلك اللغات صعبة تستطيع تعلم بايثون، لكن لا تبدأ بلغة جافاسكريبت. بعد ذلك عليك تحديد ما المجال البرمجي الذي تريد التخصص به، وتعلم المهارات المطلوبة به، وستجد تفصيل هنا:
  9. وعليكم السلام ورحمة الله وبركاته . أولا لا يمكن المقارنة بين ال objects و بين data structures فهما شيئان منفصلان ولنشرح كل منهما : إن الكائنات (Objects) تُستخدم الكائنات في البرمجة الكائنية التوجه (Object-Oriented Programming)، وهي منهجية برمجية تركز على تنظيم البرامج حول الكائنات التي تتفاعل مع بعضها البعض حيث يتم إنشاء صنف (class) يعبر عن سلوك هذه الكائنات مثل السيارة أو الكتاب أو المستخدم ...... إلخ , ويتم توظيف هذا السلوك عن طريق إنشاء خصائص وسمات هذا الصنف . ويتم إنشاء كائن من هذا الصنف أى ان الكائن هو هذا العنصر الذى يتم إنشاءه من الصنف . ويمكنك قراءة هذا الدرس لنفهم أكثر عن الكائنات . أما عن هياكل البيانات (Data Structures): فهو علم مهتم بكيفية تنظيم وتخزين البيانات بشكل منظم لتحقيق أداء معين أو تلبية احتياجات معينة , حيث تشمل هياكل البيانات مجموعة متنوعة من الطرق لتنظيم البيانات مثل القوائم المتسلسلة، الأشجار، الجداول، إلخ. غالبًا ما تستخدم لتخزين وإدارة مجموعات كبيرة من البيانات وتوفير عمليات فعالة للبحث والإدخال والحذف ويتم غالبا إنشاء تلك الهياكل عن طريق الأصناف والكائنات . تلخيصا للسابق يمكننا القول إن الكائنات تمثل مفاهيم وكيانات في البرمجة تحتوي على بيانات وسلوك ، بينما تعتبر هياكل البيانات ترتيبا وتنظيما للبيانات لتحقيق أهداف معينة مثل الفعالية أو السهولة في الوصول إلى البيانات.
  10. السلام عليكم هو اي الفرق بين الobjects و بين data structures ؟
  11. البارحة
  12. شكرا اخي الكريم لتوضح المشكله لي لقد عدلت كل شيء والان هو يعمل ❤
  13. يوجد لديك عدة أخطاء . اولا في ملف web.php فى السطر الذى تقزم بتحديده هذا السطر زائد ولا يجب كتابته حيث انك قمت بتعريف resource لل blog ولهذا فإن هذا السطر لا يجب كتابته . اما الخطأ الذى يظهر لديك هو انه يستقبل en وليس ١ لانك قمت بكتابة prefix ووضعت local parameter لهذا يجب على الدالة show ان تستقبل معاملين الاول هو اللغه local والثانى هو id لذلك قم بإضافة معامل قبل ال id يسمى lang .
  14. السلام عليكم التكلفه مشروع تحسب التكلفه بناء على الاشياء التي تطلبها تواصل معي على +972567013418 لتزويدك المزيد من التفاصيل اذا اردت
  15. App\Http\Controllers\BlogController::show(): Argument #1 ($id) must be of type int, string given, called in F:\AjeelAlSalam\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php on line 46 ما زاله المشكله موجوده يستقبل ال id من رابط هذا http://127.0.0.1:8000/en/blog/1 ال ar لا اعرف يجب ان يستقبل 1
  16. السلام عليكم انا اعمل على مشروع بلغه برمجه php وهناك جزئيه في الموقع تحتاج الى استخدام سكريبت بايثون وهي انه يوجد لدي صور كثيرة (dataset images) وأريد ان ارفع صورة او اختار صورة ومن خلال سكريبت بايثون يخرج لي الصور المشابهة لهذه الصورة وانا ساقوم بعرضها باستخدام php كيف يمكنني تنفيذ هذا الاسكريبت وهل يوجد مكتبه جاهزة يمكن استخدامها وشكرا..
  17. هل من الممكن ان توضح اكثر بالكود لو سمحت؟
  18. لا يتم إعادة مصفوفة في خاصية data، قم بطباعة data وتفقد ما الذي يتم إعادته، فأنت حاليًا تحاول استخدام ميثود map على مصفوفة لكن data ليست مصفوفة، لذا map غير متاحة.
  19. شكرا لك تم حل المشكلة ولكنى عندى سؤال اخر لو تكرمت ظهرت مشكلة اخرى عن اضافة عنوان جديد والضغط هنا يحولنى لصفحة بيضاء وهنا الخطأ فى inspect انا لا افهمة صرحة
  20. نعم أحسنتي الكود جيد ولكن توجد بعض المشاكل و بعض التعليقات . أولا إن المطلوب هو إستقبال عناصر المصفوفة من المستخدم ومن ثم طباعة جميع العناصر ما عدى العنصر رقم 3 في المصفوفة . وما قمتى به هو طباعة المصفوفة بأكملها مع جميع العناصر وقمتي فقط بالتاكد من ان القيمة المدخلة هى 3 وليس مكان عنصر المصفوفة . أما بالنسبة لمستوى الكود فهو جيد لا مشكلة به و لا يمكن إختصاره أكثر من هذا . والآن لنصلح الأخطاء معا : بالنسبة لهذا السطر c+=1 انتي تقومين بتنفيذه مرتين وهكذا فإن المستخدم إذا ادخل مثلا حجم المصفوفة 4 سيتم سؤاله مرتين فقط وستصبح المصفوفة يوجد بها عنصرين فقط أى ان نصف المصفوفة لن يتم إنشاءه والحل هو إدخال c+=1 بداخل هذا الشرط قبل سطر continue والخطأ الثانى هو أننا يجب أن نتاكد من المتغير c وليس value لانه كما أخبرتك يريد طباعة المصفوفة ما عدا العنصر الثالث وليس رقم 3 . وايضا بما أنكى قمتى بوضع المتغير c ب 0 إبتداءا إذا فإن العنصر الثالث سيكون ترتيبه 2 . ليصبح الكود الصحيح كالتالي : def func(): size=int(input("enter the number of your array's size")) c=0 array=[] while c < size: value=int(input("enter one items")) if c == 2: c+=1 continue array.append(value) c+=1 for i in array: print(i) func()
  21. # # // قم بكتابة دالة تستقبل مصفوفة من المستخدم وتقوم بطباعة جميع عناصر المصفوفة ماعدا العنصر رقم 3 def func(): size=int(input("enter the number of your array's size")) c=0 array=[] while c <size: value=int(input("enter one items")) c+=1 if value ==3: continue array.append(value) c+=1 print(array) func() الكود بعد تنفيذ التعليمات مع العلم انا لم ادخل للامتحان بعد ولكن كنت ارغب في الحصول على المساعدة لحل السؤال اعلاه السؤال الان هذا الكود نفذ لي المطلوب ولكن ارغب معرفة مستوى الكود وهل يوجد اختصار او حل افضل للحصول على نفس النتيجة للاستفادة فقط
  22. مرحبا أحمد . يجب أن تتعلم كيفية تتبع الأخطاء حتى يكون مستواك متقدما وتستطيع إكتشاف الأخطاء بمفردك . والآن لنكتشف الأخطاء معا : اولا إن الطلب لا يتم عند إتمام الشراء حيث يخبرك أنه مطلوب عنوان وأنت بالفعل إخترت العنوان . ولاحظ أنك عند إختيار العنوان تتاكد أولا منه فى قاعدة البيانات . حيث حينما تقوم بإختيار عنوان يتم إرسال طلب إلى الخادم . والآ لنقم بفتح تبويبة network فى ادوات المطورين لنكتشف الخطأ ستجد أن الخطأ الذى يظهر لك هو أن المسار غير معرف . ستجد أنك لم تقم بتعريف ال Route الذى يقوم بإرجاع العنوان بال id فى الخادم . لذلك لنقم بإنشاءه . في ملف back-end\services\addressService.js لنقم بإنشاء الدالة التى تقوم بإرجاع العنوان بناء على ال id كالتالي : exports.getAddresse = asyncHandler(async (req, res, next) => { const user = await User.findById(req.user._id).populate('addresses'); let address=[]; user.addresses.forEach(element => { if(element._id == req.params.addressId) return address.push(element); }); res.status(200).json({ status: 'success', results: address.length, data: address, }); }); و الآن في ملف back-end\routes\addressRoute.js لنقم بتعريف مسار جديد وتمرير الدالة السابقة له هكذا .: const express = require('express'); const authService = require('../services/authService'); const { addAddress, removeAddress, getLoggedUserAddresses, getAddresse } = require('../services/addressService'); const router = express.Router(); router.use(authService.protect, authService.allowedTo('user')); router.route('/').post(addAddress).get(getLoggedUserAddresses); router.get('/:addressId',getAddresse); router.delete('/:addressId', removeAddress); module.exports = router; وهكذا تم حل أول مشكلة و ستجد أنك تستطيع الآن ان تتم عملية الشراء . نأتى للخطأ الثانى وهو عدم اضافة التعليق والتقيم : لنقم بفتح خانة Network كما في السابق وعند إرسال الطلب الخاص بإضافة التعليق ستجد رسالة الخطأ تخبرك ان ratings لم يتم إرسالها و هى مطلوبة وإذا نظرنا إلى ما تقوم بإرساله ستجد أنك تقوم بإرسال rating بدلا من ratings لهذا هو يعتبر أنك لم تقم بإرسال أى تقيم وحل تلك المشكلة في ملف front-end\src\hook\review\add-rate-hook.js سطر رقم 38 قم فقط بإضافة حرف s هكذا : ratings: rateValue والآن سيعمل معك بشكل جيد وتستطيع إضافة أى تقيم . وقد قمت بإرفاق الملفات السابقى بعد التعديل . addressRoute.js addressService.js
  23. لا نجيب هنا في الأكاديمية على أسئلة الإختبارات ولكن يمكننى توضيح فكرة الحل لكي . يمكنكي إستخدام حلقة التكرار while لتحقيق ذلك. أولا يجب سؤال المستخدم عن عدد العناصر إذا أردتي أن يقوم هو بتحديد عدد العناصر أو يمكنك أنتي تحديد عدد العناصر فى المصفوفة وبعد ذلك وضع هذه القيمة في متغير يشير إلى حجم المصفوفة. ثم بعد ذلك نقوم بإنشاء متغير يحوى قيمة صفر , ثم بعد ذلك ننشأ مصفوفة فارغة . ثم نقوم بعمل while loop وجعل الشرط هو التاكد من أن المتغير الذى قمنا بوضع قيمة إبتدائية له ليس اكبر من المتغير size الذى قام المستخدم بإدخاله وفي كل مرة داخل ال loop نقوم بسؤال المستخدم عن الرقم الجديد الذى يريد إضافته للمصفوفة وبعد ذلك نقم بوضعه داخل المصفوفة وبعد ذلك لا ننسى أن نقوم بزيادة قيمة المتغير ب 1 حتى لا يتم تنفيذ ال loop دائما . وهكذا قد تم إنشاء القائمة لدينا . يمكنك كتابة الكود بنفسك وإذا واجهتك أى مشكلة به فقط أخبرينى
  24. هذا الخطأ في بايثون ينتج عندما تحاولين تحويل سلسلة نصية تحتوى على أرقام عشرية وليست رقم صحيح . مثل هذا الكود . print(int('1.5')) الكود السابق سيظهر نفس الخطأ الذى ظهر لديكي . ولحل تلك المشكلة يمكنك إستخدام split ولكن الأفضل هو تحويل الرقم إلى float ثم بعد ذلك int هكذا . print(int(float('1.5'))) وهكذا فإن الكود السابق سيقوم بطباعة رقم 1 ويمكنك إستخدامه وتمرير القيمة التى أدخلها المستخدم لأنه إذا قام بإدخال رقم عشرى و لم يتم التعامل معه سيظل يظهر الخطأ السابق
  1. عرض المزيد
×
×
  • أضف...