Program praktyk okiem programisty: nowoczesne technologie i realny projekt
Zarządzanie kapitałem wartym 86,1 miliarda funtów, które zostały zainwestowane przez ponad milion klientów Hargreaves Lansdown to ogromne wyzwanie. Z tego względu efektywny proces obsługi klienta jest tutaj kluczowy. By to osiągnąć, firma powinna korzystać z nowoczesnych, intuicyjnych i szybkich aplikacji, które w tym pomogą. Jako centrum technologiczne tworzące rozwiązania dla Hargreaves Lansdown, czyli wiodącej firmy zajmującej się zarządzaniem funduszami inwestycyjnymi i emerytalnymi w Wielkiej Brytanii, dbamy o unowocześnienie oprogramowania. To właśnie o przygotowanie aplikacji wspierającej proces obsługi klientów poprosiliśmy studentów, których zaprosiliśmy do odbycia praktyk w ramach naszego programu „Internship that matters”. Poniżej kilka słów o merytorycznych i technicznych aspektach tego programu.
Potrzeba biznesowa a realizacja projektu
Dział obsługi klienta w Hargreaves Lansdown potrzebował intuicyjnej, przejrzystej i szybkiej aplikacji, która poprawi efektywność obsługi klienta przy jednoczesnym braku zmiany procesów i procedur. Aplikacja miała zastąpić jedną z wielu funkcji systemu służącego do obsługi klienta w ramach dużego projektu, którego celem jest podzielenie dużej monolitycznej aplikacji na mniejsze komponenty. W ten sposób chcieliśmy ułatwić i uniezależnić rozwój poszczególnych funkcji systemu.
Spośród projektów możliwych do realizacji został wybrany taki, który mógł być zrealizowany w okresie trzymiesięcznych praktyk – przygotowanie aplikacji dla działu obsługi klienta w siedzibie Hargreaves Lansdown w Bristolu. Następnie wybraliśmy technologię, w ramach których będzie realizowany projekt – wszystko po to, aby przygotować dwutygodniowe szkolenie.
W projekcie uczestniczyło dziesięciu praktykantów oraz product owner będący reprezentantem biznesu i określający oczekiwania wobec aplikacji. Ja z kolei pełniłem rolę opiekuna technicznego i merytorycznego. W projekt zaangażowany był także software development manager oraz wielu innych programistów, którzy szkolili praktykantów.
System był rozwijany iteracyjnie przy użyciu Scruma. Każda iteracja miała demo, którego celem było przedstawienie użytkownikom efektów pracy w poprzedzającej iteracji oraz zebranie informacji zwrotnej. Taki proces wymuszał ciągłą gotowość do wprowadzania zmian w kolejnych iteracjach, aby było to możliwe musieliśmy zadbać o wysoką jakość kodu oraz testów.
Kandydat idealny, czyli jaki
Implementacja aplikacji a następnie wdrożenie na produkcję jest bardzo dużym wyzwaniem dla osób bez doświadczenia. Co więcej praca przy takim projekcie w zespole składającym się z 10 osób jest sama w sobie wyzwaniem i wymaga sprawnej komunikacji w zespole. W związku z tym w czasie procesu rekrutacji skoncentrowaliśmy się na kilku cechach, które dla nas były kluczowe.
- Po pierwsze: determinacja i zaangażowanie członków zespołu, ponieważ są to elementy ułatwiające pracę w projekcie, który ma określone wymagania funkcjonalne, jakościowe oraz ramy czasowe.
- Po drugie: otwartość i przyjazne nastawienie, ponieważ cechy te znacznie ułatwiają komunikację, wymianę wiedzy i doświadczeń.
- Ponadto ceniliśmy u kandydatów także zainteresowanie tematyką wytwarzania oprogramowania (bazy danych, projektowanie, technologie web itp.).
Naszym zdaniem dobry inżynier oprogramowania powinien nie tylko znać dobrze język programowania czy bibliotekę, ale również umieć wymienić wiedzę z kolegą z zespołu, omówić problem z product ownerem, czy dobrze uargumentować swoje wybory podejmowane odnośnie rozwiązań informatycznych.
Technologie, które wykorzystaliśmy
Aplikacja została podzielona na dwa komponenty – frontend, stanowiący interfejs użytkownika oraz backend wystawiający API dla frontendu, zawierający logikę biznesową, element integracji z bazą danych oraz systemami uwierzytelniania użytkownika. Komponent frontendu komunikował się z backendem przy pomocy Fetch API, co zapewniało asynchroniczną komunikację. Fronted i backend miał odrębne repozytoria kodu źródłowego, dzięki czemu można było zastosować dopasowane do potrzeb technologie, biblioteki, narzędzia zarządzania zależnościami czy procesy budowania i wdrażania.
Zarówno frontend jak i backend był wdrażany na środowisko Kubernets, które automatycznie zarządzało zasobami takimi jak interfejsy sieciowe, procesory, pamięć RAM itp. Komponenty były dostarczane jako kontenery Docker’owe, a każda zaimplementowana i zaakceptowana przez zespół funkcja aplikacji była automatycznie wdrażana przy pomocy Jenkins’a, czyli narzędzia realizującego wcześniej skonfigurowany potok. Jego kluczowe etapy to: kompilacje, testowanie, przygotowywanie i budowanie paczki zawierającej działającą aplikację, przygotowywanie kontenera Docker i ostatecznie wdrażanie kontenera na środowisko Kubernetes.
Implementacja logiki biznesowej w komponencie backend była realizowana przy wykorzystaniu języka Java i Spring Boot (ułatwiający konfigurację samodzielnej aplikacji). Backend wymagał integracji z bazą danych przy użyciu Spring Data JPA oraz Hibernate. Aby ograniczyć komunikację z bazą zastosowaliśmy cache L2 oraz cache zapytań. Z kolei chcąc ograniczyć dostęp do aplikacji i zapewnić uwierzytelnianie oraz autoryzację użyliśmy Spring Security. Spring MVC posłużył nam do wystawienia metod HTTP dla aplikacji fronted. Testy integracyjne i jednostkowe były pisane przy użyciu Spock’a wykorzystującego język Groovy.
Frontend jako interfejs graficzny był realizowany przy użyciu technologii Web. Całość składała się z wielu małych komponentów takich jak przyciski, etykiety, pola tekstowe, pola rozwijane z automatycznym uzupełnianiem itp. Jako języka programowania użyliśmy Typescript’u, który jest „transpilowany” do Javasriptu. Jego kluczową zaletą jest statyczne typowanie, co umożliwia wykrywanie wielu błędów na etapie kompilacji oraz znacząco poprawia czytelność kodu. Wykorzystaliśmy także bibliotekę React oraz Material UI, co znacząco przyspieszyło implementację. Architektura Redux zakłada jednokierunkowy przepływ danych. Wywołania backendu są realizowane asynchronicznie przy użyciu Fetch API. Do zarządzania zależnościami i budowania aplikacji użyliśmy Yarna, Npm’a i Webpacka.
Postęp w pozyskiwaniu wiedzy i umiejętności
W okresie trzymiesięcznych praktyk w każdej kolejnej iteracji widać było postęp i większą samodzielność w tych obszarach. Pod koniec członkowie zespołu znacznie sprawniej radzili sobie w trakcie analizy i planowania, potrafili przewidzieć szereg konsekwencji przy wyborze konkretnego rozwiązania. Efektem tego był wzrost ilości proponowanych zmian oraz samodzielnie dostarczanych funkcji.
Podsumowując, do programu praktyk zaprosiliśmy 10 osób, które nie miały wcześniej żadnych doświadczeń zawodowych poza działaniami podejmowanymi w związku ze studiami lub programowaniem we własnym zakresie. Dzięki ogromnemu zaangażowaniu i chęci uczenia się, zespół wykorzystał w pełni możliwości, jakie stwarzał program praktyk – a my przekonaliśmy się, że w tych osobach tkwi ogromny potencjał. Dlatego zdecydowaliśmy się kontynuować współpracę z chłopakami.
Co dalej?
Aplikacja wytworzona przez praktykantów przygotowywana jest do wdrożenia, a my implementujemy kolejne funkcjonalności. Praktykanci dołączyli do innych zespołów projektowych, gdzie będą mieli okazję zapoznać się z kolejnymi technologiami i pracować z doświadczonymi programistami.