Dobrego programistę wyróżnia umiejętność zrozumienia potrzeb klienta. Wywiad z Łukaszem Tkaczem
– Możemy pisać cudowny kod, ale nie wnosić nim żadnej realnej wartości do życia innych ludzi – a wtedy to wszystko nie ma żadnego sensu – powiedział nam Łukasz Tkacz, Fullstack Developer w IngeniousIO, z którym rozmawialiśmy o ścieżce kariery oraz o tym, kim jest dobry programista.
Spis treści
Kiedy zainteresowałeś się programowaniem?
Jeśli dobrze pamiętam, to było to jeszcze w szkole podstawowej, pod jej koniec. Z dostępem do Internetu nie było wtedy tak łatwo jak teraz i źródłem informacji były różnego rodzaju czasopisma. W jednym z nich znalazłem program “The Games Factory”, który pozwalał tworzyć własne gry. Upraszczał on zajmowanie się stroną wizualną poprzez np. przeciąganie gotowych elementów na ekran, tworzenie ekranów niczym slajdów, szybkie wybieranie tła muzycznego.
Z drugiej strony oferował także sterowanie logiką np. jeśli jeden obiekt zderzył się z innym, mogła nastąpić jakaś akcja. Nie było to co prawda programowanie w sensie pisania kodu, aczkolwiek wymagało posługiwania się np. wirtualnymi licznikami w tle do obsługi pewnych zdarzeń. Zaraz po tym, zainteresowałem się C++, a później PHP.
Co wtedy było dla Ciebie największym problemem i jak sobie z nim poradziłeś?
Na etapie działania z C++ samo zrozumienie pewnych mechanizmów – konstrukcje warunkowe, pętle, tego typu sprawy są moim zdaniem proste i łatwe do przyswojenia nawet na początku. Gdy natomiast chodzi o zarządzanie pamięcią, obiektowość, nieco abstrakcyjne podejście, jest już o wiele trudniej. To wymaga praktyki i nieco samozaparcia.
Nie jestem zwolennikiem podejścia “każdy może zostać programistą”, bo zetknąłem się z ludźmi, którzy wielokrotnie próbowali i ściana abstrakcyjnego myślenia okazała się dla nich niemożliwa do przebicia. W moim przypadku to się udało, choć musiałem być uparty i znaleźć sobie cele do zrealizowania.
Czym jest to abstrakcyjne myślenie? Możesz podać przykład jak myślą nie-programiści, a jak programiści widzą dany problem, zagadnienie?
Moim zdaniem jest to takie podchodzenie do zagadnień, w którym staramy się nie tylko zrozumieć ich naturę, ale także przewidzieć możliwe problemy przy wdrożeniu, implikacje na to co już istnieje i możliwości rozbudowy w przyszłości. Widzieć nieco szerszy horyzont mając do dyspozycji jedynie skrawek. To ma oczywiście swoje granice, bo nie można działać niejako defensywnie, starać się zabezpieczać przed wszystkimi przypadkami (co i tak się nam nigdy nie uda), ale samo obranie takiego kierunku szybko procentuje.
Przykłady z życia wzięte to choćby zapis czasu czy obsługa finansów. Dla nazwijmy to laika może być to tylko kwestia typu “gdzieś tam zapisują datę/kwotę”. Pracując jako programista możemy niemal od razu zadać sobie dodatkowe pytania: a co z pracą w różnych strefach czasowych? A co z różnymi walutami?
Jak znalazłeś pierwszą pracę w branży?
Jeśli uznać za taką nieco dorywcze wykonywanie najróżniejszych zleceń webowych, to za pośrednictwem forów internetowych. Działałem nieco z PHP-Fusionem, później phpBB i MyBB, początkowo w ramach Open Source, ale szybko okazało się, że pewne osoby są zainteresowane jakimiś specyficznymi zmianami i oferują za nie wynagrodzenie.
Czego nauczyłeś się podczas pierwszych komercyjnych projektów?
Z pewnością dały mi one do zrozumienia, jak trudno jest wycenić własną pracę. Początkowo zupełnie nie wiedziałem, ile może mi zająć wykonanie jakiegoś zlecenia, nawet jeśli teoretycznie wiedziałem, na jakim polu będę się poruszał. Dopiero zderzenie się z podobnym zagadnieniem po raz drugi, trzeci i kolejny pozwalało coraz lepiej to określać. Trudną do przecenienia wiedzą było także podejście klientów, opis ich wymagań – nawet gdy chodzi o jakieś małe przeróbki na istniejących stronach, złe opisanie wymagań daje tak samo złe rezultaty jak przy projektach o większej skali.
Pamiętasz jakiś przełomowy projekt, zadanie, które sprawiło, że poczułeś dumę, zadowolenie z tego, co udało się dokonać?
Na tamtym etapie było to zintegrowanie istniejącego CMSa, z którego korzystałem z systemem phpBB – wszystko to na własne potrzeby, do fanowskiej strony internetowej poświęconej pewnej grze. Ekipa, z którą prowadziłem stronę, wpadała na masę pomysłów co można by ulepszyć, co zaoferować użytkownikom. Nikt nam za to nie płacił, społeczność nie była jakaś wielka, ale ambicja do działania i owszem. W efekcie w ciągu kilku miesięcy z oryginalnego silnika niewiele zostało, powstał za to skrojony na nasze potrzeby, zintegrowany z forum, posiadający nieco elementów SEO i całkiem nieźle zabezpieczony przed spamem.
W jaki sposób podnosiłeś i do dziś podnosisz swoje umiejętności?
Rozbijam tę kwestię na dwa filary. Pierwszym z nich jest działanie w praktyce – to uczy najlepiej. Mogę przerobić jakiś kurs od deski do deski, ale na przykładach nieco akademickich, niewiele z tego wynika, przynajmniej w moim przypadku. Najlepiej, gdy znajdę sobie jakiś problem do rozwiązania i zajmę się nim wykorzystując technologie, jakich chcę się nauczyć. Początkowo jest trudno, ale tu wkracza do akcji drugi filar: książki i kursy. Moim zdaniem warto brać z nich minimum, które pozwala nam zacząć praktykę. Gdy to mamy, możemy działać i iść dalej, ciągnąc już obie te sprawy jednocześnie.
To firma powinna zachęcać do rozwoju pracowników czy na odwrót?
Moim zdaniem to powinno działać obustronnie. Pracownik zawsze może chcieć się rozwijać, firma powinna dać mu ku temu możliwości, nawet jeśli nie bezpośrednio (np. kierowanie na szkolenia, certyfikacje), to przynajmniej dając pewne pole do działania we własnym zakresie, nie utrudniając mu tego. Jeśli grupa pracowników chce się rozwijać i daje o tym znać, a firma to ignoruje, to moim zdaniem należy zmienić firmę. Taka jak opisana w przykładzie nie dba nie tylko o ludzi, ale przede wszystkim, sama o siebie. Dodatkowe umiejętności nie muszą oznaczać, że pracownicy od razu uciekną gdzie indziej, a mogą się przydać w prowadzonych przez firmę projektach.
Jak znalazłeś pracę w obecnej firmie? Jak przebiegał proces rekrutacyjny?
Znalazłem ogłoszenie na polskim forum PHP. Było dosyć podejrzane – bardzo mało detali (a ja sam nie wiedziałem wtedy, na co zwracać uwagę), praca w pełni zdalna, do tego poszukiwano juniora z własną działalnością gospodarczą. Teraz to nikogo nie dziwi, ale jeszcze kilka lat temu nie było takie popularne. Zgłosiłem się i dostałem do wykonania kilka prostych zadań sprawdzających czy znam podstawy PHP, SQL, a także HTML i CSS. Nie był to proces zautomatyzowany, a kolejnym etapem, można powiedzieć okresem próbnym, było pisanie testów Selenium.
Czym zajmujesz się w IngeniousIO?
Po kilku latach pracy w IngeniousIO trudno mi odpowiedzieć na to pytanie. Jestem Full Stack Developerem zajmującym się modułami finansowymi w naszym produkcie, ale jako że znam wiele mechanizmów od podszewki i cały ogrom flow biznesowego zawartego w aplikacji, często jestem potrzebny w miejscach, które teoretycznie nie powinny mnie dotyczyć. W efekcie coraz więcej zajmuję się także architekturą, bo przez ten czas produkt bardzo się rozrósł i zamiast z jednego, składa się z wielu różnych systemów.
Taka specyfika pracy Fullstacka. Czy Twoim zdaniem Fullstack ma łatwiej na rynku pracy?
Zdecydowanie tak. Może nie będziemy idealnymi specjalistami w jakiejś bardzo wąskiej dziedzinie, ale nie jestem zwolennikiem takiego podejścia. Wiedza na temat problemów powstających po obu stronach barykady jest pomocna i dzięki niej można łatwiej zrozumieć sytuację kolegów, gdy omawia się kwestie związane z projektem. Poza tym, jeśli jesteśmy Fullstackiem, to otrzymujemy trzy różne typy ofert o pracę: frontendowe, backendowe, oraz łączące obie kwestie. Jest z czego przebierać.
Co sprawia, że nadal czujesz, że pracujesz we właściwej firmie?
Szczerze powiedziawszy, to dosyć często sam sobie zadaję to pytanie. Praca w startupie ma to do siebie, że nie jest łatwa, że zmiany, nawet ogromne i burzące nasze przyzwyczajenia potrafią być wprowadzane nagle. Bo klient czegoś wymaga, na wczoraj. Ot, coś na zasadzie “włączmy to i zobaczymy co się stanie!”. Z jednej strony, jest to męczące, do tego działanie przypominające Dziki Zachód nie ułatwia sprawy, bo człowiek gdzieś jednak szuka pewnego rodzaju stabilizacji.
Z drugiej, uważam, że dało mi to szalenie dużo doświadczenia, nauczyło radzić sobie z gonitwą, ignorować pewne nieistotne sprawy. W tym konkretnym przypadku ogromną robotę robi szef polskiego oddziału – gdyby nie on, jego podejście i umiejętności przywódcze, dawno by mnie tu już nie było. Nie będę także zaprzeczał: przez ostatni rok przeszliśmy w IngeniousIO ogromne przeobrażenia i moim zdaniem, wyszły nam one na dobre. Bywa ciężko, ale gdzie tak nie jest? Trawa u sąsiadów zawsze wydaje się bardziej zielona, ale nie wiemy, co tak naprawdę się w niej czai.
Myślisz, że nie rozwinąłbyś tak swoich umiejętności, gdybyś pracował dłużej w software housie czy w korporacji?
Podejrzewam, że w przypadku software house mógłbym nauczyć się nawet więcej, przynajmniej od strony technologicznej – wiele z nich to istny młyn projektów i nie sposób nie poznać najróżniejszych rozwiązań. Pytanie natomiast brzmi, czy byłbym tak blisko styku technologii z klientem? Tego nie jestem pewien, niemniej wydaje mi się, że w większości wypadków nie. To z kolei duża strata, bo mając takie doświadczenie można rozwijać się w kierunku planowania architektury czy też zostać project managerem.
Jeśli natomiast chodzi o korporacje, to wolę trzymać się od nich z daleka. Być może moje spojrzenie na nie jest nieco spaczone, ale uważam, że wiele z nich to zabetonowane twory. Co prawda oferują jasną ścieżkę rozwoju kariery, ale w pewnym miejscu definitywnie się ona kończy. Do tego brakuje w nich „swojskiej” atmosfery, która jest przecież bardzo ważna, gdy mówimy o czymś, nad czym spędzamy przynajmniej 1/3 dnia. Stabilność zatrudnienia, pewne benefity czy dobre pieniądze to moim zdaniem za mało, aby zrekompensować „oddawanie się” firmie. Rozumiem jednak osoby, które decydują się na taką pracę.
Co jest ważne w pracy programisty? Co go wyróżnia i sprawia, że innym pracuje się łatwiej?
Moim zdaniem zrozumienie potrzeb klienta, kimkolwiek on jest. Możemy pisać cudowny kod, ale nie wnosić nim żadnej realnej wartości do życia innych ludzi – a wtedy to wszystko nie ma żadnego sensu. Uważam, że to częsty problem na uczelniach, bo wiele zagadnień programistycznych jest przedstawianych jako matematyczne zagadki bez podawania przykładów rozwiązywania problemów z realnego życia. Nie lubię sztuki dla sztuki, stawiam smaczne spaghetti, którym będę się mógł podzielić, ponad arcydzieło programistyczne do zapakowania w gablotkę w muzeum. Jeśli programista może dostarczać czegoś wartościowego: optymalizacji jakichś procesów, rozrywki, edukacji, nowych informacji, to właśnie tak powinien działać, bo to ułatwia życie innym ludziom.
Łukasz Tkacz. Fullstack Developer w IngeniousIO z 6 letnim doświadczeniem zawodowym. Programowanie zaczął od C++ w szkole podstawowej, ale to tworzenie stron internetowych rozpędziło tę pasję na dobre. Początkowo działał z PHP w ramach Open Source, w ramach prowadzonych projektów komercyjnych poznał i bardzo polubił VueJS, Laravela i MongoDB, z którymi pracuje obecnie.