Staż, jako okazja do rozwoju umiejętności twardych
Materiał powstał przy współpracy z firmą Comarch.
Rozpoczynając zawodową edukację, aby zostać programistą, możesz obrać wiele ścieżek, a każda z nich, powinna doprowadzić Cię do tego samego celu. Jedna będzie dłuższa bardziej „krajobrazowa”, a inna krótsza, lecz mniej interesująca. To, na którą z nich się zdecydujesz, będzie zależało tylko i wyłącznie od Ciebie.
Sam, kilka lat temu podjąłem się dość długiej i nieco bardziej wymagającej wyprawy. Postanowiłem, że będę studiował informatykę. Chcąc rozpocząć zawodową karierę związaną z profesjonalnym programowaniem, doszedłem do wniosku, że najlepszym wyborem będą pięcioletnie studia, I i II stopnia, na jednej z krakowskich uczelni. Czy była to dobra decyzja? Z perspektywy czasu, mogę powiedzieć, że pod pewnymi warunkami, tak. Zastrzeżenia dotyczą tutaj głównie tego, że studia studiom są nierówne. Taka trochę oczywistość, ale często nie wszyscy zdają sobie z tego sprawę. Dyplom ukończenia informatyki na jednej z wielu szkół wyższych to nie jest gwarancja pracy w IT, a już na pewno nie jest to przepustka do pięciocyfrowych zarobków. Mam nadzieję, że nie muszę Ci tłumaczyć, że 10k dla „juniora” to marketingowy mit.
Decydując się na studiowanie w obszarze nauk ścisłych, niezależnie od tego, czy będzie to informatyka, matematyka komputerowa czy fizyka, najważniejsza jest praktyka. Zasada ta dotyczy w zasadzie wszystkich kierunków i zawodów. Jednak w IT ma szczególne znaczenie. Dlaczego?
Realizując projekty „studenckie” z racji ograniczonego czasu oraz natłoku innych obowiązków, ich skala oraz liczba funkcjonalności musi być odpowiednio ograniczona. Jeśli na przedmiot, powiedzmy „inżynieria oprogramowania”, mamy przeznaczone 6 punktów ECTS, to nakład pracy studenta, powinien wynosić od 150 do 180 godzin. Oczywiści w tym wszystkim mamy wliczone 45 godzin laboratoriów oraz 30 godzin wykładu. Pozostaje więc od 75 do 95 godzin na realizację projektu i to przy założeniu, że jest on równocześnie egzaminem. Na każdej uczelni może to być ustalane inaczej — zgodnie z przysługującą autonomią. W każdym razie to wszystko daje nam w najlepszym przypadku jakieś 10/11 MD.
Man-Day, jednostka określająca dzień pracy jednej osoby.
Realizując komercyjne projekty, zespół, w skład którego wchodzą programiści, testerzy, product owner oraz project manager, na początku sprintu, odpowiedzialny jest za estymację nowych zadań, jakie należy wykonać. Z wiadomych przyczyn nie mogę udostępnić Ci tutaj dokładnych danych z projektu, przy którym obecnie pracuję, ale uwierz mi, jest tam całkiem sporo pojedynczych funkcjonalności, które pierwotnie zostały oszacowane na liczbę przekraczającą 10 MD. Mówiąc inaczej, zaprogramowanie jednej historyjki w „normalnym” oprogramowaniu, rzeczywiście wykorzystywanym przez konkretnych użytkowników, zajmuje więcej czasu niż podczas studiów mamy przeznaczone na wykonanie całości prac. Oczywiście na tablicy, można też znaleźć całą masę prostych tasków, które zostały oszacowane na kilka godzin. Sęk w tym, że nawet wykonanie, jak mogłoby się wydawać, niezbyt zaawansowanej czynności polegającej na podmianie ikony, to tak naprawdę cały dzień roboczy. Proszę nie pisać w komentarzach, że takie rzeczy to się robi w 30 minut. Jeżeli Twoja aplikacja składa się z kilkudziesięciu linijek kodu i jest używana przez dwie osoby, na dodatek, korzystające wyłącznie z dwóch urządzeń, to oczywiście można to zrobić nawet i w 5 minut. Sytuacja komplikuje się, kiedy projekt jest nieco większy i bardziej popularny. Programista po wykonaniu swoich zmian musi również upewnić się, że wszystko działa prawidłowo. Jest to nieodłączny element dla implementacji każdej nowej funkcjonalności.
Jak widzisz różnice w podejściu „praktycznym” i „akademickim” są dość spore. Wynika to między innymi z tego, że pracując przy oprogramowaniu będącym realnie wykorzystywanym i co najważniejsze przynoszącym zyski, nie możemy pójść na żaden kompromis związany z architekturą, jakością kodu czy też wydajnością. Wszystko tutaj musi być zaimplementowane z dużą starannością w sposób odpowiednio przemyślany. Niedopuszczalne jest tworzenie długu zamierzonego poprzez świadome ignorowanie zasad czystego kodu oraz ustalonej architektury. Dobrze jest również, aby zwrócić uwagę na to, żeby nie generować długu technologicznego — co oczywiście jest trudne, a nawet powiedziałbym, że niemożliwe, musisz tutaj cały czas się pilnować. To nie są projekty, które mają działać przez parę minut w trakcie prezentacji zaliczeniowej. Wszystko to musi w przyszłości zarobić na wynagrodzenie dla zespołu, a w szczególności przynieść zyski firmie, która z tego będzie korzystała.
Jeśli więc podczas swoich studiów, masz możliwość udziału w stażu i pracę nad realnymi projektami, przy których powstawaniu nie ma żadnych kompromisów — to będzie dla Ciebie najlepsza forma edukacji i przygotowania do przyszłej kariery zawodowej.
Pracując w dużym zespole składającym się z wielu osób pełniących różne role, nauczysz się przede wszystkim, współpracy z innymi osobami, ale nabędziesz też sporo umiejętności twardych.
git flow
Jednym z takich elementów jest dogłębne poznanie git flow. Pisząc kod samodzielnie, nawet jeśli używasz systemu wersjonowania, to nie jesteś w stanie poznać całego jego potencjału. Zazwyczaj ogranicza się to do podstawowych funkcjonalności, czasami może stworzysz sobie jakiś osobny branch czy coś w tym stylu. Jeśli jednak pracujesz na danym projektem samodzielnie, tego typu zabiegi w dużej mierze wyglądają jak próba zestrzelenia muchy armatą. Można? Oczywiście, że tak. Tylko pytanie, po co?
O tym, jaki sens i potencjał ma dobre wykorzystanie całego tego mechanizmu, można przekonać się podczas pracy przy dużym projekcie i w dużej grupie pracowników. To właśnie jest jeden, z elementów, których nie nauczysz się podczas studiów, ale możesz to zrobić, biorąc udział w stażu. Tutaj jednak muszę dodać pewne zastrzeżenie — nie dotyczy to programów stażowych polegających na parzeniu kawy czy też tworzeniu oprogramowania z pominięciem wszelkich praktyk i zasad dobrego kodu.
Git flow czyli zasady pracy z systemem kontroli wersji git. Odpowiedzialne są za wsparcie ciągłego rozwoju oprogramowania oraz implementacji praktyk DevOps. Po raz pierwszy zostały opublikowane i spopularyzowane przez Vincenta Driessena. Git flow definiuje ścisły model rozgałęzień, zaprojektowany tak, aby w łatwy sposób można było wydawać nowe wersje oprogramowania.
code review
Jak często zastanawiasz się, czy implementacja danej metody, algorytmu bądź funkcjonalności jest najlepszym możliwym rozwiązaniem? Czy nie będzie w przyszłości, spowalniała tworzonego oprogramowania? Czy nie będzie generowała długu technologicznego? Czy wszystko zostało odpowiednio opisane i jest zrozumiałe dla innych osób?
Szczerze, to podczas moich studiów i całej masy różnych projektów, nigdy nie zadawałem sobie takich pytań. Dlaczego? Wszystkie aplikacje, które tworzyłem, miały po prostu działać. Jeśli finalnie otrzymywałem oczekiwany rezultat, to przechodziłem do kolejnych zadań. Takie podejście miało pewne wyjątki. W toku studiów miałem kilka przedmiotów, nazwijmy to z grupy „algorytmicznej”, gdzie rozwiązania były sprawdzane przez automatyczny system. Ten z kolei nie porównywał jedynie „wyjścia”, ale również weryfikował szereg innych parametrów. Czasami w danym zadaniu nie może było używać konkretnych instrukcji (np. pętli), a czas wykonywania programu oraz przydzielana pamięć, były bardzo ograniczone. To zmuszało mnie, do kreatywnego myślenia i kombinowania. Mimo że napsuło mi to dużo nerwów, to z perspektywy czasu, oceniam cały ten wysiłek pozytywnie. Nauczyłem się, że zawsze warto zastanowić się, czy jakiś dany fragment kodu nie można napisać lepiej.
Mimo że moi wykładowcy włożyli dużo pracy, aby zmusić studentów do kreatywnego myślenia, to i tak cały ten proces można by znacznie usprawnić oraz uatrakcyjnić. Niestety, realnie przy takiej liczbie studentów i nauczycieli akademickich, na żadnej uczelni nie jest to możliwe. Nikt z prowadzących, nie będzie tak dogłębnie analizował Twojego kodu, jak członkowie zespołu, z którymi podczas stażu będziesz miał okazję pracować.
W zależności od zasad panujących w danym zespole oraz firmie każdy stworzony fragment kodu, który będziesz chciał scalić z główną gałęzią, powinien zostać zweryfikowany przez bardziej doświadczoną osobę. Tym więcej uwag i wskazówek dostaniesz, tym będzie to dla Ciebie korzystniejsze. To jedyna droga, aby poprawić swoje programistyczne umiejętności. Oczywiście nie chodzi tutaj o przysłowiowe „doczepianie się”, ale o merytoryczne uwagi do stworzonego kodu. Uwierz mi, w ciągu kilku tygodni nauczysz się znacznie więcej niż przez pięć lat studiowania.
Testowanie i jakość oprogramowania
Tworząc projekty zaliczeniowe, raczej nie zwraca się żadnej uwagi, na testy i jakość oprogramowania. Natłok innych zadań, kolokwiów czy egzaminów, powoduje, że odpuszczamy tworzenie jakichkolwiek testów, dokumentacji, a nawet przestajemy dbać o odpowiednie wcięcia umożliwiające efektywne przeglądanie napisanego kodu. Tym bardziej wymagająca uczelnia tym mniej pozostaje czasu na tego typu „dodatki”. Jeśli zbliża się egzamin z matematyki dyskretnej, to przecież nikt nie będzie pisał testów jednostkowych, kosztem czasu, który można by poświęcić na zagłębienie się w teorię grafów. Znam to ze swojego własne doświadczenia oraz historii wielu moich znajomych.
Udział w wakacyjnym stażu, w okresie, w którym nie musisz zawracać sobie głowy innymi uczelnianymi sprawami, to znakomita okazja do poszerzenia swojej wiedzy. Podczas pracy nad realnymi projektami, których żywot nie skończy się po kilku miesiącach, możesz poznać wiele nowych rozwiązań. Między innymi, mam tutaj na myśli biblioteki wykorzystywane do tworzenia testów jednostkowych albo szereg wzorców projektowych odpowiedzialnych za zapewnienie jakości oprogramowanie czy zasady separacji problemów (ang. SoC). To jedyna szansa, aby podczas studiów poznać w praktyce, jak w rzeczywistości wygląda praca programisty w projekcie, działającym w środowisku produkcyjnym przy dość dużym obciążeniu. Testowanie i jakość oprogramowania nabierają tutaj zupełnie nowego znaczenia.
Program stażowy Comarch
Jeśli jesteś studentem, co najmniej drugiego roku, na kierunku technicznym to zapraszam do aplikowania na staż organizowany przez firmę Comarch. Podczas trzech miesięcy, rozwiniesz szereg umiejętności twardych oraz poznasz wiele osób, z którymi wspólnie dzielisz tę samą pasję. Aplikować możesz do 15 kwietnia, przez formularz na stronie rekrutacyjnej. O zakwalifikowaniu będą decydować testy, które zostaną przeprowadzane w dniach 26–30 kwietnia. Oczywiście za swoją pracę otrzymasz odpowiednie wynagrodzenie, stawka to 3 370 zł miesięcznie. Dodatkowo firma oferuje pełną opiekę mentora oraz pięciodniowy płatny urlop. Jeśli obostrzenia sanitarne na to pozwolą, to staż będzie odbywał się stacjonarnie przy zachowaniu wszelkich zasad higienicznych.
Zanim wyślesz swoje CV, zastanów się jaki profil będzie dla Ciebie najbardziej interesujący oraz w jakiej lokalizacji możesz ewentualnie pracować.
Profil programistyczny
Lokalizacje: Białystok, Gdańsk, Gliwice, Katowice, Kraków, Lublin, Łódź, Poznań, Rzeszów, Tarnów, Warszawa, Wrocław.
Dostępne technologie:
- Java,
- .NET,
- C/C++,
- Bazy danych,
- Web.
Inżynier systemowy
Lokalizacje: Kraków, Łódź, Poznań, Warszawa.
Wybierając ścieżkę inżyniera systemowego, do Twoich zadań będzie należało:
- wykonywanie prac technicznych, serwisowych, instalacyjnych oraz konfiguracyjnych,
- udział w pracach projektowych i implementacyjnych,
- udział w rozwiązywaniu problemów systemowych,
- wykonywanie testów wydajnościowych,
- utrzymywanie projektowej infrastruktury serwisowej.
Embedded
Lokalizacje: Kraków.
Na tym profilu, przykładowe zadania to:
- tworzenie, integracja oraz weryfikacja oprogramowania,
- tworzenie i uruchamianie prototypów urządzeń elektronicznych,
- rozwój z zakresu hardware oraz elektroniki.
Telekomunikacja
Lokalizacje: Gdańsk, Gliwice, Katowice, Kraków, Poznań, Wrocław.
Przykładowe obowiązki z zakresu telekomunikacji:
- rozwój produktów użytkowanych przez operatorów telekomunikacyjnych,
- dostarczanie rozwiązań do ewidencji i planowania sieci transportowej,
- rozwój w zakresie technologii: GSM/UMTS/LTE, ATM, SDH, PDH, IP/Metro, xWDM, Microwayes.
AI/ML
Lokalizacje: Łódź.
Wyzwania, jakie czekają na Ciebie z dziedziny uczenia maszynowego:
- tworzenie algorytmów uczenia maszynowego,
- analiza i modelowanie danych,
- ewaluacja i testowanie przygotowanych modeli,
- udział w integracji modeli AI/ML z innymi rozwiązaniami.
Cyber Security
Lokalizacje: Kraków, Poznań.
Na stażu w dziedzinie cyber bezpieczeństwa, zostaną poruszone takie tematy jak:
- analiza zagadnień bezpieczeństwa IT,
- testy penetracyjne aplikacji webowych, mobilnych i infrastruktury.
UX/UI
Lokalizacje: Kraków.
W trakcie trzech miesięcy spędzonych na stażu będziesz brał udział w czynnej realizacji konkretnego projektu jako członek kilkuosobowego zespołu. Nauczysz się takich elementów jak:
- efektywnej pracy w zespole projektowym,
- projektowania architektury informacji oraz graficznych interfejsów użytkownika,
- prototypowania aplikacji,
- identyfikacji potrzeb użytkowników.
Podsumowanie
Wydaje mi się, że Ciebie nie muszę dłużej przekonywać o tym, jak ważny, z punktu widzenia rozwoju umiejętności twardych, jest udział w programach stażowych. Mimo że mamy specyficzny pandemiczny czas, to wybór projektów i specjalizacji jest naprawdę szeroki. Firma Comarch przygotowała interesującą ofertę, z której warto skorzystać. Weź również pod uwagę to, że Twoja praca nie musi kończyć się po trzech wakacyjnych miesiącach. Średnio 85% wszystkich stażystów zostaje na dłużej! To znakomity start dla Twojej zawodowej kariery…