Jedną z bardziej popularnych dyskusji wokół kariery programisty jest ta o stawianiu na specjalizację lub pracę jako full-stack developer. Jedni cenią sobie bycie “złotą rączką”, która będzie pracować ze wszystkim niezależnie od technologii czy warstwy aplikacji, natomiast inni stawiają na specjalizację, bo pomaga im to czuć się bardziej określonymi i lepiej rozumieć swój wkład w pracę zespołu.

Która z tych dróg może ci przynieść więcej korzyści?

Moja przygoda z programowaniem pozwoliła mi doświadczyć obu tych stanów, więc dzisiaj dzielę się z wami moimi przemyśleniami na ten właśnie temat.

Full stack

W swoim CV pozycję “full-stack developer” mam wpisaną dwukrotnie. Pierwszy raz dotyczył pracy w firmie, która dopiero kształtowała swoją pozycję na rynku, więc zamiast specjalizacji i ekspertów w wąskiej dziedzinie szukano raczej rąk do pracy przy każdym napotkanym wyzwaniu. Drugi raz dotyczył z kolei firmy, która miała już ugruntowaną pozycję, jednak full-stack developerzy pracujący przy aplikacjach webowych byli tam prawdopodobnie najliczniej reprezentowaną grupą specjalistów. Jak wspominam te czasy?

Przede wszystkim nie mogłem narzekać na nudę. Praca jako full-stack developer to okazja do zmierzenia się z praktycznie każdą warstwą budowanego przez zespół produktu, no i u mnie wyglądało to właśnie w taki sposób - jako full-stack pracowałem przy bazach danych, przy warstwie API, w backendzie, przy konfiguracji serwerów, no i w końcu na front-endzie (czasami łączonym z rolą designera). Zadania, które mogłem “brać na siebie”, nie były ograniczone do wąskiego wycinka funkcjonalności, dzięki czemu praca była bardzo różnorodna i można wręcz powiedzieć - nieprzewidywalna. Czy podobał mi się taki charakter pracy? Tak - szczególnie w pierwszych kilkunastu miesiącach pracy, kiedy to w bardzo krótkim czasie musiałem nauczyć się podstaw wielu dziedzin, z którymi wcześniej nie miałem do czynienia. Ilość wiedzy, jaką wyciągnąłem z pracy startując jako full-stack, była naprawdę nie do przecenienia.

Dodatkowo, w tej roli dużą satysfakcję dawało mi posiadanie umiejętności, dzięki którym buduję “coś z niczego” i jestem w stanie zadbać o wszystkie najważniejsze elementy wybranej aplikacji. Nie było sytuacji, w której przykładowo budowałem interfejs użytkownika, ale nie wiedziałem, jak zachować ustawienia w bazie danych. Musiałem być w stanie i poprawić kolor przycisku, i połączyć się z bazą, i wykonać migrację - tego po prostu wymagała ta pozycja.

Przez dostęp do każdej warstwy wybrane funkcje mogłem budować wertykalnie, co przekładało się na dość samodzielną pracę w danym obszarze. Z punktu widzenia podziału pracy w zespole było to stosunkowo korzystne, ponieważ kilka osób mogło równolegle pracować nad jednym systemem, rozwijając go jednak z kompletnie innej strony.

Poza różnorodnymi wyzwaniami oraz rozwijaniem się jako budowniczy aplikacji, dzięki doświadczeniu z pracą jako full-stack developer było mi też o wiele łatwiej startować z własnymi inicjatywami realizowanymi po godzinach. Full-stack to niejako programista samowystarczalny, który stosunkowo niskim nakładem sił jest w stanie zbudować samemu MVP danego produktu czy usługi, co dla osób z zapędami do prowadzenia własnej firmy może się okazać niesamowicie ważne. Dzięki takiemu właśnie doświadczeniu nie musiałem się więc zastanawiać jak do mojego back-endu dodać interfejs użytkownika, albo jak właściwie zintegrować serwisy z bazą danych, tylko krok po kroku mogłem to wszystko realizować na własną rękę. Czy było to najbardziej efektywne jeśli chodzi o mój czas? Zapewne nie, bo pewnie dobrze byłoby część tych zadań zlecić innej osobie. Jeśli chodzi jednak o oszczędności na początkowych etapach projektu, to umiejętności full-stackowe były naprawdę bezcenne.

Specjalizacja

Po kilkunastu zrealizowanych projektach jako full-stack developer postanowiłem jednak, że czas na specjalizację. Skąd taka decyzja?

Można powiedzieć, że pracując w zespole wybrane osoby naturalnie przyciągane są przez aktywności, które są im najbliższe. U mnie zawsze była to praca nad interfejsem użytkownika. Przez doświadczenie z grafiką komputerową miałem zazwyczaj nieco więcej zmysłu do budowania tej właśnie warstwy niż pozostałe osoby w zespole, więc z przyjemnością brałem na siebie zadania front-endowe. W pewnym momencie nabrałem ich tak dużo, że front-end stał się dla mnie bardziej interesujący niż wszystko z czym do tej pory pracowałem. Zacząłem zauważać pierwsze korzyści jakie niesie za sobą specjalizacja, no a dalej była już tylko decyzja o postawieniu wszystkiego na jedną, front-endową kartę.

Od tego momentu zmieniło się u mnie naprawdę dużo. Przede wszystkim zmiana dotyczyła ilości czasu, którą mogłem teraz poświęcić na warstwę, która była mi najbliższa. W pracy jako full-stack developer, front-end często ogranicza się do pobrania wybranej nakładki z gotowymi stylami, poskładania tego wszystkiego jak leci, i powrotu do pracy nad niższymi warstwami. Dla kogoś, kogo pasjonuje budowanie UI, było to oczywiście niewystarczające. Dopiero w pracy jako front-end developer mogłem przyjrzeć się interakcji użytkownika z produktem tak blisko jakbym chciał, mogłem poświęcać dość czasu na pracę nad front-endową infrastrukturą, albo spróbować zrozumieć jak front-end robią firmy, które traktują tę warstwę aplikacji bardziej poważnie.

Zmieniło się też to, że o wiele łatwiej jest mi zrozumieć i określić wartość jaką wnoszę do projektu. W pracy jako full-stack byłem od wszystkiego, ale “wszystko” było zawsze “tylko” na wystarczająco dobrym poziomie. Jako front-end developer mogę wprost określać w czym się specjalizuję, jaką wartość daję zespołowi, jakie problemy, z którymi zmaga się zespół, mogę rozwiązać lepiej i szybciej, oraz jaką wiedzą mogę się faktycznie dzielić. Ta kwestia na pewno jest bardzo subiektywna i zależy od każdego kto zastanawia się nad podobną decyzją, ale dla mnie jest to naprawdę korzystne.

W specjalizacji jest wiele zalet, ale jedna z nich może być szczególnie ważna dla początkujących - myślę mianowicie o tym początkowym wrażeniu ogromnych ilości wiedzy do wchłonięcia, które niektórych mogą wręcz paraliżować. W wypadku postawienia na jedną konkretną dziedzinę o wiele łatwiej zrozumieć to, co danego dnia można odpuścić, albo do czego nie trzeba przykładać aż tak dużej uwagi. Oczywiście konsekwencją tego jest teraz głębokość poznawania obszaru w którym się specjalizujesz, co po czasie okazuje się równie ogromnym zbiorem wiedzy, ale dla mnie osobiście było to łatwiejsze do przełknięcia niż wieczne wrażenie potrzeby uczenia się... wszystkiego.

Ciemne strony

Do tej pory pisałem tylko i wyłącznie o neutralnych bądź pozytywnych aspektach każdej z tych dwóch ścieżek. Oczywiście można zgadywać, że istnieją też te bardziej negatywne.

W przypadku pracy jako full-stack developer najbardziej przeszkadzało mi bycie nieokreślonym - pracownikiem od wszystkiego, ale specjalistą raczej od niczego. W przypadku dzielenia się wiedzą było to szczególnie trudne, bo na żadną z warstw mojego stacku nie poświęcałem tyle czasu, żeby opowiadać o moich doświadczeniach w tym właśnie miejscu

Bardzo często byłem też świadkiem tego, że full-stack developerzy mieli wybrane warstwy, którymi opiekowali się ze szczególną uwagą, natomiast inne traktowali po łebkach - cierpiała na tym nie tylko jakość kodu, ale też doświadczenia użytkownika końcowego.

No i tak jak pisałem wcześniej - będąc od wszystkiego miałem wrażenie, że muszę się też uczyć wszystkiego. Nie mogłem zostawać w tyle z front-endem, back-endem, bazami danych ani z chmurą. Efektem tego było wyraźne wrażenie utraty kontroli nad wieloma obszarami naszej branży, a koniec końców całkiem sporo stresu (wiadomo, FOMO).

Jeśli chodzi o specjalizację, to pierwszym minusem byłby na pewno brak zaspokajania ambicji przedsiębiorcy czy budowniczego, który przede wszystkim stawia na budowanie produktu od fundamentów po sam dach (od warstwy przetrzymywania danych, do interfejsu użytkownika). Specjalizacja pozbawia cię kontaktu z wieloma warstwami aplikacji, mówiąc ci na czym konkretnie masz się skupiać. Jeśli przede wszystkim pasjonuje cię programowanie oraz bardziej rzemieślnicze podejście do poprawiania swoich umiejętności, to będzie to dla ciebie korzystne. Jeśli natomiast kierujesz się dewizą “good enough”, to specjalizacja może być dla ciebie nie do zaakceptowania.

Kolejnym minusem jest dość hermetyczne środowisko w którym zaczynasz się obracać, w którym po kilku miesiącach znasz na pamięć każdego wartego śledzenia eksperta, standardową bibliotekę czy najlepszą w regionie konferencję. Jeśli priorytetem jest dla ciebie różnorodna pula zadań z którymi się mierzysz, to stawiając na specjalizację po pewnym czasie możesz odczuwać znużenie obowiązkami - coś, czego jako full-stack developer możesz nigdy nie doświadczyć.

Trzeci możliwy minus specjalizacji to - wbrew pozorom - możliwa utrata twojej wartości na rynku. To oczywiście nie zależy tylko i wyłącznie od ciebie ale i od firm, które cię zatrudniają, jednak w wielu firmach na początkowym etapie rozwoju o wiele bardziej ceni się osoby “od wszystkiego” niż tych, którzy “wybrzydzają” pracując tylko w jednym konkretnym miejscu projektu. Jeśli trafisz do miejsca, gdzie rozumie się wartość dziedziny w której się specjalizujesz, to problem znika. Jeśli natomiast będziesz pracował gdzieś, gdzie twoja specjalizacja nie przynosi oczekiwanego zwrotu, to na miejsce satysfakcji wskoczy frustracja oraz poczucie bycia niedocenianym. A tego przecież chcemy unikać, prawda?

Który kierunek jest dla ciebie?

Nie chciałbym kończyć tego artykułu zdecydowanym stwierdzeniem o tym, która ścieżka będzie dla ciebie tą najlepszą. W podejmowaniu takiej decyzji brać pod uwagę należy bardzo dużo zmiennych, które mogą decydować o kierunku, którym zdecydujesz się iść, więc trudno teraz napisać “idź koniecznie w lewo” albo “idź koniecznie w prawo”.

Jeśli zmagasz się z wyborem jednej z dwóch ścieżek o których tutaj pisałem, to polecam jednak spróbować odpowiedzieć sobie na następujące pytania:

  • czy programujesz, aby budować coś z niczego (full-stack), czy aby nieustannie poprawiać swój fach (specjalizacja)?
  • czy bardziej pasjonuje cię rozwiązywanie wyzwań z wielu różnych dziedzin (full-stack), czy z jednej konkretnej (specjalizacja)?
  • czy ilość wiedzy do przyswojenia wydaje się dla ciebie zbyt duża (specjalizacja) czy bardziej cię pasjonuje (full-stack)?
  • czy myślisz o budowaniu marki osobistej wokół konkretnej dziedziny programowania (specjalizacja)?
  • czy myślisz o budowaniu produktów i usług we własnej firmie (full-stack)?

Oczywiście wokół odpowiedzi na te pytania jest mnóstwo niuansów, ale myślę, że pozwolą ci one dość dobrze zrozumieć konsekwencje stawiania na jedną z dwóch opisywanych dzisiaj dróg. W każdym z opisywanych przykładów jest też jak zwykle sporo wyjątków, więc nie powinno dziwić cię to, że front-end developerzy zakładają własne firmy, albo, że nie każdy full-stack developer to miliarder na swoim (aczkolwiek i jeden i drugi zarobi naprawdę dobre pieniądze źródło.

Jeśli chodzi o kilka luźnych obserwacji na sam koniec, to polecałbym rozpoczynanie pracy od stanowiska full-stack developera. Pozwoli ci to odkryć wiele równorzędnych dziedzin programowania, w których specjalizować się możesz w dalszej kolejności. Jeśli postąpisz odwrotnie to może się okazać, że niektóre drogi zamykasz sobie zbyt wcześnie.

Dodałbym też, że cała ta dyskusja opiera się nie nieco fałszywych założeniach, bo praktycznie nie spotkałem na swojej drodze kogoś takiego jak full-stack developer w pełnym tego słowa znaczeniu (i wielu moich znajomych również nie spotkało takich osób - tak tak, to wciąż bardzo subiektywne). Zazwyczaj tytuł taki miały osoby które faktycznie pracowały przy wszystkich warstwach aplikacji, jednak 80% czasu poświęcały zazwyczaj tylko na jedną z nich. Tym niemniej, postawienie na specjalizację lub pracę jako “full-stack” to z pewnością kilka różnic, które sprawiają, że obu tych ścieżek nie traktujemy jako jedno.

No i na sam koniec - jeśli nie możesz podjąć decyzji dotyczącej kierunku w który powinna zmierzać twoja przygoda z programowaniem, wahasz się lub masz obawy, to spokojnie - nikt nie powiedział, że w danej roli musisz pracować do końca swojego zawodowego życia. Wielu pracodawców doceni fakt, że chciałbyś poznać programowanie z kilku perspektyw, więc nowe stanowisko prawdopodobnie przyniesie ci tylko i wyłącznie stos nowych doświadczeń i okazji do nauki. Przede wszystkim chodzi przecież o to, żeby się rozwijać.