{"id":31244,"date":"2021-07-14T06:00:58","date_gmt":"2021-07-14T04:00:58","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/pair-programming\/"},"modified":"2024-11-07T14:32:35","modified_gmt":"2024-11-07T13:32:35","slug":"pair-programming","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/pair-programming\/","title":{"rendered":"Pair Programming"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\">Przejd\u017a do:<\/p>\n    <ol>\n                    <li><a href=\"#Czym-jest-Pair-Programming\">1.  Czym jest Pair Programming<\/a><\/li>\n                    <li><a href=\"#Korzysci-programowania-w-parach\">2.  Korzy\u015bci programowania w parach<\/a><\/li>\n                    <li><a href=\"#Programowanie-w-parach-techniki\">3.  Programowanie w parach \u2013 techniki<\/a><\/li>\n                    <li><a href=\"#Czy-to-faktycznie-dziala\">4.  Czy to faktycznie dzia\u0142a?<\/a><\/li>\n                    <li><a href=\"#Pair-Programming-online\">5.  Pair Programming online<\/a><\/li>\n                    <li><a href=\"#Podsumowanie\">6.  Podsumowanie<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Czym-jest-Pair-Programming\">Czym jest Pair Programming<\/h2>\n\n\n\n<p>Pair Programming ewoluowa\u0142 przez dekady, zyska\u0142 jednak na popularno\u015bci dzi\u0119ki metodologii <strong>Extreme Programming (XP),<\/strong> kt\u00f3ra zosta\u0142a sformalizowana przez Kenta Becka w ksi\u0105\u017cce<strong> \u201eExtreme Programming Explained: Embrace Change\u201d.<\/strong> Istnieje kilka technik programowania w parach, a ka\u017cda<br>z nich charakteryzuje si\u0119 innymi za\u0142o\u017ceniami. Uog\u00f3lniaj\u0105c, ca\u0142o\u015b\u0107 polega na wsp\u00f3\u0142pracy dw\u00f3ch programist\u00f3w, wsp\u00f3\u0142dziel\u0105cych jedn\u0105 stacj\u0119 robocz\u0105, kt\u00f3rzy razem pracuj\u0105 nad rozwi\u0105zaniem danego problemu programistycznego. Programista aktualnie pisz\u0105cy kod to tzw. driver, drugi to navigator, zwany r\u00f3wnie\u017c obserwatorem \u2013 on tak\u017ce aktywnie uczestniczy w procesie tw\u00f3rczym, jednak skupia si\u0119 bardziej na og\u00f3lnym kierunku oraz na ci\u0105g\u0142ej weryfikacji kodu napisanego przez \u201ekierowc\u0119\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Korzysci-programowania-w-parach\">Korzy\u015bci programowania w parach<\/h2>\n\n\n\n<p>Z moich obserwacji wynika, \u017ce programi\u015bci pracuj\u0105cy w parach wzajemnie wywieraj\u0105 na siebie pewnego rodzaju presj\u0119. Zdaj\u0105 sobie oni spraw\u0119, jak cenny jest czas ich partner\u00f3w, przez co chc\u0105 go maksymalnie wydajnie wykorzysta\u0107. W zale\u017cno\u015bci od zastosowanej techniki (opowiem o nich w dalszej cz\u0119\u015bci artyku\u0142u) korzy\u015bci programowania w parach mog\u0105 by\u0107 nast\u0119puj\u0105ce:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>lepsza jako\u015b\u0107 kodu, przy czym istotne jest, aby osoba pisz\u0105ca aktualnie kod formu\u0142owa\u0142a swoje my\u015bli na g\u0142os \u2013 cz\u0119sto pozwala to rozwi\u0105za\u0107 dany problem, nawet bez znacznej ingerencji drugiej strony,<\/li>\n\n\n\n<li>\u0142atwiejsze dzielenie si\u0119 wiedz\u0105 domenow\u0105 mi\u0119dzy cz\u0142onkami zespo\u0142u,<\/li>\n\n\n\n<li>szybszy rozw\u00f3j mniej do\u015bwiadczonych programist\u00f3w dzi\u0119ki parowaniu ich z tymi bardziej do\u015bwiadczonymi,<\/li>\n\n\n\n<li>potencjalnie wi\u0119ksza odporno\u015b\u0107 na zewn\u0119trzne zak\u0142\u00f3cenia \u2013 jedna osoba z pary zawsze mo\u017ce pozostawa\u0107 skupiona na zadaniu, podczas gdy druga mo\u017ce np. uczestniczy\u0107 w zewn\u0119trznej dyskusji z pozosta\u0142ymi cz\u0142onkami zespo\u0142u.<\/li>\n<\/ul>\n\n\n\n<p>Nale\u017cy jednak pami\u0119ta\u0107, \u017ce programowanie w parach jest trudne, bywa wyczerpuj\u0105ce, wymaga samodyscypliny i pokory, a tak\u017ce umiej\u0119tno\u015bci udzielania i dawania feedbacku. Cz\u0119sto ju\u017c sama \u015bwiadomo\u015b\u0107, \u017ce kto\u015b przez cz\u0119\u015b\u0107 dnia b\u0119dzie nam zagl\u0105da\u0142 przez rami\u0119 i ocenia\u0142 to, co robimy, mo\u017ce zdezorganizowa\u0107 wewn\u0119trzny spok\u00f3j. No bo kto nie lubi czasem za\u0142o\u017cy\u0107 s\u0142uchawek, odci\u0105\u0107 si\u0119 od otoczenia i zanurzy\u0107 w jakim\u015b ciekawym problemie?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Programowanie-w-parach-techniki\">Programowanie w parach \u2013 techniki<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Dobre praktyki<\/h3>\n\n\n\n<p>Zanim opisz\u0119 poszczeg\u00f3lne techniki programowania w parach, rzecz najistotniejsza, niezale\u017cna od stosowanej techniki: chodzi o <strong>robienie przerw oraz oraz nieprzeznaczanie na programowanie w parach zbyt du\u017co czasu w ci\u0105gu dnia \u2013 celem jest tu utrzymanie wydajno\u015bci. <\/strong>Zaczynaj\u0105c od kr\u00f3tkich sesji (1-2 godz.), z czasem mo\u017cna zwi\u0119ksza\u0107 liczb\u0119 godzin po\u015bwi\u0119conych na Pair Programming, jednak wed\u0142ug mnie dobrze jest nigdy nie przekracza\u0107 5-6 godz. Jak wspomnia\u0142em wcze\u015bniej, do wyboru mamy kilka technik, ka\u017cda z nich ma swoje wady i zalety. Dan\u0105 technik\u0119 nale\u017cy dobiera\u0107 do konkretnej sytuacji. Proces programowania w parach b\u0119dzie wygl\u0105da\u0142 inaczej, je\u017celi planujemy przekaza\u0107 wiedz\u0119 lub przeprowadzi\u0107 onboarding nowej osoby w zespole, a inaczej, je\u017celi chcemy zaimplementowa\u0107 jak\u0105\u015b skomplikowan\u0105 funkcjonalno\u015b\u0107. Poni\u017cej opisz\u0119 te, z kt\u00f3rymi ja si\u0119 spotka\u0142em i kt\u00f3re \u2013 wed\u0142ug mnie \u2013 powinny znale\u017a\u0107 si\u0119 w arsenale ka\u017cdego szanuj\u0105cego si\u0119 programisty.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Backseat navigator<\/h3>\n\n\n\n<p>Prawdopodobnie najpopularniejsza metoda, stosowana zazwyczaj instynktownie. Jest wykorzystywana w sytuacji, gdy rozwi\u0105zuj\u0105c jaki\u015b problem, doszli\u015bmy do \u015bciany. Bywa, \u017ce tak bardzo skupiamy si\u0119 na znalezieniu rozwi\u0105zania, \u017ce nie widzimy alternatywnych mo\u017cliwo\u015bci, dochodzimy do \u015blepej uliczki i koniec. W takim wypadku prosimy innego programist\u0119 o wsparcie \u2013 taka osoba b\u0119dzie zdolna spojrze\u0107 na nasz\u0105 zagwozdk\u0119 z innej perspektywy. Z drugiej strony, wariant ten jest idealny dla mniej do\u015bwiadczonych programist\u00f3w pod k\u0105tem nauki nowych umiej\u0119tno\u015bci. Mamy wtedy do czynienia z relacj\u0105 <em>nowicjusz \u2013 ekspert<\/em>. Jedna strona pisze kod (nowicjusz), druga natomiast pe\u0142ni rol\u0119 wsparcia \/ mentora (ekspert).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Driver-navigator<\/h3>\n\n\n\n<p>Klasyczny Pair Programming, zderzenie dw\u00f3ch r\u00f3\u017cnych perspektyw na kod. \u201eKierowca\u201d (ang. driver) zajmuje si\u0119 pisaniem kodu, skupia si\u0119 na detalach implementacyjnych, nawigator (ang. navigator) natomiast my\u015bli o rozwi\u0105zaniu bardziej og\u00f3lnie, jest partnerem do dyskusji, decyduje o kierunku, wychwytuje braki w implementacji oraz przypadkach testowych (real-time code review). Wed\u0142ug mnie technika ta jest idealna do rozwi\u0105zywania z\u0142o\u017conych problem\u00f3w, gdzie mnogo\u015b\u0107 regu\u0142 biznesowych znacz\u0105co wyd\u0142u\u017cy\u0142aby samodzielne pr\u00f3by rozwi\u0105zania problemu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ping-pong<\/h3>\n\n\n\n<p>Bywa, \u017ce od pocz\u0105tku znamy kierunek, w kt\u00f3rym powinni\u015bmy p\u00f3j\u015b\u0107, a dany problem nie jest dla nas wyzwaniem. Takie arcynudne zadania r\u00f3wnie\u017c wymagaj\u0105 od nas profesjonalnego podej\u015bcia. Je\u017celi TDD (<a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/test-driven-development-na-co-dzien\">Test-Driven Development<\/a>) nie jest nam obce, to ta technika sprawdzi si\u0119 idealnie. Ca\u0142o\u015b\u0107 polega na naprzemiennym pisaniu test\u00f3w oraz implementacji. <em>Ping<\/em> \u2013 pierwszy programista pisze nieprzechodz\u0105cy test, <em>pong<\/em> \u2013 drugi programista pisze implementacj\u0119, sprawiaj\u0105c, \u017ce test zaczyna przechodzi\u0107. Po tym nast\u0119puje faza refaktoryzacji i ca\u0142y proces rozpoczyna si\u0119 od nowa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Czy-to-faktycznie-dziala\">Czy to faktycznie dzia\u0142a?<\/h2>\n\n\n\n<p><strong>Teoria teori\u0105, ale czy Pair Programming faktycznie jest tak wyj\u0105tkowy i zawsze da nam oczekiwane efekty? <\/strong><\/p>\n\n\n\n<p>Jak zwykle, to zale\u017cy. Osobi\u015bcie mia\u0142em okazj\u0119 stosowa\u0107 g\u0142\u00f3wnie dwie pierwsze techniki, niestety \u2013 rzadziej, ni\u017c bym chcia\u0142. Spowodowane jest to faktem, \u017ce w \u015bwiecie IT mamy wok\u00f3\u0142 siebie wielu ludzi, cz\u0119sto \u015bwietnych specjalist\u00f3w, jednak r\u00f3\u017cnica charakter\u00f3w jest czynnikiem, kt\u00f3ry znacz\u0105co ogranicza powodzenie wsp\u00f3lnego programowania.<\/p>\n\n\n\n<p>Trzeba pami\u0119ta\u0107, \u017ce przynosz\u0105cy rezultaty Pair Programming to przede wszystkim budowanie relacji<br>z cz\u0142onkami zespo\u0142u oraz prze\u0142amywanie wszelkich barier komunikacyjnych. Poni\u017cej przedstawi\u0119 kilka wniosk\u00f3w z mojej przygody z Pair Programming, kt\u00f3re wed\u0142ug mnie poprawiaj\u0105 efektywno\u015b\u0107 ca\u0142ego procesu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dobrze jest okre\u015bli\u0107 cel sesji, kt\u00f3ry b\u0119dzie mo\u017cna zweryfikowa\u0107 po jej zako\u0144czeniu,<\/li>\n\n\n\n<li>innym wa\u017cnym aspektem jest ustalenie przerw oraz cz\u0119stotliwo\u015b\u0107 zmian,<\/li>\n\n\n\n<li>je\u017celi rozwi\u0105zujemy jaki\u015b skomplikowany problem, pierwsza w rol\u0119 nawigatora niech wcieli si\u0119 osoba z wi\u0119ksz\u0105 wiedz\u0105 domenow\u0105. W przypadku zadania typowo technicznego, niech to b\u0119dzie osoba z wi\u0119kszym do\u015bwiadczeniem \/ umiej\u0119tno\u015bciami,<\/li>\n\n\n\n<li>b\u0119d\u0105c w roli drivera, komunikujmy na g\u0142os wszystko, co robimy \u2013 niejednokrotnie samo m\u00f3wienie na g\u0142os o danym problemie pozwoli\u0142o mi znale\u017a\u0107 rozwi\u0105zanie.<\/li>\n<\/ul>\n\n\n\n<p>Te rzeczy sprawdzi\u0142y si\u0119 u mnie, jednak zdecydowanie jestem daleki od twierdzenia, \u017ce takie podej\u015bcie jest idealne. Moja sugestia jest taka, aby po prostu zacz\u0105\u0107, wyci\u0105ga\u0107 wnioski i pr\u00f3bowa\u0107 usprawnia\u0107 ca\u0142y proces tak, aby czu\u0107 si\u0119 komfortowo i czerpa\u0107 z tego satysfakcj\u0119.<\/p>\n\n\n\n<div class=\"wp-block-group table-of-contents\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h3 class=\"wp-block-heading has-white-color has-text-color has-link-color wp-elements-678d644e40712193d059672c86b821ac\"><strong>Czy warto stosowa\u0107 BDD?<\/strong><\/h3>\n\n\n\n<p class=\"has-white-color has-text-color has-link-color wp-elements-2d8191f58ba2c29ba352c8d01de9f3ff\">Czym jest i w jakich sytuacjach warto zastosowa\u0107 podej\u015bcie BDD? Jakie s\u0105 plusy tego rozwi\u0105zania?<\/p>\n\n\n\n<div class=\"buttons-box\" style=\"justify-content: flex-start\">\n                    <a class=\"btn btn-arrow btn-green btn-inline \" href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/testy-bdd-czy-naprawde-sa-potrzebne\">PRZECZYTAJ ARTYKU\u0141 <\/a>\n        \n<\/div><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Pair-Programming-online\">Pair Programming online<\/h2>\n\n\n\n<p>Pytanie, kt\u00f3re pojawia si\u0119 cz\u0119sto w kontek\u015bcie zdalnego programowanie w parach, brzmi: <strong>czy to w og\u00f3le ma sens?<\/strong><\/p>\n\n\n\n<p>Odpowied\u017a brzmi: zdecydowanie tak. O ile nasz zesp\u00f3\u0142 nie pracuje w spos\u00f3b asynchroniczny, to wed\u0142ug mnie zdalny Pair Programming nie r\u00f3\u017cni si\u0119 w zasadzie niczym od tego standardowego, przeprowadzanego w biurze. Co wi\u0119cej, w dzisiejszych czasach, kiedy wszyscy przenie\u015bli\u015bmy si\u0119 z biur do dom\u00f3w, mo\u017ce nie\u015b\u0107 za sob\u0105 ogrom korzy\u015bci, wymusza bowiem kontakt z innymi cz\u0142onkami zespo\u0142u, kt\u00f3ry z regu\u0142y jest bardziej naturalny w \u015brodowisku biurowym \u2013 rozmawiamy w pokoju, na korytarzu czy w kuchni. Je\u017celi chodzi o narz\u0119dzia, istnieje ich wiele i tak naprawd\u0119 to, kt\u00f3re wybierzemy, zale\u017cy od osobistych preferencji. Jednym wystarczy <strong>Google Meet, Skype<\/strong> czy jakiekolwiek inne narz\u0119dzie z opcj\u0105 udost\u0119pniania ekranu, inni natomiast, chc\u0105c ze zdalnego programowania w parach wyci\u0105gn\u0105\u0107 jak najwi\u0119cej, skorzystaj\u0105 w tym celu z dedykowanego narz\u0119dzia. W zale\u017cno\u015bci od preferowanego edytora kodu b\u0119d\u0105 to <strong>Floobits, Saros, Live Share <\/strong>czy <strong>Teamhub.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Podsumowanie\">Podsumowanie<\/h2>\n\n\n\n<p>Niestety, pomimo tego, \u017ce wi\u0119kszo\u015b\u0107 os\u00f3b zajmuj\u0105cych si\u0119 zawodowo programowaniem s\u0142ysza\u0142a o programowaniu w parach, to ci\u0105gle mo\u017cna zauwa\u017cy\u0107, \u017ce jest ono traktowane po macoszemu. Moim zdaniem wynika to poniek\u0105d z faktu, \u017ce <strong>korzy\u015bci z jego stosowania nie zawsze s\u0105 widoczne od razu.<\/strong> Jest to umiej\u0119tno\u015b\u0107, kt\u00f3ra wymaga systematycznego stosowania, dlatego warto regularnie po\u015bwi\u0119ca\u0107 jej cz\u0119\u015b\u0107 czasu przeznaczonego na kodowanie. Po zako\u0144czonej sesji wskazane jest spisa\u0107 to, co posz\u0142o dobrze, a co nie zadzia\u0142a\u0142o, da\u0107 sobie nawzajem feedback, tak aby kolejne sesje by\u0142y lepsze od poprzednich.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W jaki spos\u00f3b dostarcza\u0107 kod lepszej jako\u015bci i minimalizowa\u0107 liczb\u0119 b\u0142\u0119d\u00f3w? Jak radzi\u0107 sobie z implementacj\u0105 zawi\u0142ych zada\u0144, a tak\u017ce tych, kt\u00f3rych poziom skomplikowania jest mniejszy, ale ich zakodowanie, ze wzgl\u0119du na r\u00f3\u017cne czynniki, wymaga sporego skupienia? Jak skutecznie dzieli\u0107 si\u0119 wiedz\u0105 i do\u015bwiadczeniem programistycznym? Odpowiedzi\u0105 na te pytania mo\u017ce by\u0107 odpowiednio przeprowadzony Pair Programming.<\/p>\n","protected":false},"author":186,"featured_media":31245,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":37,"footnotes":""},"categories":[1,582],"tags":[568,594],"offering":[513],"class_list":["post-31244","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-java-pl","tag-project-management","offering-application-development"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/31244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/186"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=31244"}],"version-history":[{"count":3,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/31244\/revisions"}],"predecessor-version":[{"id":33890,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/31244\/revisions\/33890"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/31245"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=31244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=31244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=31244"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=31244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}