{"id":93885,"date":"2020-09-10T19:42:23","date_gmt":"2020-09-10T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov"},"modified":"2020-09-10T19:42:23","modified_gmt":"2020-09-10T17:42:23","slug":"continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","title":{"rendered":"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/ed8a32ae63b8dccfc8b4893ab27f1527.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om\u00f3wmy, dlaczego narz\u0119dzia CI i CI to zupe\u0142nie r\u00f3\u017cne rzeczy.<\/p>\n<p><\/p>\n<p>Jak\u0105 bol\u0105czk\u0119 rozwi\u0105zuje CI, sk\u0105d pochodzi ten pomys\u0142, jakie ostatnie potwierdzenia, \u017ce to dzia\u0142a, jak zrozumie\u0107, \u017ce macie rzeczywi\u015bcie praktyk\u0119, a nie tylko zainstalowanego Jenkinsa.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Pomys\u0142 na przedstawienie dotycz\u0105ce Continuous Integration pojawi\u0142 si\u0119 jeszcze rok temu, kiedy chodzi\u0142em na rozmowy rekrutacyjne, szukaj\u0105c pracy. Rozmawia\u0142em z 10-15 firmami, z kt\u00f3rych tylko jedna potrafi\u0142a zrozumiale odpowiedzie\u0107, czym jest CI i w jaki spos\u00f3b zrozumia\u0142a, \u017ce go nie maj\u0105. Pozosta\u0142e m\u00f3wi\u0142y niezrozumia\u0142e bzdury o Jenkinsie \ud83d\ude42 No c\u00f3\u017c, mamy Jenkinsa, on robi kompilacje, CI! W wyst\u0105pieniu postaram si\u0119 wyja\u015bni\u0107, czym w rzeczywisto\u015bci jest Continuous Integration i dlaczego Jenkins oraz podobne narz\u0119dzia maj\u0105 z tym bardzo ma\u0142o wsp\u00f3lnego.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/a57813a652c0d788e5a927dc8a7130ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A wi\u0119c, co zazwyczaj przychodzi na my\u015bl przy s\u0142owie CI? Wi\u0119kszo\u015bci ludzi przychodz\u0105 na my\u015bl Jenkins, GitLab CI, Travis itd.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/c9799c11ba7bb7bbdb2048c2f314b22a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nawet je\u015bli poszukamy w Google, to znajdziemy te narz\u0119dzia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/028ef088b28b73e7905b1666d9d53d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli zapytasz znajomych, to zaraz po wymienieniu narz\u0119dzi opowiedz\u0105 ci, \u017ce CI to wtedy, gdy w Pull Request na commit odbywa si\u0119 kompilacja i uruchamianie test\u00f3w.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/f37ba8f985c10900f669540e063c5e43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuous Integration to nie o narz\u0119dziach, nie o kompilacjach z testami w ga\u0142\u0119zi! Continuous Integration to praktyka bardzo cz\u0119stej integracji nowego kodu, a do jej stosowania zupe\u0142nie niekonieczne jest budowanie Jenkins\u00f3w, GitLab\u00f3w itd.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/c3a12b4a875050550b42714607e787c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zanim rozwi\u0105\u017cemy, jak wygl\u0105da pe\u0142noprawne CI, najpierw zag\u0142\u0119bmy si\u0119 w kontekst ludzi, kt\u00f3rzy to wymy\u015blili, i poczujmy t\u0119 bol\u0105czk\u0119, kt\u00f3r\u0105 pr\u00f3bowali rozwi\u0105za\u0107.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/2ab9c0f4dba2887fed5744c8b021b424.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A rozwi\u0105zali bol\u0105czk\u0119 pracy zespo\u0142owej!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/11a5f3b1075f8b8d0f169fe07adf6c91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zobaczmy na przyk\u0142adach, z jakimi trudno\u015bciami spotykaj\u0105 si\u0119 programi\u015bci przy pracy zespo\u0142owej. Mamy projekt, ga\u0142\u0105\u017a master w git i dw\u00f3ch programist\u00f3w.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/8138a52376e87239ff5f7b0af5cd8fee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I zacz\u0119li pracowa\u0107 jak wszyscy od lat przywykli. Wzi\u0119li zadanie w JIRA, za\u0142o\u017cyli feature branch, pisz\u0105 kod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/54720c40d9bbd9631b411a2a26c4083f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeden sko\u0144czy\u0142 funkcj\u0119 szybciej i po\u0142\u0105czy\u0142 z masterem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/4593dc3cf33a44bf3a4d8166be9bc5da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Drugiemu zaj\u0119\u0142o to wi\u0119cej czasu, po\u0142\u0105czy\u0142 p\u00f3\u017aniej i napotka\u0142 konflikt. Teraz, zamiast pisa\u0107 potrzebne funkcje biznesowe, programista marnuje czas i si\u0142y na rozwi\u0105zywanie konflikt\u00f3w.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/c947601fb1dd3b3dd64bac455dc6691a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Im bardziej skomplikowane jest po\u0142\u0105czenie swojej funkcji z g\u0142\u00f3wnym repozytorium, tym wi\u0119cej czasu na to po\u015bwi\u0119camy. I to jeszcze pokazuj\u0119 do\u015b\u0107 prosty przyk\u0142ad. To przyk\u0142ad, w kt\u00f3rym jest tylko 2 programist\u00f3w. A wyobra\u017acie sobie, je\u015bli 10, 15 lub 100 os\u00f3b w firmie pisze w jednym repozytorium. Oszalejecie, pr\u00f3buj\u0105c rozwi\u0105za\u0107 wszystkie te konflikty. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/16c6b8b51ae462f1e0acb966a93c0ae5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jest troch\u0119 inny przypadek. Mamy g\u0142\u00f3wne repozytorium i kilku programist\u00f3w, kt\u00f3rzy co\u015b robi\u0105.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/21b78ad8d0cb7cb5bded6ef9d49707c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Stworzyli po jednej ga\u0142\u0119zi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/b85d8aa0080f08c1ad8ad83f3a9ab084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jedna si\u0119 zmergowa\u0142a, wszystko dobrze, zadanie zako\u0144czone.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/e96d4fd52c39089e3377ed85adeeb591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W mi\u0119dzyczasie drugi programista zrealizowa\u0142 swoje zadanie. Za\u0142\u00f3\u017cmy, \u017ce odda\u0142 je do przegl\u0105du. W wielu firmach istnieje praktyka przegl\u0105d\u00f3w. Z jednej strony to praktyka \u2013 dobra i u\u017cyteczna, z drugiej strony w wielu przypadkach nas spowalnia. Nie b\u0119dziemy si\u0119 w to zag\u0142\u0119bia\u0107, ale oto \u015bwietny przyk\u0142ad, do czego mo\u017ce prowadzi\u0107 krzywa historia z przegl\u0105dami. Odda\u0142e\u015b pull request do przegl\u0105du. Programista nie ma ju\u017c nic do roboty. Co zaczyna robi\u0107? Bierze si\u0119 za inne zadania. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/7b8e121be99432606056acf11e20f518.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W tym czasie drugi programista jeszcze co\u015b zrobi\u0142. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/ceaa5ba5b3b5014fad527362f5794e94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pierwszy wykona\u0142 trzecie zadanie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/9c27663e63bb9489ecffc5a1f73abb87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I po pewnym d\u0142u\u017cszym czasie, jego przegl\u0105d zosta\u0142 przetestowany i pr\u00f3buje si\u0119 zmergowa\u0107. I co si\u0119 dzieje? Napotyka ogromn\u0105 liczb\u0119 konflikt\u00f3w. Dlaczego? Poniewa\u017c podczas gdy jego pull request wisia\u0142 na przegl\u0105dzie, w kodzie wiele si\u0119 zmieni\u0142o. <\/p>\n<p><\/p>\n<p>Opr\u00f3cz historii z konfliktami, jest kwestia komunikacji. Dop\u00f3ki twoja ga\u0142\u0105\u017a wisi na przegl\u0105dzie, czekaj\u0105c na co\u015b, podczas gdy d\u0142ugo pracujesz nad funkcj\u0105, przestajesz \u015bledzi\u0107, co jeszcze zmienia si\u0119 w bazie kodu twojego serwisu. Mo\u017ce to, co teraz pr\u00f3bujesz rozwi\u0105za\u0107, zosta\u0142o ju\u017c rozwi\u0105zane wczoraj i mo\u017cesz skorzysta\u0107 z jakiej\u015b metody. Ale tego nie zobaczysz, poniewa\u017c zawsze pracujesz na przestarza\u0142ej ga\u0142\u0119zi. A ta przestarza\u0142a ga\u0142\u0105\u017a zawsze prowadzi do tego, \u017ce b\u0119dziesz musia\u0142 rozwi\u0105zywa\u0107 konflikty po\u0142\u0105cze\u0144. <\/p>\n<p><\/p>\n<p>Okazuje si\u0119, \u017ce je\u015bli pracujemy w zespole, tzn. nie jedna osoba grzebie w repozytorium, lecz 5-10 os\u00f3b, to im d\u0142u\u017cej nie dodajemy naszego kodu do g\u0142\u00f3wnego repozytorium, tym bardziej cierpimy z powodu tego, \u017ce ostatecznie co\u015b trzeba zmergowa\u0107. I im wi\u0119cej mamy konflikt\u00f3w oraz im starsz\u0105 wersj\u0119 u\u017cywamy, tym wi\u0119cej mamy problem\u00f3w.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/55c070f65a4d3838fb8c02bb9684c76b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wsp\u00f3lna praca nad czym\u015b \u2013 to b\u00f3l! Zawsze sobie przeszkadzamy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/b914c50aad6f3c9f97edcad7e71ba627.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na ten problem zwr\u00f3cono uwag\u0119 ponad 20 lat temu. Pierwsze wzmianki o praktyce Continuous Integration znalaz\u0142em w ekstremalnym programowaniu.<\/p>\n<p><\/p>\n<p>Ekstremalne programowanie to pierwszy framework agile. Strona powsta\u0142a w 1996 roku. Pomys\u0142 polega\u0142 na stosowaniu r\u00f3\u017cnych praktyk programowania, planowania i innych, aby rozw\u00f3j by\u0142 jak najbardziej elastyczny, aby\u015bmy mogli szybciej reagowa\u0107 na zmiany oraz wymagania naszych klient\u00f3w. 24 lata temu zacz\u0119li si\u0119 z tym boryka\u0107, \u017ce je\u015bli robi si\u0119 co\u015b zbyt d\u0142ugo w izolacji, to marnuje si\u0119 na to wi\u0119cej czasu, poniewa\u017c pojawiaj\u0105 si\u0119 konflikty. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/93a80838bdb3b297557dbf2ac7587965.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz przeanalizujemy wyra\u017cenie \u201eContinuous Integration\u201d na poszczeg\u00f3lne s\u0142owa. Je\u015bli przet\u0142umaczymy dos\u0142ownie, wychodzi nieprzerwana integracja. Ale jak to nieprzerwana, to nie jest do ko\u0144ca jasne, poniewa\u017c jest bardzo przerywana. Ale na ile jest to integration, te\u017c nie jest oczywiste. <\/p>\n<p><\/p>\n<p>Dlatego teraz przytaczam cytaty z ekstremalnego programowania. Rozbierzemy oba s\u0142owa osobno. <\/p>\n<p><\/p>\n<p>Integration \u2014 Jak ju\u017c wspomnia\u0142em, d\u0105\u017cymy do tego, aby ka\u017cdy in\u017cynier pracowa\u0142 z najnowsz\u0105 wersj\u0105 kodu, aby jak najcz\u0119\u015bciej dodawa\u0142 sw\u00f3j kod do wsp\u00f3lnej ga\u0142\u0119zi, aby to by\u0142y ma\u0142e ga\u0142\u0119zie. Bo je\u015bli s\u0105 du\u017ce, mo\u017cemy utkn\u0105\u0107 przez tydzie\u0144 z konfliktami podczas mergowania. Szczeg\u00f3lnie, je\u015bli mamy d\u0142ugi cykl rozwoju typu waterfall, gdzie programista poszed\u0142 na miesi\u0105c pisa\u0107 jak\u0105\u015b ogromn\u0105 funkcjonalno\u015b\u0107. A na etapie integracji zablokuje si\u0119 na d\u0142ugo. <\/p>\n<p><\/p>\n<p>Integration \u2013 to moment, gdy bierzemy swoj\u0105 ga\u0142\u0105\u017a i integrujemy j\u0105 z masterem, robimy merge. Jest r\u00f3wnie\u017c ostateczna wersja, gdy jeste\u015bmy tzw. transbase developer, gdzie d\u0105\u017cymy do tego, aby pisa\u0107 bezpo\u015brednio do mastera, bez \u017cadnych dodatkowych ga\u0142\u0119zi.<\/p>\n<p><\/p>\n<p>W skr\u00f3cie, integration \u2013 to wzi\u0105\u0107 sw\u00f3j kod i dostarczy\u0107 go do mastera. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/8950103e6a59ed7132ec321ac6abe600.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co oznacza s\u0142owo \u201eci\u0105g\u0142y\u201d, co to jest ci\u0105g\u0142o\u015b\u0107? Praktyka zak\u0142ada, \u017ce programista stara si\u0119 jak najszybciej integrowa\u0107 sw\u00f3j kod. To jest jego cel podczas wykonywania ka\u017cdej zadania \u2013 sprawi\u0107, aby jego kod pojawi\u0142 si\u0119 w masterze jak najszybciej. W idealnym \u015bwiecie programi\u015bci robiliby to co kilka godzin. Tzn. bierzesz ma\u0142e zadanie, \u0142\u0105czysz je z masterem. Wszystko jest w porz\u0105dku. D\u0105\u017cysz do tego. I trzeba to robi\u0107 nieprzerwanie. Gdy tylko co\u015b zrobisz, od razu wrzucasz to do mastera. <\/p>\n<p><\/p>\n<p>A programista, kt\u00f3ry co\u015b robi, ponosi odpowiedzialno\u015b\u0107 za to, co zrobi\u0142, aby to dzia\u0142a\u0142o i nic nie zepsu\u0142o. Tutaj zwykle pojawia si\u0119 problem z testami. Chcemy uruchomi\u0107 jakie\u015b testy na naszym commitie, na naszym merge, aby upewni\u0107 si\u0119, \u017ce to dzia\u0142a. I tutaj w\u0142a\u015bnie mo\u017ce pom\u00f3c Jenkins.<\/p>\n<p><\/p>\n<p>Ale z histori\u0105: a mo\u017ce zmiany b\u0119d\u0105 ma\u0142e, a mo\u017ce zadania b\u0119d\u0105 ma\u0142e, a mo\u017ce zrobimy zadanie i od razu spr\u00f3bujemy je w\u0142\u0105czy\u0107 do mastera \u2013 tutaj \u017cadne Jenkins nie pomog\u0105. Poniewa\u017c Jenkins pomo\u017ce tylko w uruchamianiu test\u00f3w. <\/p>\n<p><\/p>\n<p>Mo\u017cesz obej\u015b\u0107 si\u0119 bez nich. To wcale nie przeszkodzi. Poniewa\u017c celem praktyki jest \u0142\u0105czenie tak cz\u0119sto, jak to mo\u017cliwe, aby nie traci\u0107 ogromnych ilo\u015bci czasu na konflikty w przysz\u0142o\u015bci. <\/p>\n<p><\/p>\n<p>Wyobra\u017amy sobie, \u017ce mamy 2020 rok, ale z jakiego\u015b powodu bez internetu. I pracujemy lokalnie. Nie mamy Jenkins. To nic z\u0142ego. Wci\u0105\u017c mo\u017cesz utworzy\u0107 lokaln\u0105 ga\u0142\u0105\u017a. Napisz w niej jaki\u015b kod. Zr\u00f3b zadanie w 3-4 godziny. Prze\u0142\u0105cz si\u0119 na master, zr\u00f3b git pull, po\u0142\u0105cz swoj\u0105 ga\u0142\u0105\u017a. Gotowe. Je\u015bli robisz to cz\u0119sto \u2013 gratulacje, masz Continuous Integration!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/1f2117b65994b940edb04e0e119f6e8a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jakie s\u0105 wsp\u00f3\u0142czesne dowody na to, \u017ce warto na to po\u015bwi\u0119ca\u0107 si\u0142y? Poniewa\u017c w og\u00f3lnym zarysie to jest trudne. Je\u015bli spr\u00f3bujesz tak pracowa\u0107, zrozumiesz, \u017ce wymaga to planowania, b\u0119dziesz musia\u0142 po\u015bwi\u0119ci\u0107 wi\u0119cej czasu na dekompozycj\u0119 zada\u0144. Poniewa\u017c je\u015bli b\u0119dziesz robi\u0107 man\u2026, nie b\u0119dziesz m\u00f3g\u0142 szybko si\u0119 zmergowa\u0107 i w ten spos\u00f3b wpadniesz w k\u0142opoty. Nie b\u0119dzie ju\u017c praktyki. <\/p>\n<p><\/p>\n<p>I to b\u0119dzie drogie. Nie da si\u0119 pracowa\u0107 od jutra w ramach Continuous Integration. Wszyscy b\u0119dziecie d\u0142ugo przyzwyczaja\u0107 si\u0119 do dekompozycji zada\u0144, d\u0142ugo b\u0119dziecie przyzwyczaja\u0107 si\u0119 do poprawiania praktyki przegl\u0105d\u00f3w, je\u015bli takow\u0105 posiadacie. Naszym celem jest, aby to wszystko zosta\u0142o scalone jeszcze dzi\u015b. A je\u015bli przegl\u0105d zajmuje wam trzy dni, to macie problemy i Continuous Integration wam nie wychodzi. <\/p>\n<p><\/p>\n<p>Ale czy mamy jakie\u015b aktualne dowody, kt\u00f3re wskazuj\u0105, \u017ce inwestowanie w t\u0119 praktyk\u0119 ma sens?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/2026a8f1d72fb05613511e7bab57e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pierwsze, co przysz\u0142o mi do g\u0142owy, to State of DevOps. To badanie, kt\u00f3re prowadz\u0105 od 7 lat. Obecnie robi\u0105 to jako niezale\u017cna organizacja, ale pod Google.<\/p>\n<p><\/p>\n<p>Ich badanie z 2018 roku pokaza\u0142o korelacj\u0119 mi\u0119dzy firmami, kt\u00f3re staraj\u0105 si\u0119 u\u017cywa\u0107 kr\u00f3tkotrwa\u0142ych ga\u0142\u0119zi, kt\u00f3re integruj\u0105 si\u0119 szybko i cz\u0119sto, a ich wyniki wydajno\u015bci IT s\u0105 znacznie lepsze.<\/p>\n<p><\/p>\n<p>Jakie to s\u0105 wska\u017aniki? To 4 metryki, kt\u00f3re zbieraj\u0105 od wszystkich firm w swoich ankietach: cz\u0119stotliwo\u015b\u0107 wdro\u017ce\u0144, czas wprowadzania zmian, czas na przywr\u00f3cenie us\u0142ugi, wska\u017anik awaryjno\u015bci zmian.<\/p>\n<p><\/p>\n<p>I po pierwsze, jest ta korelacja, wiemy, \u017ce firmy, kt\u00f3re cz\u0119sto si\u0119 scalaj\u0105, maj\u0105 te metryki znacz\u0105co lepsze. Dziel\u0105 firmy na kilka kategorii: to firmy wolne, kt\u00f3re dzia\u0142aj\u0105 powoli, medium performer, high performer oraz elita. Elita to Netflix, Amazon, kt\u00f3re s\u0105 super szybkie, wykonuj\u0105 wszystko szybko, pi\u0119knie i w wysokiej jako\u015bci.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/4fd98ef48a5cffdd6ae2ceea93dbb0bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Druga historia, kt\u00f3ra wydarzy\u0142a si\u0119 zaledwie miesi\u0105c temu. W Technology Radar pojawi\u0142 si\u0119 wspania\u0142y artyku\u0142 o Gitflow. Gitflow r\u00f3\u017cni si\u0119 od wszystkich innych tym, \u017ce jego ga\u0142\u0119zie \u017cyj\u0105 d\u0142ugo. S\u0105 ga\u0142\u0119zie release, kt\u00f3re \u017cyj\u0105 d\u0142ugo, oraz ga\u0142\u0119zie funkcjonalne, kt\u00f3re r\u00f3wnie\u017c d\u0142ugo trwaj\u0105. Ta praktyka w Technology Radar zosta\u0142a przeniesiona do HOLD. Dlaczego? Poniewa\u017c ludzie borykaj\u0105 si\u0119 z problemami integracyjnymi. <\/p>\n<p><\/p>\n<p>Je\u015bli twoja ga\u0142\u0105\u017a \u017cyje bardzo d\u0142ugo, staje si\u0119 problematyczna, traci \u015bwie\u017co\u015b\u0107, zaczynamy po\u015bwi\u0119ca\u0107 wi\u0119cej czasu na wprowadzenie w niej jakiejkolwiek zmiany. <\/p>\n<p><\/p>\n<p>Niedawno autor Gitflow stwierdzi\u0142, \u017ce je\u015bli d\u0105\u017cysz do ci\u0105g\u0142ej integracji, je\u015bli chcesz wdra\u017ca\u0107 zmiany jak najcz\u0119\u015bciej, to Gitflow jest z\u0142ym pomys\u0142em. Doda\u0142 w artykule, \u017ce je\u017celi masz backend, gdzie mo\u017cesz do tego d\u0105\u017cy\u0107, to Gitflow jest dla ciebie zb\u0119dne, poniewa\u017c Gitflow ci\u0119 spowolni, a tak\u017ce stworzy problemy z integracj\u0105. <\/p>\n<p><\/p>\n<p>To nie oznacza, \u017ce Gitflow jest z\u0142e i nie nale\u017cy go u\u017cywa\u0107. Jest on przeznaczony do innych przypadk\u00f3w. Na przyk\u0142ad, gdy musisz wspiera\u0107 kilka wersji us\u0142ugi, aplikacji, czyli tam, gdzie musisz oferowa\u0107 wsparcie przez d\u0142u\u017cszy okres czasu. <\/p>\n<p><\/p>\n<p>Ale je\u015bli porozmawiasz z lud\u017ami, kt\u00f3rzy wspieraj\u0105 takie us\u0142ugi, us\u0142yszysz wiele narzeka\u0144 na to, \u017ce ta wersja to 3.2, kt\u00f3ra by\u0142a 4 miesi\u0105ce temu, a ten fix nie zosta\u0142 w niej uwzgl\u0119dniony i teraz, aby go wprowadzi\u0107, musisz zrobi\u0107 mas\u0119 zmian. I zn\u00f3w utkn\u0119li, a teraz przez tydzie\u0144 pr\u00f3buj\u0105 wzi\u0105\u0107 i wpoi\u0107 jak\u0105\u015b now\u0105 funkcjonalno\u015b\u0107. <\/p>\n<p><\/p>\n<p>Jak s\u0142usznie zauwa\u017cy\u0142 Aleksander Kowalew w czacie, korelacja nie jest r\u00f3wnoznaczna z przyczynowo\u015bci\u0105. Tak jest. Tzn. nie ma bezpo\u015bredniego zwi\u0105zku, \u017ce je\u015bli masz ci\u0105g\u0142\u0105 integracj\u0119, to wszystkie metryki b\u0119d\u0105 doskona\u0142e, nie. Ale istnieje pozytywna korelacja, \u017ce je\u015bli jedno, to z du\u017cym prawdopodobie\u0144stwem drugie te\u017c. Nie ma pewno\u015bci, ale przewa\u017cnie. To tylko korelacja. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow\" src=\"\/wp-content\/uploads\/2020\/09\/d5fc050550b0e9f86a1fdf85fff32fa5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Niby ju\u017c co\u015b robimy, niby ju\u017c si\u0119 \u0142\u0105czymy, ale jak zrozumie\u0107, \u017ce ci\u0105g\u0142a integracja faktycznie istnieje, \u017ce \u0142\u0105czymy si\u0119 wystarczaj\u0105co cz\u0119sto?<\/p>\n<p><\/p>\n<p>Jez Humble to autor Handbook, Accelerate, strony Continuous Delivery oraz ksi\u0105\u017cki \u201eContinuous Delivery\u201d. Proponuje taki test:<\/p>\n<p><\/p>\n<ul>\n<li>Kod in\u017cyniera trafia do mastera codziennie. <\/li>\n<li>Przy ka\u017cdym commicie uruchamiacie testy jednostkowe.<\/li>\n<li>Budowa w masterze pad\u0142a, zosta\u0142a naprawiona w ci\u0105gu oko\u0142o 10 minut.<\/li>\n<\/ul>\n<p><\/p>\n<p>Proponuje u\u017cywa\u0107 takiego testu, aby upewni\u0107 si\u0119, \u017ce praktyka u was na pewno istnieje. <\/p>\n<p><\/p>\n<p>Ostatnie wydaje mi si\u0119 nieco kontrowersyjne. Tzn. je\u015bli mo\u017cesz naprawi\u0107 to w 10 minut, to znaczy, \u017ce masz Continuous Integration, co brzmi troch\u0119 dziwnie, moim zdaniem, ale ma to sens. Dlaczego? Poniewa\u017c, je\u015bli cz\u0119sto scalasz, to znaczy, \u017ce twoje zmiany s\u0105 ma\u0142e. Je\u015bli ma\u0142a zmiana spowodowa\u0142a, \u017ce twoja wersja g\u0142\u00f3wna pad\u0142a, b\u0119dziesz w stanie szybko znale\u017a\u0107 przyczyn\u0119, poniewa\u017c zmiana jest niewielka. Mia\u0142e\u015b ma\u0142e scalanie, w kt\u00f3rym zmieni\u0142o si\u0119 20-30 linii. W zwi\u0105zku z tym mo\u017cesz szybko zrozumie\u0107, w czym by\u0142 problem, poniewa\u017c zmiany s\u0105 bardzo drobne, masz bardzo ma\u0142y obszar poszukiwa\u0144 problemu. <\/p>\n<p><\/p>\n<p>Nawet je\u015bli po wydaniu nasz produkcyjny system si\u0119 rozsypuje, je\u015bli mamy praktyk\u0119 Continuous Integration, du\u017co \u0142atwiej jest nam dzia\u0142a\u0107, poniewa\u017c zmiany s\u0105 minimalne. Tak, wp\u0142ynie to na planowanie. B\u0119dzie to bolesne. A mo\u017ce najtrudniejsz\u0105 cz\u0119\u015bci\u0105 tej praktyki jest przyzwyczajenie si\u0119 do rozdzielania zada\u0144, tzn. jak sprawi\u0107, by wzi\u0105\u0107 co\u015b i zrobi\u0107 to w ci\u0105gu kilku godzin i przy tym przej\u015b\u0107 przez recenzj\u0119, je\u015bli j\u0105 masz. Recenzja to osobny b\u00f3l. <\/p>\n<p><\/p>\n<p>Testy jednostkowe to tylko pomocnik, kt\u00f3ry pomaga ci zrozumie\u0107, czy twoja integracja przebieg\u0142a pomy\u015blnie, czy nic nie zosta\u0142o uszkodzone. Moim zdaniem to tak\u017ce nie jest ca\u0142kowicie obowi\u0105zkowy punkt, poniewa\u017c sens praktyki nie polega na tym. <\/p>\n<p><\/p>\n<p>To kr\u00f3tko o Continuous Integration. To wszystko, co jest w tej praktyce. Jestem got\u00f3w na pytania. <\/p>\n<p><\/p>\n<p>Kr\u00f3tko jeszcze raz podsumuj\u0119:<\/p>\n<p><\/p>\n<ul>\n<li>Continuous Integration to nie Jenkins, to nie Gitlab.<\/li>\n<li>To nie narz\u0119dzie, to praktyka o tym, \u017ce jak najcz\u0119\u015bciej scalimy nasz kod z g\u0142\u00f3wn\u0105 ga\u0142\u0119zi\u0105. <\/li>\n<li>Robimy to, aby unikn\u0105\u0107 ogromnego b\u00f3lu, kt\u00f3ry pojawia si\u0119 przy scalaniu w przysz\u0142o\u015bci, tzn. odczuwamy ma\u0142y b\u00f3l teraz, aby nie odczuwa\u0107 du\u017cego w przysz\u0142o\u015bci. W tym wszystkim chodzi. <\/li>\n<li>Komunikacja odbywa si\u0119 poprzez kod, ale rzadko to widz\u0119, ale te\u017c do tego zosta\u0142a stworzona.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Pytania<\/strong><\/p>\n<p><\/p>\n<p><em>Co zrobi\u0107 z nierozdzielonymi zadaniami?<\/em><\/p>\n<p><\/p>\n<p>Rozdzieli\u0107. Jaki jest problem? Mo\u017cesz poda\u0107 przyk\u0142ad, \u017ce jest zadanie i nie da si\u0119 go rozdzieli\u0107?<\/p>\n<p><\/p>\n<p><em>S\u0105 takie zadania, kt\u00f3re z zasady nie mog\u0105 by\u0107 rozdzielone, na przyk\u0142ad te, kt\u00f3re wymagaj\u0105 bardzo g\u0142\u0119bokiej ekspertyzy i kt\u00f3re mog\u0105 by\u0107 realizowane przez miesi\u0105c, a\u017c do uzyskania jakiego\u015b zadowalaj\u0105cego rezultatu.<\/em> <\/p>\n<p><\/p>\n<p>Je\u015bli dobrze ci\u0119 rozumiem, istnieje jakie\u015b du\u017ce i skomplikowane zadanie, kt\u00f3rego wynik b\u0119dzie widoczny dopiero za miesi\u0105c?<\/p>\n<p><\/p>\n<p><em>Tak, dok\u0142adnie. Tak, wynik mo\u017cna b\u0119dzie oceni\u0107 nie wcze\u015bniej ni\u017c za miesi\u0105c.<\/em> <\/p>\n<p><\/p>\n<p>Dobrze. W sumie to nie jest problem. Dlaczego? Poniewa\u017c w tym przypadku, gdy m\u00f3wimy o ga\u0142\u0119ziach, nie m\u00f3wimy o ga\u0142\u0119zi z funkcj\u0105. Funkcje mog\u0105 by\u0107 du\u017ce i skomplikowane. Mog\u0105 obejmowa\u0107 wiele komponent\u00f3w. I mo\u017cliwe, \u017ce nie mo\u017cemy ich zrobi\u0107 w jednej ga\u0142\u0119zi w ca\u0142o\u015bci. To normalne. Musimy po prostu podzieli\u0107 t\u0119 histori\u0119. Je\u015bli funkcja nie jest w pe\u0142ni gotowa, to nie oznacza, \u017ce niekt\u00f3re jej fragmenty kodu mog\u0105 by\u0107 scalane. Na przyk\u0142ad doda\u0142e\u015b migracj\u0119, a wewn\u0105trz funkcji s\u0105 jakie\u015b etapy. Na przyk\u0142ad masz etap - zrobi\u0107 migracj\u0119, doda\u0107 now\u0105 metod\u0119. Te rzeczy mo\u017cesz ju\u017c scala\u0107 codziennie. <\/p>\n<p><\/p>\n<p><em>Dobrze. Jaki w tym sens?<\/em><\/p>\n<p><\/p>\n<p>Jaki sens ma \u0142\u0105czenie ma\u0142ych rzeczy ka\u017cdego dnia?<\/p>\n<p><\/p>\n<p><em>Tak.<\/em><\/p>\n<p><\/p>\n<p>Je\u015bli co\u015b si\u0119 zepsu\u0142o, widzisz to od razu. Masz ma\u0142y fragment, kt\u00f3ry co\u015b zepsu\u0142, \u0142atwiej to naprawi\u0107. Sens polega na tym, \u017ce \u0142atwiej jest teraz scali\u0107 ma\u0142y fragment, ni\u017c du\u017c\u0105 rzecz za kilka tygodni. A trzeci sens jest taki, \u017ce inni in\u017cynierowie b\u0119d\u0105 pracowa\u0107 z aktualn\u0105 wersj\u0105 kodu. Zobacz\u0105, \u017ce dodano jakie\u015b migracje, a tutaj pojawi\u0142a si\u0119 jaka\u015b metoda, kt\u00f3r\u0105 tak\u017ce mog\u0105 chcie\u0107 u\u017cy\u0107. Wszyscy b\u0119d\u0105 wiedzie\u0107, co si\u0119 dzieje w twoim kodzie. To w\u0142a\u015bnie z tych trzech powod\u00f3w praktyka jest wprowadzana. <\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119, pytanie zamkni\u0119te!<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) Mog\u0119 doda\u0107? Powiedzia\u0142e\u015b wszystko dobrze, chc\u0119 tylko doda\u0107 jedno zdanie.<\/em><\/p>\n<p><\/p>\n<p>Dobrze.<\/p>\n<p><\/p>\n<p><em>W przypadku Continuous Integration kod jest scalany do wsp\u00f3lnej ga\u0142\u0119zi nie wtedy, gdy funkcja jest ca\u0142kowicie gotowa, ale wtedy, gdy przestaje psu\u0107 si\u0119 build. I \u015bmia\u0142o mo\u017cesz commitowa\u0107 do mastera ile chcesz razy dziennie. Drugi aspekt - je\u015bli z jakiego\u015b powodu nie mo\u017cesz podzieli\u0107 miesi\u0119cznego zadania na zadania chocia\u017cby co trzy dni, nie m\u00f3wi\u0105c ju\u017c o trzech godzinach, to znaczy, \u017ce masz ogromny problem. A to, \u017ce nie masz Continuous Integration - to najmniejszy z tych problem\u00f3w. To oznacza, \u017ce masz problemy z architektur\u0105, a praktyki in\u017cynieryjne s\u0105 na zerze. Poniewa\u017c nawet je\u015bli to badania, w ka\u017cdym przypadku musisz to sformu\u0142owa\u0107 w postaci hipotez lub cykli.<\/em> <\/p>\n<p><\/p>\n<p><em>M\u00f3wili\u015bmy o czterech metrykach, kt\u00f3re odr\u00f3\u017cniaj\u0105 udane firmy od tych, kt\u00f3re zostaj\u0105 w tyle. Trzeba doprowadzi\u0107 te cztery metryki do sukcesu. Je\u015bli \u015bredni czas realizacji zadania to miesi\u0105c, to najpierw skupi\u0142bym si\u0119 na tej metryce. Zmniejszy\u0142bym go najpierw do trzech dni. A potem zacz\u0105\u0142bym my\u015ble\u0107 o Continuous.<\/em><\/p>\n<p><\/p>\n<p>Czy dobrze ci\u0119 rozumiem, \u017ce s\u0105dzisz, i\u017c na razie nie ma sensu inwestowa\u0107 w praktyki in\u017cynieryjne, je\u015bli jakiekolwiek zadanie trwa miesi\u0105c?<\/p>\n<p><\/p>\n<p><em>Masz Continuous Integration. I jest tam taka mo\u017cliwo\u015b\u0107, \u017ce w ci\u0105gu 10 minut albo naprawiasz b\u0142\u0105d, albo go wycofujesz. Wyobra\u017a sobie, \u017ce wprowadzi\u0142e\u015b zmiany. I to nawet w przypadku continuous deployment, wprowadzi\u0142e\u015b to na produkcj\u0119 i dopiero potem zauwa\u017casz, \u017ce co\u015b posz\u0142o nie tak. Musisz to wycofa\u0107, ale ju\u017c zasz\u0142a migracja bazy danych. Masz ju\u017c schemat bazy danych w nowej wersji, a wi\u0119cej, \u017ce jeszcze jaki\u015b backup przeszed\u0142, jeszcze dane zosta\u0142y tam zapisane.<\/em><\/p>\n<p><\/p>\n<p><em>I jaka jest twoja alternatywa? Je\u015bli cofasz kod, to on ju\u017c nie mo\u017ce wsp\u00f3\u0142pracowa\u0107 z t\u0105 zaktualizowan\u0105 baz\u0105 danych.<\/em><\/p>\n<p><\/p>\n<p>Baza rozwija si\u0119 tylko do przodu, prawda. <\/p>\n<p><\/p>\n<p><em>Ludzie, kt\u00f3rzy maj\u0105 s\u0142abe praktyki in\u017cynieryjne, prawdopodobnie te\u017c nie czytali grubej ksi\u0105\u017cki o ... Co robi\u0107 z backupem? Je\u015bli odzyskujesz z backupu, to oznacza, \u017ce tracisz dane, kt\u00f3re zosta\u0142y zgromadzone w tym czasie. Na przyk\u0142ad, pracowa\u0142e\u015b trzy godziny z now\u0105 wersj\u0105 bazy danych, u\u017cytkownicy si\u0119 zarejestrowali. Wracasz do starego backupu, poniewa\u017c nowa wersja schemat nie dzia\u0142a, odpowiednio, tych u\u017cytkownik\u00f3w straci\u0142e\u015b. A oni s\u0105 niezadowoleni, narzekaj\u0105.<\/em><\/p>\n<p><\/p>\n<p><em>Aby opanowa\u0107 ca\u0142y zakres praktyk wspieraj\u0105cych Continuous Integration i Continuous Delivery, nie wystarczy nauczy\u0107 si\u0119 po prostu \u2026 Po pierwsze, mo\u017ce ich by\u0107 bardzo wiele, co b\u0119dzie niepraktyczne. Ponadto istnieje wiele innych praktyk, takich jak naukowe. Istnieje taka praktyka, kt\u00f3ra by\u0142a popularizowana przez GitHub. Chodzi o to, \u017ce jednocze\u015bnie dzia\u0142aj\u0105 zar\u00f3wno stary, jak i nowy kod. To wtedy, gdy tworzysz niedoko\u0144czon\u0105 funkcj\u0119, kt\u00f3ra mo\u017ce zwraca\u0107 jak\u0105\u015b warto\u015b\u0107: albo jako funkcja, albo jako Rest API. Wykonujesz zar\u00f3wno nowy kod, jak i stary kod, a nast\u0119pnie por\u00f3wnujesz r\u00f3\u017cnic\u0119 mi\u0119dzy nimi. Je\u015bli r\u00f3\u017cnica istnieje, logujesz to zdarzenie. W ten spos\u00f3b wiesz, \u017ce nowa funkcja jest gotowa do wdro\u017cenia zamiast starej, je\u015bli w okre\u015blonym czasie nie by\u0142o r\u00f3\u017cnicy mi\u0119dzy tymi dwoma.<\/em> <\/p>\n<p><\/p>\n<p><em>Takich praktyk jest setki. Zasugerowa\u0142bym rozpocz\u0105\u0107 od transbase development. Nie jest to w 100% zwi\u0105zane z Continuous Integration, ale praktyki s\u0105 takie same, jedno bez drugiego \u017ale funkcjonuje.<\/em> <\/p>\n<p><\/p>\n<p>Czy poda\u0142e\u015b transbase development jako przyk\u0142ad, gdzie mo\u017cna zobaczy\u0107 praktyki, czy sugerujesz ludziom, aby zacz\u0119li u\u017cywa\u0107 transbase development?<\/p>\n<p><\/p>\n<p><em>Zobaczy\u0107, poniewa\u017c nie b\u0119d\u0105 mogli tego u\u017cywa\u0107. Aby je wykorzysta\u0107, trzeba przeczyta\u0107 wiele rzeczy. Je\u015bli osoba zadaje pytanie: \u201eCo zrobi\u0107 z funkcj\u0105, kt\u00f3ra zajmuje miesi\u0105c\u201d, to oznacza, \u017ce nie czyta\u0142a o transbase development. Nie poleca\u0142bym tego na razie. Sugerowa\u0142bym skoncentrowa\u0107 si\u0119 wy\u0142\u0105cznie na tym, jak prawid\u0142owo architektonicznie dzieli\u0107 du\u017ce zadania na mniejsze. W tym chodzi o dekompozycj\u0119.<\/em><\/p>\n<p><\/p>\n<p><em>Dekonstrukcja to jedno z narz\u0119dzi architekta. Najpierw przeprowadzamy analiz\u0119, potem dekompozycj\u0119, nast\u0119pnie syntez\u0119, a potem integracj\u0119. W ten spos\u00f3b wszystko si\u0119 uk\u0142ada. Aby dotrze\u0107 do Continuous Integration, nale\u017cy najpierw przej\u015b\u0107 przez dekompozycj\u0119. Problemy w pierwszym etapie si\u0119 pojawiaj\u0105, a my ju\u017c rozmawiamy o czwartym etapie, tzn. im cz\u0119\u015bciej robisz integracj\u0119, tym lepiej. Robienie jej jeszcze jest za wcze\u015bnie, lepiej by\u0142oby najpierw podzieli\u0107 sw\u00f3j monolit.<\/em> <\/p>\n<p><\/p>\n<p><em>Trzeba narysowa\u0107 kilka strza\u0142ek i kwadrat\u00f3w na jakim\u015b schemacie. Nie mo\u017cesz powiedzie\u0107, \u017ce teraz poka\u017c\u0119 architektoniczny schemat nowej aplikacji i pokaza\u0107 jeden kwadracik, wewn\u0105trz kt\u00f3rego znajduje si\u0119 zielony przycisk aplikacji. W ka\u017cdym razie b\u0119dzie wi\u0119cej kwadrat\u00f3w i strza\u0142ek. Na ka\u017cdym schemacie, kt\u00f3ry widzia\u0142em, by\u0142o ich wi\u0119cej ni\u017c jeden. A dekompozycja ju\u017c na poziomie graficznej reprezentacji jest dokonywana. Dlatego kwadraty mo\u017cna robi\u0107 niezale\u017cnie. Je\u015bli nie, to mam du\u017c\u0105 uwag\u0119 do architekta.<\/em> <\/p>\n<p><\/p>\n<p>Jest pytanie z czatu: \u201eCzy je\u015bli przegl\u0105d jest obowi\u0105zkowy i trwa d\u0142ugo, gdzie\u015b dzie\u0144 i wi\u0119cej?\u201d.<\/p>\n<p><\/p>\n<p>Macie problemy z praktyk\u0105. Nie powinno by\u0107 przegl\u0105du przez dzie\u0144 i wi\u0119cej. To ta sama historia co w poprzednim pytaniu, tylko troch\u0119 \u0142agodniejsza. Je\u015bli przegl\u0105d trwa dzie\u0144, to oznacza, \u017ce najprawdopodobniej dotyczy to jakiej\u015b bardzo du\u017cej zmiany. Trzeba go robi\u0107 mniejszym. W transbase development, kt\u00f3ry Oleg poleci\u0142, jest taka historia, kt\u00f3ra nazywa si\u0119 ci\u0105g\u0142ym przegl\u0105dem. Jej ide\u0105 jest to, \u017ce robimy celowo tak ma\u0142y pull request, poniewa\u017c d\u0105\u017cymy do ci\u0105g\u0142ego merge\u2019a po kawa\u0142ku. I dlatego pull request zmienia jedn\u0105 abstrakcj\u0119 lub 10 linijek. Dzi\u0119ki temu przegl\u0105d zajmuje nam kilka minut. <\/p>\n<p><\/p>\n<p>Je\u015bli przegl\u0105d zajmuje dzie\u0144 i wi\u0119cej, to znaczy, \u017ce co\u015b jest nie tak. Po pierwsze, by\u0107 mo\u017ce macie jakie\u015b problemy z architektur\u0105. Albo to du\u017cy kawa\u0142ek kodu, na przyk\u0142ad 1 000 linii. Albo macie tak skomplikowan\u0105 architektur\u0119, \u017ce cz\u0142owiek nie mo\u017ce jej zrozumie\u0107. To jest problem, ale r\u00f3wnie\u017c trzeba go rozwi\u0105za\u0107. Mo\u017ce w og\u00f3le przegl\u0105d nie jest konieczny. Nad tym te\u017c trzeba si\u0119 zastanowi\u0107. Przegl\u0105d to ta rzecz, kt\u00f3ra was spowalnia. Ma swoje plusy og\u00f3lnie, ale trzeba zrozumie\u0107, po co to robicie. Czy to dla was spos\u00f3b na szybkie przekazywanie informacji, czy dla ustalenia jakich\u015b standard\u00f3w wewn\u0119trznych, czy co? Po co wam to? Poniewa\u017c przegl\u0105d trzeba robi\u0107 albo bardzo szybko, albo w og\u00f3le go anulowa\u0107. To jak transbase development \u2013 historia bardzo pi\u0119kna, ale tylko dla do\u015bwiadczonych ludzi. <\/p>\n<p><\/p>\n<p>Je\u015bli chodzi o 4 metryki, to zaleca\u0142bym jednak je zrealizowa\u0107, aby zrozumie\u0107, do czego to prowadzi. Sprawdzi\u0107 w liczbach, zobaczy\u0107 obrazek, jak bardzo jest \u017ale. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Jestem got\u00f3w podj\u0105\u0107 dyskusj\u0119 na ten temat z tob\u0105. Liczby i metryki - to wszystko jest \u015bwietne, praktyki - to \u015bwietne. Ale musimy zrozumie\u0107 - czy jest to potrzebne biznesowi. S\u0105 firmy, kt\u00f3re nie potrzebuj\u0105 takiej szybko\u015bci zmian. Znam firmy, w kt\u00f3rych nie mo\u017cna wprowadza\u0107 zmian co 15 minut. I nie dlatego, \u017ce s\u0105 jakie\u015b z\u0142e. To taki cykl \u017cycia. A \u017ceby robi\u0107 funkcje branches, funkcje toggle, potrzebna jest g\u0142\u0119boka wiedza.<\/em> <\/p>\n<p><\/p>\n<p>To trudne. Je\u015bli chcesz poczyta\u0107 wi\u0119cej o funkcji toggle, to bardzo polecam. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. Jest te\u017c wspania\u0142y artyku\u0142 Martyna Faulera o funkcjach toggle: o r\u00f3\u017cnych typach, cyklach \u017cycia itd. Funkcja toggle - to skomplikowane. <\/p>\n<p><\/p>\n<p><em>A jednak nie odpowiedzia\u0142e\u015b na pytanie: \u201eCzy Jenkins jest potrzebny, czy nie?\u201d<\/em><\/p>\n<p><\/p>\n<p>Jenkins w rzeczywisto\u015bci nie jest potrzebny w \u017cadnym przypadku. Je\u015bli m\u00f3wimy powa\u017cnie, narz\u0119dzia: Jenkins, Gitlab przynie\u015b\u0107 wygod\u0119. Zobaczysz, czy kompilacja si\u0119 uda\u0142a, czy nie. Mog\u0105 ci pom\u00f3c, ale nie zapewni\u0105 ci praktyki. Mog\u0105 tylko da\u0107 znacznik \u2013 Ok, nie Ok. I to, je\u015bli piszesz jeszcze testy, bo je\u015bli nie masz test\u00f3w, to to jest prawie bezsensowne. Dlatego jest potrzebny, poniewa\u017c \u2013 to bardziej wygodne, ale w og\u00f3le mo\u017cna bez niego \u017cy\u0107, nie stracisz zbyt wiele. <\/p>\n<p><\/p>\n<p><em>T. j. je\u015bli masz praktyki, to znaczy, \u017ce nie jest ci potrzebny?<\/em><\/p>\n<p><\/p>\n<p>Zgadza si\u0119. Polecam test Jez Humbles. Mam mieszane uczucia co do ostatniego punktu. Ale og\u00f3lnie, je\u015bli masz trzy rzeczy, ci\u0105gle si\u0119 \u0142\u0105czysz, uruchamiasz testy na commitach w masterze, szybko naprawiasz build w masterze, to by\u0107 mo\u017ce, \u017ce nie potrzebujesz nic wi\u0119cej. <\/p>\n<p><\/p>\n<p><em>Jak czekamy na pytania od uczestnik\u00f3w, mam pytanie. M\u00f3wili\u015bmy teraz o kodzie produktowym. A czy u\u017cywa\u0142e\u015b tego do kodu infrastrukturalnego? To taki sam kod, ma te same zasady i ten sam cykl \u017cycia, czy s\u0105 tam inne cykle \u017cycia i zasady? Zwykle, gdy wszyscy m\u00f3wi\u0105 o Integracji i Rozwoju Ci\u0105g\u0142ym, zapominaj\u0105, \u017ce jest jeszcze kod infrastrukturalny. I ostatnio jest go coraz wi\u0119cej. Czy nale\u017cy tam wprowadza\u0107 wszystkie te zasady?<\/em><\/p>\n<p><\/p>\n<p>Nawet nie to, czy nale\u017cy, to b\u0119dzie \u015bwietne, poniewa\u017c na pewno upro\u015bci to \u017cycie. Gdy tylko pracujemy z kodem, nie ze skryptami na bash, a mamy normalny kod.<\/p>\n<p><\/p>\n<p><em>Stop, stop, skrypt na bash \u2013 to te\u017c jest kod. Nie dotykaj mojej starej mi\u0142o\u015bci.<\/em> <\/p>\n<p><\/p>\n<p>Dobrze, nie b\u0119d\u0119 st\u0105pa\u0107 po twoich wspomnieniach. Mam osobist\u0105 niech\u0119\u0107 do basha. Psuje si\u0119 brzydko i strasznie ca\u0142y czas. I psuje si\u0119 cz\u0119sto w spos\u00f3b nieprzewidywalny, wi\u0119c go nie lubi\u0119. Ale dobrze, za\u0142\u00f3\u017cmy, \u017ce masz kod w bashu. Mo\u017ce rzeczywi\u015bcie si\u0119 nie znam i s\u0105 tam normalne frameworki do testowania. Po prostu nie jestem w temacie. I w takim razie mamy te same zalety.<\/p>\n<p><\/p>\n<p>Kiedy pracujemy z infrastruktur\u0105 jak z kodem, mamy te same problemy co programi\u015bci. Kilka miesi\u0119cy temu natkn\u0105\u0142em si\u0119 na sytuacj\u0119, w kt\u00f3rej kolega przes\u0142a\u0142 mi pull request na 1000 linii basha. I utkn\u0105\u0142e\u015b na recenzji przez 4 godziny. Problemy s\u0105 te same. To nadal kod. I nadal wsp\u00f3\u0142praca. Utkn\u0119li\u015bmy z pull request i utkn\u0119li\u015bmy z tym, \u017ce musimy rozwi\u0105zywa\u0107 te same konflikty merge w tym samym bashu, na przyk\u0142ad. <\/p>\n<p><\/p>\n<p>Obecnie bardzo aktywnie przygl\u0105dam si\u0119 ca\u0142emu temu procesowi maksymalnie pi\u0119knym programowaniem infrastruktury. Wprowadzi\u0142em do infrastruktury Pulumi. To czystsze programowanie. Tam jest to jeszcze bardziej atrakcyjne, poniewa\u017c mam wszystkie mo\u017cliwo\u015bci j\u0119zyka programowania, wi\u0119c z tymi samymi ifami zrobi\u0142em eleganckie prze\u0142\u0105czniki w powietrzu i wszystko dzia\u0142a dobrze. To znaczy, moja zmiana znajduje si\u0119 ju\u017c w ga\u0142\u0119zi master. Ju\u017c wszyscy to widz\u0105. Inni in\u017cynierowie s\u0105 tego \u015bwiadomi. Ju\u017c mia\u0142o to na co\u015b wp\u0142yw. Ale w tym czasie w\u0142\u0105czy\u0142o si\u0119 to nie dla ca\u0142ej infrastruktury. W\u0142\u0105czy\u0142o si\u0119 to na przyk\u0142ad dla moich testowych \u015brodowisk. Dlatego odpowiadaj\u0105c na twoje pytanie jeszcze raz, jest to potrzebne. Nam, jako in\u017cynierom pracuj\u0105cym z kodem, znacznie u\u0142atwia \u017cycie. <\/p>\n<p><\/p>\n<p><em>Czy s\u0105 jeszcze jakie\u015b pytania?<\/em> <\/p>\n<p><\/p>\n<p>Mam pytanie. Chc\u0119 kontynuowa\u0107 dyskusj\u0119 z Olegiem. Og\u00f3lnie my\u015bl\u0119, \u017ce masz racj\u0119, \u017ce je\u015bli zadanie zajmuje ci miesi\u0105c, to masz problem z architektur\u0105, masz problem z analiz\u0105, dekompozycj\u0105, planowaniem itd. Ale mam takie wra\u017cenie, \u017ce je\u015bli zaczniesz pr\u00f3bowa\u0107 \u017cy\u0107 wed\u0142ug continuous integration, to zaczniesz rozwi\u0105zywa\u0107 b\u00f3le zwi\u0105zane z planowaniem, poniewa\u017c nie uciekniesz od tego. <\/p>\n<p><\/p>\n<p><em>(Oleg) Tak, to prawda. W zakresie nak\u0142ad\u00f3w praca ta jest por\u00f3wnywalna z ka\u017cd\u0105 inn\u0105 powa\u017cn\u0105 praktyk\u0105 zmieniaj\u0105c\u0105 kultur\u0119. Najtrudniejsze w przezwyci\u0119\u017caniu s\u0105 przyzwyczajenia, zw\u0142aszcza te z\u0142e. A je\u015bli aby wdro\u017cy\u0107 t\u0119 praktyk\u0119 wymagana jest znacz\u0105ca zmiana nawyk\u00f3w otoczenia: deweloper\u00f3w, zarz\u0105du, mened\u017cera produkcji, czekaj\u0105 na was niespodzianki.<\/em> <\/p>\n<p><\/p>\n<p><em>Jakie mog\u0105 by\u0107 niespodzianki? Przypu\u015b\u0107my, \u017ce postanowili\u015bcie cz\u0119\u015bciej przeprowadza\u0107 integracje. I w przypadku integracji zale\u017c\u0105 od siebie r\u00f3\u017cne rzeczy, na przyk\u0142ad artefakty. A w waszej firmie mo\u017ce istnie\u0107 polityka, \u017ce ka\u017cdy artefakt musi by\u0107 w jaki\u015b spos\u00f3b uwzgl\u0119dniony w systemie archiwizacji artefakt\u00f3w. I to zajmuje pewn\u0105 ilo\u015b\u0107 czasu. Osoba musi zaznaczy\u0107, \u017ce jako mened\u017cer wydania zatwierdzi\u0142a ten artefakt do produkcji. Je\u015bli to zajmuje 5-10-15 minut, ale przeprowadzacie wydanie raz w tygodniu, to wydanie raz w tygodniu zajmowa\u0142oby p\u00f3\u0142 godziny \u2013 to niewielki podatek.<\/em> <\/p>\n<p><\/p>\n<p><em>Je\u015bli robisz Continuous Integration 10 razy dziennie, to 10 razy trzeba pomno\u017cy\u0107 przez 30 minut. I to przekracza ilo\u015b\u0107 czasu pracy tego mened\u017cera wydania. Po prostu si\u0119 m\u0119czy to robi\u0107. Istniej\u0105 sta\u0142e koszty dla r\u00f3\u017cnych praktyk. I to wszystko.<\/em> <\/p>\n<p><\/p>\n<p><em>I musisz albo anulowa\u0107 t\u0119 zasad\u0119, aby nie zajmowa\u0107 si\u0119 takimi sprawami, tzn. nie przypisujesz r\u0119cznie poziomu zgodno\u015bci czego\u015b z czym\u015b. Ca\u0142kowicie polegasz na jakim\u015b zautomatyzowanym zestawie test\u00f3w gotowo\u015bci.<\/em> <\/p>\n<p><\/p>\n<p><em>A je\u015bli musisz uzyska\u0107 od kogo\u015b potwierdzenie, aby szef podpisa\u0142, i nie wchodzisz do produkcji bez tego, \u017ce Wania powiedzia\u0142, \u017ce to dozwolone itd. \u2013 wszystkie te bzdury stan\u0105 na drodze praktykom. Poniewa\u017c je\u015bli s\u0105 jakie\u015b zwi\u0105zane dzia\u0142ania w postaci podatku, wszystko 100 razy si\u0119 zwi\u0119ksza. Dlatego zmiana nie zawsze jest przyjmowana z entuzjazmem. Poniewa\u017c trudno jest zmienia\u0107 nawyki ludzi.<\/em> <\/p>\n<p><\/p>\n<p><em>Kiedy cz\u0142owiek wykonuje znan\u0105 prac\u0119, robi to praktycznie bez zastanowienia. Obci\u0105\u017cenie poznawcze jest r\u00f3wne zeru. Po prostu dzia\u0142a wed\u0142ug ustalonych procedur, ma w g\u0142owie list\u0119 kontroln\u0105, robi\u0142 to tysi\u0105ce razy. I gdy tylko przychodzisz i m\u00f3wisz mu: \u201eZrezygnujmy z tej praktyki i od poniedzia\u0142ku wdro\u017cymy now\u0105\u201d, dla niego staje si\u0119 to powa\u017cnym obci\u0105\u017ceniem poznawczym. A jednak obci\u0105\u017ca to wszystkich jednocze\u015bnie.<\/em> <\/p>\n<p><\/p>\n<p><em>Dlatego najpro\u015bciej, chocia\u017c w rzeczywisto\u015bci nie wszyscy mog\u0105 sobie na to pozwoli\u0107, ja zawsze post\u0119puj\u0119 dok\u0142adnie w ten spos\u00f3b, to jest nast\u0119puj\u0105ce. Kiedy rozpoczyna si\u0119 nowy projekt, zwykle od razu wpychane s\u0105 do niego wszystkie nieprzetestowane praktyki. Dop\u00f3ki projekt jest m\u0142ody, w\u0142a\u015bciwie nie ryzykujemy. Produkcja jeszcze nie istnieje, nie ma czego rozwali\u0107. Dlatego mo\u017cna to wykorzysta\u0107 jako trening. Takie podej\u015bcie dzia\u0142a. Ale nie wszystkie firmy maj\u0105 mo\u017cliwo\u015b\u0107 cz\u0119sto rozpoczyna\u0107 takie projekty. Chocia\u017c to te\u017c jest troch\u0119 dziwne, bo teraz trwa pe\u0142na transformacja cyfrowa, wszyscy powinni uruchamia\u0107 eksperymenty, aby dogoni\u0107 konkurencj\u0119.<\/em> <\/p>\n<p><\/p>\n<p>Tutaj natrafiasz na to, \u017ce najpierw musisz zrozumie\u0107, co musisz zrobi\u0107. \u015awiat nie jest idealny, produkcja te\u017c nie jest idealna. <\/p>\n<p><\/p>\n<p><em>Tak, te rzeczy s\u0105 ze sob\u0105 powi\u0105zane.<\/em><\/p>\n<p><\/p>\n<p>Biznes te\u017c nie zawsze ma zrozumienie, \u017ce powinien i\u015b\u0107 dok\u0142adnie w tym kierunku. <\/p>\n<p><\/p>\n<p><em>S\u0105 sytuacje, w kt\u00f3rych jakiekolwiek zmiany s\u0105 ca\u0142kowicie niemo\u017cliwe. To sytuacja, gdy na zesp\u00f3\u0142 wywierane jest wi\u0119ksze ci\u015bnienie. Zesp\u00f3\u0142 jest ju\u017c ca\u0142kiem wypalony. Nie ma \u017cadnego zapasu czasu na eksperymenty. Od rana do wieczora pracuj\u0105 nad funkcjami. A kierownictwu ci\u0105gle ma\u0142o i ma\u0142o tych funkcji. Wymagana jest coraz wi\u0119ksza liczba. W takiej sytuacji jakiekolwiek zmiany s\u0105 ca\u0142kowicie niemo\u017cliwe. Zespo\u0142owi mo\u017cna tylko powiedzie\u0107, \u017ce jutro zrobimy tak samo jak wczoraj, po prostu musimy zrobi\u0107 troch\u0119 wi\u0119cej funkcji. \u017badne przej\u015bcia do jakichkolwiek praktyk w tym sensie nie s\u0105 mo\u017cliwe. To klasyczna sytuacja, w kt\u00f3rej nie ma czasu na ostrzenie topora, trzeba r\u0105ba\u0107 drzewa, wi\u0119c r\u0105bi\u0105 t\u0119py toporem. Tutaj nie ma prostych rad.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Przeczytam doprecyzowanie z czatu: \"Ale potrzebne jest du\u017ce pokrycie testami na r\u00f3\u017cnych poziomach. Ile czasu po\u015bwi\u0119ca si\u0119 na testy? To jako\u015b drogo, zajmuje du\u017co czasu.\"<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) To jest klasyczne nieporozumienie. Test\u00f3w powinno by\u0107 wystarczaj\u0105co du\u017co, aby\u015bcie sami mieli pewno\u015b\u0107. Continuous Integration to nie jest taka rzecz, gdzie najpierw przeprowadza si\u0119 100% test\u00f3w, a dopiero potem zaczyna si\u0119 wdra\u017ca\u0107 t\u0119 praktyk\u0119. Continuous Integration zmniejsza obci\u0105\u017cenie poznawcze, poniewa\u017c ka\u017cda z widocznych zmian jest na tyle oczywista, \u017ce rozumiecie, czy co\u015b si\u0119 zepsuje, nawet bez test\u00f3w. Mo\u017cecie to szybko przetestowa\u0107 w my\u015blach, poniewa\u017c zmiany s\u0105 ma\u0142e. Nawet je\u015bli macie tylko tester\u00f3w manualnych, im te\u017c jest \u0142atwiej. Wypu\u015bcili\u015bcie now\u0105 wersj\u0119 i powiedzieli\u015bcie: \u201eSp\u00f3jrz, nic si\u0119 nie zepsu\u0142o?\u201d. Oni sprawdzili i powiedzieli: \u201eNie, nic si\u0119 nie zepsu\u0142o\u201d. Poniewa\u017c tester wie, na co zwr\u00f3ci\u0107 uwag\u0119. Mo\u017cecie mie\u0107 jeden commit zwi\u0105zany z jednym fragmentem kodu. I to eksploduje w konkretne zachowanie.<\/em><\/p>\n<p><\/p>\n<p>Tutaj oczywi\u015bcie lekko przesadzi\u0142e\u015b. <\/p>\n<p><\/p>\n<p><em>(Dmitriy) Z tym si\u0119 nie zgodz\u0119. Istnieje praktyka \u2013 rozw\u00f3j przez testowanie, kt\u00f3ra w\u0142a\u015bnie ratuje przed tym.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) Jeszcze do tego nie doszed\u0142em. Pierwsz\u0105 iluzj\u0105 jest to, \u017ce trzeba pisa\u0107 dok\u0142adnie 100% test\u00f3w lub w og\u00f3le nie zajmowa\u0107 si\u0119 Continuous Integration. To nieprawda. To s\u0105 dwie r\u00f3wnoleg\u0142e praktyki. I one nie s\u0105 od siebie bezpo\u015brednio zale\u017cne. Wasze pokrycie testami powinno by\u0107 optymalne. Optymalne oznacza, \u017ce sami jeste\u015bcie pewni, \u017ce jako\u015b\u0107 mastera, w kt\u00f3rej pozostanie po commicie wasz master, pozwala wam z pewno\u015bci\u0105 nacisn\u0105\u0107 przycisk \u201eDeploy\u201d w pi\u0105tek wieczorem, b\u0119d\u0105c pod wp\u0142ywem alkoholu. Jak to osi\u0105gniecie? Dzi\u0119ki przegl\u0105dowi, dzi\u0119ki pokryciu, dzi\u0119ki dobremu monitoringowi.<\/em> <\/p>\n<p><\/p>\n<p><em>Dobry monitoring jest nierozr\u00f3\u017cnialny od test\u00f3w. Je\u015bli uruchamiacie testy raz na pre-prod, to sprawdzaj\u0105 one wszystkie wasze scenariusze u\u017cytkownika tylko raz. A je\u015bli uruchamiacie je w niesko\u0144czonej p\u0119tli, to jest wasz rozbudowany system monitorowania, kt\u00f3ry testuje wszystko w niesko\u0144czono\u015b\u0107 \u2013 czy system pad\u0142, czy nie. W tym przypadku r\u00f3\u017cnica polega tylko na jednorazowo\u015bci lub wielokrotno\u015bci. Bardzo dobry zestaw test\u00f3w, kt\u00f3ry \u2026 jest uruchamiany bez ko\u0144ca, to monitorowanie. I prawid\u0142owy monitoring powinien by\u0107 taki.<\/em> <\/p>\n<p><\/p>\n<p><em>I dlatego jak dok\u0142adnie osi\u0105gniecie ten stan, kiedy w pi\u0105tek wieczorem wdro\u017cycie now\u0105 wersj\u0119 i wr\u00f3cicie do domu, to ju\u017c inna kwestia. Mo\u017ce po prostu jeste\u015bcie odwa\u017cnym szale\u0144cem.<\/em> <\/p>\n<p><\/p>\n<p>Cofnijmy si\u0119 nieco do Continuous Integration. Troch\u0119 odbiegli\u015bmy w stron\u0119 innej skomplikowanej praktyki. <\/p>\n<p><\/p>\n<p><em>Druga iluzja to przekonanie, \u017ce MVP nale\u017cy szybko wytwarza\u0107, wi\u0119c testy w og\u00f3le nie s\u0105 potrzebne. To nie do ko\u0144ca prawda. Gdy piszesz user story w MVP, mo\u017cesz j\u0105 rozwija\u0107 albo na spontanicznie, tzn. us\u0142ysza\u0142e\u015b, \u017ce istnieje jaka\u015b user story i od razu przyst\u0119pujesz do kodowania, albo pracuj\u0105c wg TDD. Z praktyki wynika, \u017ce w przypadku TDD nie trwa to d\u0142u\u017cej, tzn. testy to efekt uboczny. Praktyka TDD nie polega na testowaniu. Mimo \u017ce nazywa si\u0119 to Test Driven Development, to w rzeczywisto\u015bci chodzi bardziej o podej\u015bcie architektoniczne. To metoda, jak pisa\u0107 dok\u0142adnie to, co jest potrzebne, a nie pisa\u0107 rzeczy niepotrzebne. Ta praktyka koncentruje si\u0119 na nast\u0119pnej iteracji twojego rozwoju my\u015bli w zakresie tworzenia architektury aplikacji.<\/em> <\/p>\n<p><\/p>\n<p><em>Dlatego tak trudno pozby\u0107 si\u0119 tych iluzji. MVP i testy nie wykluczaj\u0105 si\u0119 nawzajem. Wr\u0119cz przeciwnie, je\u015bli tworzysz MVP w praktyce TDD, zrobisz to lepiej i szybciej ni\u017c bez tej praktyki, na \u015blepo.<\/em><\/p>\n<p><\/p>\n<p>To bardzo nieoczywista i skomplikowana my\u015bl. Kiedy s\u0142yszysz, \u017ce teraz b\u0119d\u0119 pisa\u0142 jeszcze testy i przy tym co\u015b zrobi\u0119 szybciej, brzmi to absolutnie absurdalnie. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Tutaj wielu, kiedy m\u00f3wi o MVP, po prostu nie chce im si\u0119 napisa\u0107 czegokolwiek sensownego. To dwie r\u00f3\u017cne rzeczy. Nie nale\u017cy przekszta\u0142ca\u0107 MVP w co\u015b z\u0142ego, co nie dzia\u0142a.<\/em> <\/p>\n<p><\/p>\n<p>Tak, masz racj\u0119.<\/p>\n<p><\/p>\n<p><em>A potem nagle MVP w prod.<\/em><\/p>\n<p><\/p>\n<p>Na zawsze. <\/p>\n<p><\/p>\n<p>A TDD brzmi bardzo dziwnie, gdy s\u0142yszysz, \u017ce piszesz testy i wydaje si\u0119, \u017ce wykonujesz wi\u0119cej pracy. To brzmi do\u015b\u0107 dziwnie, ale w rzeczywisto\u015bci sprawia, \u017ce idzie to szybciej i przyjemniej. Gdy piszesz test, ju\u017c w g\u0142owie my\u015blisz o tym, jaki kod i jak b\u0119dzie wywo\u0142ywany, a tak\u017ce jakie zachowanie od niego oczekujemy. Nie po prostu m\u00f3wisz, \u017ce napisa\u0142e\u015b jak\u0105\u015b funkcj\u0119, kt\u00f3ra co\u015b robi. Najpierw my\u015blisz, \u017ce ma takie i takie warunki, tak b\u0119dzie wywo\u0142ywana. Pokrywasz to testami i z tego rozumiesz, jak b\u0119d\u0105 wygl\u0105da\u0142y interfejsy wewn\u0105trz twojego kodu. To ma ogromny wp\u0142yw na architektur\u0119. Tw\u00f3j kod automatycznie staje si\u0119 bardziej modularny, poniewa\u017c najpierw pr\u00f3bujesz zrozumie\u0107, jak b\u0119dziesz go testowa\u0107, a dopiero potem go piszesz. <\/p>\n<p><\/p>\n<p>W moim przypadku z TDD by\u0142o tak, \u017ce w pewnym momencie zatrudni\u0142em mentora do Ruby, kiedy jeszcze by\u0142em programist\u0105 Ruby. I on m\u00f3wi: 'Zr\u00f3bmy to w TDD'. Pomy\u015bla\u0142em: 'O nie, teraz musz\u0119 pisa\u0107 co\u015b dodatkowo'. Uzgodnili\u015bmy, \u017ce przez dwa tygodnie b\u0119d\u0119 pisa\u0107 ca\u0142y dzia\u0142aj\u0105cy kod w Pythonie w TDD. Po dw\u00f3ch tygodniach zrozumia\u0142em, \u017ce ju\u017c nie chc\u0119 wraca\u0107. Pr\u00f3buj\u0105c to wdra\u017ca\u0107 przez dwa tygodnie, zrozumia\u0142em, jak bardzo u\u0142atwi\u0142o mi to my\u015blenie. Ale to nie jest oczywiste, dlatego wszystkim polecam, \u017ce je\u015bli macie wra\u017cenie, \u017ce TDD to skomplikowane, d\u0142ugie i niepotrzebne, spr\u00f3bujcie stosowa\u0107 to przez dwa tygodnie. Dwa by\u0142y wystarczaj\u0105ce dla mnie.<\/p>\n<p><\/p>\n<p><em>(Dmitrij) Mo\u017cemy rozwin\u0105\u0107 t\u0119 my\u015bl z perspektywy eksploatacji infrastruktury. Zanim uruchomimy co\u015b nowego, robimy monitorowanie, a potem uruchamiamy. W takim przypadku nasze monitorowanie staje si\u0119 normalnym testowaniem. I jest rozw\u00f3j poprzez monitorowanie. Ale prawie wszyscy m\u00f3wi\u0105, \u017ce to trwa d\u0142ugo, nie chce mi si\u0119, zrobi\u0142em tymczasowy szkic. Je\u015bli zrobili\u015bmy monitorowanie we w\u0142a\u015bciwy spos\u00f3b, rozumiemy stan systemu CI. A w systemie CI jest du\u017co monitorowania. Rozumiemy stan systemu, wiemy, co si\u0119 w nim dzieje. I podczas rozwoju robimy system, aby osi\u0105gn\u0105\u0107 po\u017c\u0105dany stan.<\/em> <\/p>\n<p><\/p>\n<p><em>Te praktyki s\u0105 znane od dawna. Rozmawiali\u015bmy o tym jakie\u015b 4 lata temu. Ale przez 4 lata praktycznie nic si\u0119 nie zmieni\u0142o.<\/em> <\/p>\n<p><\/p>\n<p><em>Na tej nucie proponuj\u0119 zako\u0144czy\u0107 oficjaln\u0105 dyskusj\u0119.<\/em><\/p>\n<p><\/p>\n<p>Wideo (wstawione jako element multimedialny, ale z jakiego\u015b powodu nie dzia\u0142a):<\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/zZ3qXVN3Oic\">https:\/\/youtu.be\/zZ3qXVN3Oic<\/a><\/noindex><br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/518406\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":93886,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-93885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Continuous Integration jako praktyka, a nie Jenkins. Andriej Aleksandrow | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-10T17:42:23+00:00","article:modified_time":"2020-09-10T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"93885","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:37:31","updated":"2022-09-27 15:57:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/93885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=93885"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/93885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/93886"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=93885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=93885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=93885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}