Przeczytaj wersję webową.

Wahadło Proof of Concept

2024-05-30

Cześć!

Już prawie lato, więc w wakacyjnym klimacie dzisiejszy temat też wlatuje gorący 🔥

Przyjrzymy się problemowi, który często dotyka organizacje – kwestii utrzymania PoC na produkcji i tego, jak reagują na to zespoły inżynierskie. Bo to właśnie sprawia, że organizacja z jednej strony nie potrafi eksperymentować, a z drugiej - nie jest w stanie poprawiać tego co już ma.

Jak zwykle, czekają Ciebie też najciekawsze artykuły z ostatnich kilku tygodni.

A więc w dzisiaj mam dla Ciebie:

Miłego czytania 😀


Inżynierska prasówka

Dziś rozpoczniemy od mocnych słów DHH, a skończymy na migracji bazy danych w Uberze. A pomiędzy? Modularny monolit, code review i Copilot, czyli same ciekawostki.

  1. System tests have failed
    David nie zostawia jeńców w swoich artykułach. Ale trzeba przyznać, że ma w tym dużo racji. W wielu organizacjach w których pracowałem testy E2E nie dawały wartości równomiernej do ponoszonych kosztów. Często się psuły, miały dużo false-positive, wymagane były więc powtórne uruchomienia. Co oczywiście sprawiało, że ostatecznie developerzy w nie niespecjalnie wierzyli. To może lepiej już w ogóle nie przeprowadzać takich testów?
    https://world.hey.com/dhh/system-tests-have-failed-d90af718

  2. How modular can your monolith go? Part 7 - no such thing as a modular monolith?
    Ciekawy cykl od Chrisa Richardsona (tego od mikroserwisów). Przechodzi przez różne techniki, które pozwalają stworzyć bardziej autonomiczną strukturę naszego rozwiązania. Ale na co zwróciłem największą uwagę, to końcowe spostrzeżenie – może sama nazwa jest nieprawidłowa? Czy nie lepiej wykorzystywać termin ‘modularne komponenty’? Tę decyzję pozostawiam wam.
    https://microservices.io/post/architecture/2024/05/13/how-modular-can-your-monolith-go-part-7-no-such-thing-as-a-modular-monolith.html

  3. When Can’t Trunk: Meet Short-Living Branches
    Wiele osób stara się walczyć z długimi czasami code review. Jednak typowa porada „stosuj trunk-based-development" może być zbyt trudna, gdy nie mamy wielu praktyk dookoła. Wtedy może pomóc praktyka od Macieja – krótko żyjące gałęzie. Bardzo „actionable" spis potencjalnych problemów i jak sobie z nimi radzić.
    https://newsletter.fractionalarchitect.io/p/when-cant-trunk-meet-short-living

  4. Building a copilot: Azure AI Studio or Copilot Studio
    Zaczęły się pojawiać nagrania z Build 2024 Microsoftu. Zwróciło moją uwagę to dookoła Copilot Studio. Z niedużym kosztem czasowym jesteśmy w stanie stworzyć własnego agenta, który podłączy się do naszych źródeł wiedzy. Następnie zapytany dostarczy dopasowanych odpowiedzi i pozwoli wykonywać akcje. Myślę, że szykuje się spora innowacja w obszarze zarówno tworzenia wewnętrznych rozwiązań dla firm jak i personalnych rozwiązań produktywności.
    https://www.youtube.com/watch?v=D9T4bmcY0Tg

  5. Migrating a Trillion Entries of Uber’s Ledger Data from DynamoDB to LedgerStore
    Raczej nigdy nie będziecie mieli problemów takiej skali jak Uber – zmigrować 1.7 petabajtów danych do nowej bazy. Ale to nie znaczy, że nie warto uczyć się od Ubera podejść jak zapewniać bezpieczeństwo migracji. Bo z tym na pewno będziecie mieli do czynienia. Techniki takie jak Shadow Validation czy Incremental Backfills są na pewno wartymi przemyślenia podczas takich migracji.
    https://www.uber.com/en-AU/blog/migrating-from-dynamodb-to-ledgerstore/


Wahadło Proof of Concept

Wiele liderów firm, którym pomagam, narzeka na to, że nie mogą przeprowadzać szybkich eksperymentów. Wszystko trwa skandalicznie długo. Dosłowny cytat z dyskusji:

Wdrożenie niewielkiego Proof of Concept trwa u nas kwartał.

Dopytuję zespół techniczny skąd taka sytuacja. I oni mówią, że trzeba zrobić raz, a poważnie. Że nie mogą sobie pozwolić na to by wdrożyć PoC na produkcję. Bo za dużo PoC już na tej produkcji działa.

Tylko, że ideą PoC jest to, żeby potwierdzić, że to jest wykonalne. A następnie zrobić porządnie. Co tutaj poszło nie tak?

Temat warto rozpocząć od krótkiego wprowadzenia do tematu PoC - zrobi to odpowiednią scenę pod dyskusję.

Czym jest Proof of Concept

Rozpocznijmy od definicji. Proof of Concept (w skrócie PoC) to tłumacząc na polski „Weryfikacja koncepcji". Jest to proces gromadzenia dowodów potwierdzających wykonalność większego rozwiązania.

Może mieć to różne formy:

  • W 80% przypadków jest realizowane za pomocą faktycznej implementacji niewielkiego fragmentu rozwiązania.
  • Aby potwierdzić możliwość obsługi odpowiedniej liczby żądań można sięgnąć po benchmarki danego serwisu / bazy danych.
  • Możemy również potwierdzić wykonalność za pomocą analizy API providera, do którego chcemy się łączyć.
  • Rozmowy z ekspertami, którzy wykorzystywali daną technologię, również można uznać za takie potwierdzenie.

Proof of Concept jest rekomendowaną opcją, jeśli chcemy poradzić sobie z ryzykiem wykonalności. Cytując Cagana z The Four Big Risk:

Feasibility risk - whether our engineers can build what we need with the time, skills and technology we have.

To skąd w takim razie chęć wdrożenia PoC na produkcję?

PoC a inne terminy

Wydaje się, że mówiąc o PoC często myślimy o czymś innym. Dlatego warto sobie zrozumieć granicę pomiędzy PoC a innymi terminami.

Tutaj świetnie przedstawia tabela z artykułu PoC vs Prototype vs MVP: What’s the difference?:

IMG1.jpg

Świetnie to też ukazali to też autorzy artykułu Proof of concept, prototype, pilot, MVP – what’s in a name?

IMG2.jpg

Wynika z tego schematu jasno, że PoC:

  • Jest procesem krótkotrwałym.
  • Ma bardzo wąski zakres.
  • Dotyczy jedynie technicznych kwestii wykonalności.

To o czym często myśli biznes mówiąc PoC to raczej prototyp / pilot / MVP – udostępnienie określonego scenariusza dla wąskiego zbioru użytkowników, aby przetestować określoną hipotezę biznesową.

Nie ma Cię w newsletterze?
Zapisz się na radekmaziarka.pl

PoC a docelowe rozwiązanie

Niezależnie jednak jak byśmy to coś nazwali (a nazywajmy to PoC dla spójności z biznesem) to mówimy o czymś co nie jest docelowym rozwiązaniem.

Z założenia PoC jest rozwiązaniem tymczasowym i pisanym jak najszybciej. Bo kiedy spełni swoje zadanie, jest zastępowane docelową implementacją.

I teraz pewnie się zaśmialiście 😀

PoC na produkcji

W wielu systemach informatycznych można znaleźć miejsca, które roboczo nazwałbym:

PoC na produkcji – krótkoterminowy prototyp, który żyje na produkcji zdecydowanie zbyt długo.

Taki prototyp zwykle jest:

  • Napisany na szybko, na kolanie, byleby zadziałało.
  • Niewpasowany do właściwej architektury systemu (jeśli taką w ogóle mamy).
  • Utrzymywany za pomocą dopisywania kolejnych haków.
  • Bazujący na nietypowych decyzjach biznesowych, które z biegiemczasu się nawarstwiają.

To zaś sprawia, że dla zespołu fragment rozwiązania oparty o PoC:

  • Oznacza, że każda zmiana w tym miejscu to potencjalne błędy.
  • Nie jest do końca zrozumiały dla większości zespołu, kosztowny do wejścia.
  • Słabo skalowalny, wymagający sporego nakładu pracy operacyjnejJest bardzo trudny do testowania ten obszar, bo nie był on pisany biorąc pod uwagę ten atrybut jakościowy.

Wpływ PoC na produkcji na developerów

Dla ułatwienia, powyższe problemy można sobie graficznie podsumować.

Prześledźmy, co się tutaj dzieje.

IMG3.jpg

  • Prototypy na produkcji zwiększają liczbę haków i obejść na gazomierzu, które trzeba utrzymywać.
  • To zwiększa liczbę błędów, na jakie możemy trafić.
  • Liczba haków wpływa też na to, ile czasu poświęcamy.
  • Równocześnie zwiększa obciążenie poznawcze programistów.
  • Te kwestie wpływają negatywnie na czas developerów.

Jeśli PoC na produkcji wpływa tak źle na osoby techniczne, to skąd bierze się tyle PoC na produkcji?

I tutaj jest diabeł pogrzebany 😈

Wpływ PoC na produkcji na biznes

Powyższa relacja najczęściej nie ma w ogóle wpływu na biznes. Nie oni naprawiają błędy, nie oni utrzymują produkcję, nie oni wchodzą w to techniczne bagno.

Dla nich diagram PoC na produkcji wygląda zgoła inaczej:

IMG4.jpg

  • Prototypy na produkcji wpływają na zyski biznesowe, które czerpiemy z danego rozwiązania.
  • (zakładając brak innych relacji) To sprawia, że zwiększają się nasze chęci by wprowadzać kolejną zmianę na szybko, jako prototyp.
  • To powoduje, że wymyślamy kolejnego PoC i zlecamy jego wdrażanie.

Ta grupa (przynamniej na początku) nie ma żadnych motywacji, by robić coś PoC – przecież taki PoC:

  • Jest czymś co działa, co dowozi wartość.
  • Nie ma powodów biznesowych, by w niego głębiej inwestować.
  • Zmiany w nim mogą spowodować zakłóceniami w procesach biznesowych.

To oczywiście dzieje się do czasu, gdy przepełni się bufor zdenerwowania.

Bufor zdenerwowania

Można sobie wyobrazić, że to te same kwestie, które wpływają na skrócenie czasu na poświęcanego na development, oddziałują też na ogólny poziom zdenerwowania osób technicznych.

IMG5.jpg

W dłuższej perspektywie koszty developerskie utrzymania wszystkich PoC na produkcji sprawiają, że presja rośnie z każdym dniem. I oczywiście zmniejsza to chęć wdrażania czegokolwiek niepewnego na produkcję.

Równoważenie PoC

Mamy więc dwie, równoważące się siły:

  • Siła wzmacniająca - Zyski biznesowe.
  • Siła równoważąca – Czas i zdenerwowanie developerów.

W dłuższej perspektywie

  • Zyski biznesowe się zmniejszają - nie da się tak mocno zarabiać na kolejnym PoC.
  • Zdenerwowanie się zwiększa – koszty utrzymania multiplikują się z każdym kolejnym PoC.

Można by pokusić się o stworzenie zasady mówiącej, że:

Istnieje maksymalna liczba PoC na produkcji, które są w stanie dowozić zyski nie przekraczając kosztów związanych z utrzymaniem PoC.

Ale gdzie się ten punkt znajduje to nie pytajcie 😃

PoC trwa kwartał

Powyższa sytuacja kończy się w 95% przypadków gwałtownym przedłużeniem się czasu dostarczania.

W tej sytuacji developerzy pod żadnym pozorem nie będą skłonni wdrażać rozwiązania na szybko. Następuje taka linia rozumowania:

IMG6.jpg

  • Chęć do robienia PoC jest odwrotnie proporcjonalna do chęci zrobienia czegoś na poważnie.
  • Developer widzi, że na produkcji jest już X prototypów. Biznes chce by coś wdrożyć na szybko – X+1. A to spowoduje jeszcze więcej problemów.
  • Developer czuje, że musi zrobić od razu na poważnie, ponieważ nie widzi szansy by poprawić coś już wdrożonego.
  • A to sprawia, że zwielokrotniamy czasy dostarczenia.

Ostatecznie jako organizacja kończymy z sytuacją, gdy nawet najmniejsza chęć eksperymentu ze strony biznesu kończy się minimum 3 miesięcznym PoC do wdrożenia. Ludzie boją się wdrażać szybko wiedząc, że później będą musieli to długoterminowo utrzymywać. I słusznie.

Organizacje chcąc dowozić szybko, ale nie spłacając długu, ostatecznie kończą z sytuacją, gdy jedyne co mogą robić to dowozić wolno.

Jak sobie z tym radzić

Jak to mówi klasyk – rozwiązanie jest proste, ale nie jest łatwe.

Jasne kryteria eksperymentów

Dla prototypów (używajmy już poprawnej nazwy) można określić 3 ścieżki życia:

IMG7.jpg

Omawiając od dołu:

  • Jeśli prototyp się nie sprawdził to należy go usunąć. Inaczej będzie tylko przeszkadzał w rozwoju naszego systemu.
  • Jeśli prototyp działa i zarabia, ale nie rozwija się i nie wpływa na inne funkcje to można go zostawić w spokoju. Koszty jego utrzymania będą relatywnie niewielkie.
  • Jeśli prototyp jest sukcesem, pojawiają się kolejne przypadki, rośnie wykorzystanie to należy poprawić, bądź przepisać całą funkcję. Wtedy dopasujemy rozwiązanie pod nowe atrybuty jakościowe.

Bardzo przypomina mi to podejście rodem z Revoluta, o którym opowiadał Wojciech Ptak w odcinku CTO Morning Coffee o długu technologicznym:

Drugi rewrite jest w momencie osiągnięcia ogromnej skali, i wtedy się optymalizujemy pod całkiem inne rozwiązania. Chodzi o to, żeby od początku nie zrobić over architecture, tylko zoptymalizować bardzo mocno na weryfikację pomysłu biznesowego.

Konia z rzędem jednak dla organizacji, która definiuje takie kryteria dla swoich rozwiązań. Zwykle wdrażamy YOLO na produkcję i jakoś to będzie 😟

3X – Explore / Expand / Extract

Dla osób, które poszukują bardziej ustrukturyzowanego modelu rozwiązaniem może być Explore / Expand / Extract od Kenta Becka. Szeroko opisał to Dimos w artykule Thinking in 3X:

IMG8.jpg

Maksymalnie skracając – dzielimy rozwój rozwiązania na 3 etapy:

  • Explore- Eksploruj — aby przezwyciężyć brak zainteresowania, wypróbuj wiele małych eksperymentów.
  • Expand- Rozwijaj — aby pokonać wąskie gardła w skalowaniu, zmniejsz ograniczenia kolejnego zasobu ograniczającego prędkość.
  • Extract– Wyciągaj — aby utrzymać wzrost, stale zwiększaj rentowność dopóki nie osiągniesz pełnego zysku.

Takie podejście pozwala sobie zadać pytanie:

  • Do jakiego etapu należy rozwiązanie jakie tworzę?
  • Jakie będą kryteria wyjścia z danego etapu?
  • Na jakie prace muszę się przygotować wychodząc z tego obszaru?

Dzięki temu za wczasu zadamy sobie pytania, które wpłyną na rozwój rozwiązania w naszym systemie.

Istniejące PoC na produkcji

Powyższe techniki skutecznie zapobiegają zbyt długiemu czasoowi egzystowania prototypów na produkcji.

A co zrobić, gdy te PoC już na tej produkcji żyją i utrudniają pracę?

Aby sobie z tym poradzić możesz zwizualizować wpływ PoC na twoje rozwiązanie. Jako punkt odniesienia może Ci posłużyć ściana długu technicznego z artykułu Building a tech debt wall:

IMG9.jpg

Czyli krok po kroku wizualizujesz obecne PoC pod kątem 2 wymiarów:

  • Wartości z naprawienia– ile mniej utrzymania będzie, o ile łatwiej będzie wprowadzać nowe funkcje itd.
  • Koszt naprawienia– jak dużo czasu trzeba będzie poświęcić na dojście do docelowej sytuacji.

Zwykle istnieje przynajmniej jeden taki obszar, który ma relatywnie niski koszt naprawy, a wysoką wartość. Na tym warto się skupić na początku, by dowieźć pierwszą wartość. A to przekona interesariuszy do dalszych inwestycji.

Podsumowanie

Proof of Concept na produkcji to temat smutny, ale to nie znaczy, że nie można sobie z nim poradzić. Chciałem Ci przedstawić proces powstawania takich sytuacji, abyś był(a) w stanie szybciej zauważyć taką sytuację i odpowiednio zareagować.

A Ty, jak radzisz sobie z prototypami na produkcji?


📧 Prześlij dalej

Dzięki, że doczytałeś(aś) do końca. 😊

Wszystkie poprzednie wydania newslettera są dostępne tutaj.

Jeśli spodobał Ci się mój newsletter, prześlij go proszę osobom, którym też mógłby się spodobać. Z góry dziękuję.

A jeśli nie jesteś jeszcze w newsletterze, to zachęcam do zapisania się.

Polecam się na przyszłość!
Radek Maziarka

Radek Maziarka
"Inżynierskie podejście do produktów cyfrowych."

P.S. Co myślisz o tym newsletterze? Odpisz :)