برمجة زوجية

البرمجة الزوجية هي أحد تقنيات أجيل لتطوير البرمجيات حيث يعمل اثنين من المبرمجين معا في محطة عمل واحدة. يكتب أحدهم الكود المصدري في حين يستعرض الأخر كل سطر من الأكواد كما تمت كتابتها. والشخص الذي يقوم بالكتابة يُسمى المحرك. ويطلق على الشخص الذي يستعرض الكود المراقب (أو الملاح"One of the programmers, the driver, has control of the keyboard/mouse and actively implements the program. The other programmer, the observer, continuously observes the work of the driver to identify tactical (syntactic, spelling, etc.) defects, and also thinks strategically about the direction of the work."). ويتبادل المبرمجان الأدوار بشكل متكرر.
أثناء الاستعراض، يضع المراقب في اعتباره التوجه الاستراتيجي للعمل، والخروج بأفكار من أجل إدخال تحسينات والمشاكل المحتملة في المستقبل لمعالجتها. وهذا يتيح الفرصة للمحرك في تركيز كل اهتمامه على الجوانب «التكتيكية» لاستكمال المهمة الحالية، وذلك باستخدام المراقب كشبكة أمان ودليل.
تصغير|مع انخفاض أسعار أجهزة الكمبيوتر هذه الأيام، أصبح من الشائع إعداد جديد بشاشتين يتشاركان في مكان العمل في الصناعة

 التكاليف والفوائد 
وجدت بعض الدراسات أن المبرمجين الذين يعملون بشكل زوجي ينتجون برامج أقصر، مع تصميمات أفضل وعدد أخطاء برمجية أقل، من المبرمجين الذين يعملون وحدهم. وقد وجدت الدراسات انخفاض معدلات الخطأ من 15 ٪ إلى 50 ٪، وتتفاوت اعتمادا على خبرة المبرمج وتعقيد المهمة.. وعادة ما ينظر الأزواج في بدائل تصميمية أكثر من المبرمجين المنفردين، ويستطيعوا التوصل إلى تصاميم أكثر بساطة وأكثر ثباتا؛ كما يستطيعون اصطياد عيوب التصميم في وقت مبكر. وعادة ما يعمل الأزواج بشكل أسرع من مبرمج واحد مخصص لنفس المهمة. وغالبا ما يجد الأزواج المشاكل التي تبدو «مستحيلة» سهلة أو حتى سريعة الحل، أو على الأقل من الممكن حلها عندما يعملون معا. "Collaborative teams consistently report that together they can evolve solutions to unruly or seemingly impossible problems. … The driver might actually be working out a design or implementing a part of the problem, realizing that he or she may ultimately come to a dead end in the problem resolution. The navigator, while watching the driver's partial design or implementation, begins thinking about the next step. When the driver hits the dead end, the navigator is often prepared to take over and lead the way. Often, the cycle continues until the problem is solved."

ومع ذلك، وفي 2007، استنتج تحليل الميتا أن «البرمجة الزوجية ليست مفيدة بشكل موحد أو فعالة» بسبب أن العديد من العوامل الأخرى بجانب اختيار استخدام البرمجة الزوجية لها آثار كبيرة على نتائج مهمة البرمجة. ووجدت دراسة الميتا أن البرمجة الزوجية تميل إلى تقليل الوقت اللازم للتطوير، وتنتج آثارا إيجابية هامشية على نوعية الكود، ولكن هذه البرمجة الزوجية تتطلب جهد أكبر من المطور، وهذا يعني، أن تكلفتها أكثر بكثير من تكلفة البرمجة المنفردة. ويقترح المؤلفان أن دراسة البرمجة الزوجية تعاني من التحيز في النشر حيث ان الدراسات التي لا تظهر أن البرمجة الزوجية مفيدة، لا تقدم للنشر، أو لا يقبل نشرها. وبالتالي يتم الاستنتاج أنه «لا يمكنك ان تتوقع أسرع وأفضل وأرخص».
على الرغم من اكتمال الترميز بشكل أسرع مما يكون عليه عندما يعمل مبرمج واحد وحده، فإن مجموع وقت المبرمج (عدد المبرمجين × الوقت الممضى) يزداد. ويجب على المدير أن يوازن بين انتهاء العمل بشكل أسرع وتقليل الاختبار ووقت التصحيح ضد ارتفاع تكلفة الترميز. ويمكن للوزن النسبي لهذه العوامل أن تختلف من مشروع إلى آخر ومهمة لأخرى. ان الاستفادة من الاقتران هو أعظم بالنسبة للمهام التي لا يستعبها المبرمجين تماما قبل أن البدء: وهذا يعني، المهام الصعبة التي تدعو إلى الإبداع والتطور.<ref name='ijhcs'> وبالنسبة للمهام البسيطة، والتي يستعبها الزوجين تماما بالفعل، ينتج الاقتران في انخفاض صافي الإنتاجية.

تمر المعرفة بين المبرمجان وهم يعملون. فهما يتبادلان المعرفة بخصوصيات النظام، ويلتقطان تقنيات البرمجة من بعضهما البعض. "Knowledge is constantly being passed between partners, from tool usage tips to design and programming idioms. The partners take turns being the teacher and the student. Even unspoken skills and habits cross partners." يلتقط بسرعة الموظفون الجدد ممارسات الفريق ومعرفة تفاصيل هذا النظام. "[Expert-novice pairing] can even be valuable for novices who are novices only in the sense that they haven't been with their team for very long. … Watching and then doing with an expert by your side can greatly reduce the time it would require to learn 'the right way' of working with the team. It really helps when the newbie works with many of the experts (or with any team member) so he or she can learn about many different aspects of the system." تنتشر مع «الاقتران المختلط»—كل مبرمج يدور خلال سائر مبرمجين الفريق بدلا من الاقتران بشريك واحد فقط—معرفة النظام في الفريق بأكمله، وبالتالي الحد من مخاطر الإدارة في حالة ترك أحد المبرمجين الفريق.

عادة ما يحسن الاقتران الانضباط وإدارة الوقت. فالمبرمجين أقل عرضة لتخطي اختبارات الوحدة، وقضاء بعض الوقت في تصفح شبكة الإنترنت أو على البريد الإلكتروني الشخصي، "Two people working in a pair treat their shared time as more valuable. They tend to cut phone calls short; they don't check e-mail messages or favorite Web pages; they don't waste each other's time." (Ward's Wiki 1999, contributed by Paul Chisholm). أو الالتواء عند العمل مع شريك مقترن. فالشريك المقترن «يبقيهم صادقين»."Under stress, people revert. They will skip writing tests. They will put off refactoring. They will avoid integrating. With your partner watching, though, chances are that even if you feel like blowing off one of these practices, your partner won't.""With any software development process there is a constant struggle to get the software engineers to follow the prescribed process. A benefit of pair programming is improved adherence to procedures and standards." وان الناس يكونوا أكثر ترددا في مقاطعة زوجا مما هو عليه الحال بالنسبة لشخص يعمل وحده."Others see us already working with someone else, and they leave us alone. The net effect is that we have bigger blocks of uninterrupted time, which is good for our mental state and our progress. It also reduces task-switching, which for some people generates a huge overhead."

وبعض الفوائد الإضافية المذكورة تشمل زيادة الروح المعنوية، "In our recent Web survey, we asked, 'What have you found beneficial about pair programming?' The single most common response was, 'It's a lot more fun!'" وزيادة الثقة في صحة الكود.

 الدراسات العلمية 
حسب الاقتصاديون
 «وقد أظهرت لوري وليامز من جامعة يوتا في مدينة سولت ليك أن المبرمجين الزوجيين ليسوا سوى 15 ٪ أبطأ من اثنين من المبرمجين الفرديين المستقلين، ولكن ينتجوا 15 ٪ أخطاء برمجية أقل. (ملحوظة: أظهرت الدراسة الأصلية أن كود 'خالي من الأخطاء’ ذهبت من 70 ٪ إلى 85 ٪، بل قد تكون أكثر سهولة للقول بأن هذا هو انخفاض 50 ٪ من الأخطاء، من 30 ٪ إلى 15 ٪). ولأن الاختبار والتصحيح في كثير من الأحيان أكثر تكلفة من العديد من البرامج الأولية، فهذه نتيجة مثيرة للإعجاب.»

وقد أظهرت وليامز في دراسة 2000 تحسنا في صحة الأخطاء بنحو 15 ٪ وانخفاض 20 ٪ -40 ٪ في الوقت، ولكن بين زيادة 15 ٪ و60 ٪ في الجهد، وهو، مجموع ساعات المبرمج. ودراية وليامز2000 تستشهد بدراسة سابقة (Nosek 1998) والتي اظهرت أيضا انخفاضا بنسبة 40 ٪ في الوقت وزيادة 60 ٪ في الجهد.
وتعرض دراسة (لوي 2006) تجربة علمية صارمة والتي عند اختبار زوجين مبتدئين ضد منفردين مبتدئين يتم تحقيق مكاسب إنتاجية أكبر بكثير من اختبار أزواج ذو خبرة ضد منفردين خبرة.

وفي دراسة حديثة أكبر (Arisholm 2007) يوجد زيادة 48 ٪ في صحة الأنظمة المعقدة، ولكن لا يوجد فرق كبير في الوقت، في حين كان النقص في الوقت في النظم البسيطة 20 ٪، ولكن لم يوجد اختلاف كبير في الصحة. وبشكل عمومي لم يكن هناك انخفاض عام في الوقت أو زيادة في الصحة، ولكن زيادة عامة 84 ٪ في الجهد.

ويظهر لوي، وتشان، ونوزك (2008) أن البرمجة الزوجية تتفوق في المهام التصميمية.

وفي تحليل ميتا كامل النطاق من الدراسات التجريبية على البرمجة الزوجية، من قبل أو خلال عام 2007، يؤكد (هناي. 2009) «أنه لا يمكنك توقع أسرع وأفضل وأرخص». وتكلف الجودة الأعلى للقيام بمهام معقدة جهد مرتفع، وتخفيض المدة للمهام الأبسط يأتي مع جودة أقل بشكل ملحوظ—تحليل الميتا «تشير إلى أن البرمجة الزوجية ليست مفيدة بشكل موحد أو فعالة».

 أشكال البرمجة الزوجية 

 خبير-خبير 
قد يبدو الاقتران بين اثنين من الخبراء الاختيار الواضح لأعلى إنتاجية ويمكن أن يؤدي إلى نتائج رائعة، لكنه غالبًا ما يؤدي إلى محدودية ظهور أفكار جديدة وعملية، حيث من غير المرجح أن يشكك كلا الطرفين في الممارسات المتبعة.

 خبير-مبتدئ 
يوفر الاقتران بين المبتدئ والخبير العديد من الفرص للخبير لتوجيه المبتدئ. يمكن لهذا الاقتران أيضًا تقديم أفكار جديدة، لأن المبتدئ أكثر عرضة للتشكيك في الممارسات المتبعة. وبالتالي سيكون من الخبير الآن شرح الممارسات المتبعة، ومن المرجح أن يبدأ بالتشكيك فيها أيضاّ. ومع ذلك، في هذا الاقتران، يمكن للمبتدئ أن يشعر بالخوف من التشكيك في ممارسات الخبير ويتردد في المشاركة بشكل مفيد. أيضًا، قد لا يتمتع بعض الخبراء بالصبر اللازم للسماح للمبتدئ بالمشاركة البناءة.

 مبتدئ-مبتدئ 
يمكن أن يؤدي الاقتران بين المبتدئ والمبتدئ إلى نتائج أفضل بكثير من عمل اثنين من المبتدئين بشكل مستقل، على الرغم من أن هذه الممارسة غير محبذة عمومًا لأنه يصعب على المبتدئين تطوير عادات جيدة دون وجود قدوة مناسبة.

 مؤشرات التعثر 
وهناك مؤشرات قليلة على أن هذا الزوج لا يعمل بشكل جيد:
 فك الارتباط—واحد من أعضاء يحرك فعليا كرسيه بعيدا عن لوحة المفاتيح، أو يبدأ العمل على بريده الإلكتروني، وما إلى ذلك. وفي بعض الأحيان يمكن أن يصل هذا إلى أقصى قدر عند نوم أحد الأعضاء.
 مشاهدة المحترف—في بعض الأحيان يكون أحد الأعضاء أكثر خبرة من الآخر. فيوجد إغراء بالإذعان إلى العضو الأكثر بروزا، وسيتم انزال الأقل خبرة إلى صفة مراقب. وهذا غالبا ما يؤدي إلى فك الارتباط.
 الصمت—لا يمكن أن يعمل الأزواج معا إذا لم يتحدثوا مع بعضهم البعض.Agile Pair Programming | Agile Sherpa 

 المتغيرات 
 البرمجة الزوجية عن بعد 
البرمجة الزوجية عن بعد، والمعروفة أيضا باسم البرمجة الزوجية الافتراضية أو البرمجة الزوجية الموزعة، هي برمجة زوجية يكون فيها المبرمجين في مواقع مختلفة،Flor, Nick (2006). Globally distributed software development and pair programming. Communication of the ACM, 49, 57-58. يعملون عبر محرر الوقت الحقيقي التعاوني، أو سطح مكتب مشترك، أو برنامج مساعد في بيئة تطوير متكاملة للبرمجة الزوجية عن بعد. تُدخل البرمجة الزوجية عن بعد صعوبات لم تكن موجودة في اقتران الوجه لوجه، مثل تأخير اضافي للتنسيق، وهذا يتوقف على أدوات تتبع المهمة ذات «الوزن الثقيل» بدلا من تلك «الخفيفة» مثل فهرس البطاقات، وفقدان التواصل الغير لفظي مما أدى إلى الارتباك والصراعات على أشياء مثل من «لديه لوحة المفاتيح».

العديد من الأدوات الإضافية مثل مساعدات برنامج إيكليبس متوفرة لدعم الاقتران عن بعد. ولقد جربت بعض الفرق Virtual Network Computing وRealVNC مع كل مبرمج باستخدام الحاسوب الخاص بهم.Agile Ajax: Pair Programming with VNC Pair Programming - The Ultimate Setup and the other options we tried. - Jonathan Cogley's Blog Ola Lindberg › Computer ergonomics and pair programming  واستخدام آخرون وضع العرض المتعدد (-x) من خلال شاشة جنو المستندة إلى نص. ولدى شركةأبل ماك أو إس عشرة تطبيق تقاسم الشاشة مدمج.

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

 انظر أيضًا 
 برمجة قصوى
 c2:PairProgramming
 c2:PairProgrammingPattern
 c2:PairRotationFrequency

 وصلات خارجية 
 wikiHow: How to Pair Program  How-to guide; contains common wisdom on how to make pair programming work.
 Agile Alliance's Index of Articles about Pair Programming
 PairWithUs A collection of videos showing pair programming in action.

 برامج ووصلات تدعم البرمجة الزوجية 
 Eclipse Communication Framework Includes Cola, an إكلبس plug-in
 Saros An إكلبس plug-in
 XPairtise An إكلبس plug-in
 wave-vs.net Plug-in for مايكروسوفت فيجوال ستوديو

 المراجع 

تصنيف:برمجة
تصنيف:برمجة قصوى
تصنيف:تطوير البرمجيات أجايل