馃憠 Specjalna promocja dla widz贸w: http://bit.ly/3YUsSvV
W dzisiejszym odcinku rozmawiali艣my z Micha艂em Taszyckim, Founder kursreacta.pl, o legacy code – czym jest, jak podej艣膰 do pracy z nim, a tak偶e jak mo偶na wykorzysta膰 go jako hobby i pasj臋. 馃檶
Dowiedzieli艣my si臋, 偶e legacy code to nie tylko stara, nieu偶ywana ju偶 baza kodu, ale tak偶e cenny zas贸b, kt贸ry mo偶na w odpowiedni spos贸b wykorzysta膰 馃憣. Micha艂 podzieli艂 si臋 z nami swoj膮 wiedz膮 i do艣wiadczeniem, dzi臋ki czemu dowiedzieli艣my si臋, jak skutecznie pracowa膰 z legacy code, jak radzi膰 sobie z problemami zwi膮zanymi z jego utrzymaniem oraz jak mo偶na wykorzysta膰 go, aby rozwija膰 swoje umiej臋tno艣ci i pasj臋 do programowania.
馃 Je艣li chcecie pozna膰 tajniki pracy z legacy code, to ten odcinek podcastu jest dla Was! Zach臋camy do s艂uchania i zostawienia komentarza pod postem, aby podzieli膰 si臋 swoimi refleksjami i do艣wiadczeniami w pracy z kodem.
Nikodem: Standardowa procedura, kt贸r膮 umie艣cimy na pewno pod spodem w komentarzu, do widzenia.聽
W opisie! Wiedzia艂em, 偶e co艣 jest nie tak!
Dzie艅 dobry, cze艣膰 wszystkim, z tej strony Nikodem, witam w kolejnym podca艣cie DEVision. Dzisiaj w studio jest ze mn膮 Micha艂 Taszycki, cze艣膰 Micha艂!聽
Micha艂: Cze艣膰!聽
Z Micha艂em b臋d臋 dzisiaj rozmawia艂 o legacy kodzie.聽
Tak.聽
Zanim przejdziemy do g艂贸wnego w膮tku tego tematu, nasz膮 tradycj膮 jest tak, 偶e prosimy go艣ci, 偶eby si臋 przedstawili, opowiedzieli kilka s艂贸w o sobie, wi臋c prosz臋, opowiedz co艣 o sobie.聽
To tak, obecnie jestem troch臋 przedsi臋biorc膮, troch臋 programist膮, bo jako przedsi臋biorca tworz臋 kursy online i ucz臋 programowa膰 w nowoczesnych technologiach, takich jak React, GraphQL, ale te偶 ucz臋 jak programowa膰 Commodore 64, natomiast to jest inna historia, dzisiaj skoro m贸wimy o legacy kodzie to mo偶e ta cz臋艣膰 mojej kariery, kt贸ra jest programistyczna, to programist膮 jestem od oko艂o 19 lat i pracowa艂em w bardzo du偶o r贸偶nych miejscach, od korporacji gdzie robi艂em powa偶ne aplikacje biznesowe, tam by艂o najwi臋cej legacy kodu.聽
Chcesz powiedzie膰, 偶e w innych przedsi臋biorstwach si臋 nie pracuje nad powa偶nym kodem?
Tam si臋 robi powa偶ne aplikacje biznesowe, a w innych miejscach si臋 robi mo偶e mniej powa偶ne aplikacje, niekoniecznie biznesowe, no ale r贸偶nie bywa. W ka偶dym razie pracowa艂em w korporacjach, p贸藕niej realizowa艂em marzenia z dzieci艅stwa, pracowa艂em jako game developer, i tam te偶 by艂 legacy code tylko troch臋 inny, bo pracowa艂em w takich studiach, w kt贸rych portowali艣my gry z r贸偶nych platform na inne platformy, na przyk艂ad przenosili艣my Saints Row 2, to by艂 taki klon GTA z Xbox’a na peceta no i tam ten legacy code by艂 troch臋 w innym stopniu legacy kodem ni偶 w korporacjach, ale o definicjach legacy kodu mo偶e p贸藕niej pogadamy, bo to jest temat rzeka, p贸藕niej jak ju偶 dosz艂o do mnie, 偶e praca jako game developer jest fantastyczna, daje bardzo du偶o satysfakcji, tylko ma jeden ma艂y minus, crunch time. To jest co艣, co jest nienegocjowalne, bo jak gry maj膮 jaki艣 deadline, 偶e trzeba je dostarczy膰, to niestety trzeba dostarczy膰 je na czas, bo inaczej firma zbankrutuje albo ludzie wylec膮 na bruk i to oznacza to, w po艂膮czeniu z faktem, 偶e tak jak we wszystkich innych projektach w IT, nie zawsze potrafimy oszacowa膰, ile co艣 zajmie, to w grach si臋 to 艂膮czy, z tym, 偶e na koniec projektu, albo na koniec dostarczania r贸偶nych tam kamieni milowych, trzeba pracowa膰 d艂u偶ej, pracowa膰 po godzinach, pracowa膰 w weekendy. No jak ju偶 wyszed艂em z game dev’u, to zaj膮艂em si臋 programowaniem aplikacji mobilnych jako fullstack, wcze艣niej skupiony bardziej na backendzie w Ruby on Rails, kt贸ry jest najpi臋kniejszym j臋zykiem programowania, czy w Ruby, w kt贸rym si臋 bardzo przyjemnie programuje i Ruby on Rails, w kt贸rym bardzo fajnie si臋 robi aplikacje backendowe, a teraz jestem skupiony bardziej na frontendzie i bardziej na ekosystemie javascriptowym, typescriptowym, Node.js-owym. I wsz臋dzie w tych miejscach zawsze mia艂em styczno艣膰 z legacy kodem.聽
Wspomnia艂e艣 tutaj, kilkukrotnie pad艂o takie has艂o, sam w og贸le zapowiedzia艂em, 偶e b臋dziemy rozmawia膰 o legacy kodzie, wi臋c chcieliby艣my przej艣膰 do tego i powiedzia艂e艣 tutaj, 偶e chcieliby艣my powiedzie膰 definicj臋, czym jest legacy kod, w艂a艣nie wydaje mi si臋, 偶e to jest jedno z takich zagadnie艅, nie wiem, na przyk艂ad jak jest r贸偶nica mi臋dzy testami jednostkowymi a testami integracyjnymi, co programista to gdzie艣 indziej postawi t膮 granic臋, podobnie by艂oby z definicj膮 legacy kodu jakby zapyta膰 programist臋, to ka偶dy b臋dzie mia艂 jak膮艣 swoj膮 definicj臋, wi臋c chcia艂bym us艂ysze膰, jaka jest twoim zdaniem definicja legacy kodu.聽
Ok, z legacy kodem jest tak, 偶e wydaje mi si臋, 偶e ka偶dy z grubsza ma jak膮艣 tam intuicyjn膮 definicj臋 i ka偶dy potrafi powiedzie膰, jak zobaczy kod, kt贸ry jest legacy to raczej nie powie, 偶e ten kod nie jest legacy, w t膮 stron臋 si臋 ludzie nie myl膮, w drug膮 stron臋 mog膮 si臋 pomyli膰 i teraz definicji mamy kilka, mo偶emy wzi膮膰 sobie tak膮 dos艂own膮 definicj臋 z angielskiego, 偶e legacy kod, to jest co艣, co dziedziczymy, dostajemy w spadku po kim艣 i teraz mo偶emy dosta膰 po kim艣, czyli firma, w kt贸rej pracujemy dosta艂a kod po jakiej艣 innej firmie albo nasz zesp贸艂 po jakim艣 innym zespole, kt贸ry pracuje w tej samej firmie, albo na przyk艂ad ja zacz膮艂em pracowa膰 nad kodem, kt贸ry kto艣 inny dostarczy艂 a p贸藕niej robi git blame i okazuje si臋, 偶e to jestem ja z przesz艂o艣ci i to jest jedna z takich definicji, czyli co艣, co dostali艣my. Kto艣 inny m贸g艂by powiedzie膰, 偶e to jest stary kod, ale to jest ten problem, o kt贸rym m贸wi臋, gdzie t膮 kresk臋 postawi膰, czy to jest kod sprzed wczoraj, czy to sprzed miesi膮ca, czy sprzed dw贸ch lat, 10 lat, czy to mo偶e kod w innej technologii albo zwinnej jakiej艣 tam metodyce projektowania w Domain-Driven, albo w czym艣 innym budowany, mo偶e w innym j臋zyku.聽
S艂ysza艂em te偶 tak膮 opini臋, 偶e na przyk艂ad to jest test, kt贸ry, przepraszam, to jest kod, kt贸ry nie jest pokryty testami.聽
Tak, to jest definicja Michaela Feathers’a z jego ksi膮偶ki “Working Effectively with Legacy Code” i to jest taka Biblia pracy z legacy kodem, kt贸r膮 ka偶dy powinien przeczyta膰, tam jest du偶o takich sposob贸w, jak mo偶na zaj膮膰 si臋 tym legacy kodem, 偶eby to mia艂o r臋ce i nogi, przyk艂ady s膮 w C++ bodaj偶e i nie wiem, czy w Javie, ale jest tam du偶o prze艂o偶enia na inne j臋zyki programowania. Wracaj膮c jeszcze do tego czasu, to takie ekstremum, maksymaln臋 opini臋, kt贸r膮 s艂ysza艂em, to 偶e legacy kod to jest kod, kt贸ry w艂a艣nie zosta艂 zapisany. Jak ju偶 napiszesz kod to on staje si臋 legacy i tyle. Mo偶na si臋 zgodzi膰, czy nie, jak my艣lisz?聽
Nie, wydaje mi si臋, 偶e bym si臋 nie zgodzi艂, je偶eli jeszcze nad danym kodem b臋d臋, w sensie to te偶 pytanie, co znaczy, 偶e kod zosta艂 napisany, 偶e zmergowa艂em, zrobi艂em git merge i tyle, 偶e ju偶 w tym momencie staje si臋 kod legacy? Nie powiedzia艂bym.聽
To jest ciekawa perspektywa, ja te偶 czuj臋, 偶e to nie jest jeszcze tak, 偶e, jak napisze kod to ju偶 jest legacy.聽
Dop贸ki wiem jak kod dzia艂a i nie musz臋 wczytywa膰 si臋 w kod, 偶eby wiedzie膰, co tu si臋 dzieje z tym kodem, to na pewno nie nazwa艂bym go legacy.聽
Tak i tu zbli偶asz si臋 do mojej personalnej definicji, kt贸ra m贸wi, 偶e legacy kod to jest taki kod, kt贸ry dostali艣my od kogo艣 innego, to mo偶e nie jest takie wa偶ne, bo tym kim艣 mog臋 by膰 ja z przesz艂o艣ci.聽
Co艣 ty tutaj napisa艂?
Dok艂adnie. To jest kod, z kt贸rym z jakiego艣 powodu czuj臋 si臋 niekomfortowo, bo na przyk艂ad napisa艂em go dawno temu albo dosta艂em go 艣wie偶o od kogo艣 innego, albo nie ma test贸w, albo nie ma dokumentacji, albo w 艣rodku czaj膮 si臋 smoki, bo tak te偶 mo偶e by膰, tam mo偶e by膰 napisany brzydko, zw艂aszcza 偶e kiedy kto艣 inny go pisa艂, a nie ty, to wtedy jest najgorzej.聽
Najgorzej jest, je偶eli patrzysz, kto艣 brzydko to napisa艂, ju偶 na niego klniesz, a p贸藕niej si臋 okazuje, 偶e to ty.聽
Tak, ale wracaj膮c do tej definicji, kto艣, kto mo偶e by膰 r贸wnie偶 tob膮 z przesz艂o艣ci. No i wa偶niejsza rzecz, 偶e ten kod ju偶 jest, bo kodem legacy nie mo偶e by膰 kod, kt贸ry dopiero napiszemy, ale ju偶 jest powiedzmy od jakiegokolwiek czasu, natomiast on ju偶 sobie dzia艂a, najlepiej jest zdeployowany na produkcji i dostarcza komu艣 jak膮艣 warto艣膰, u偶ytkownicy na przyk艂ad polegaj膮 na tym kodzie, 偶eby korzysta膰 z funkcjonalno艣ci aplikacji, firma, kt贸ra jest posiadaczem tego kodu zarabia na nim grube pieni膮dze, na przyk艂ad nasza pensja jest wyp艂acana z jakich艣 pieni臋dzy, na kt贸re ten kawa艂ek kodu jako艣 tam zarabia, no i te dwie rzeczy, 偶e mamy kod, z kt贸rym czujemy si臋 niekomfortowo, mamy kod, kt贸ry ju偶 dzia艂a i problem zaczyna si臋, kiedy musimy co艣 w tym kodzie zmieni膰.聽
Wydaje mi si臋, 偶e najwa偶niejsze tutaj o czym nie wspomina艂e艣, 偶e to w艂a艣nie wymaga jakiej艣 zmiany, wymaga jakiego艣, nie wiem, czy to jakiej艣 poprawy wydajno艣ci, czy dodanie jakich艣 nowych funkcjonalno艣ci, bo przecie偶 komu przeszkadza艂 stary kod, kt贸ry istnieje i dzia艂a bez zarzut贸w?聽
Nikomu nie powinien, co nie zmienia faktu, 偶e ten kod b臋dzie legacy kodem, bo ju偶 jest i mo偶na by si臋 czu膰 niekomfortowo, kiedy do niego zasi膮dziesz.聽
Kiedy na niego musisz patrze膰.聽
Tak, no i a偶 ci臋 na przyk艂ad korci 偶eby co艣 tam zmieni膰, bo tam czaj膮 si臋 rzeczywiste smoki, ale p贸ki on dzia艂a, p贸ki on robi to, co ma robi膰, no to szkoda wydawa膰 pieni膮dze, wydawa膰 czas i wysi艂ek na to, 偶eby co艣 z nim robi膰 no i dopiero kiedy musimy z jakiego艣 powodu go ruszy膰, to wtedy warto wiedzie膰 jak pracowa膰 z takim legacy kodem, bo na przyk艂ad w wi臋kszo艣ci przypadk贸w to nie jest tak, 偶e mo偶emy taki kod zostawi膰 i on sobie 偶yje, mo偶e nie licz膮c jakiego艣 tam kodu napisanego w Cobolu, na kt贸rym stoj膮 wszystkie banki albo jakich艣 bardzo starych system贸w w powa偶nych aplikacjach biznesowych w korporacjach, takie rzeczy te偶 si臋 zdarzaj膮, no i ten kod sobie 偶yje 30 lat. Programi艣ci, kt贸rzy znaj膮 si臋 na danej technologii ju偶 dawno umarli na przyk艂ad.聽
Albo zmienili prac臋.聽
Albo zmienili prac臋 i trzeba si臋 nim w jaki艣 spos贸b zajmowa膰, natomiast obecnie to ci臋偶ko jest, 偶eby mie膰 taki kod, kt贸ry ju偶 sobie dzia艂a i 偶eby nic z nim nie robi膰, bo trzeba 艂ata膰 jakie艣 dziury bezpiecze艅stwa, trzeba update’owa膰 biblioteki, bo inaczej kiedy zasi膮dziemy do tego kodu, po na przyk艂ad miesi膮cu i pr贸bujemy tam zainstalowa膰 wszystkie zale偶no艣ci to si臋 nie udaje i trzeba nad tym jako艣 tam panowa膰, wi臋c no nad kodem obecnie to raczej trzeba w wi臋kszo艣ci przypadk贸w pracowa膰 stale, stety albo niestety.聽
Powiedzia艂e艣 tutaj kilkukrotnie, 偶e taki legacy kod to jest kod, z kt贸rym nie czujemy si臋 komfortowo i teraz chcia艂em w jaki艣 spos贸b nawi膮za膰 do definicji, o kt贸rej ja wspomnia艂em, mianowicie o kodzie, kt贸ry nie ma test贸w albo ma powiedzmy jako艣 藕le napisane testy, ale nie wiem, w jaki spos贸b nawi膮za膰, bo tak my艣l臋 i w sumie to si臋 zgodz臋, gdybym dosta艂 teraz jaki艣 kod, kt贸ry jest powiedzmy, stary, napisany przy pomocy jakich艣 starszych technologii, ale nawet je偶eli by艂by dobrze testowany to wydaje mi si臋, 偶e dalej m贸g艂bym si臋 czu膰 w jaki艣 spos贸b niekomfortowo i dalej bym go nazwa艂 legacy kodem.聽
Tak, zgadzam si臋, zgadzam si臋, testy w legacy kodzie s膮 bardzo wa偶ne. Je艣li one ju偶 s膮, to jak dla mnie to dalej mo偶e by膰 legacy kod, natomiast to znaczy, 偶e kto艣 za nas ju偶 odwali艂 troch臋 pracy, kt贸r膮 i tak by艣my musieli prawdopodobnie zrobi膰, je艣li chcieliby艣my efektywnie pracowa膰 z takim kodem legacy.聽
No tutaj te偶 nie chcia艂bym, znaczy chcia艂bym w艂a艣nie zaznaczy膰, 偶e w sumie to jakbym mia艂 wybra膰 czy mam dosta膰 legacy kod bez test贸w i z testami to na pewno bym si臋 zgodzi艂 na ten z testami.聽
No tak, by艂oby troszk臋 mniej roboty na pocz膮tku, ale trzeba chyba poruszy膰 jeden temat, 偶e sk膮d si臋 bierze l臋k taki w stosunku do legacy kodu.聽
Pewnie st膮d, 偶e zmieni臋 co艣 i co艣 zepsuj臋, to jest takie chyba najbardziej.聽
Tak, wydaje mi si臋, 偶e tak jest, bo to, co zauwa偶y艂em, 偶e wi臋kszo艣膰 programist贸w, czy programistek, kt贸re maj膮 w艂a艣nie jakie艣 takie obawy przed legacy kodem, to s膮 zwykle ludzie mniej do艣wiadczeni, zwykle bardziej pocz膮tkuj膮cy i zwykle ludzie, kt贸rzy maj膮 jeszcze jakie艣 tam do艣wiadczenie i zjedli na kodzie z臋by, to tego kodu si臋 troch臋 mniej boj膮. Wydaje mi si臋, 偶e to te偶 si臋 bierze st膮d, 偶e fajniej jest chyba pracowa膰 nad czym艣 od zera. No bo zw艂aszcza pocz膮tkuj膮cy maj膮 takie wydaje mi si臋 podej艣cie albo cz臋stsze jest takie podej艣cie w艣r贸d pocz膮tkuj膮cych, 偶e fajnie by by艂o, gdybym mia艂 tyle mo偶liwo艣ci, 偶e m贸g艂bym now膮, 艣wie偶膮 aplikacj臋 zrobi膰 z jakimi艣 moimi bibliotekami, moim podej艣ciem i tak dalej, bo programowanie to jest bardzo kreatywna dzia艂ka, robimy co艣 od zera, przelewamy my艣li na s艂owa, komputer te s艂owa przerabia w elektrony powiedzmy i co艣 si臋 dzieje, wi臋c jest to bardzo kreatywne i tym bardziej jest kreatywne im mamy wi臋cej do zrobienia i w tym legacy kodzie tej kreatywno艣ci jest troch臋 mniej, a przynajmniej jest ona troch臋 inna, natomiast legacy kod ma du偶o zalet moim zdaniem, bo jak zaczynamy pracowa膰 od zera to nie mamy ogranicze艅 偶adnych, jak kto艣 pr贸bowa艂 jakiego艣 kreatywnego zaj臋cia kiedy艣, napisa膰 jakiego艣 blog posta albo, nie wiem, ksi膮偶k臋, albo narysowa膰 co艣, no to zwykle jest taki problem, mamy bia艂膮 kartk臋, jak tu zacz膮膰, co zrobi膰, tyle mo偶liwo艣ci, ci臋偶ko kt贸r膮艣 wybra膰 i trzeba sobie samemu nadawa膰 jakie艣 ograniczenia. Legacy kod takie ograniczenia nadaje, bo mamy jakie艣 funkcjonalno艣ci, kt贸rych pod 偶adnym pozorem nie mo偶emy zepsu膰 i je艣li chcemy co艣 tam doda膰, to musimy si臋 najpierw upewni膰, 偶e jednak b臋dziemy mieli ten komfort, 偶e co艣 nas przed tym b臋dzie chroni膰 no i tutaj wchodz膮 testy ca艂e na bia艂o.聽
W艂a艣nie chcia艂em ju偶 przej艣膰 do tego powiedzmy procesu, jak wygl膮da praca nad takim legacy kodem. Jak mo偶e wygl膮da膰 w og贸le takie zadanie, powiedzmy, 偶e przychodzi do ciebie tw贸j prze艂o偶ony, ci oznajmia, 偶e potrzebujemy ten stary kod jako艣 przerobi膰 albo dopisa膰 funkcjonalno艣膰 do starego kodu, do legacy kodu.
To pierwszy odruch: Panie, to si臋 nie da.聽
To jest standardowe chyba, trzeba usi膮艣膰 i policzy膰 czy zyski b臋d膮 wi臋ksze ni偶 koszta, to tak, ale za艂贸偶my, 偶e s膮.聽
Tak, p贸藕niej przechodzisz przez te 5 stadi贸w, tam ten gniew, niedowierzanie, jak ju偶 si臋 pogodzisz z tym, 偶e musisz wej艣膰 do tego kodu, zwalczy膰 te smoki, to takim najprostszym algorytmem pracy z legacy kodem, to jest pierwsza rzecz, zabezpieczy膰 si臋 przed przypadkowymi zmianami tego kodu, czyli w jaki艣 spos贸b chroni膰 istniej膮c膮 funkcjonalno艣膰, wi臋c najpro艣ciej, jak to zrobi膰, to zrobi膰 du偶膮 liczb臋 test贸w automatycznych, no i teraz czy to b臋d膮 testy jednostkowe, czy to b臋d膮 testy integracyjne, czy to b臋d膮 testy end-to-end, to jest rzecz drugorz臋dna. To zale偶y od tego, jaki kawa艂ek legacy kodu uda nam si臋 wydzieli膰 najmniejszy, 偶eby艣my mogli zacz膮膰 pracowa膰 i dostarczy膰 t臋 funkcjonalno艣膰. Bo jak wydzielimy funkcj臋 legacy, to testy jednostkowe wystarcz膮, jak jaki艣 modu艂, kt贸ry jest powi膮zany z innymi modu艂ami, to jakie艣 testy integracyjne, kt贸re co艣 tam sprawdz膮, no a jak w 艣rodku czaj膮 si臋 rzeczywi艣cie smoki, w臋偶e i wszystko jest ze sob膮 powi膮zane, to trzeba jednak test end-to-end zrobi膰, ale to, co jest fajne w kodzie legacy, kt贸rego nie ma w innych kodach, kt贸re s膮 艣wie偶utkie, to jest to, 偶e kod legacy ju偶 istnieje, ju偶 dzia艂a na produkcji, ju偶 zarabia pieni膮dze, wi臋c ta funkcjonalno艣膰 ju偶 tam jest, nawet jak nie ma test贸w, nawet jak nie ma dokumentacji, to zachowanie tego kodu jest zapisane w kodzie, wi臋c musimy je tylko wy艂uska膰 stamt膮d, najprostsz膮 metod膮, najprostsz膮, ale nie naj艂atwiejsz膮, jest zastosowanie techniki zwanej smoke test, czyli testy dymienia, nomenklatura si臋 z elektroniki wzi臋艂a, jako taki szybki test, kt贸ry potrafi sprawdzi膰 jakiego艣 elektronicznego dynksa, czy on b臋dzie dzia艂a艂, pod艂膮czasz go do pr膮du, jak dymi to nie dzia艂a. Natomiast w informatyce to jako smoke testy to si臋 m贸wi NAS testy, w kt贸rych traktujemy kod jako czarn膮 skrzynk臋, nie patrzymy do 艣rodka, nie musimy rozumie膰 jak dzia艂a, tylko dajemy jakie艣 dane wej艣ciowe, czyli argumenty funkcji i nagrywamy dane wyj艣ciowe, czyli funkcja wyplu艂a taki string z takimi danymi, wi臋c ten string l膮duje w unit te艣cie, jak to b臋d膮 testy integracyjne albo end-to-end, to musimy jaki艣 snapshot albo modu艂贸w, albo jakie艣 rzeczy, kt贸re wp艂ywaj膮 do tych modu艂贸w z naszego modu艂u, kt贸ry testujemy albo zrobi膰 jaki艣 snapshot ca艂ej aplikacji, te testy b臋d膮 dzia艂a艂y wolniej, ale c贸偶, pracujemy z tym, co mamy, nie zastanawiamy si臋, generujemy tych test贸w najwi臋cej jak si臋 da, tak, 偶eby d膮偶y膰 do tego, 偶eby pokry膰, mie膰 stuprocentowe pokrycie kodu testami, i to te偶 zale偶y jak bardzo ta cz臋艣膰 kodu legacy jest wa偶na, jak to jest jaka艣 bramka p艂atno艣ci, jak wywalimy to funkcja zacznie traci膰 miliony z ka偶d膮 godzin膮 to lepiej, 偶eby te testy by艂y jak najg臋stsze, natomiast jak to jest jaka艣 prosta funkcjonalno艣膰, to mo偶emy przymru偶y膰 oko i uzna膰, 偶e czujemy si臋 pewnie z mniejszym pokryciem, natomiast w tych takich bardziej krytycznych rzeczach no to stuprocentowe pokrycie to jest jaki艣 tam pierwszy krok, kolejnym krokiem mo偶e by膰 puszczanie jakiej艣 maszynki do generowania test贸w mutacyjnych, w du偶ym skr贸cie to polega na tym, 偶e ten kod, kt贸ry testujemy zostaje poddany mutacjom, czyli gdy w kodzie na przyk艂ad wyst臋puje jaka艣 liczba 50, to to narz臋dzie zmienia, generuje nowe wersje tego kodu z minus 50, zerem, z miliardem, z minus miliardem i r贸偶nymi takimi rzeczami, z nullem, stringiem i tak dalej i w r贸偶nych takich miejscach kodu na przyk艂ad dodaj臋 if’y, usuwa if’y, generuje jakie艣 warunki brzegowe w p臋tlach for tak, 偶eby ten kod zmutowa艂, by艂 inny no i odpala testy na tym i teraz jak twoje testy nadal przechodz膮 na tym z艂ym kodzie, to mutant 偶yje, jak testy si臋 wywalaj膮, to mutant ginie i twoim zadaniem jest teraz zabi膰 wszystkie mutanty, jak to zrobisz to masz du偶o wi臋ksz膮 pewno艣膰, 偶e masz pokrycie nie tylko tam linijek kodu, nie tylko jakich艣 tam instrukcji, ale rzeczywi艣cie, 偶e tw贸j kod sprawdza takie wa偶ne, istotne rzeczy, kt贸re mog膮 si臋 wywali膰 w tym kodzie w trakcie, kiedy ty b臋dziesz ju偶 na nim p贸藕niej pracowa艂, no i to jest ten pierwszy krok, robimy smoke testy, generujemy ich bardzo du偶o, nie wiemy nadal co ten kod robi, ale ju偶 wiemy, 偶e jak testy b臋d膮 przechodzi膰 to zachowanie kodu si臋 nie zmieni. No i teraz mo偶emy zakasa膰 r臋kawy i zaj膮膰 si臋 t膮 kreatywn膮 cz臋艣ci膮.聽
W ko艅cu zabieramy si臋 za robot臋, przecie偶 szef nie p艂aci za metod臋 pr贸b i b艂臋d贸w.聽
No tak, ale metoda pr贸b i b艂臋d贸w to jeszcze jest, jeszcze przed nami, bo teraz jak ju偶 mamy te testy, testy nas chroni膮.聽
Mo偶na ju偶 bezpieczniej wej艣膰 w kod i mo偶na faktycznie zacz膮膰 si臋 z nim bawi膰, bo je偶eli zepsujemy co艣, zmienimy co艣, czego nie powinni艣my tyka膰, to nasze testy to wy艂api膮.聽
Dok艂adnie.聽
Troch臋 bezpieczniejsze takie podej艣cie do tematu.聽
Tak no i teraz w zale偶no艣ci od tego, nad czym pracujemy to mo偶emy si臋 bawi膰, mo偶emy zrobi膰 tak zwany research and development, czyli robi膰 jakie艣 spike’i, kt贸re nam sprawdz膮, czy t膮 funkcjonalno艣膰, kt贸r膮 chcemy dostarczy膰, powinni艣my zrobi膰 ruszaj膮c t膮 cz臋艣膰 kodu, czy tamt膮, czy w taki spos贸b, czy w inny spos贸b i tutaj przychodzi taka inna technika zwana mikado method, czyli po polsku gra w bierki. Polega to na tym, 偶e zaczynasz, wchodzisz w ten kod jak czo艂g i pr贸bujesz dostarczy膰 t臋 funkcjonalno艣膰 po prostu, to, co ci przyjdzie do g艂owy robisz, modyfikujesz, zmieniasz i tak dalej, no i napotykasz r贸偶ne rzeczy, na przyk艂ad b艂膮d kompilacji, napotykasz jakie艣 zale偶no艣ci, czego艣 brakuje, czego艣 nie brakuje i zapisujesz sobie te rzeczy na kartce jako takie kroki cofasz te zmiany i pr贸bujesz uwzgl臋dni膰 te rzeczy, kt贸re masz zapisane na kartce, idziesz sobie takim ci膮giem i buduje ci si臋 taki graf zale偶no艣ci, rzeczy, kt贸re musisz zmieni膰 w kodzie, czyli zrobi膰 jaki艣 refactoring, 偶eby m贸c dopiero dostarczy膰 t臋 funkcjonalno艣膰. No i to jest to jakie艣 narz臋dzie pracy z tym kodem, jak to s膮 proste rzeczy, kt贸re musimy zmodyfikowa膰, mo偶na p贸j艣膰 na 偶ywio艂, jak to s膮 bardzo skomplikowane rzeczy to jednak warto mie膰 jaki艣 system pracy z takim kodem no i ta mikado method, czyli ta gra w bierki, czyli wyci膮gasz jedn膮 bierk臋 i patrzysz czy si臋 rozsypuj膮 rzeczy, jak si臋 rozsypi膮, to nie, cofasz i pr贸bujesz jeszcze raz.聽
Szkoda, 偶e w bierki nie by艂o takiej opcji, jakby si臋 rozwali艂o to cofam i jeszcze jeden ruch wykonuj臋.聽
Albo na przyk艂ad robisz pair programming no i jak twoja bierka rozwali wszystko to druga osoba ma sw贸j ruch i pr贸buje inn膮 gierk臋 wyci膮gn膮膰 i ca艂y czas zapisujecie te wszystkie rzeczy, kt贸re si臋 dziej膮 na kartce no i p贸藕niej robi si臋 taka rzeczywi艣cie prosta droga do celu, to jest takie, idziesz kawa艂ek, cofasz si臋, idziesz kawa艂ek, cofasz si臋, idziesz kawa艂ek, cofasz si臋 i w ko艅cu dochodzisz do takiego ci膮gu, szeregu krok贸w, kt贸re mo偶esz zrobi膰, 偶eby rzeczywi艣cie dostarczy膰 t臋 funkcjonalno艣膰. A no i zapomnia艂em o najwa偶niejszej rzeczy, no mamy te smoke testy, ale jak dostarczamy now膮 funkcjonalno艣膰 to trzeba jeszcze testy, kt贸re sprawdz膮 t膮 funkcjonalno艣膰 dostarczy膰 no i dobrze to zrobi膰 test-driven development, czyli najpierw napisa膰 testy, tak, 偶eby one wymusi艂y t臋 implementacj臋, i to te偶 nam tak pozwala jasno sprecyzowa膰, co b臋dziemy robi膰, tak偶e p贸藕niej, je艣li ju偶 dostarczymy t臋 funkcjonalno艣膰, to mamy jasne potwierdzenie, 偶e te testy, kt贸re by艂y na czerwono nagle zaczynaj膮 przechodzi膰 no i na koniec dostajemy w艂a艣nie ca艂膮 t膮 seri臋 test贸w, tych smoke test贸w, kt贸re nam broni艂y star膮 funkcjonalno艣膰 oraz nowe testy, kt贸re broni膮 tej nowej funkcjonalno艣ci i tu mo偶e pojawi膰 si臋 pewien inny problem, 偶e to nowa funkcjonalno艣膰 mo偶e sta膰 w sprzeczno艣ci z poprzednim zachowaniem programu, czyli cz臋艣膰 test贸w, tych smoke test贸w, kt贸re broni艂y starego zachowania zaczn膮 nam failowa膰, co wtedy?聽
Wtedy pytanie, jak bardzo stoj膮 w sprzeczno艣ci do siebie te dwa testy, wydaje mi si臋, 偶e ja zacz膮艂bym od notyfikacji starych test贸w, w sensie no, je偶eli stare zacz臋艂y failowa膰 to chyba dobrze, bo zmienili艣my funkcjonalno艣膰, kt贸rej mia艂y broni膰.聽
Mo偶e dobrze, mo偶e nie, to jest, je艣li my mo偶emy podj膮膰 t臋 decyzj臋 to spokojnie mo偶emy tak zrobi膰, jak powiedzia艂e艣, natomiast s膮 takie problemy, jak dostali艣my projekt od jakiej艣 w og贸le innej firmy i tak dalej, albo pracujemy w jakiej艣 domenie, o kt贸rej nie mamy zielonego poj臋cia.聽
Dobra, mo偶e by膰 faktycznie problematyczne, bo jeszcze nie wiadomo, kto korzysta z naszych efekt贸w i kto korzysta z tej funkcjonalno艣ci, mog艂o by膰 tak, 偶e okazuje si臋, 偶e oni wcale si臋 nie zgodzili na zmian臋 funkcjonalno艣ci i dalej potrzebuj膮, 偶eby dzia艂a艂o po staremu.聽
Tak, wiesz, to mo偶e by膰 taki problem, o kt贸rym kiedy艣 czyta艂em, 偶e kto艣 usprawni艂 dzia艂anie programu, 偶eby nie zu偶ywa艂 tyle procesora i jaki艣 u偶ytkownik zg艂osi艂 buga, bo mia艂 jaki艣 skrypt, kt贸ry wykrywa艂 wi臋ksz膮 temperatur臋 procesora, kt贸ry co艣 mu uruchamia艂 i zale偶a艂 od tej jakiej艣 z funkcjonalno艣ci, kt贸ra by艂a zupe艂nie niepotrzebna temu programowi, wi臋c nie zawsze mo偶na zak艂ada膰, 偶e u偶ytkownicy b臋d膮 zadowoleni ze zmian, kiedy naprawisz im jaki艣 b艂膮d, bo mo偶e ich oprogramowanie, kt贸re zale偶y od tego oprogramowania, zale偶y od tego b艂臋du albo na przyk艂ad to, co my uznajemy za b艂膮d si臋 oka偶e jakie艣 nieprawid艂owe, no i dobry przyk艂ad, nie wiem, robimy program do ksi臋gowo艣ci, generujemy jakie艣 faktury i trzeba naliczy膰 jakie艣 w艂a艣ciwe stawki VAT dla odpowiednich produkt贸w i dla odpowiednich rodzaj贸w dzia艂alno艣ci, to mo偶na si臋 pomyli膰, po to zatrudniamy ksi臋gowych, 偶eby oni wiedzieli takie rzeczy, 偶eby panowali nad tym, co si臋 zmienia w prawie, wi臋c warto wtedy p贸j艣膰 z list膮 takich test贸w, kt贸re przechodz膮, kt贸re si臋 wywalaj膮 i p贸j艣膰 do takiego product ownera, w tym przypadku ksi臋gowego i spyta膰 czy tutaj ma by膰 8% w takim przypadku, czy tutaj ma by膰 23, no i ksi臋gowy m贸wi “No tu tak, tu tak, tu to w sumie oboj臋tne, a tego nie powinno by膰, a to w og贸le nie wiedzia艂em, 偶e ten program to robi, ciekawostka”. I to ci ju偶 m贸wi, kt贸re testy mo偶esz totalnie wywali膰, kt贸re mo偶esz zast膮pi膰 tymi nowymi, a kt贸re na pewno musz膮 zosta膰. No i jak ju偶 uda nam si臋 dostarczy膰 t臋 funkcjonalno艣膰, wszystkie testy przechodz膮, jeste艣my na zielono, to mo偶emy przej艣膰 do standardowego kroku: test-driven development, refactoring, czyli staramy si臋 upi臋kszy膰 ten kod tak, 偶eby osoba, kt贸ra odziedziczy go po nas troch臋 mniej na niego kl臋艂a, 偶eby mia艂a troch臋 艂atwiej.聽
Albo my z przysz艂o艣ci.聽
Tak, dostarcza膰 nowe funkcjonalno艣ci i wa偶na cz臋艣膰 tego refactoringu w legacy kodzie to jest refactoring tych test贸w, kt贸re by艂y nam potrzebne, 偶eby zacz膮膰 prac臋. No bo te smoke testy, to s膮 idealnie takie testy do wyrzucenia, bo one rzeczywi艣cie broni膮 nam tego kodu, ale nic si臋 z tego nie dowiemy, dowiemy si臋, 偶e jak takie dane b臋d膮, to takie dane wyj艣ciowe si臋 zdarz膮, takie jakie艣 eventy w naszej aplikacji polec膮 i r贸偶ne takie rzeczy, no i warto popracowa膰 troch臋 nad tymi testami i spr贸bowa膰 wyci膮gn膮膰 jakie艣 sensowniejsze testy, kt贸re s膮 艂adnie opisane, zrobi膰 jakie艣 unit testy, jakie艣 testy integracyjne, jakie艣 testy end-t-end, kt贸re b臋d膮 bardziej opisowe, bo testy, kt贸re tylko nam broni膮 jakiej艣 aplikacji przed dzia艂aniem, to jest p贸艂 sukcesu, dobrze by by艂o, jakby te testy po odpaleniu si臋, raz przesz艂y, a dwa, 偶eby te napisy, kt贸re s膮 zielone, to 偶eby by艂y zgodne z rzeczywisto艣ci膮, bo my pracuj膮c nad tym projektem, tym legacy kodem, poznajemy to, co ten kod rzeczywi艣cie robi w trakcie pracy nad nim, no to warto t臋 wiedz臋 zapisa膰 w jakim艣 sensownym miejscu, wi臋c albo w dokumentacji, kt贸ra cz臋sto si臋 przedawnia, albo lepiej w 偶ywej dokumentacji, czyli w tej ca艂ej, w tym ca艂ym szeregu test贸w, kt贸ry mamy i kt贸ry ju偶 wiemy, 偶e je艣li opisy si臋 b臋d膮 zgadza膰, testy b臋d膮 przechodzi膰, to ta dokumentacja b臋dzie opisywa膰 rzeczywisto艣膰.聽
W艂a艣nie tutaj poruszy艂e艣 super kwesti臋, mianowicie dokumentacja, tak jak m贸wisz, bardzo cz臋sto dokumentacja si臋 przedawnia, bardzo cz臋sto jest niesp贸jna z tym, co faktycznie si臋 dzieje w naszej aplikacji albo jeszcze gorzej mo偶e by膰 tak, 偶e w og贸le dokumentacji nie ma.聽
Czy to jest gorzej?聽
W艂a艣nie si臋 zastanawiam.聽
W legacy kodzie cz臋sto w艂a艣nie niekoniecznie jest gorzej, czyli w sumie w ka偶dym kodzie niekoniecznie jest gorzej, ja osobi艣cie mam zdanie takie, 偶e jak dokumentacja istnieje to dobrze by by艂o, 偶eby ta dokumentacja by艂a jednak mocno zintegrowana z testami, bo wtedy mamy potwierdzenie, 偶e ta dokumentacja jest zgodna z rzeczywisto艣ci膮 bo je艣li nie mamy takiej kultury pracy w zespole, 偶e jaka艣 cz臋艣膰 naszego czasu jest po艣wi臋cona na pisanie tej dokumentacji i rzeczywi艣cie wszyscy o to dbaj膮, no to wtedy bardzo szybko ta dokumentacja si臋 przedawnia i mo偶na spotka膰 te偶 na przyk艂ad komentarze w kodzie: Napraw mnie w czwartek. Czwartek by艂 10 lat temu.聽
No tak, niestety zdarza si臋 tak, 偶e w kodzie pojawia si臋 w艂a艣nie jakie艣 to-do, kt贸re jest ju偶 przestarza艂e albo w og贸le nie ma prawa bytu. Niestety masz tutaj racj臋.聽
Komentarz: pod 偶adnym pozorem nie deployowa膰 na produkcj臋.聽
Takiego jeszcze nie widzia艂em, ale zdarzaj膮 si臋 inne r贸偶ne takie 艣mieszki, natomiast zastanawia艂em si臋 nad samymi testami, o kt贸rych tutaj wspomnia艂e艣, 偶e one te偶 powinny odzwierciedla膰 jak najbardziej to, co si臋 dzieje w kodzie i te opisy, kt贸re s膮 przy testach te偶 powinny by膰 aktualne. Pytanie, jak cz臋sto si臋 zdarza co艣 takiego, 偶e trafiasz na testy, kt贸re mo偶e i przechodz膮, mo偶e faktycznie broni膮 jakiej艣 funkcjonalno艣ci, ale s膮 ju偶 niezgodne z opisem, bo kto艣 na przyk艂ad zmieni艂 kod, testy przesta艂y przechodzi膰, poszed艂, poprawi艂 testy, ale kompletnie nie zmieni艂 opisu.
No to du偶o zale偶y od kultury pracy w danej firmie, ale te偶 w danym j臋zyku programowania, to zauwa偶y艂em, czy w danej technologii, bo na przyk艂ad jak pracujesz w Ruby, konkretnie powiedzmy w Ruby on Rails albo w jakich艣 tam zbli偶onych technologiach do tego, no to tam kultura pisania test贸w jest bardzo, bardzo wysoka i ma du偶e tradycje i tam jak kilka lat temu pracowa艂em w Ruby on Rails, to z kim nie gada艂e艣 na konferencji, to ludziom do g艂owy by nie przysz艂o, 偶e mo偶na pisa膰 kod bez test贸w. I to by艂o takie naturalne, piszesz kod, piszesz testy, tylko jedyne pytanie by艂o, czy robisz test-driven development, czy testy piszesz po fakcie. Z testami, opisami tych test贸w jest podobnie jak z nazwami funkcji, i wiemy, 偶e funkcji klas i wszystkich innych rzeczy no i wiemy, 偶e to jest jeden z dw贸ch najtrudniejszych problem贸w w informatyce, czyli nazewnictwo, dwa: inwalidacja cashu i problemy off-by-one.聽
Zastanawiam si臋 ile ostatnio czasu sp臋dzi艂em nad wymy艣laniem poprawnych nazw zmiennych, zdecydowanie za d艂ugo mi zesz艂o.聽
Ja nad tym sp臋dzam du偶o czasu, jedna z najcz臋stszych rzeczy, kt贸re robi臋 dla kursant贸w w trakcie jakiego艣 tam code review to jest zwracanie uwagi na nazwy, bo dobre nazewnictwo mo偶e oszcz臋dzi膰 du偶o czasu nie tylko tobie, ale wszystkim innym, kt贸rzy czytaj膮 kod, bo kod si臋 pisze szybko, a czyta si臋 go wielokrotnie, znaczy pisze si臋 go cz臋sto raz, a czyta si臋 go wielokrotnie i wi臋cej czasu si臋 sp臋dza nad zrozumieniem go i to nie tylko ja go zrozumiem, nawet tam po miesi膮cu tylko ka偶dy, kto si臋 zetknie z tym kodem musi sp臋dzi膰 jaki艣 czas na na rozumieniu tego kodu, jak dbasz o dobre nazewnictwo, raz, 偶e piszesz testy, kt贸re s膮 zgodne z rzeczywisto艣ci膮, to fajnie, bo masz unit testy, kt贸re ci opisuj膮 co ta dana funkcja robi, masz dobrze nazwan膮 funkcj臋, nazwa si臋 zgadza z unit testami, to nie musisz nawet zagl膮da膰 do 艣rodka, ale jak funkcja nazywa si臋 w jaki艣 spos贸b, na przyk艂ad “do something” albo powiedzmy fetch list of users i zwraca bulla to si臋 zastanawiasz, w jaki spos贸b ona 艣ci膮ga tych u偶ytkownik贸w i gdzie oni s膮 zapisywani, co jeszcze si臋 dzieje, to od razu ci nasuwa na my艣l, 偶e o, w 艣rodku pewnie b臋d膮 jakie艣 mocne efekty uboczne, funkcja zrobi jakie艣 dziwne rzeczy, a gdzie艣 tam si臋 mo偶e zapisz膮 u偶ytkownicy, patrzysz do 艣rodka, ona wcale tego nie robi tylko sprawdza, czy na przyk艂ad mo偶na sfetchowa膰 tych u偶ytkownik贸w.聽
Rozmawiamy tutaj ju偶 od jakiego艣 czasu o legacy kodzie i tak powiem, jakbym nigdy wcze艣niej nie by艂 programist膮, raczej by艣 mnie nie zach臋ci艂 tym opisem i nie chcia艂bym raczej wchodzi膰 w legacy code, dlatego jakby艣 z twojej perspektywy, dlaczego twoim zdaniem warto pracowa膰 z legacy kodem?
No tak, pr臋dzej czy p贸藕niej w naszych karierach, kiedy艣 b臋dziemy musieli zmierzy膰 si臋 ze smokami i nie b臋dzie test贸w, nie b臋dzie niczego, no dochodzimy do tego, 偶e praca z legacy kodem i umiej臋tno艣膰 pracy z legacy kodem to jest taka bardzo wa偶na umiej臋tno艣膰, bo kiedy艣 si臋 z tym zetkniemy w mniejszym lub wi臋kszym stopniu i to, jak bardzo czujemy si臋 z tym komfortowo, tym 艂atwiej si臋 b臋dzie nam z tym pracowa膰. No bo tak, czasem si臋 zdarz膮 projekty, 偶e b臋dziemy mogli sami od zera co艣 zrobi膰, b臋dzie super fajnie, super kreatywnie do czasu, a偶 nie dostarczymy pewnej du偶ej ilo艣ci funkcjonalno艣ci i trzeba b臋dzie dodawa膰 kolejnych i nagle nasz pi臋kny kod stanie si臋 legacy. Wi臋c to nie jest mo偶e co艣 takiego, co bardzo przyci膮ga, co jest takie super fajne, mo偶e nie dla wszystkich, nie ka偶demu mo偶e si臋 to podoba膰, natomiast je艣li chce si臋 by膰 profesjonalnym programist膮, profesjonaln膮 programistk膮, to trzeba umie膰 pracowa膰 z takim kodem i warto jest nauczy膰 si臋 znajdowa膰 przyjemno艣膰 w pracy z takim kodem. No i mo偶na potraktowa膰 te wszystkie etapy, ten etap ubezpieczania tego kodu, znajdowania r贸偶nych, budowania tych test贸w to mo偶e by膰 co艣 fajnego, bo to jest teoretycznie jaka艣 mechaniczna rzecz, kt贸r膮 robimy, zw艂aszcza je艣li to s膮, robimy smoke testy jednostkowe dla jakiej艣 tam funkcji i tak dalej, kt贸r膮 wiemy, jak zrobi膰, ale na przyk艂ad programuje w React i jeste艣my w wersji 16, kod jest napisany w komponentach klasowych, trzeba je przerobi膰 na funkcyjne, to nie zawsze jest proste i teraz przetestowanie takich komponent贸w na frontendzie r贸wnie偶 nie zawsze jest proste. Niekt贸re mo偶na przetestowa膰 jednostkowo, niekt贸re trzeba zrobi膰 w otoczeniu jakich艣 komponent贸w, co艣 tam zmokowa膰, a niekt贸re trzeba odpali膰 na jakim艣 Cypress’ie no i przetestowa膰 jako end-to-end, wi臋c tu jest du偶o wyzwa艅, kt贸re s膮 ciekawe, wi臋c znalezienie takiego sposobu, 偶eby dobrze to testowa膰, jak najmniej czasu na tym straci膰, czyli zrobi膰, a si臋 nie narobi膰, to jest w艂a艣nie fajna rzecz w tym legacy kodzie, bo nie musimy, to jest takie odst臋pstwo od regu艂y, 偶e musimy pisa膰 艂adne testy, nie, smoke testy jak najta艅sze, jak najprostsze w React, to wi臋kszo艣膰 os贸b teraz korzysta z Jest, to jest taki framework do testowania w Javascripcie i Typescripcie, no i Jest ma snapshoty, wi臋c nie musimy sobie sami generowa膰 tych, na przyk艂ad to, co wygeneruje nasza funkcja, nie musimy tego stringa przekleja膰 do testu i si臋 tym bawi膰 tylko robimy snapshota na przyk艂ad tego, co wyrenderuje nasz komponent, nagrywamy go, commitujemy go i testy ju偶 za drugim razem, za pierwszym razem generuj膮 snapshota, a za drugim razem ju偶 przechodz膮 pod warunkiem, 偶e kod si臋 nie zmieni, to jest ta cz臋艣膰, kt贸ra mo偶e by膰 troch臋 mechaniczna, troch臋 kreatywna, bo musimy znale藕膰 spos贸b na otestowanie tego, no i p贸藕niej zaczyna si臋 ta naprawd臋 ekscytuj膮ca i fajna cz臋艣膰, mamy przygod臋 i musimy zmierzy膰 si臋 ze smokiem i to jest taki archetyp historii, 偶e to jest droga bohatera, musimy przej艣膰 przez lochy, znale藕膰 smoka, pokona膰 go i wtedy dostajemy nagrod臋, ale mamy taki plus, 偶e ju偶 w tym momencie zbudowali艣my sobie zbroj臋, kt贸ra nas chroni i mamy odpowiedni膮 bro艅 i teraz musimy znale藕膰 spos贸b na zg艂adzenie tego smoka albo ujarzmienie go, czyli znale藕膰 spos贸b, 偶eby tak zrefactorowa膰 ten kod, 偶eby wprowadzenie tych zmian, kt贸re mamy zrobi膰 by艂o jak najprostsze.聽
Jeszcze trzeci膮 opcj臋, przepraszam, 偶e przerywam, ale mo偶na by si臋 tak zakra艣膰 pod smoka, 偶eby mu wykra艣膰 skarb, a go nie rusza膰.聽
Tak, to prawda.聽
Tak my艣l臋, 偶e to jest takie dobre, bo czasami jednak ja, jak pracuj膮c z legacy kodem zdarza艂o mi si臋 tak, 偶e jednak wola艂em unika膰 wszystkich pu艂apek, wszystkiego, doj艣膰 tylko do celu, wzi膮膰 to, co mia艂em wzi膮膰 i wi臋cej tutaj nie macza膰 palc贸w.聽
Tak, to jest dobre, je艣li mo偶emy tak zrobi膰, to omijamy ten problem, bo nie pracujemy z tym legacy kodem, ale jest to jedna z technik pracy w og贸le z jakim艣 tam starym kodem, czyli zamiatanie pod dywan i to nie jest z艂a technika, bo czasem po prostu musimy co艣 zrobi膰, nie mamy czasu, 偶eby zag艂臋bi膰 si臋 w jak膮艣 tam funkcj臋, kt贸ra ma 5 ekran贸w d艂ugo艣ci, kt贸ra co艣 tam robi, my musimy doda膰 jak膮艣 tam jedn膮 ma艂膮 rzecz, to jednym z takich sensownych rozwi膮za艅 jest zapakowanie ca艂ej reszty tego, czego nie musimy dotyka膰 w worek, czyli inaczej m贸wi膮c ekstract method, taki refactoring, pakujemy to w worek, zamiatamy pod dywan i zajmiemy si臋 tym kiedy indziej i og贸lnie taka strategia zajmowania si臋 rzeczami kiedy indziej w przysz艂o艣ci jest najlepsz膮 strategi膮 pracy z legacy kodem pod warunkiem, 偶e mamy t臋 dyscyplin臋, 偶e rzeczywi艣cie b臋dziemy kiedy艣 po sobie sprz膮ta膰. Je艣li rzeczywi艣cie trzymamy si臋 tej zasady skauta, 偶e zostajemy, nasz kod, znaczy inaczej, zostawiamy nasz kod w lepszej postaci ni偶 go zastali艣my, to takim optymalnym rozwi膮zaniem jest zmienianie rzeczy i refakturyzacja rzeczy najp贸藕niej jak tylko si臋 da, bo im wcze艣niej to robimy, tym mamy mniej informacji o kodzie, mamy mniej do艣wiadczenia z tym kodem i mo偶emy si臋 zap臋dzi膰 troch臋 w kozi r贸g, bo zrobimy jaki艣 refactoring a p贸藕niej si臋 oka偶e, 偶e jednak poszli艣my w troch臋 z艂膮 stron臋 i musimy cofa膰 te zmiany i zmienia膰 kod dwa razy.聽
Gorzej jest w sytuacji, kiedy nie trzymamy si臋 dyscypliny, kiedy nad jednym projektem pracuje kilka os贸b jednocze艣nie i kilka os贸b zrobi艂o to samo i za ka偶dym razem, je偶eli b臋dziemy dok艂ada膰 po prostu t膮 cegie艂k臋, gdzie opakowujemy problem w worek, to nagle tych work贸w nam si臋 tyle narobi, 偶e trzeba worki wpakowa膰 w kolejny worek albo w ko艅cu ju偶 zakasa膰 r臋kawy i usi膮艣膰 do problemu i go rozwi膮za膰 raz a porz膮dnie.聽
Tak, ale to jest w艂a艣nie ta kwestia tej dyscypliny, 偶e siadamy do kodu i zanim dostarczymy t膮 funkcjonalno艣膰 to zmieniamy go w taki spos贸b, 偶e dostarczenie tej funkcjonalno艣ci b臋dzie proste, czyli robimy ten refactoring wcze艣niej i te偶 staramy si臋 troszk臋 bardziej upi臋kszy膰 kod, wi臋c jak znajdziemy co艣, co si臋 powtarza, co艣, co by艂o zrobione na przyk艂ad podw贸jnie niepotrzebnie, albo nie wiem, kto艣 bardzo 藕le nazwa艂 jak膮艣 funkcj臋, to naprawmy to, bo to jest te偶 opinia, kt贸r膮 si臋 dowiedzia艂em, 偶e jest kontrowersyjna, 偶e ja uwa偶am, 偶e to nie jest, 偶e nasz pracodawca powinien si臋 totalnie nie interesowa膰 tym, czy my refactorujemy czy nie, czy my piszemy testy, czy nie, bo to jest nasz obowi膮zek, 偶eby艣my to robili.聽
Poruszali艣my tutaj kilka r贸偶nych definicji legacy kodu, a co my艣lisz o takim stwierdzeniu, 偶e ka偶dy stary kod to jest legacy code?聽
Tutaj musz臋 si臋 bardzo nie zgodzi膰, z racji tego, 偶e takim starym kodem zajmuj臋 si臋 te偶 poniek膮d zawodowo i hobbystycznie. Ot贸偶 ja sobie taki komputer Commodore 64, nie wiem, czy s艂uchacze widzowie znaj膮 taki komputer, jak nie, to zajrzyjcie na sw贸j strych, jest du偶a szansa, 偶e taki tam le偶y i to jest komputer, kt贸ry w zesz艂ym roku obchodzi艂 40-letnie urodziny, jest to komputer o niesamowitych mo偶liwo艣ciach, bo je艣li spojrze膰 na to, co on potrafi to tak: ma 64 kb RAM-u, a偶 8 bitmap, kt贸re mog膮 si臋 jednocze艣nie porusza膰 na ekranie, one s膮 wspomagane sprz臋towo, 16 kolor贸w i 1 MHz ma procesor, czyli jest jako艣 1000 razy wolniejszy ni偶 pierwszy iPhone, ale jest bardzo ciekawy fakt, kilka bardzo ciekawych fakt贸w o Commodore 64, po pierwsze: jest w ksi臋dze Rekord贸w Guinnessa jako najlepiej sprzedaj膮cy si臋 komputer na 艣wiecie, model komputera na 艣wiecie, chyba iPad go przegoni艂, je艣li iPada uznajemy za komputer i wszelkie inne pecety, je艣li my艣limy o wszystkich mo偶liwych konfiguracjach pecet贸w, to oczywi艣cie jest ich wi臋cej, ale model komputera, kt贸ry jest ustalony i sprzedawany to Commodore 64 nadal jest na topie, mia艂 rozdzielczo艣膰 320 na 200, czyli to jest mniej ni偶 jedna ikona na i’Phonie nowym, piksele by艂y grube i fajne i jest bardzo ciekawy fakt dotycz膮cy tego komputera, 偶e nie wiem, czy spotka艂e艣 si臋 z tak膮 rzecz膮, 偶e od czasu do czasu musisz upgrade’owa膰 sw贸j system operacyjny albo upgrade’owa膰, kupi膰 sobie nowy telefon, bo aplikacja dzia艂aj膮 coraz wolniej. Standardowo, przy ka偶dej aktualizacji. Na przyk艂ad taki Photoshop z ka偶d膮 tam aktualizacj膮 uruchamia艂 si臋 coraz wolniej no i jakie艣 takie dziwne rzeczy si臋 dziej膮 i je艣li chodzi o Commodore 64 to jedna z ciekawych rzeczy jest taka, 偶e ca艂y czas powstaj膮 na niego nowe programy, tak 艣rednio oko艂o 50 nowych gier, takich porz膮dnych gier z wy偶szej p贸艂ki powstaje na Commodore 64 co roku, jakie艣 40 dem, czyli takich teledysk贸w powstaje narobionych przez zapale艅c贸w w ci膮gu roku, jakby liczy膰 wszelkie grafiki, muzyczki, inne takie rzeczy, no to liczy si臋 to w tysi膮cach rocznie, tyle rzeczy powstaje na ten komputer, mimo 偶e nie jest produkowany od 94 roku i te wszystkie aplikacje s膮 coraz 艂adniejsze i coraz szybsze, jak to si臋 dzieje, specyfikacja tego sprz臋tu si臋 nie zmienia, ale ludzie odkrywaj膮 coraz to nowe mo偶liwo艣ci, coraz to nowe b艂臋dy sprz臋towe, kt贸re mo偶na wykorzysta膰 w taki spos贸b, 偶e te b艂臋dy staj膮 si臋 feature’ami. To s膮 te b艂臋dy, o kt贸rych wspomina艂e艣 wcze艣niej, nie wolno ich usuwa膰, bo przeszkodz膮 nam. Tak, to, co jest fajne, 偶e teraz mamy bardzo du偶o mo偶liwo艣ci, 偶eby programowa膰 ten komputer, kiedy ja zaczyna艂em to by艂em dzieckiem i pierwszy program, kt贸ry napisa艂em, to du偶o os贸b, kt贸re mia艂o Commodore 64 rozpozna, to by艂o 10 Print Commodore 64 20 go to 10. To by艂 program napisany w Basic, kt贸ry jest dost臋pny na Commodore, zaraz po w艂膮czeniu tego komputera mo偶esz zacz膮膰 to pisa膰, uruchomi膰 i dzia艂a. No i jak zobaczy艂em, 偶e tekst si臋 drukuje ca艂y czas w niesko艅czonej p臋tli to si臋 wci膮gn膮艂em i to p贸藕niej przysz艂y jakie艣 tam inne programy przepisywane z czasopism, ale nigdy nie mia艂em mo偶liwo艣ci programowania w assemblerze, bo nie by艂o 偶adnych ksi膮偶ek w moim mie艣cie dost臋pnych, bo Commodore ju偶 przestawa艂 by膰 produkowany, sprzedawany w bibliotece, te偶 偶adnych ksi膮偶ek nie mia艂em, Internetu nie mia艂em wtedy jeszcze, wi臋c sk膮d tu czerpa膰 wiedz臋, moi znajomi nie programowali, zw艂aszcza nie na Commodore 64, co najwy偶ej grali, nie mia艂em dost臋pu do demo sceny, wiedzia艂em, 偶e jakie艣 fajne produkcj s膮 tworzone, wiedzia艂em te偶, 偶e w assemblerze, ale jak si臋 tego assemblera nauczy膰. Mog艂em sobie telegazet臋 w艂膮czy膰 co najwy偶ej, pozdro dla ludzi, kt贸rzy wiedz膮 co to jest telegazeta teraz i przeczyta膰 jaki艣 artyku艂 o programowaniu i to by艂o wszystko. I dopiero par臋 lat temu, w 2014 roku stwierdzi艂em, 偶e mo偶e spr贸buj臋 i co si臋 okaza艂o, 偶e mamy bardzo du偶o fajnych narz臋dzi, kt贸re umo偶liwiaj膮 programowanie na Commodore 64, bo mamy kompilatory assemblera do kodu maszynowego, mamy emulatory, czyli takie programy, kt贸re udaj膮, 偶e s膮 tymi komputerami, dzia艂aj膮ce na wszystkich platformach i co wa偶ne to emulatory umo偶liwiaj膮 nie do艣膰, 偶e symulowanie tego dzia艂ania prawid艂owego komputera, ale te偶 tych wszystkich b艂臋d贸w, kt贸re tam istniej膮, wi臋c rzeczywi艣cie mo偶na na tym programowa膰 nie maj膮c tej maszyny i co si臋 okaza艂o, 偶e programowanie w assemblerze, kt贸ry jest prostym assemblerem na prostym o艣miobitowym komputerze, mam ma艂o instrukcji, jest przyjemne i jest bardzo dobr膮 odskoczni膮 od takiej pi臋knej architektury oprogramowania, kt贸r膮 robimy na co dzie艅, programowania obiektowego, programowania funkcyjnego, a tutaj nie, mamy programowa膰 niskopoziomowo, mamy co艣 pokaza膰 na ekranie, nie mamy nawet mno偶enia, musimy jaki艣 algorytm zrobi膰 z dodawania, odejmowania, przesuwania bit贸w, 偶eby to zadzia艂a艂o, musimy robi膰 jakie艣 optymalizacje r贸偶ne dziwne i to jest z takich hobby komputerowych, to jest najlepsza odskocznia, jak膮 mia艂em od takiego normalnego programowania i stwierdzi艂em, 偶e te偶 zaczn臋 uczy膰 ludzi jak to robi膰, wi臋c kiedy mia艂em to na 艣wie偶o, bo dopiero co nauczy艂em si臋 jakiej艣 tam techniki, to zacz膮艂em nagrywa膰 takie kr贸tkie lekcje, kt贸re maj膮 5-10, mo偶e 15 minut max i ucz膮 ci臋 jednej ma艂ej rzeczy, na przyk艂ad jak wy艣wietli膰 sprite na ekranie. Sprite to jest ta ruchoma bitmapa wspomagana sprz臋towo albo jak zagra膰 sobie jak膮艣 nut臋 na Commodore, albo jak otworzy膰 ramk臋, czyli poszerzy膰 rozdzielczo艣膰 ekranu z 320 pikseli na jakie艣 tam powiedzmy 400 ile艣 i r贸偶ne takie rzeczy si臋 dowiadywa艂em, nagrywa艂em o tym lekcje, dodawa艂em do tego kod 藕r贸d艂owy i za艂o偶enie by艂o takie, 偶eby dla ludzi, kt贸rzy nie maj膮 czasu, kt贸rzy te偶 w dzieci艅stwie chcieli si臋 tego nauczy膰, teraz moj膮 rodzin臋, teraz maj膮 obowi膮zki, nie maj膮 czasu, 偶eby siedzie膰 d艂ugie godziny nad starymi ksi膮偶kami, tylko 偶eby sobie obejrzeli 5 minut i 偶eby mieli takie objawienie “Aha, to tak si臋 otwiera ramk臋, aha to tak si臋 wy艣wietla 64 sprity zamiast 8, tak si臋 robi te triki i zacz膮艂em wydawa膰 takie lekcje i co si臋 okaza艂o, 偶e s膮 ludzie, kt贸rzy s膮 tym zainteresowani, czekali tylko na to, 偶eby mie膰 takiego powiedzmy Netflixa do Commodore, 偶eby obejrze膰 sobie par臋 takich lekcji, nauczy膰 si臋 jak to programowa膰, to by艂 w艂a艣nie taki m贸j pierwszy krok w stron臋 jakiej艣 tam przedsi臋biorczo艣ci, 偶eby zrobi膰 sobie co艣 opr贸cz programowania.聽
Musz臋 przyzna膰, 偶e bardzo ciekawa rozmowa, bardzo mi si臋 podoba艂a.聽
Dzi臋kuj臋, ca艂a przyjemno艣膰 po mojej stronie.聽
Og贸lnie ten sprz臋t, przepraszam, ten temat dotycz膮cy programowania na Commodore by艂 dla mnie niezwykle interesuj膮cy, bo pami臋tam jak za dzieciaka zawsze si臋 interesowa艂em tym, jak to wszystko dzia艂a pod spodem i mieli艣my te偶 jakie艣 starsze sprz臋ty w domu, gdybym chcia艂 si臋 dowiedzie膰 czego艣 wi臋cej, mog臋 ci臋 jako艣 znale藕膰 gdzie艣 w Internecie?聽
Tak, na wszystkich mediach spo艂eczno艣ciowych, GitHub i tak dalej jestem jako Micha艂 T, pisze si臋 mehowte geneza jest taka, 偶e kiedy艣 pr贸bowa艂em nauczy膰 ludzi m贸wi膮cych tylko po angielsku, jak wym贸wi膰 moje imi臋, to jest najprostszy spos贸b Micha艂 T, wi臋c je艣li kto艣 chce ze mn膮 pogada膰 to najpro艣ciej tak, natomiast jak kto艣 chce si臋 nauczy膰 czego艣 o Commodore 64 to zapraszam na stron臋 64bites.com slash i nazwa tego podcastu, to tam dostaniecie ode mnie pewnie jaki艣 prezent, natomiast je艣li kto艣 chce dowiedzie膰 si臋 czego艣 wi臋cej takiego praktycznego o legacy to jaki艣 czas temu nagra艂em tak膮 prezentacj臋 o legacy kodzie w React’ie i o tym, jak w praktyce przerabia膰 w艂a艣nie stare komponenty klasowe na funkcyjne i to znajdziecie na stronie kursreacta.pl slash legacy. Tam jest ta prezentacja, wystarczy zostawi膰 sw贸j email i od razu mo偶ecie zobaczy膰 prezentacj臋 i dostaniecie ca艂y kod 藕r贸d艂owy do zabawy w legacy samodzielnie.聽
Dobrze. Jeszcze raz dzi臋kuj臋 bardzo za to, 偶e zgodzi艂e艣 si臋 nas odwiedzi膰 i opowiedzie膰 tutaj o w艂a艣nie z jednej strony o tym legacy kodzie, o swoich pasjach, o tym, jak programujesz na Commodore 64. Dzi臋kujemy.聽
Dzi臋kuj臋 za zaproszenie, by艂o mi bardzo mi艂o tutaj go艣ci膰.聽
Dzi臋kuj臋 r贸wnie偶 naszym widzom i s艂uchaczom. Mam nadziej臋, 偶e odcinek wam si臋 podoba艂, jak zwykle zach臋cam was do pozostawienia lajk贸w, subskrypcji i komentarzy i r贸wnie偶 zach臋cam was do obejrzenia link贸w, kt贸re umie艣cimy w opisie. Dzi臋kuj臋, trzymajcie si臋, cze艣膰!聽
A ja zapraszam do komentowania czy mieli艣cie Commodore, czy Atari, czy ZX Spectrum i prosz臋 si臋 nawzajem nie hejtowa膰 za bardzo.
Dzi臋ki!聽
________________________________________________________
Podcast DEVision to polski podcast IT dla programist贸w, kt贸rzy chc膮 rozwija膰 swoj膮 wiedz臋, pos艂ucha膰 o ciekawych projektach oraz zainspirowa膰 si臋 innymi. A to wszystko w przyjemnej formie rozmowy, kt贸rej mo偶esz s艂ucha膰 w tramwaju, na si艂owni, a nawet w pracy 馃槈
馃拰 Zapisz si臋 do naszego newslettera: https://bit.ly/37TTNCK
馃審 Wi臋cej o nas przeczytasz na stronie: https://bit.ly/3Pttiox
Obserwuj nas na social media: 馃殌
LinkedIn: https://bit.ly/3PxlHFQ
馃帶 Spotify: https://spoti.fi/39xU0fm
馃帶 iTunes: https://apple.co/3PsjhrQ
Je艣li Ci si臋 temat spodoba艂, subskrybuj nasz kana艂, bo dopiero si臋 rozkr臋camy z gor膮cymi tematami! 馃檪