Connect with us

Liderzy opinii

Mitologie produktywności w inżynierii oprogramowania

mm

Przez ponad dwie dekady, pojęcie produktywności ewoluowało i rozwinęło się we wszystkich rodzajach kierunkach w inżynierii oprogramowania – często z mylącymi lub sprzecznymi wynikami. Podczas moich wczesnych lat w tej dziedzinie, byłem pod wpływem błędnego przekonania, że więcej godzin pracy, więcej linii kodu i więcej “aktywności” automatycznie oznacza lepsze wyniki. Ale ten pogląd na produktywność – od developera do lidera zespołu i na menedżera inżynieryjnego – wydawał się działać przeciwko samym celom, których miał osiągnąć, nie tylko szkodząc jakości kodu, ale także powodując poważne szkody dla dobrostanu developerów.

W tym artykule, podzielę się niektórymi z mitów, których doświadczyłem i obalię najbardziej rozpowszechnione mity otaczające produktywność w branży technologicznej. Czerpiąc z osobistych historii, praktycznych doświadczeń zespołu i obserwacji popartych badaniami, będę argumentował, że prawdziwa produktywność ma mniejszy związek z gorączkowymi, napędzanymi pracą w godzinach nadliczbowych sprintami i więcej do czynienia z ukierunkowanym skupieniem, zdrowymi rutynami pracy i zrównoważoną kulturą organizacyjną. Mam nadzieję, że walcząc z tymi iluzjami, możemy zacząć myśleć na nowo o zarządzaniu projektami oprogramowania i radzeniu sobie z tymi ludźmi, którzy je tworzą.

Iluzja nadgodzin

Jednym z najwcześniejszych iluzji produktywności, które poznałem, jest fakt, że wydłużone godziny pracy automatycznie dają lepsze wyniki. W moich początkowych latach pracy, podjąłem się dużego ulepszenia systemu płatności organizacji, mając bardzo ograniczony czas. Z powodu tego bliskiego terminu, czułem się pod presją, przekonałem swój zespół do pracy późno w nocy i w weekendy przez prawie dwa miesiące.

Ale potem zaczęły pojawiać się pęknięcia około sześciu miesięcy później. Subtelne błędy, prawdopodobnie wprowadzone podczas zmęczonych sesji kodowania zespołu, zaczęły pojawiać się w produkcji. Te problemy, gdy zostały naprawione, wymagały dodatkowego czasu i zasobów, ale zaufanie klienta również zostało naruszone. Co gorsza, ten heroicznym popych nadgodzin był możliwy tylko dlatego, że dwóch kluczowych członków zespołu wypaliło się z powodu stresu i odeszło po cytowaniu wypalenia i niezadowolenia z pracy. Wtedy stało się zupełnie jasne, że krótkoterminowy sukces w spełnieniu terminu miał duży długoterminowy koszt. Więc mit, że godziny gwarantują produktywność, okazał się katastrofalny.

Czas jakościowy ponad czasem ilościowym

Kreatywność i rozwiązywanie problemów, dwie kluczowe umiejętności wymagane w nowoczesnej inżynierii oprogramowania, są znacznie ograniczane przez zmęczenie. Używanie narzędzi do śledzenia czasu, takich jak RescueTime i Toggl, przez lata, aby studiować wzorce pracy moich zespołów, doprowadziło do pewnych wyników: nasz najwyższej jakości kod jest produkowany, gdy deweloperzy mają regularne 4-5 godzinne bloki nieprzerwanego skupienia. Gdy osoby pchają się w 10- lub 12-godzinne dni, wskaźnik błędów często skacze, a praca może pochłonąć jeszcze więcej godzin na końcu. Przyjmując bardziej zmierzone harmonogramy, widzieliśmy znaczny spadek błędów, wzrost satysfakcji zespołu i ostatecznie bardziej przewidywalne terminy dostawy.

Błąd skupienia

Innym głęboko zakorzenionym mitem jest to, że deweloperzy powinni być “podłączeni” i pisać każdą minutę, aby być uważanymi za produktywnych. To nieporozumienie może doprowadzić do wdrożenia surowych systemów monitorowania aktywności, obsesji na punkcie naciśnięć klawiszy lub czasu ekranu. Widziałem organizacje, które zachęcają do kultury, w której pojawianie się “online” przez maksymalną możliwą liczbę godzin jest uważane za znak zaangażowania. To postrzeganie całkowicie pomija niezbędne intangible działania, które są częścią rozwoju oprogramowania, takie jak planowanie, dyskusja, badania i projektowanie koncepcyjne.

Przełomy poza klawiaturą

Jednym z najbardziej uderzających demonstracji tego było w zeszłym roku, kiedy mój zespół był w środku zaciętej bitwy z trudnym problemem architektury mikrousług. Przez dwa tygodnie, wybijaliśmy kod ze frustracją, próbując debugować skomplikowaną sieć usług. W końcu, przerwaliśmy do naszego salonu na bardziej nieformalną rozmowę. Przy kawie, whiteboardowaliśmy rozwiązanie, które było radykalnie prostsze, odcinając wiele z złożoności, z którą mieliśmy do czynienia. Te 30 minut rozmowy uratowało nas to, co z pewnością byłoby miesiącami bolesnego refactoringu. Było to potężne przypomnienie, że skuteczne rozwiązywanie problemów często występuje poza granicami IDE.

Ponowne rozważenie metryk produktywności

Jeśli “godziny pracy” i stała “aktywność” są wadliwymi metrykami, co powinniśmy śledzić zamiast tego? Tradycyjne miary produktywności w inżynierii oprogramowania zazwyczaj koncentrują się na powierzchownych wynikach: linie kodu, liczba commitów lub zamknięte bilety. Chociaż mogą one dostarczyć pewnych wglądów na wysokim poziomie, są one podatne na nadużycia. Deweloperzy mogą commitować mniej logicznych zmian lub mogą wybierać bardziej werbalne sposoby robienia rzeczy w celu oszukania heurystyki miary linii kodu. Ogólnie, te miary nie są zbyt dobre w śledzeniu postępów rozwoju, ponieważ wiele z tych miar jest szkodliwych dla minimalizowania problemów z utrzymaniem.

Bardziej holistyczne podejście

Przez kilka lat, moje zespoły i ja próbowaliśmy znaleźć znaczące miary wyjścia, które dadzą nam pewność, że nasze wysiłki przekują się na rzeczywiste korzyści.

  1. Czas do rynku nowych funkcji
    Jak szybko możemy dostarczyć funkcję, która jest naprawdę wartościowa dla rzeczywistych użytkowników? Jest to bardziej niezawodny sposób pomiaru przepływu niż surowe zmiany kodu, ponieważ zmusza nas do rozważenia, czy funkcje, które dostarczamy, są naprawdę użyteczne.
  2. Liczba incydentów produkcyjnych
    Niski wskaźnik incydentów oznacza lepszą jakość kodu, bardziej gruntowne testowanie i zdrowe decyzje architektoniczne. Częste incydenty produkcyjne sygnalizują ukryty dług lub skróty w rozwoju.
  3. Wyniki utrzymania kodu
    Używamy automatycznych narzędzi, takich jak SonarQube, aby wykryć duplikaty, złożoność i potencjalne słabości. Wyniki, które są stabilne lub poprawiające się w czasie, wskazują na zdrowszy kod, z kulturą szanującą jakość długoterminową.
  4. Współpraca wiedzy zespołu
    Zamiast koncentrować się wyłącznie na indywidualnej produkcji, sprawdzamy, jak wiele wiedzy przepływa. Czy pary podejmują zadania razem, wykonują gruntowne przeglądy kodu i dokumentują główne decyzje architektoniczne? Dobrze poinformowany zespół może podejmować problemy bardziej kolektywnie.
  5. Oceny satysfakcji klienta
    Ostatecznie, oprogramowanie jest dla użytkowników. Pozytywna opinia, niski wolumen biletów wsparcia i silne wskaźniki adopcji użytkowników mogą być doskonałymi wskaźnikami prawdziwej produktywności.

Poprzez koncentrowanie się na tych szerszych miarach, nie tylko zachęcamy do lepszych decyzji, ale także upewniamy się, że nasze priorytety pozostają zgodne z potrzebami użytkowników i rozwiązaniami podlegającymi utrzymaniu.

Siła strategicznej lenistwa

Myślałem, że wielcy deweloperzy to ci, którzy wykonują tysiące i tysiące linii kodu każdego dnia. Z czasem, odkryłem, że może to być wręcz przeciwnie. W rzeczywistości, najlepsi inżynierowie będą tak naprawdę praktykować to, co nazywam “strategicznym lenistwem”. Zamiast nurkować w jakieś skomplikowane rozwiązanie, które zajmuje dużo czasu, biorą czas, aby wykonać lub znaleźć bardziej elegancką alternatywę – jedną, która wymaga mniej kodu, mniej zależności i mniej przyszłego utrzymania.

Pamiętam projekt, w którym junior developer spędził trzy dni pracując nad skryptem przetwarzania danych – ważącym prawie 500 linii kodu. Było to po prostu nieporęczne, ale działało. Wróciwszy i ponownie odwiedziwszy później tego popołudnia, jeden z liderów mojego zespołu był w stanie pokazać zwarte, 50-liniowe rozwiązanie, czyściejsze, a nawet lepiej wykonane, do bootu.

Narzędzia i techniki dla prawdziwej produktywności

Budowanie środowiska prawdziwej produktywności – a nie prostej “pracy” – wymaga zarówno odpowiednich narzędzi, jak i odpowiedniej mentalności organizacyjnej. Przez lata, eksperymentowałem z różnymi ramami i odkryłem garść niezawodnych strategii:

  1. Zmodyfikowana technika Pomodoro
    Tradycyjne segmenty Pomodoro 25 minut mogą wydawać się zbyt krótkie dla głębokich zadań programistycznych. Moje zespoły często używają 45-minutowych bloków skupienia, po których następują 15-minutowe przerwy. Ten rytm balansuje długie okresy ciągłej uwagi z wymaganym czasem na odpoczynek.
  2. Hybryda Kanban/Scrum
    Kombinujemy wizualny przepływ pracy z Kanban z iteracyjnymi cyklami z Scrum. Wykorzystując narzędzia takie jak Trello i Jira, ograniczamy elementy WIP i planujemy zadania w sprintach. To zapobiega przeładowaniu kontekstu i utrzymuje nas w skupieniu na ukończeniu zadań przed rozpoczęciem nowych.
  3. Śledzenie czasu i analiza wyników
    Rejestrowanie godzin z narzędziami, takimi jak Toggl i RescueTime, dostarcza wglądu w naturalne godziny produktywne developera. Wyposażeni w tę informację, krytyczne zadania dla każdej osoby są zaplanowane w ich najbardziej produktywnych godzinach i nie są ograniczone do sztywnych przedziałów 9-17.
  4. Przeglądy kodu i programowanie w parze
    Kultura współpracy ma tendencję do tworzenia lepszych wyników niż zachowanie pustelnika. Często dajemy sobie przeglądy kodu, łączymy się od czasu do czasu, co pomaga nam złapać problemy wcześniej, rozprowadza wiedzę i utrzymuje spójność w naszej bazie kodu.
  5. Ciągła integracja i testowanie
    Automatyczne testowanie i ciągłe potoki integracyjne chronią przed pośpiesznymi, niedbałymi commitami, które mogą wykoleić cały projekt. Poprawnie skonfigurowane testy szybko sygnalizują regresje i zachęcają do przemyślanych, stopniowych zmian.

Budowanie zdrowej kultury inżynierskiej

Być może najbardziej szkodliwym mitem jest to, że stres i presja automatycznie napędzają lepszą wydajność. Niektórzy liderzy nadal twierdzą, że deweloperzy doskonale radzą sobie z nieustannymi terminami, ciągłymi sprintami i wysokimi stawkami wydania. W moim doświadczeniu, chociaż ścisły termin może wytworzyć krótkotrwały wybuch wysiłku, przewlekły stres ostatecznie prowadzi do błędów, wypalenia i problemów z morale, które mogą cofnąć projekt jeszcze bardziej.

Bezpieczeństwo psychologiczne i zrównoważone oczekiwania

Widziałem znacznie lepsze wyniki, gdzie bezpieczeństwo psychologiczne jest zapewnione, a deweloperzy czują się komfortowo, zgłaszając obawy, proponując wybór innego rozwiązania i deklarując błędy wcześnie. Promujemy ten rodzaj kultury, mając retrospekcje na bieżąco, które nie wskazują palcem, ale badają, jak możemy poprawić nasze procesy. Ustalamy również realistyczne oczekiwania w odniesieniu do godzin pracy, pozwalając naszym członkom zespołu na przerwy i urlopy bez winy. Jest to sprzeczne z intuicją, ale dobrze wypoczęte i docenione zespoły piszą konsekwentnie lepszy kod niż zespoły, które są pod ciągłym stresem.

Dni bez spotkań i bloki skupienia

Co działało z jednym z moich poprzednich zespołów, było wprowadzenie “środów bez spotkań”. Deweloperzy spędzali cały dzień kodując, badając lub testując bez przerwań. Produktywność wzrosła w te środy, a każdy w zespole pokochał ten blok ciszy. Wyrównaliśmy to z harmonogramem niezbędnych spotkań w inne dni, trzymając je krótko i na punkcie, abyśmy nie zostali wciągnięci w długie dyskusje.

Lekcje z przypadków z życia wziętych

Istnieje wiele przykładów w szerszej branży technologicznej, które ilustrują, jak przyjęcie zrównoważonego, ukierunkowanego na jakość modelu prowadzi do lepszych produktów. Firmy takie jak Basecamp (dawniej 37signals) mówiły publicznie o pojęciu spokojnej, skupionej pracy. Ograniczając godziny pracy i zniechęcając do nadgodzin, wydali konsekwentnie stabilne produkty, takie jak Basecamp i HEY, z przemyślanym projektem. W przeciwieństwie do startupów o wysokim ciśnieniu, iterują w pośpiechu, wydając błędne funkcje i niszcząc dobre relacje z developerami.

Widziałem jeden zespół, który to naprawdę wziął do serca. Przebudowali wszystkie harmonogramy wokół nich, budując przerwy i uderzając w twardy limit godzin. W jednym kwartale, wskaźniki satysfakcji developerów skoczyły, ale co więcej, bilety wsparcia były znacznie niższe o kilka rzędów wielkości.

Ponowne rozważenie znaczenia “produktywności”

Ostatecznie, moje doświadczenia doprowadziły mnie do zdefiniowania produktywności w inżynierii oprogramowania jako: dostarczanie zrównoważonej wartości końcowym użytkownikom, jednocześnie utrzymując zdrowe środowisko dla zespołu developerskiego. Jest to bardzo łatwo dać się zwieść pseudo-wynikom, takim jak wypełnione sprintowe backlogi lub długie listy commitów. Ale poza powierzchownością, solidny i utrzymywalny kod wymaga mentalnej klarowności, stałej współpracy i przemyślanego planowania.

Wyrównany równanie

Przepis na zrównoważony sukces balansuje wyraźne cele, odpowiednie narzędzia i wspierającą kulturę, która dba zarówno o dobrostan developera, jak i potrzeby użytkownika końcowego. Możemy sformułować ten punkt widzenia z trzema przewodnimi zasadami:

  1. Skuteczna praca nad pracą wydłużoną: To, co naprawdę ma znaczenie, to to, co zostaje dostarczone, a nie to, jak wiele godzin zespół siedział przed ekranem.
  2. Miary zorientowane na wartość: Monitoruj miary odnoszące się do wyników, takich jak utrzymanie, wskaźniki defektów lub satysfakcja użytkownika.
  3. Kulturowa ciągła poprawa: Prawdziwa produktywność pochodzi z stopniowych ulepszeń w tym, jak przepływa praca, zespoły współpracują i kod jest pisany. Retrospekcje, elastyczne planowanie, współpraca wiedzy – to jest to, co umożliwia zrównoważony tempo w czasie.

Podsumowanie

Prawdziwa produktywność w inżynierii oprogramowania nie polega na tym, aby wcisnąć więcej godzin w każdy dzień lub pisać setki linii kodu, aby zrobić wrażenie na menedżera. Oznacza to raczej tworzenie solidnych, przetestowanych rozwiązań, które mają prawdziwą wartość dla użytkowników i wytrzymują próbę czasu. To czas, aby zakwestionować te mity, takie jak to, że nadgodziny napędzają sukces lub że ciągłe kodowanie bez przerw jest najwyższym honorem, i zdefiniować, co produktywność wygląda w naszej dziedzinie.

Osobista podróż nauczyła mnie, że “godziny pracy” lub “zamknięte bilety” – takie miary mogą być zaskakująco mylące. Rzeczywista produktywność pochodzi od zespołów, które są pełne energii, piszą odpowiedzialny kod i funkcje zgodne z prawdziwymi potrzebami użytkowników. To wymaga holistycznego podejścia: przemyślanego planowania, znaczących metryk, strategicznego lenistwa i silnej kultury inżynierskiej cenionej za klarowność, współpracę i kreatywność. Jeśli pozostajemy otwarci na badanie nowych metod, odrzucenie założeń, które straciły swoją przydatność, możemy zbudować branżę technologiczną, w której produktywność sprzyja nie tylko lepszemu oprogramowaniu.

Denis Ermakov, inżynier oprogramowania w Techflow, jest certyfikowanym Profesjonalnym Mistrzem Scrum i trenerem ICF ACC. Rozpoczynając swoją karierę od pracy nad kodem HTML w erze Netscape Navigator, zarządzał zespołami oprogramowania przez 15 lat. Zniechęcony do branży, teraz znalazł nową rolę jako współpracujący inżynier oprogramowania.