艣roda, 30 wrze艣nia 2020

Codeforces, Codewars i inne wyzwania programistyczne



Ka偶da umiej臋tno艣膰 zanika, je艣li nie jest rozwijana. Jednym ze sposob贸w na rozwijanie umiej臋tno艣ci, jest mierzenie si臋 z coraz to trudniejszymi wyzwaniami, kt贸re po cz臋艣ci, b臋d膮 nawi膮zywa艂y do opanowanego ju偶 materia艂u, a po cz臋艣ci, b臋d膮 zmusza艂y nas do szukania nowych rozwi膮za艅. 

Szachi艣ci podczas 膰wicze艅 rozwi膮zuj膮 zadania o rosn膮cym stopniu trudno艣ci. Podobnie jest z graniem na instrumencie - je艣li kiedy艣 gra艂e艣 i odstawi艂e艣 instrument na kilka tygodni, wiesz, 偶e trudno jest wr贸ci膰 do poprzedniej formy. Gdy tylko grasz to co umiesz, nie rozwijasz si臋. Gdy nie podnosisz ci臋偶ar贸w, jeste艣 coraz gorszy w podnoszeniu ci臋偶ar贸w.

Podobnie jest z programowaniem - gdy zajmujemy si臋 tym jedynie w pracy, poziom naszego skilla maleje. Moim zdaniem, dobrym sposobem na jego podwy偶szanie jest regularne mierzenie si臋 z problemami na platformach typu Codewars, Codeforces czy Spoj. 

Dzia艂aj膮 one na podobnej zasadzie, zapraszaj膮c u偶ytkownika do zmierzenia si臋 z coraz trudniejszymi problemami. Na Codewars nie musimy zajmowa膰 si臋 inputem danych od u偶ytkownika, wystarczy, 偶e napiszemy funkcj臋 spe艂niaj膮c膮 wymagania. Inne portale, na przyk艂ad Codeforces czy Spoj, wymagaj膮 od nas pobierania danych od u偶ytkownika w spos贸b zale偶ny od wybranego j臋zyka. Codewars wymaga te偶 innego podej艣cia w kwestii rozwi膮zywania b艂臋d贸w, poniewa偶 raczej musimy tam sami wypisa膰 sobie input metod za pomoc膮 konsoli. Codeforces pokazuje, z jakimi danymi by艂 wywo艂any failuj膮cy test.

Codewars otworzy艂o mi oczy na wiele zagadnie艅 zwi膮zanych z programowaniem. Mog臋 Ci poleci膰 ten portal szczeg贸lnie ze wzgl臋du na to, 偶e po udzieleniu odpowiedzi na pytanie, masz podgl膮d do odpowiedzi innych u偶ytkownik贸w. Bardzo cz臋sto zdarza艂o mi si臋, 偶e tworzy艂em obszerne i brzydkie rozwi膮zanie problemu, a potem 艂apa艂em si臋 za g艂ow臋, bo kto艣 mocniejszy ode mnie w matematyce, upora艂 si臋 z zadaniem w jednej linijce. Znajomo艣膰 matematyki bardzo pomaga w rozwi膮zywaniu takich zada艅. 

Zadania algorytmiczne s膮 dla mnie zawsze ciekawsze od CRUD-贸w, kt贸re klepiemy w pracy, przynosz膮 czysty "fun" z programowania. Zadanka pomog艂y mi te偶 zrozumie膰 podstawy programowania funkcyjnego w JS i innych j臋zykach.

Codewars to niez艂y spos贸b na nauk臋 ficzer贸w wbudowanych w r贸偶ne j臋zyki oraz og贸lnie, nauki nowych j臋zyk贸w. Sporo czasu po艣wi臋ci艂em na uczenie si臋 w ten spos贸b Pythona. Przyk艂adowo - aby utrwali膰 sobie wiedz臋 o podstawowych opcjach, mo偶esz wzi膮膰 na przyk艂ad 10 zada艅 na najni偶szym poziomie w Codewars i wykona膰 je w ci膮gu oko艂o 25 minut do godziny. Mo偶esz te偶 rozwi膮za艅 kilka prostych zada艅 okre艣lonego rodzaju, na przyk艂ad z datami. Wa偶ne by taki trening powtarza膰 regularnie i zwi臋ksza膰 poziom zada艅. 

Rozwi膮zuj膮c zadanie najpierw w Pythonie, a nast臋pnie w JS, Javie czy C++, zaczynasz dostrzega膰 r贸偶nice mi臋dzy ich r贸偶nymi paradygmatami. Co艣 co zajmuje w Pythonie 3 linijki, w C++ mo偶e zaj膮膰 20, a w Javie mo偶e by膰 wbudowane. Rozwijaj膮 te偶 znajomo艣膰 struktur danych - list臋 bez powt贸rze艅 mo偶esz zrobi膰 przez filtrowanie duplikat贸w, albo u偶y膰 Map. 

Najlepsze s膮 dla nas te problemy, kt贸rych rozwi膮zanie wymaga dog艂臋bnego przemy艣lenia. Czasem zdarza si臋, 偶e rozwi膮zanie jest zbyt wolne ze wzgl臋du na to, 偶e wykorzysta艂e艣 ma艂o wydajne algorytmy. Innym razem trzeba dobrze zrozumie膰 prosty z pozoru problem, bo okazuje si臋, 偶e nerwowe zmienianie kodu w r贸偶nych miejscach, nic nie pomaga. 

Zadanka pomagaj膮 te偶 podczas life coddingu na rozmowach kwalifikacyjnych. 

Odpowiedzi膮 na wiele zada艅 programistycznych na portalach tego typu s膮 cz臋sto wyra偶enia regularne, temat o kt贸rym zdarza si臋 nam zapomina膰. 

Du偶膮 korzy艣ci膮 zada艅 jest prowokowanie skojarze艅. Kiedy艣 znalaz艂em zadanie, kt贸re polega艂o na z艂o偶eniu tablicy w tablic臋 wieloelementow膮 o zadanej wielko艣ci i wybranie z niej liter po skosie. Gdy dochodzimy do granicy tabeli, zmieniamy kierunek i wybieramy litery dalej.



Po kilku nieudanych pr贸bach dosta艂em ol艣nienia - to dok艂adnie algorytm odbijaj膮cej si臋 kulki, kt贸ry przerabia艂em 3 lata wcze艣niej na stronie MDN, tyle 偶e trzeba go wdro偶y膰 w tablicy, nie na canvasie. 

Czy zadania tego typu przydaj膮 si臋 w pracy? Moim zdaniem tak, poniewa偶 podwy偶szaj膮 nasz skill w niskopoziomowych zadaniach, kt贸re stanowi膮 podstaw臋 naszej pracy, jak przetwarzanie string贸w, walidowanie danych czy te偶 liczenie r贸偶nych rzeczy. Stanowi to mi艂y dodatek do pozosta艂ych element贸w rozwoju programistycznego, o kt贸rych b臋d臋 stara艂 si臋 pisa膰 tu na bie偶膮co.

Podziel si臋 w komentarzu, co uwa偶asz na temat zada艅 programistycznych i gdzie je rozwi膮zujesz.

Kamil

Brak komentarzy:

Prze艣lij komentarz