Close

Ujemna prędkość: jak podnieść granicę złożoności


Jednym z najczęstszych celów organizacji inżynieryjnych jest szybkie dostarczanie wysokiej jakości oprogramowania.

Przyjrzyj się wizji dyrektora ds. informatycznych i dyrektora ds. technicznych w swojej firmie i posłuchaj, co mówią te osoby. Prawdopodobnie dążą do osiągnięcia jakiejś permutacji tego celu. Choć jest to często stawiany cel, spektrum jego realizacji jest szerokie — od zespołów, które osiągają znakomite rezultaty, po zespoły które utknęły w odmętach dostarczania oprogramowania. Niektóre zespoły konsekwentnie wprowadzają do produkcji nowy kod, napotykając nieliczne incydenty i wywierając niewielki negatywny wpływ na klientów, podczas gdy inne mają problemy z wydaniami kwartalnymi.

Jednym z najczęstszych celów organizacji inżynieryjnych jest szybkie dostarczanie wysokiej jakości oprogramowania.

Przyjrzyj się wizji dyrektora ds. informatycznych i dyrektora ds. technicznych w swojej firmie i posłuchaj, co mówią te osoby. Prawdopodobnie dążą do osiągnięcia jakiejś permutacji tego celu. Choć jest to często stawiany cel, spektrum jego realizacji jest szerokie — od zespołów, które osiągają znakomite rezultaty, po zespoły które utknęły w odmętach dostarczania oprogramowania. Niektóre zespoły konsekwentnie wprowadzają do produkcji nowy kod, napotykając nieliczne incydenty i wywierając niewielki negatywny wpływ na klientów, podczas gdy inne mają problemy z wydaniami kwartalnymi.

Co powoduje tę rozbieżność w wydajności?


W przypadku dostarczania oprogramowania złożoność to różnica między szybkim dostarczaniem wysokiej jakości oprogramowania a… brakiem dostarczania. Jest to różnica między biciem co tydzień w dzwon zwycięstwa po udanym wydaniu a frustracją niezaangażowanego zespołu, który po miesiącach pracy nad najnowszą wersją uzyskuje efekt w postaci sześciu nowych błędów i przywracania.

Porównajmy prędkość i jakość dostarczania nowych produktów i funkcji przez startupy z tymi samymi parametrami w dużej organizacji o ugruntowanej pozycji. Przykładowo w ciągu ostatniej dekady w branży finansowej startupy fintech spowodowały zmniejszenie udziału rynkowego dużych banków o ugruntowanej pozycji. Duże banki często powołują się na nieuczciwą przewagę startupów fintech, które funkcjonują pod mniejszym nadzorem regulacyjnym i nie muszą utrzymywać starszych, monolitycznych zestawów aplikacji. Mniejsze zespoły oznaczają większą zwinność i możliwość dostosowywania się w zależności od potrzeb klienta. Zasadniczo fintechy nie są tak złożone jak uznane banki, co pozwala im działać szybciej przy mniejszym ryzyku. Chociaż złożoność może spowalniać zespoły programistyczne, nie zawsze jest zła.

Globalna sieć
materiały pokrewne

Ograniczenie nadmiernej rozbudowy oprogramowania

ikona trzech pierścieni
POZNAJ ROZWIĄZANIE

Zarządzanie komponentami za pomocą rozwiązania Compass

Złożoność dostarczania oprogramowania


Złożoność może być dobra: rozwiązywanie zawiłych problemów jest niezwykle satysfakcjonujące. Motywuje zespoły, aby sprostać wyzwaniom, rozwiązywać trudne problemy i dokonywać przełomów. I odwrotnie — od pewnego momentu złożoność nie polega już na rozwiązywaniu trudnych problemów i wywiera negatywny wpływ na zespoły programistyczne.

Złożoność organizacyjna odgrywa zasadniczą rolę w ograniczaniu efektywności zespołów programistycznych. Słownikowo złożoność jest definiowana jako stan posiadania wielu różnych części połączonych lub powiązanych ze sobą w skomplikowany sposób. W praktyce złożoność organizacyjna to agregat informacji, zależności, zmian, innych zespołów, narzędzi i wniosków, po których zespoły oprogramowania muszą poruszać się podczas wchodzenia w interakcje z pozostałą częścią organizacji.

Wyższy poziom złożoności organizacyjnej naturalnie utrudnia szybkie dostarczanie wysokiej jakości oprogramowania, ponieważ zespoły spędzają więcej czasu na poruszaniu się po organizacji niż na rozwiązywaniu zawiłych problemów. Rosnące organizacje szybko przekonują się, że zespoły programistyczne osiągają granicę złożoności — stopień złożoności, którego przekroczenie negatywnie wpływa na działanie zespołu, zadowolenie z pracy oraz na jakość oprogramowania i prędkość jego dostarczania. Może się zatem wydawać logiczne, że zmniejszenie złożoności organizacyjnej pozwala zespołom skupić się na rozwiązywaniu zawiłych problemów, dostarczaniu oprogramowania szybciej i w wyższej jakości. Zastanówmy się, dlaczego niekoniecznie tak jest.

Wpływ złożoności na zespół programistyczny


Wprowadzenie architektury mikrousług stanowi dobry przykład wpływu złożoności na zespoły programistyczne. Definicja złożoności jest również doskonałym opisem architektury mikrousług: stan posiadania wielu różnych części połączonych lub powiązanych ze sobą w skomplikowany sposób. To prawda, że mikrousługi pozwalają zespołom na samodzielne działanie, szybsze dostarczanie i bezpieczne skalowanie systemów — jestem wielkim fanem mikrousług — jednak bez wątpienia takie podejście znacznie zwiększa złożoność.

Przyjrzyjmy się efektywności zespołów programistycznych w Atlassian podczas wieloletniej drogi, która doprowadziła do przyjęcia architektury mikrousług.

Na początku drogi Atlassian do mikrousług wskaźniki DORA wyglądały świetnie! Mniejsze porcje kodu ułatwiły testowanie i wdrażanie, umożliwiając zespołom bezpieczne i szybsze działanie, a zadowolenie z pracy było wysokie. Podczas tej fazy zespoły czerpały oczekiwane korzyści z architektury mikrousług. Chociaż złożoność wzrosła, nie miało to negatywnego wpływu na zespoły.

Best for CI/CD: Bitbucket

początek drogi do mikrousług

Korzyści związane z architekturą mikrousług spowodowały, że w organizacji zaczęto szerzej wdrażać to podejście, co naturalnie zwiększyło złożoność organizacyjną. Bardziej autonomiczne zespoły wymagały większej współpracy, a więcej mikrousług oznaczało więcej zależności. Tempo zmian gwałtownie wzrosło i pojawiły się wszystkie oznaki niekontrolowanego rozwoju oprogramowania. Zwiększona złożoność spowodowała ograniczenie efektywności zespołów programistycznych, na co wskazywał spadek prędkość zmian, a jednocześnie problemem stało się obciążenie poznawcze.

Best version control system: Git

Przy braku interwencji organizacja ostatecznie osiągnęła granicę złożoności, a skuteczność zespołu programistycznego spadła. Korzyści płynące z szybkości, autonomii i jakości, które były widoczne na początku drogi do mikrousług, odeszły w niepamięć, co spowodowało zrozumiały spadek zadowolenia programistów. Wszystko to wskazuje, że organizacja osiągnęła granicę złożoności. Zespół programistyczny wkłada więcej wysiłku w poruszanie się po złożoności organizacyjnej niż w rozwiązywanie zawiłych problemów — zero frajdy.

Best for application deployment: Ansible

Przy braku interwencji organizacja ostatecznie osiągnęła granicę złożoności, a skuteczność zespołu programistycznego spadła. Korzyści płynące z szybkości, autonomii i jakości, które były widoczne na początku drogi do mikrousług, odeszły w niepamięć, co spowodowało zrozumiały spadek zadowolenia programistów. Wszystko to wskazuje, że organizacja osiągnęła granicę złożoności. Zespół programistyczny wkłada więcej wysiłku w poruszanie się po złożoności organizacyjnej niż w rozwiązywanie zawiłych problemów — zero frajdy.

Best for infrastructure automation: Chef

Przy braku interwencji organizacja ostatecznie osiągnęła granicę złożoności, a skuteczność zespołu programistycznego spadła. Korzyści płynące z szybkości, autonomii i jakości, które były widoczne na początku drogi do mikrousług, odeszły w niepamięć, co spowodowało zrozumiały spadek zadowolenia programistów. Wszystko to wskazuje, że organizacja osiągnęła granicę złożoności. Zespół programistyczny wkłada więcej wysiłku w poruszanie się po złożoności organizacyjnej niż w rozwiązywanie zawiłych problemów — zero frajdy.

Best for large-scale configurations: Puppet

Przy braku interwencji organizacja ostatecznie osiągnęła granicę złożoności, a skuteczność zespołu programistycznego spadła. Korzyści płynące z szybkości, autonomii i jakości, które były widoczne na początku drogi do mikrousług, odeszły w niepamięć, co spowodowało zrozumiały spadek zadowolenia programistów. Wszystko to wskazuje, że organizacja osiągnęła granicę złożoności. Zespół programistyczny wkłada więcej wysiłku w poruszanie się po złożoności organizacyjnej niż w rozwiązywanie zawiłych problemów — zero frajdy.

Best for automating workflows: Bitbucket Pipelines

osiągnięcie granicy złożoności

Przy braku interwencji organizacja ostatecznie osiągnęła granicę złożoności, a skuteczność zespołu programistycznego spadła. Korzyści płynące z szybkości, autonomii i jakości, które były widoczne na początku drogi do mikrousług, odeszły w niepamięć, co spowodowało zrozumiały spadek zadowolenia programistów. Wszystko to wskazuje, że organizacja osiągnęła granicę złożoności. Zespół programistyczny wkłada więcej wysiłku w poruszanie się po złożoności organizacyjnej niż w rozwiązywanie zawiłych problemów — zero frajdy.

Best for high-speed and scalability: SaltStack

Przy braku interwencji organizacja ostatecznie osiągnęła granicę złożoności, a skuteczność zespołu programistycznego spadła. Korzyści płynące z szybkości, autonomii i jakości, które były widoczne na początku drogi do mikrousług, odeszły w niepamięć, co spowodowało zrozumiały spadek zadowolenia programistów. Wszystko to wskazuje, że organizacja osiągnęła granicę złożoności. Zespół programistyczny wkłada więcej wysiłku w poruszanie się po złożoności organizacyjnej niż w rozwiązywanie zawiłych problemów — zero frajdy.

Best for problem management: Jira Service Management

Przy braku interwencji organizacja ostatecznie osiągnęła granicę złożoności, a skuteczność zespołu programistycznego spadła. Korzyści płynące z szybkości, autonomii i jakości, które były widoczne na początku drogi do mikrousług, odeszły w niepamięć, co spowodowało zrozumiały spadek zadowolenia programistów. Wszystko to wskazuje, że organizacja osiągnęła granicę złożoności. Zespół programistyczny wkłada więcej wysiłku w poruszanie się po złożoności organizacyjnej niż w rozwiązywanie zawiłych problemów — zero frajdy.

Best for container orchestration: Kubernetes

Przy braku interwencji organizacja ostatecznie osiągnęła granicę złożoności, a skuteczność zespołu programistycznego spadła. Korzyści płynące z szybkości, autonomii i jakości, które były widoczne na początku drogi do mikrousług, odeszły w niepamięć, co spowodowało zrozumiały spadek zadowolenia programistów. Wszystko to wskazuje, że organizacja osiągnęła granicę złożoności. Zespół programistyczny wkłada więcej wysiłku w poruszanie się po złożoności organizacyjnej niż w rozwiązywanie zawiłych problemów — zero frajdy.

Jak sprawdzić, czy granica złożoności jest blisko


Osiągnięcie granicy złożoności wydaje się nieuniknione, ale istnieją oznaki pozwalające stwierdzić, że zespół zbliża się do niej. Najpierw jednak muszę zaznaczyć, że nie ma bezwzględnego wskaźnika, który pokazuje, ile dzieli Cię od granicy złożoności, jednak opisane poniżej oznaki mogą pomóc Ci w ustaleniu, ile zostało Ci do tej.

Najbardziej oczywistą oznaką, że zespół osiągnął granicę złożoności, jest to, że spędza więcej czasu na poruszaniu się po złożoności organizacyjnej niż na rozwiązywaniu zawiłych problemów, na których powinien się skupić. Przyjrzenie się tendencjom czasu wdrażania zmian (prędkość) i wskaźników błędnych zmian (jakość) wg DORA pozwala zorientować się, czy zespoły zwalniają, czy przyspieszają. Chociaż na te wskaźniki wpływają też inne elementy, są dobrą oznaką efektywności zespołu.

Zadowolenie programistów jest kolejną oznaką tego, po jak dużej złożoności organizacyjnej muszą poruszać się zespoły programistyczne. W porównaniu z innymi rolami w firmie programiści bardziej lubią spędzać czas na rozwiązywaniu zawiłych problemów, a jednocześnie czują większą niechęć do wykonywania niepotrzebnych zadań, które w tym przeszkadzają. Niski poziom zadowolenia programistów jest dobrą oznaką, że złożoność organizacyjna jest problemem w zespole programistycznym.

Upraszczanie to strategia przegrywania


Kiedy firmy zdają sobie sprawę, że ich zespoły toną w złożoności, często uruchamiają „projekt upraszczania” mający na celu przywrócenie prostoty w organizacji. Upraszczanie jest strategią przegrywania z dwóch powodów: złożoność rośnie szybciej w porównaniu z tempem upraszczania środowiska przez dowolną organizację, a „projekty upraszczania” funkcjonują w złożonym środowisku, które zgodnie z założeniem mają uprościć.

Częstym punktem wyjścia do upraszczania jest zmniejszenie liczby aplikacji poprzez wycofanie lub konsolidację tam, gdzie to możliwe. Wycofanie aplikacji wymaga od zespołu zrozumienia wszystkich zależności w procesach poprzedzających i następczych, określenia, kto korzysta z aplikacji, jak zastąpić funkcjonalność, gdzie i w jaki sposób zostanie przeprowadzona archiwizacja i migracja danych, a także radzenia sobie z wieloma innymi komplikacjami, które pojawiają się przy tego rodzaju pracy. Niestety znaczące nakłady wysiłku zainwestowanego w ten proces nie są nagradzane równie znaczącym zmniejszeniem złożoności. Istnieje granica liczby aplikacji, które firma może wycofać bez wpływu na podstawową działalność lub środowisko użytkownika, ale nie ma ograniczeń co do liczby nowych komponentów oprogramowania, które inżynierowie mogą stworzyć. W ciągu 12 miesięcy potrzebnych do wycofania jednej aplikacji prawdopodobnie powstały setki nowych mikrousług. Ponieważ prawidłowe środowisko technologiczne rozwija się z czasem, utrzymywanie w środowisku stałej liczby aplikacji lub komponentów oprogramowania w celu zmniejszenia złożoności jest niewykonalne.

Projekty upraszczania zazwyczaj obejmują przekształcenie struktury organizacyjnej w celu usunięcia złożoności przepływu komunikacji. Najmniej skomplikowane struktury organizacyjne obejmują duże zespoły hierarchiczne pracujące w jednym miejscu. Najbardziej skomplikowane struktury organizacyjne obejmują małe, rozproszone i autonomiczne zespoły. Prawo Conwaya pokazuje, że duże zespoły hierarchiczne prawdopodobnie będą tworzyć monolityczne aplikacje, natomiast małe zespoły rozproszone prawdopodobnie będą tworzyć aplikacje wykorzystujące architektury modułowe takie jak mikrousługi. Szybkie wytwarzanie wysokiej jakości oprogramowania jest możliwe dzięki modułowym wzorcom architektury, takim jak architektura mikrousług, co oznacza, że bardziej złożona struktura organizacyjna może prowadzić do sukcesu. Chociaż „uproszczenie” struktury organizacyjnej ułatwia jej zrozumienie, uzyskany efekt projektu uproszczenia jest przeciwny do zamierzonego.

Upraszczanie jest ważne i opłacalne, ale najlepiej sprawdza się jako integralna część ciągłego doskonalenia zespołów programistycznych (i współpracujących ze sobą zespołów), a nie jednorazowe działanie. Upraszczanie może opóźnić osiągnięcie granicy złożoności, ale nie przywróci w organizacji szybkości i swobody charakterystycznych dla startupów.

Podniesienie granicy złożoności


How do configuration management tools enhance collaboration in software teams?

Aby przywrócić efektywność zespołu programistycznego, organizacje muszą podnieść granicę złożoności. Podniesienie granicy złożoności zasadniczo oznacza zwiększenie złożoności organizacyjnej do poziomu, którego przekroczenie negatywnie wpływa na działanie zespołu, zadowolenie z pracy oraz na jakość oprogramowania i szybkość jego dostarczania.

Inżynieria platform jest ważną koncepcją w dążeniu do podniesienia granicy złożoności organizacyjnej. Silne zespoły inżynierów platform koncentrują się na zmniejszaniu obciążenia poznawczego zespołów programistycznych poprzez oddzielenie złożoności organizacyjnej od ich codziennej pracy. Prawidłowo wdrożona inżynieria platform umożliwia zespołom zrównoważenie wielu wysiłków związanych z rozwiązywaniem zawiłych problemów dzięki mniejszej ilości czasu poświęcanego na poruszanie się po złożoności organizacyjnej.

How do you start with Bitbucket for configuration management?

Właśnie po to w Atlassian powstała platforma środowiska programistycznego Compass. Compass pomaga w podniesieniu granicy złożoności, ułatwiając zespołom programistycznym poruszanie się po złożoności organizacyjnej poprzez katalog komponentów, wskaźniki i karty wyników oraz skupienie się na tworzeniu zdrowej kultury inżynieryjnej. W tym miejscu należy wyjaśnić, że w Atlassian złożoność organizacyjna nie zmniejszyła się, a wręcz nadal rosła, gdy organizacja stopniowo przenosiła się do architektury mikrousług. Ograniczyliśmy czas spędzany przez zespoły programistyczne na poruszaniu się po tej złożoności, bo na tym właśnie polega różnica między projektem upraszczania a podniesieniem granicy złożoności.

Atlassian zatrudnia ponad 10 000 pracowników i dysponuje ponad 17 000 komponentami oprogramowania, ale nasze zespoły programistyczne działają w dużej mierze ze swobodą startupów, szybko dostarczając wysokiej jakości oprogramowanie. Nasz klucz do sukcesu? Podniesienie granicy złożoności w celu poprawy efektywności zespołów programistycznych.

Podnoszenie granicy złożoności można rozpocząć od dwóch punktów:

  • Śledzenie i ocenianie wskaźników DORA. Co wskaźniki DORA mówią o Twoim zespole? Jeśli jeszcze nie śledzisz wskaźników DORA, znajdziesz je w gotowej postaci w narzędziu Compass.
  • Zrozumienie i ocenianie zadowolenia programistów. Jak się czują programiści w Twoich zespołach? Większość organizacji przeprowadza badania zadowolenia pracowników. Zapytaj o wyniki z podziałem na obszary funkcjonalne, aby uzyskać wgląd w zadowolenie programistów. Kluczowe pytania obejmują ocenę następujących stwierdzeń:
    • W momencie dostarczania odczuwam dumę
    • Ilość stresu w mojej pracy jest akceptowalna
    • Rozumiem, w jaki sposób moja praca przyczynia się do realizacji celów firmy

Innym sposób polega na uzyskaniu tych informacji za pośrednictwem portalu Compass podczas rytuału CheckOps, w ramach którego zespoły dzielą się swoimi opiniami z ostatniego tygodnia i wskazują, co mogło pójść lepiej.

Podniesienie granicy złożoności wymaga połączenia narzędzi, procesów i rytuałów. Platforma środowiska programistycznego, taka jak Compass, może pomóc w zrozumieniu kondycji systemu, mapowaniu zależności i tworzeniu rytuałów, pomagając podnieść granicę złożoności i uwolnić potencjał zespołów dostarczających oprogramowanie w Twojej organizacji.

Wypróbuj Compass bezpłatnie już dziś.


Udostępnij ten artykuł

Zalecane lektury

Dodaj te zasoby do zakładek, aby dowiedzieć się więcej na temat rodzajów zespołów DevOps lub otrzymywać aktualności na temat metodyki DevOps w Atlassian.

Ilustracja DevOps

Społeczność rozwiązania Compass

ilustracja przedstawiająca pokonywanie przeszkód

Samouczek: Tworzenie komponentu

Ilustracja przedstawiająca mapę

Zacznij korzystać z Compass za darmo

Zapisz się do newslettera DevOps

Thank you for signing up