Pair Programming

Umut Gökbayrak
Çevik Yazılım Geliştirme
6 min readAug 5, 2021

--

Pair programlama ya da eşli programlama, yüksek kalitede bir yazılım üretmek istendiğinde öncelikle tercih edilecek XP (extreme programming) yöntemlerinden bir tanesidir. En basit manada, yazılımcıların diğer yazılımcılarla eşleşerek tek bir sorunun çözümüne odaklanması, daha hızlı ve kaliteli bir sonuç alması amaçlı uygulanır. Dahası, sadece yazılımcılarla değil, testçilerle, analistlerle, devops, güvenlik uzmanlarıyla da eşleşerek bir çıktı üretilebilir.

Photo by Alvaro Reyes on Unsplash

Temel prensip oldukça basittir. Eşlerden birincisi önünde klavye olan “driver” (sürücü) olarak ve ikincisi de görevi kodu gözetlemek, yönlendirmekle olan navigator (gözlemci/co-pilot) olarak adlandırılır. Bu roller eşler arasında, çeşitli yöntemler ile sürekli değişmelidir. Pair programming oturumu esnasında eşler sürekli iletişimde olmalı, ne düşündüğünü, ne yaptığını, ne yapacağını anlatmalıdır.

Bu yazıda pair programming’in temellerinden ve pratikte uygulanmasından bahsedeceğim. Bu disiplinin “uzaktan” nasıl uygulanabildiği konusu, başka bir başlığın konusu olacak.

Ne için kullanılır?

“Bir elin nesi var iki elin sesi var” atasözünün vücut bulmuş halidir pair programming. Kodun daha yazıldığı anda kalitesinin yüksek olması amaçlanmıştır. Kendi başınıza halı altına süpürme potansiyeliniz olan işleri yanınızda sizi disipline eden bir eş varken çok daha kaliteli yaparsınız. Kod yazarken sizi dikkatle izleyen bir çift göz olduğunda tüm bilgi dağarcığınızı kullanır, tüm bilgi ve becerinizi klavyeye aktarırsınız. İki kişi birbiriyle tüm egoları bir kenara bırakarak, sosyal etkileşime girer, mesleki paylaşım yapar ve bilgi paylaşımında çok verimli bir aşama katedersiniz.

Kısaca pair programming aşağıdaki durumlar için mükemmel uyum sağlar:

  • Bir junior yazılımcının senior yazılımcıdan bir şeyler öğrenmesi için
  • Takıma yeni katılmış bir yazılımcının oryantasyonu sürecinde
  • Büyükçe bir projenin geliştirmesi sürecinde
  • Bir yazılımcının yeni bir çevik prensip öğrenmesi sürecinde (TDD, unit testing vs…)
  • Production (canlı) ortamda bir bug veya problemin çözümünde. Sistemin inceliklerinin takım arkadaşlarına aktarımının sağlanmasında

Eşli programlamada bir driver ve navigator olması işin tüm özü. Driver kodun syntax, compile olması ve yazılması ile uğraşırken navigator bir sonraki adımın ne olacağını düşünmeye, ölçeklenmede çıkabilecek sorunlara odaklanır. Bu sayede yazılan kod, sanki daha yazılırken code review (kod gözden geçirme) uygulanmışçasına daha yüksek kalitede çıkar.

Özetle; bazı konuları kendinizden daha iyi bilen, sizden akıllı birileriyle birlikte yapmak ve “vay canına, ne yaptın az önce” diyebilmek bu meslekte en hızlı ilerleme yöntemlerinden birisidir.

Driver (sürücü) değişimi

Pair programming’de bir kaç dakikada bir, driver yerini navigator’a bırakıp, yer değiştirilir. Normal şartlarda bu durumda driver, “ben burada tıkandım, bir el atar mısın” diyebilir veya navigator, “bir fikrim var klavyeye geçebilir miyim” gibi yapıcı bir dil kullanır. Sosyal normlar burada gayet güzel işler.

Driver-navigator değişimi konusunda sıklıkla uygulanan diğer iki yöntem ise ping-pong programming ve strong-style pairing’dir.

Ping-Pong Programming

Klasik pair programming’in TDD (test driven development) ile birlikte uygulanan ve oturumu daha eğlenceli ve interaktif kılan bir yöntemdir. Kısaca mantığı şöyledir:

  • A çalışmayan bir test yazar
  • B testi geçer kılacak kodu yazar. (daha fazla değil)
  • B sıradaki testi yazar
  • A az önce B’nin yazdığı testi geçerli kılacak kodu yazar.
  • A ve B’nin yazacak bir testi kalmayana kadar bu süreç devam eder.
  • A veya B kodu daha iyi çalışacak şekilde refactor eder. Bu esnada da sürücü koltuğu sıklıkla değişir.

Ping-pong programming genellikle sıfırdan bir ürün geliştirirken ideal kullanım alanı bulmaktadır. Kendinize denk bir eş bulduysanız uygularken çok büyük keyif alacağınıza eminim.

Strong-style Pairing

Aslında dışarıdan bakıldığında standart bir driver-navigator ilişkisine benzer, ama tek farkla. Farkı:

Kafandaki bir fikrin bilgisayara gitmesinin tek yolu, bir başkasının ellerinden geçmesidir.

İlk duyduğumda bana da süreci gereksiz zorlaştıracakmış gibi gelmesine rağmen; navigator’un çok deneyimli bir uzman, driver’ın daha tecrübesiz bir kişi olduğu durumlarda çok iyi işleyen bir teknik olduğunu gördüm.

Örneğin ekibe yeni birisi katıldığında veya bir stajyeri, junior’u işe adapte etmeye çalışıyorsanız strong-style pairing tekniğine bir şans verebilirsiniz.

İki kişiyi tek işe koşmak vakit kaybı olmuyor mu?

Pair programming uygulanması tartışmaya açıldığında en çok gelen soru bu oluyor. Bir kişinin yapacağı işe neden iki kişi koşuyor? Maliyet iki kat artmıyor mu?

Araştırmalar; pair programming’in yazılım geliştirme sürecine %15 civarı bir ek süre (overhead) getirdiğini gösteriyor. Ama, işin çıktısındaki kaliteye, kurum içi hafızanın tabana yayılması gibi avantajlar göz önüne alındığında bu overhead çoğunlukla göz ardı edilebilir hale geliyor.

Unutmamak gereken şey; Pair programming, iyi tanımlanmış hedef olmadan çok iyi sonuç vermez. O nedenle eğer o esnada gündelik trivial bir iş yapılıyorsa ve birlikte çalışmanın rasyonel bir avantajı yoksa, pair programming yerine ayrı bir şekilde çalışmak daha anlamlı olabiliyor.

İlla ki tüm gün, 8 saat pair programming yapmak zorunda da değilsiniz. Hatta bu önerilmez. Hepimiz gün içinde email cevaplamak, basit fixler yapmak, toplantı yapmak, bir konuyu araştırmak vs… farklı işler de yaparız. İşinizin tabiatına bağlı olarak günün yarısını trivial işleri tek başınıza yaparken, kalan yarısını eşli programlama ile geçirebilirsiniz.

İşin Sosyal Tarafı

Pair programming ofiste uygulandığında iki insanın yanyana gelmesini gerektirir. Tabii bu durum bazı temel sosyal kuralların uygulanmasını zorunlu kılar.

  • Kişisel hijyen. Pair programming sık duş almayan birisiyle uygulandığında eziyete döner. Ofiste bu tarz kişiler varsa, önce bu sorunu çözmelisiniz.
  • Maske kullanımı. Pandemi döneminde öğrendik ki, insanların birbirine çok yakın çalışmaları sorun çıkartabiliyor. Bu nedenle eğer çok gerekli değilse aynı ofiste bile olunsa remote (uzaktan) pair programming yapmanız mümkün. Eğer iki monitor ve iki klavye kullanarak oturumu yapıyorsanız, arada sosyal mesafeyi koruyarak pair programming yapmanız mümkün olabilir.
  • Kişilerin birbirini yeterince tanımaması: Büyük bir şirkette çalışıyorsanız veya ekibe yeni katılan bir kişiyle pair olmuşsanız, birbirinizi yeterince tanımıyor olabilirsiniz. Oturuma başlamadan önce birbirinizi kısaca tanımanız fayda sağlar. Karşılıklı hangi teknik vasıflara ve zaafiyetlere sahip olduğunuzu anlamanız daha verimli bir oturum yapılmasını sağlar.
  • Kullanılan dil: Yapıcı olmak ve bir takım olarak bir yere varmak üzerine yapıcı bir dil seçilmelidir. Söylemeye gerek bile yok belki ama yine de eğer bir ego problemi varsa, bu sorun da oturum öncesinde çözülmelidir.

Oturum Esnasında Yapılması Gerekenler

Pair programming oturumlarında yapılması önerilen davranışlardan öne çıkanları aşağıdaki gibidir.

  • Konuşun: İyi bir pair (eş) aklından geçenleri, neyi neden yaptığını anlatır. Bir oturumun iyi geçtiğini iki kişinin sürekli konuşup bilgi paylaşımı yapmasından anlarsınız. Eğer birisi sessiz kalmışsa diğeri onu nezaket çerçevesinde karşılıklı etkileşime davet etmelidir.
  • Ara verin: Pair programming çok yoğun bir çalışma yöntemidir. Oturup tüm gün pair olarak çalışmak sürdürülebilir olmayacaktır. Bu nedenle bu sistemi pomodoro yöntemi gibi bir teknik ile birlikte uygulamanızı öneririm.
Pomodoro saati
  • Her oturumda iyi tanmlı, küçük bir hedefe odaklanın. Örneğin bir user story’nin tamamlanması, bir unit testin bitmesi, bir kodun refactor edilmesi, performans metriklerinin karşılanması vs… Eğer pair olarak pomodoro yöntemini uygularsanız, activity inventory, records sheet’lerini de tutuyor olmanız çok büyük avantaj sağlayacaktır.
  • İki klavye ve iki monitor kullanın. Kimi zaman göz ardı edilse de iyi bir pair programming oturumunun vazgeçilmez unsurlarındandır. Her pair’in önünde kodu gösteren bir monitor olması kodu en iyi şekilde görmeyi ve incelemeyi sağlar. İki klavyenin bilgisayara bağlı olması da, sık sık driver navigator değişimi yapılan ping-pong programming gibi oturumlarda, klavyenin sürekli elden ele gezdiği bir gereksiz sürecin elimine edilmesini sağlar.
  • Gereksiz süslemelerden ve şovdan kaçının. İki yazılımcı bir araya geldiğinde kimi zaman iş şova kaçabiliyor. Sıklıkla, iki yazılımcı birbirine ne kadar iyi yazılımcılar olduklarını göstermek için, en akla gelmeyecek tasarım şablonlarını (design patterns) kullanıyor, kodu süsledikçe süslüyor. Buna gerek yok. Amaç, en kısa sürede ve ihtiyaç duyulan kalitede işi tamamlamak olmalı.
  • 5 saniye kuralını uygulayın. Eğer siz navigator’sanız ve kodda bariz bir sorun gözlemlediyseniz 5 saniye bekledikten sonra bunu driver’a iletin. Bu sayede çok daha iyi bir sosyal ilişki kurma şansınız olur. Aksi takdirde, sürekli ne yapacağı söylenen, her satırında bir kusuru söylenen bir kişi olmak driver için hoş bir deneyim olmayacaktır.
  • Klavyede eşit zaman geçirin. Bir kişinin sürekli sürücü koltuğunda oturması ve navigator’un yerine geçmesi için fırsat vermemesi çok rahatsız edici bir deneyimdir. O nedenle çok hassas olmaya gerek kalmasa da kabaca aşağı yukarı aynı sürelerde klavye başında olmak takım ruhunu olumlu etkileyecektir.
  • Farklı kişilerle de eş olun. Kişilerin kendisini daha iyi ifade ettiği veya bir şeyler öğrendiği favori eşleri mutlaka olacaktır. Ama hep aynı ikilinin pair olmasındansa başka kişilerle de eşleşmenizi ve bunu bir disiplin haline getirmenizi öneririz. Farklı tecrübe seviyelerinde ve disiplinlerde kişilerle farklı bakış açıları kazanırsınız ve kurum içi hafıza çok daha iyi dağılır. Bunu şirket kültürü yapan yerler de vardır. Round robin pairing yapan, kura ile random pairing yapan firmalar vardır.
  • Başka şeylerle ilgilenmeyin. Bir pair programming oturumu hem driver hem de navigator’un tek bir amaca odaklandığı anda işe yarar. Driver kod yazarken, navigator telefonuyla Instagram’da geziniyorsa o oturum bir sonuç getirmez. Oturuma başlarken telefonları bir sepette toplamak, sessize almak gibi disiplinler uygulansa da bence yeterli olgunluğa sahip insanların böyle şeylere ihtiyaç duymaması gerekir.

--

--