Kod

Jak zbudować zespół IT

Jak zbudować zespół IT

Darmowy kurs Pythona ➞ Mini-kurs dla początkujących i doświadczonych programistów. 4 ciekawe projekty w portfolio, komunikacja na żywo z prelegentem. Kliknij tutaj, aby dowiedzieć się, czego możesz nauczyć się na tym kursie.

Dowiedz się więcej

W tym odcinku omówiliśmy strukturę zespołu programistów oraz metody planowania i oceny jego pracy. Wersje audio i nowe odcinki podcastu „People and Code” są dostępne na popularnych platformach. Dzielimy się przydatnymi wskazówkami dotyczącymi optymalizacji procesów zespołowych, które mogą poprawić produktywność i jakość pracy.

Fizyk, analityk i biznesmen, pełniący funkcję Product Ownera systemu Unified Client MDM w HFLabs. Na swoim stanowisku odpowiada za strategiczny rozwój i zarządzanie produktem, którego celem jest optymalizacja zarządzania danymi klientów.

  • Jak zorganizowany jest zespół
  • Jak budowana jest hierarchia w zespole
  • Jak radzić sobie z konfliktami w zespole i zapobiegać wypaleniu zawodowemu
  • Jak kształtować wartości zespołowe i przekazywać je wszystkim
  • Planowanie i zarządzanie w zespole
  • Jak przełożyć zadanie biznesowe na język programistów
  • Jak prowadzone są sprinty
  • Jak ocenić, czy zespół poradził sobie z zadaniem
  • Jak dołączyć do zespołu: porady dla nowych

Jak zorganizowany jest zespół

Michaił, Twoja firma jest dobrze znana w specjalistycznych kręgach, ale przeciętny konsument nie ma o niej wystarczającej świadomości. Na jakich obszarach się Państwo koncentrują?

Od 17 lat HFLabs poprawia jakość danych klientów. Gromadzimy i przetwarzamy wszelkie informacje charakteryzujące zarówno osoby fizyczne, jak i podmioty prawne. Posiadamy dane takie jak nazwisko, imię, drugie imię, nazwy firm, dokumenty, adresy i inne ważne informacje. Naszym celem jest zapewnienie wysokiej jakości i dokładności danych, co pozwala naszym klientom podejmować świadome decyzje i efektywnie zarządzać swoimi zasobami.

Nasze oprogramowanie jest instalowane na serwerach banków i firm ubezpieczeniowych, efektywnie przetwarzając informacje, które otrzymują codziennie. Ten model biznesowy znany jest jako oprogramowanie lokalne, co oznacza lokalną instalację i zarządzanie systemem. Dzięki naszemu rozwiązaniu klienci mogą niezawodnie przechowywać dane i zapewnić sobie wysoki poziom bezpieczeństwa, spełniający wymagania sektora finansowego.

Obecnie oferujemy pięć kluczowych linii produktów, a ja jestem odpowiedzialny za jedną z nich. Zajmuję się również rozwojem nowych produktów i tworzeniem zespołów produktowych w celu ich udanego wprowadzenia na rynek.

Nasz zespół jest zorganizowany tak, aby skutecznie realizować zadania i osiągać cele projektu. Pełni on kilka kluczowych ról, z których każda ma swoją własną, unikalną funkcję.

Przede wszystkim jest kierownik projektu, który koordynuje pracę zespołu i dba o dotrzymywanie terminów oraz realizację zadań na najwyższym poziomie. Następnie są specjaliści ds. treści, którzy tworzą i edytują teksty, dbając o to, aby spełniały one wymagania SEO i były atrakcyjne dla grupy docelowej.

W skład zespołu wchodzą również projektanci, którzy odpowiadają za oprawę wizualną materiałów i tworzenie atrakcyjnego interfejsu. Programiści zajmują się techniczną stroną projektu, zapewniając funkcjonalność i optymalizację strony internetowej.

Każdy członek zespołu odgrywa kluczową rolę w osiąganiu wspólnych celów, co przyczynia się do pomyślnej realizacji projektów i wysokiej jakości produktu końcowego.

Kiedy zaczynałem pracę w firmie, w zespole produktowym było nas około dziesięciu osób. Obecnie zespół ten liczy ponad pięćdziesięciu specjalistów. Od tego czasu moje zrozumienie, jak powinien być zorganizowany zespół, stale ewoluowało. Zrozumiałem, jak ważna jest elastyczność struktury i interakcji, która pozwala nam skutecznie dostosowywać się do zmian w otoczeniu biznesowym i potrzeb rynku.

Struktura zespołu zależy bezpośrednio od jego wielkości. W małych zespołach członkowie pełnią różnorodne funkcje, od rozwoju po negocjacje z klientem. Każdy członek zespołu pełni funkcję programisty, testera, analityka biznesowego i inżyniera serwisu. Dodatkowo są „implementatorzy”, którzy pełnią również funkcję kierowników projektów. Jest to typowe dla startupów, gdzie warunki zmieniają się szybko, a pracownicy ściśle ze sobą współpracują. Takie podejście pozwala zespołom zachować elastyczność i dostosować się do wymagań rynku, co jest ważnym aspektem udanego rozwoju biznesu.

Wraz z rozwojem firmy zaczynają się wyłaniać odrębne role, a jedną z pierwszych jest zespół wsparcia technicznego. Tę funkcję najtrudniej zaplanować, ponieważ nie da się z góry przewidzieć, kiedy i jakie problemy napotka klient. Następnie utworzono zespoły odpowiedzialne za interakcję z klientem i proces wdrożenia.

Nowoczesna struktura zespołu produktowego obejmuje programistów, testerów, menedżera produktu i analityków. Analitycy w zespole dzielą się na dwie kategorie: zewnętrznych, którzy przede wszystkim współpracują z klientami, oraz wewnętrznych, którzy koncentrują się na samym produkcie. Analitycy wewnętrzni formułują wymagania funkcjonalne w oparciu o mapę drogową i zajmują się innymi aspektami rozwoju. Taka struktura ułatwia efektywny rozwój produktu, równoważąc potrzeby techniczne i biznesowe.

Wielkość zespołu może się różnić w zależności od projektu i jego skali. Zazwyczaj zespół składa się z kilku osób do kilkudziesięciu specjalistów. Należy pamiętać, że liczba uczestników wpływa na efektywność pracy i komunikację w zespole. Zespół może składać się z różnych ról, takich jak kierownik projektu, programiści, projektanci i testerzy, co pozwala na osiągnięcie najlepszych rezultatów w realizacji przypisanych zadań.

Każdy produkt jest rozwijany przez osobny zespół, a liczebność tych zespołów może się znacznie różnić. W niektórych przypadkach zespoły składają się zaledwie z trzech osób, w innych mogą liczyć nawet dwadzieścia. Na przykład nasz flagowy zespół ds. rozwoju produktu składa się z 27 specjalistów. Zespół ten jest podzielony na podgrupy, z których każda odpowiada za określone funkcje i możliwości produktu.

Jaka jest struktura hierarchii zespołu?

Kwestia budowania poziomych i pionowych powiązań w zespole programistów jest ważnym aspektem organizacji przepływu pracy. Większość firm ma określoną hierarchię, która pomaga uporządkować interakcje między różnymi rolami. Zazwyczaj wygląda to następująco: na najniższym poziomie znajdują się prości programiści, którzy bezpośrednio zajmują się pisaniem kodu i rozwiązywaniem problemów technicznych. W miarę zdobywania kwalifikacji i doświadczenia mogą zostać głównymi lub starszymi programistami, którzy podejmują się bardziej złożonych projektów i mogą pełnić rolę mentorów dla mniej doświadczonych kolegów.

Kolejnym poziomem są liderzy zespołów i liderzy techniczni. Liderzy zespołów są odpowiedzialni za kierowanie zespołem, koordynację zadań i utrzymywanie efektywnej komunikacji między uczestnikami projektu. Liderzy techniczni z kolei koncentrują się na technicznych aspektach rozwoju, zapewniając zgodność ze standardami jakości i decyzjami architektonicznymi.

Na wyższym szczeblu znajdują się menedżerowie produktu i kierownicy projektów (PM), którzy zajmują się planowaniem strategicznym, definiowaniem wymagań produktowych i zarządzaniem projektami. Łączą zespół programistów z celami biznesowymi i klientami, zapewniając pomyślną realizację zadań.

Na samym szczycie hierarchii znajduje się wiceprezes ds. inżynierii i inni menedżerowie, którzy podejmują decyzje w całej firmie, określają kierunki rozwoju i odpowiadają za ogólne zarządzanie zespołami programistycznymi. Należy zauważyć, że każda z tych ról odgrywa unikalną rolę w procesie rozwoju, a skuteczna komunikacja między nimi ma kluczowe znaczenie dla pomyślnej realizacji projektów.

Projekt nie ma jasno określonych poziomów dla programistów. Biorąc pod uwagę jego długą historię i złożoną logikę biznesową, pełne zrozumienie wszystkich aspektów wymaga czasu. Programistów można z grubsza podzielić na doświadczonych i początkujących. Jednak kluczowe kwestie, takie jak decyzje architektoniczne czy istotne zmiany, są omawiane przez cały zespół programistów. Takie podejście sprzyja lepszemu zrozumieniu projektu i gwarantuje wysoką jakość realizacji zadań.

Niedawno stanęliśmy przed koniecznością stworzenia ujednoliconego systemu monitorowania wszystkich naszych produktów. Kluczowe było skoordynowanie działań między zespołami: ustalenie, jakich narzędzi używać, gdzie przenosić współdzielony kod i inne aspekty. Nie mamy scentralizowanego kierownictwa, które mogłoby ustalić jednolite zasady, więc zespoły mogą samodzielnie dochodzić do porozumień i to na razie wystarczy.

Kadr z filmu: Serial „Dolina Krzemowa” / HBO

Kierownicy produktu odgrywają kluczową rolę w tej historii, ponieważ odpowiadają za planowanie strategiczne i rozwój produktu. Ich zadaniem jest zrozumienie potrzeb użytkowników i rynku oraz koordynacja pracy różnych zespołów w celu osiągnięcia wspólnych celów. Kierownicy produktu analizują dane, zbierają opinie użytkowników i podejmują decyzje dotyczące funkcjonalności i projektu produktu. Działają jako łącznik między programistami, marketingowcami i klientami, zapewniając spójność wszystkich procesów. Co ważne, ich zaangażowanie na wszystkich etapach cyklu życia produktu przyczynia się do stworzenia udanego i pożądanego rozwiązania.

Kierownicy produktu w naszej firmie pełnią nie tylko funkcje zarządzania produktem, ale także aktywnie uczestniczą w zarządzaniu personelem. Oznacza to, że zarządzają zespołami i zapewniają efektywną interakcję między uczestnikami projektu. Takie podejście pozwala nam nie tylko tworzyć wysokiej jakości produkt, ale także rozwijać zespół, zwiększając jego produktywność i współpracę.

W rezultacie powstaje trójstopniowa struktura zarządzania projektem. Menedżer produktu odpowiada za rozwój produktu, zarządzanie zaległościami, przydzielanie zadań oraz interakcję z account managerami i analitykami obsługującymi klientów. Dział produkcji zajmuje się planowaniem, wdrażaniem, testowaniem regresji i przekazaniem projektu klientowi. Dodatkowo, każdy zespół – testowania, wsparcia i rozwoju – ma wyznaczonego lidera, który koordynuje komunikację wewnętrzną i monitoruje realizację zadań. Taka struktura zapewnia efektywną współpracę między różnymi rolami i przyczynia się do pomyślnego osiągnięcia celów projektu.

Programiści współpracują z różnymi działami związanymi z procesem rozwoju. Najczęściej ściśle współpracują z działem testowania, projektowania i zarządzania produktem. Dział testowania zapewnia jakość oprogramowania, dostarczając informacji zwrotnych na temat funkcjonalności i identyfikując błędy. Projektanci pomagają tworzyć przyjazny dla użytkownika i atrakcyjny interfejs, a menedżerowie produktu definiują wymagania i priorytety.

Relacje między programistami a innymi działami opierają się na otwartej komunikacji i współpracy. Regularne spotkania i wymiana informacji pomagają zapewnić jasne zrozumienie celów projektu i zwiększyć efektywność. Skuteczna współpraca przyczynia się do lepszego produktu końcowego i większego zadowolenia użytkowników.

Tradycyjne podejście polegające na ścisłym podziale firmy na działy, z których każdy wykonuje tylko swoją część zadania, staje się coraz bardziej przestarzałe. Takie podejście spowalnia komunikację, co negatywnie wpływa na wydajność pracy. Ważne jest, aby pracownicy aktywnie komunikowali się i dzielili się wiedzą, tworząc w ten sposób bardziej elastyczne i produktywne środowisko pracy. Lepsza komunikacja między działami ułatwia szybkie rozwiązywanie problemów i zwiększa ogólną produktywność firmy.

W naszej praktyce proces pracy nad główną funkcjonalnością rozpoczyna się od utworzenia wielofunkcyjnego zespołu składającego się z trzech do sześciu osób. W skład zespołu mogą wchodzić programiści, testerzy, analitycy, projektanci i programiści front-end. W ramach tej niewielkiej grupy członkowie samodzielnie ustalają najwygodniejsze metody pracy. Skład i liczba takich zespołów nie są stałe i różnią się w zależności od specyfiki każdej konkretnej funkcjonalności. Takie podejście pozwala na efektywne wykorzystanie zasobów i umożliwia adaptację do zmian w projekcie.

Jak kształtować wartości zespołu i przekazywać je wszystkim

Strategia produktu jest kształtowana w oparciu o dogłębne zrozumienie potrzeb użytkowników, analizę rynku i otoczenia konkurencyjnego. Proces ten rozpoczyna się od określenia kluczowych celów i zadań do osiągnięcia. Następnie ważne jest stworzenie jasnego i zrozumiałego opisu wizji produktu, który będzie służył jako przewodnik dla całego zespołu.

Aby skutecznie przekazać strategię programistom, stosuję kilka metod. Po pierwsze, ważne jest organizowanie spotkań roboczych, podczas których wszyscy członkowie zespołu mogą omawiać strategię i zadawać pytania. Pomaga to w stworzeniu wspólnej wizji i zrozumienia. Po drugie, tworzę dokumentację, która szczegółowo opisuje wszystkie aspekty strategii, w tym grupę docelową, kluczowe funkcje i korzyści płynące z produktu. Takie podejście zapewnia dostępność informacji i pozwala programistom lepiej nawigować po zadaniach.

Aktywnie korzystam również z narzędzi wizualnych, takich jak diagramy i schematy blokowe, które pomagają w przejrzysty sposób przedstawić strategię i jej elementy. Ułatwia to zrozumienie złożonych informacji i ułatwia ich przyswojenie. Regularna aktualizacja tej dokumentacji i otwartość na opinie zespołu pomagają zachować aktualność strategii i dostosować ją do zmian na rynku i potrzeb użytkowników.

Nasze produkty posiadają specyficzne funkcjonalności mające na celu normalizację dużych wolumenów danych. Dążymy do prawidłowego łączenia informacji i tworzenia uniwersalnego standardu dla danych klientów firmy. Aby to osiągnąć, stosujemy jasne wskaźniki, takie jak szybkość przetwarzania danych, jakość wyników, wskaźnik błędów i nasza pozycja konkurencyjna na rynku. Te wskaźniki pomagają nam ulepszać nasze rozwiązania i zapewniać wysoki poziom obsługi klienta.

Jest jeden aspekt naszej strategii, który jest mniej przewidywalny. W przeciwieństwie do usług SaaS, które mają stale rosnącą bazę klientów, mamy tylko kilkudziesięciu klientów. Nowi klienci pojawiają się średnio raz lub dwa razy w roku, a ich wymagania mogą się znacznie różnić. Na przykład, klient może zażądać ilości danych lub obciążenia online przekraczającego wszystkie nasze poprzednie projekty razem wzięte. Stwarza to nieoczekiwane wyzwania, których nie da się przewidzieć. Spotkaliśmy się już z podobnymi sytuacjami.

W naszym małym zespole ścisła komunikacja z programistami jest niezbędna. Aktywnie komunikuję im cele biznesowe, aby wszyscy byli na bieżąco. Nie przeciążamy procesu wieloma poziomami OKR-ów, ponieważ każdy jasno rozumie swoje zadania i cele. Skuteczna komunikacja pomaga nam osiągać sukcesy i dostarczać projekty na czas.

Nie tworzymy rozwiązań na zamówienie, ponieważ nasz model biznesowy różni się od tego podejścia. Nie jesteśmy w stanie zaspokoić wszystkich potrzeb klientów, dlatego ważne jest, aby utrzymać główny cel naszego produktu. Wymaga to ścisłej integracji między zarządzaniem produktem, przedsprzedażą i zespołem programistów. Pomoże to uniknąć desynchronizacji i zapewni, że wprowadzenie nowych funkcji nie doprowadzi do nowego kierunku lub rozwidlenia, które jest niezgodne z istniejącym rdzeniem produktu.

Planowanie i zarządzanie zespołem

Czy stosujesz metody planowania, takie jak planowanie długoterminowe, średnioterminowe, kwartalne, miesięczne lub sprintowe? Odpowiedni system planowania pozwala skutecznie zarządzać czasem i zasobami oraz osiągać cele. Określ, który system najlepiej sprawdzi się w Twojej pracy, aby zwiększyć produktywność i poprawić wyniki.

Planowanie długoterminowe jest istotne w kontekście projektów na dużą skalę. Na przykład mamy komponent odpowiedzialny za wyszukiwanie duplikatów, co polega na porównywaniu wszystkich rekordów ze sobą w dużych wolumenach danych w celu identyfikacji podobnych rekordów na podstawie określonych kryteriów. Zadanie to jest rozłożone na kilka produktów: jedna część jest rozwiązywana w jednej aplikacji, druga w innej, a ostateczne informacje są gromadzone w trzeciej. Udało nam się pomyślnie przeprowadzić ten proces, ale wkrótce zdaliśmy sobie sprawę, że przy naszym obecnym podejściu, za dwa lata będziemy musieli zmierzyć się z wolumenami danych, których nie będziemy w stanie przetworzyć w akceptowalnym czasie. Podkreśla to wagę planowania strategicznego i dostosowywania się do rosnących wolumenów danych, aby zapewnić wydajność i wydajność systemu w przyszłości.

Długoterminowe planowanie jest kluczowym aspektem udanego rozwoju firmy. Wyznaczyliśmy sobie znaczący cel, do którego dążyliśmy przez kilka lat, wykorzystując pracę kilku zespołów. Kluczowym krokiem było wdrożenie tego celu w sposób, który zapewnił wszystkim klientom nieprzerwane, wysokiej jakości usługi. Ten proces trwał dwa i pół roku.

Zarządzanie operacyjne w moim zespole obejmuje kilka kluczowych procesów, z których wyłaniają się zadania. Podstawą jest mapa drogowa produktu, która uwzględnia istotne funkcje i zmiany planowane na dany rok. Na tym pierwszym etapie zadania są formułowane na wysokim poziomie kwartalnie, a następnie szczegółowo rozdysponowywane na konkretne zadania i rozdzielane na sprinty, z uwzględnieniem dostępnych zasobów. Takie podejście gwarantuje efektywne planowanie i realizację projektów, co przyczynia się do osiągnięcia strategicznych celów firmy.

Wraz ze wzrostem wielkości naszych klientów, rośnie również ich zapotrzebowanie na szybką implementację niezbędnych funkcji. Naszym głównym celem jest zapewnienie rentowności, a jeśli klient jest skłonny zainwestować w funkcjonalność, która idealnie wpisuje się w nasze podstawowe założenia, chętnie mu pomożemy. Organizujemy naszą pracę nad projektem, wyznaczając jasne terminy i tworząc elastyczną mapę drogową, która, mimo podziału na kwartały, pozostaje elastyczna.

Produkt jest w fazie produkcyjnej, co pozwala nam na bieżąco otrzymywać opinie od użytkowników. Na podstawie tych informacji planujemy ulepszenia, naprawiamy ewentualne błędy i wprowadzamy drobne zmiany, których wdrożenie zajmuje nie więcej niż jeden dzień roboczy. Ta iteracyjna praca przyczynia się do poprawy jakości produktu i zadowolenia użytkowników.

Kadr: serial „Dolina Krzemowa” / HBO

Na refaktoryzację przeznaczono specjalny czas, np. jeden dzień w tygodniu. Dzięki temu zespół może skupić się na ulepszaniu kodu, zwiększaniu jego jakości i upraszczaniu przyszłej konserwacji. Regularna refaktoryzacja pomaga wyeliminować dług techniczny i poprawia wydajność aplikacji. Poświęcenie czasu na to zadanie jest ważną częścią procesu rozwoju, ponieważ pomaga zapobiegać kumulacji problemów i zwiększa czytelność kodu.

Próbowaliśmy różnych metod. Wcześniej przeznaczaliśmy na to dedykowany dzień, ale nie było to efektywne. Problem polegał na tym, że pozostałe zadania z poprzednich dni zakłócały koncentrację, a jeden dzień nie wystarczał na zajęcie się poważniejszymi problemami. W rezultacie mogliśmy naprawić tylko drobne usterki.

Wdrożyliśmy wydania techniczne jako osobny sprint skupiony wyłącznie na rozwiązywaniu długu technicznego i refaktoryzacji. Utrzymywaliśmy tę praktykę przez rok, ale wkrótce zdaliśmy sobie sprawę, że nie możemy poświęcić na te zadania całego sprintu, ponieważ mieliśmy zobowiązania wobec klientów z ustalonymi terminami. W rezultacie zaczęliśmy planować refaktoryzację i usuwanie długu technicznego w każdym sprincie, w oparciu o dostępne zasoby. W większości sprintów mogliśmy uwzględnić małe zadania, które zajmowały jeden lub dwa dni. W niektórych przypadkach udało nam się nawet poświęcić cały sprint na pracę nad aspektami technicznymi.

Jak przełożyć problem biznesowy na język programisty

Granica między problemami biznesowymi a zadaniami programisty często jest nieostra, ale można ją jasno zdefiniować. Problem biznesowy jest formułowany z naciskiem na potrzeby i cele firmy, na przykład zwiększenie sprzedaży lub poprawę obsługi klienta. Zadanie programisty wymaga natomiast podejścia technicznego, obejmującego zdefiniowanie architektury, technologii i algorytmów.

Przełożenie problemu biznesowego na techniczny odbywa się poprzez proces analizy i dekompozycji. Najpierw należy zrozumieć, jak cele biznesowe odnoszą się do konkretnych funkcji produktu. Następnie, w oparciu o te informacje, programiści mogą tworzyć jasne i mierzalne zadania, które można wdrożyć za pomocą programowania i technologii.

Dlatego ważne jest utrzymywanie komunikacji między analitykami biznesowymi a programistami, aby zapewnić przejrzystość i efektywność w przejściu od problemów biznesowych do rozwiązań technicznych. Taka współpraca pomaga stworzyć produkt, który nie tylko spełnia wymagania biznesowe, ale jest również wdrażany z wykorzystaniem nowoczesnych technologii.

Rozwiązywanie zadań w dużej mierze zależy od zespołu, który nad nimi pracuje. Mamy małą grupę i nie ma ścisłych standardów formułowania zadań. Istnieje wspólne podejście do opisywania zadań, ale konkretna realizacja zależy od programistów i analityków. Jeśli programista ma pytania, można je zidentyfikować na etapie planowania, co pomaga uniknąć nieporozumień i poprawia efektywność pracy.

Każde zadanie powinno mieć jasną formułę biznesową wyjaśniającą jego cel. Ważne jest, aby każdy pracownik rozumiał, dlaczego wykonuje swoją pracę, jaką wartość przynosi i komu dokładnie jest ona potrzebna. Motywacja oparta na świadomości znaczenia swojej pracy przyczynia się do zwiększenia efektywności i zaangażowania. To zrozumienie pomaga nie tylko w osiąganiu celów indywidualnych, ale także w osiąganiu ogólnych celów biznesowych.

Regularne wykonywanie zadań takich jak „zmień nazwę tego pola” lub „dodaj tabelę” bez dogłębnego zrozumienia ich celu, procesów i potencjalnych korzyści dla firmy może prowadzić do demotywacji pracowników. Ważne jest, aby zrozumieć, jak każde zadanie wpisuje się w ogólną strategię i jak może wpłynąć na wyniki finansowe firmy. Uwzględnienie tych aspektów nie tylko zwiększa motywację, ale także prowadzi do bardziej efektywnego wykonywania zadań, co z kolei przyczynia się do osiągania celów korporacyjnych.

Jak działają sprinty

Przyjrzyjmy się teraz bliżej sprintowi. Sprint jest kluczowym elementem metodyki Agile, reprezentującym okres czasu, w którym zespół pracuje nad konkretnym zadaniem lub projektem. Zazwyczaj sprint trwa od jednego do czterech tygodni.

Na początku sprintu zespół spotyka się na spotkaniu planistycznym, aby określić cele i zadania do realizacji. Uczestnicy omawiają priorytety i dzielą pracę na mniejsze zadania, które można wykonać w trakcie sprintu.

Podczas realizacji zadań zespół organizuje codzienne spotkania, aby omówić bieżące postępy, pojawiające się problemy i plany na dany dzień. Pozwala to na szybką reakcję na zmiany i utrzymanie wysokiego poziomu przejrzystości pracy.

Pod koniec sprintu zespół przeprowadza retrospektywę, aby przeanalizować wyniki, omówić, co poszło dobrze, a co można poprawić w przyszłości. Pozwala to zespołowi na ciągłe doskonalenie procesów i zwiększanie efektywności.

Dlatego sprint to ustrukturyzowany i efektywny sposób organizacji pracy zespołu, zapewniający elastyczność i możliwość szybkiego dostosowywania się do zmian.

W trakcie naszej pracy zespół przeszedł znaczące zmiany. Znacząco zwiększyliśmy zatrudnienie, a pandemia COVID-19 wywarła na nas silny wpływ. Wcześniej większość pracowników pracowała w biurze codziennie, a spotkania offline odbywały się dwa razy w tygodniu, a do organizacji procesów wykorzystywano tablice i karty. Teraz dostosowaliśmy się do nowych warunków i z powodzeniem kontynuujemy współpracę zdalną, co pozwala nam utrzymać wysoką produktywność i efektywność.

Podczas lockdownu przeszliśmy na całkowicie zdalny tryb pracy i nie wszyscy pracownicy wrócili jeszcze do biura. Część zespołu nadal pracuje zdalnie, reszta wybrała format hybrydowy. Dostosowaliśmy się do nowych warunków, chociaż przed pandemią miałem wątpliwości co do skuteczności pracy zdalnej.

Wcześniej przeanalizowaliśmy zestaw zadań oszacowanych przez analityków na podstawie czasu i zasobów potrzebnych do ich wykonania. Zadania te zostały zorganizowane w osobne pola w Jira. Zebraliśmy wolumen zadań dla sprintu, biorąc pod uwagę jego pojemność, i nadaliśmy im priorytety na podstawie ważności, złożoności i liczby klientów. Takie podejście pozwala nam efektywnie zarządzać projektami i terminowo osiągać cele.

Stosowaliśmy dwutygodniowe sprinty. Spotkania synchronizacyjne odbywały się raz lub dwa razy w tygodniu, aby omówić bieżące zadania, etapy ich realizacji i wszelkie pojawiające się problemy. Pod koniec sprintu osiągnięto jasne zrozumienie tego, co zostało osiągnięte, a co pozostało nierozwiązane. Po sprincie wydano wersję, która przeszła testy regresyjne dla konkretnych klientów. Następnie kompilacje zostały przekazane do wsparcia technicznego w celu wdrożenia. Takie podejście zapewnia efektywne zarządzanie projektem i minimalizuje ryzyko związane z rozwojem. Ponieważ klientami są duże firmy, informacje zwrotne od nich były opóźnione. Następnie przeprowadziliśmy retrospektywę: po każdym sprincie spotykaliśmy się, aby omówić pozytywne i negatywne aspekty, a także zmiany, które należało wprowadzić w przepływie pracy. Pomogło nam to poprawić jakość naszej pracy i zwiększyć zadowolenie klientów. Pandemia przyniosła znaczące zmiany w procesach pracy zespołu. Zespół, charakteryzujący się wysokim poziomem współpracy, z powodzeniem dostosował się do nowych warunków. Wszelkie rytuały synchronizacyjne zostały wyeliminowane, ponieważ członkowie zespołu zaczęli się rozumieć bez słów. Przepływ pracy stał się bardziej wydajny, a opóźnienia minimalne. Retrospektywy odbywały się co dwa sprinty, co pozwoliło nam skupić się na wynikach i usprawnianiu procesów. Trudności pojawiały się wraz z rozwojem zespołu. Dodanie nowych pracowników zburzyło dotychczasowe wzajemne porozumienie, które istniało bez dodatkowych rytuałów. W odpowiedzi na te wyzwania wdrożyliśmy format mini-zespołu, w którym każdy koncentrował się na rozwijaniu konkretnych funkcji i tworzeniu wokół nich efektywnych procesów. To rozwiązanie usprawniło komunikację i zwiększyło produktywność.

Stosowaliśmy dwa podejścia. Jeśli członkowie zespołu się znali, mogli sobie poradzić bez dodatkowych rytuałów. Jednak gdy do zespołu dołączali nowi członkowie, co zdarzało się dość często, synchronizacja była niezbędna. Pozwalało nam to szybko otrzymywać informacje zwrotne od nowych członków zespołu i zapewniać im skuteczne wsparcie.

Retrospektywy stały się dla nas gorącym tematem. Nie przeprowadzaliśmy ich od dawna i próbowaliśmy różnych formatów, ale wciąż nie znaleźliśmy optymalnego rozwiązania. Postanowiliśmy skupić się na retrospektywach opartych na studium przypadku. Jeśli podczas rozwoju funkcji lub interakcji pojawią się problemy, tworzymy 10-osobowy zespół znający sytuację i szczegółowo analizujemy przypadek. Takie podejście pozwala nam zidentyfikować przyczyny niepowodzeń i opracować skuteczne rozwiązania dla przyszłych projektów.

Szacując zakres zadań, poker wykorzystuje zarówno formalny proces, jak i podejście intuicyjne. Zespoły często stosują metodę pokera planistycznego, w której każdy członek głosuje nad swoją oceną w oparciu o własne założenia i doświadczenie. Pozwala nam to zebrać opinie i osiągnąć konsensus. Takie podejście zapewnia bardziej obiektywną ocenę i minimalizuje wpływ czynników subiektywnych. Łącząc metody formalne z intuicyjnymi szacunkami, możemy osiągnąć dokładniejsze zrozumienie zakresu zadań.

Poker nie jest wykorzystywany w naszym procesie, ale metoda planowania uległa znaczącej zmianie. Doszliśmy do wniosku, że nie ma potrzeby gromadzenia wszystkich uczestników na jednym ogólnym spotkaniu. Obecnie stosujemy asynchroniczne podejście do szacowania zadań. Proces ten odbywa się w ramach ogólnego czatu, gdzie zadania są przyjmowane do szacowania. Za szacowanie odpowiada jedna konkretna osoba, ale wszyscy uczestnicy mają dostęp do szacowań i mogą w razie potrzeby wprowadzać korekty. Takie podejście zapewnia większą elastyczność i efektywność procesu planowania.

Po szacowaniu rozpoczyna się etap planowania. W tym procesie sprint jest wypełniany z uwzględnieniem dostępnych zasobów, szacowanych zadań i wcześniej ustalonych priorytetów. Należy pamiętać, że odpowiednie planowanie przyczynia się do efektywnego podziału czasu pracy i zwiększa produktywność zespołu.

Jak ocenić, czy zespół ukończył zadanie

Co dzieje się dalej? Czy istnieją jakieś kryteria, według których można określić, czy zadanie zostało ukończone prawidłowo? Kiedy praca jest uznawana za zaakceptowaną? Mogą to być testy, przeglądy kodu i inne czynniki. Ważne jest ustalenie jasnych standardów, które pomogą ocenić jakość wykonania zadania i zapewnią spełnienie wszystkich wymagań.

Półtora roku temu nie przeprowadzaliśmy przeglądów kodu, ponieważ wszyscy programiści mieli wystarczające doświadczenie. Jednak wraz z rozwojem zespołu pojawiła się potrzeba przeprowadzania przeglądów kodu w razie potrzeby. W tym procesie zdaliśmy sobie sprawę z wagi stworzenia ciągłego procesu. Obecnie Jira ma oddzielny status, który pozwala przypisać recenzenta. Przeprowadza on przegląd kodu zadania, a dopiero wtedy zadanie jest uznawane za ukończone. Poprawia to jakość kodu i współpracę w zespole.

Każde zadanie ma przypisanego testera zamykającego, który dodatkowo wzbogaca testy automatyczne o scenariusze. Proces testowania jest w pełni zautomatyzowany. Korzystamy z własnego frameworka testowania opartego na danych, który umożliwia efektywne zarządzanie danymi. To podejście wymaga zdefiniowania stanu początkowego i końcowego danych oraz wykonania operacji między nimi, co tworzy przypadki testowe. Testowanie odbywa się z wykorzystaniem frameworka na różnych poziomach, w tym na poziomie usług i na pełnym testowaniu integracyjnym. Na poziomie integracji uruchamiamy dwa lub trzy nasze produkty, które ze sobą współdziałają, co pozwala nam testować ich kompatybilność i funkcjonalność w warunkach rzeczywistych.

Warunkiem przejścia zadania do statusu „zakończone” jest brak nieudanych testów. Nasz system testowania obejmuje dziesiątki tysięcy testów. Następnie analizujemy wyniki wspólnie z testerem, określając, które testy zakończyły się niepowodzeniem, a które nie. W przypadku zidentyfikowania jakichkolwiek problemów zadanie jest zwracane do działu rozwoju w celu dalszego debugowania. Takie podejście zapewnia wysoką jakość produktu i minimalizuje ryzyko w trakcie procesu rozwoju.

Tworzenie nowej funkcjonalności jest ważnym etapem w procesie tworzenia produktu. Rozważmy konkretny przykład dodania funkcji wyszukiwania na stronie internetowej.

Na etapie początkowym zespół zbiera wymagania, określając, które parametry muszą zostać uwzględnione w wyszukiwarce. Następnie tworzony jest prototyp interfejsu, który demonstruje, jak będzie wyglądać funkcja wyszukiwania. Na etapie rozwoju programiści wdrażają algorytmy zapewniające efektywne wyszukiwanie danych oraz integrację z bazą danych.

Po zakończeniu rozwoju funkcja jest testowana, gdzie sprawdzana jest jej wydajność i dokładność. Ważne jest, aby użytkownicy mogli szybko i łatwo znaleźć potrzebne informacje. Po naprawieniu wszystkich wykrytych błędów funkcja jest uruchamiana.

Przykład tworzenia funkcji wyszukiwania na stronie internetowej pokazuje zatem, jak złożony proces, obejmujący zbieranie wymagań, prototypowanie, programowanie i testowanie, przechodzi od pomysłu do wdrożenia. Takie podejście gwarantuje stworzenie wysokiej jakości produktu, który spełnia oczekiwania użytkowników.

W przypadku zgłoszeń dotyczących problemów z wydajnością konieczna jest szybka reakcja. Jeśli nasz serwis zaczął wolniej przetwarzać zgłoszenia, warto przeprowadzić kompleksową analizę. Dobrym początkiem jest sprawdzenie obciążenia serwera i zidentyfikowanie ewentualnych wąskich gardeł w infrastrukturze. Pomocna jest również analiza logów i identyfikacja możliwych przyczyn spowolnienia. Optymalizacja kodu i wydajności bazy danych może znacznie poprawić szybkość działania usługi. Regularne monitorowanie wydajności systemu jest niezbędne do proaktywnego identyfikowania potencjalnych problemów i szybkiego ich rozwiązywania.

Opracowaliśmy specjalistyczny proces i wdrożyliśmy szereg przydatnych funkcji, które upraszczają analizę wydajności naszego produktu. W przypadku wystąpienia określonych czynników wyzwalających, takich jak wydłużenie czasu reakcji dla określonej metody API, system automatycznie aktywuje profilowanie. W takim przypadku uruchamiany jest Flight Recorder, umożliwiający efektywne monitorowanie i analizę wydajności.

Gromadzimy dane za pomocą nmon, co pozwala nam analizować stan procesora, dysku i innych komponentów systemu. Wszystkie zebrane metryki są następnie przekazywane przez inżyniera wsparcia do dewelopera w celu analizy. Po tym możliwe są dwa scenariusze.

Pierwszym problemem, który można rozwiązać w 10 minut, jest nadmierny dostęp do bazy danych. Na przykład, trzykrotne żądanie tej samej wartości powoduje niepotrzebne zużycie zasobów i spowalnia działanie aplikacji. Optymalizacja zapytań do bazy danych nie tylko przyspiesza proces, ale także zmniejsza obciążenie serwera. Zaleca się korzystanie z buforowania danych lub przechowywanie wyników w zmiennych, aby uniknąć powtarzających się żądań. Poprawa wydajności aplikacji jest bezpośrednio związana z efektywnym zarządzaniem żądaniami do bazy danych.

Drugi, bardziej złożony rodzaj problemu pojawia się, gdy charakter problemu jest jasny, ale jego rozwiązanie wymaga znacznych zasobów. Przykładem jest refaktoryzacja całego modułu. Natychmiastowe wdrożenie takich zmian nie zawsze jest praktyczne, dlatego rozpoczynamy planowanie. Ważne jest, aby przeanalizować, czy inni klienci napotkali podobne problemy. Szacujemy również częstotliwość występowania tego problemu w przyszłości: jeśli występuje on często, sensowne jest zaplanowanie jego rozwiązania na kolejny sprint. Kolejny etap obejmuje szczegółowe planowanie rozwoju i sam proces rozwoju. Takie podejście pozwala na efektywne zarządzanie zasobami i minimalizuje ryzyko.

Jak mogę sprawdzić, czy problem został rozwiązany? Jednym z najprostszych sposobów jest wdrożenie zmian na produkcji i obserwacja rezultatów. Mamy jednak cztery różne testy obciążeniowe dostosowane do różnych baz danych. Używamy tych platform do symulacji średniego obciążenia i typowego stanu danych, z którymi pracują nasi klienci. Pozwala nam to dokładniej ocenić skuteczność rozwiązania i zminimalizować ryzyko podczas wdrażania aktualizacji.

Analizujemy metryki i stosujemy metody inżynierii chaosu, aby symulować złożone sytuacje. Obejmuje to zwiększenie opóźnienia odpowiedzi bazy danych i zmianę parametrów sprzętowych podczas działania produktu. Takie podejście pomaga nam lepiej zrozumieć, jak system reaguje na niestandardowe warunki, i zapewnia jego stabilność i niezawodność.