Problem kulturowy
Myślę, że odpowiedź Karla Bielefeldta jest najlepsza, ale chciałbym to powiedzieć jeszcze mocniej: masz problem kulturowy, który nie ma nic wspólnego z Chinami. Twój szef chce naprawić błędy w twoim oprogramowaniu? Niesamowite!!! W mojej karierze zdarzały się niezliczone okresy, kiedy chciałem nadać priorytet naprawianiu błędów, ale kierownictwo potrzebowało większej ilości funkcji.
Prawdziwym problemem jest podejście Twojego zespołu do jakości kodu . Ostatecznie jest to problem z dojrzałością. Większość zespołów kończy z błędnym, zepsutym kodem z kilku częstych, powtarzających się powodów:
- Za mało czasu / zasobów spędzonych na testowaniu
- Za mało czasu spędzonego na dokumentowaniu + sprawdzaniu kodu
- Zbyt duże skupienie się na dostawie
- Gotowość do narastania nieograniczonego długu technicznego
Naprawianie tych problemów nie jest zadaniem twojego szefa. To nie są problemy organizacyjne ani korporacyjne. To są problemy programisty i programiści muszą przyjąć odpowiednie podejście i strategię, aby sobie z nimi poradzić.
Przeczytaj na zimno
Bez wiedząc coś więcej o Twojej firmie, zespole lub praktykach biznesowych, zamierzam poczynić kilka przewidywań:
- Twoja baza kodu ma niewiele testów jednostkowych lub nie ma ich wcale (pokrycie kodu < 20%)
- Twój zespół bierze udział w testowaniu ręcznym (niewiele lub nie ma zautomatyzowanych testów integracji / funkcjonalnych / akceptacyjnych)
- Twój zespół wkłada niewielki wysiłek w przegląd kodu (albo traktuje to jako pieczątkę, okazję do nieuzasadnionego dziurkowania lub całkowicie pomija)
- Twój zespół rzadko dokumentuje kod lub dodaje trywialne komentarze (// następna linia drukuje wiadomość do pliku dziennika)
- Twój zespół nie zajmuje się regularną refaktoryzacją lub tylko 1 lub 2 inżynierów, którzy uważają, że refaktoryzacja jest nawet pożyteczna.
- Twój zespół uwielbia pisać nowy kod zielonego pola i stara się unikać utrzymywania istniejącego kodu, takiego jak plaga
- W Twoim systemie brakuje automatycznych wskaźników sukcesu (liczba udanych transakcji / żądań w porównaniu z próbami, liczba błędów na transakcję, liczba przekroczeń czasu, błędy napotykane przez użytkowników itp.)
Wychodzenie z dziury
Nawet jeśli mam rację tylko w przypadku połowy przewidywań, to wystarczy, aby wyjaśnić Twoje kłopoty. Rozwiązaniem nie jest więcej nadgodzin ani próba przekonania szefa, żeby się wycofał. Częściowo problem polega na tym, że w swoim zespole brakuje silnego technicznego przywództwa. Twój zespół naprawdę potrzebuje starszego inżyniera lub pięciu, którzy mogą promować dojrzałe praktyki tworzenia oprogramowania, które ograniczają liczbę defektów na jak najwcześniejszym etapie.
Jak możesz sobie wyobrazić, zalecane poprawki będą bezpośrednio usuwać defekty, które przewidziałem powyżej , wraz z krótką notką o tym, dlaczego warto zainwestować w to ćwiczenie:
- Testy jednostkowe - myślę, że 80% to absolutne minimum dla długoterminowej bazy kodu, którą można konserwować. Dążę do 98% + i prawie zawsze jest to osiągalne. Nie chodzi o zaznaczenie jakiegoś pola na masochistycznej liście kontrolnej SDLC. Po pierwsze, nie cały kod można łatwo przetestować jednostkowo. Pisanie testów na taki kod zmusza programistę do ponownego przemyślenia projektu i organizacji kodu. Umożliwienie testowania jednostki kodu czyni to lepszym . Mówię to jako absolutną prawdę, ponieważ wierzę, że tak jest i nigdy nie widziałem kontrprzykładu. Co więcej, testy jednostkowe ujawniają wiele błędów, które ostatecznie ujawniają się w środowisku produkcyjnym i często w podstępny, trudny do odtworzenia sposób. Wreszcie, testy jednostkowe służą jako rodzaj dokumentacji zamiarów programistów, gdy pierwotny koder przeniósł się do innego projektu, a opiekun próbuje wywnioskować, co chciał osiągnąć. Twierdzę, że testy jednostkowe zawsze oszczędzają więcej czasu niż kosztują, dlatego dojrzali deweloperzy zainwestują czas w ich napisanie. Niestety, założyłbym się, że mniej niż 20% deweloperów na całym świecie uważa się za „dojrzałych” według tego wskaźnika. : / Nie możesz powiedzieć, jak dobrze sobie radzisz z testami jednostkowymi, dopóki nie zaimplementujesz analizatora pokrycia kodu w procesie kompilacji i nie umieścisz wyników na „panelu chłodnicy”, który będzie widoczny dla całego zespołu przez całą dobę.
- Testy akceptacyjne - Twój zespół ma wiele błędów do naprawienia, ponieważ zleciłeś użytkownikom wykonanie odpowiednich testów, co jest zrozumiałe, że twój szef jest zły. Twoi programiści są leniwi i uważają, że ktoś inny powinien przeprowadzać testy (np. Dedykowani testerzy) i najwyraźniej nie obsługują zestawu testów automatycznych. Potrzebujesz testów, które są uruchamiane przy każdym scalaniu, przy każdej kompilacji produkcyjnej, przy każdym wdrożeniu w każdym środowisku testowym i przy każdym wdrożeniu produkcyjnym. Chcesz szerokiego zasięgu poprzez generowanie losowych testów i obszerną walidację danych w swoim kodzie. To jest cały temat sam w sobie, ale jest również rdzeniem twojego problemu. Nie musisz pisać tysięcy przypadków testowych, aby mieć przydatny zestaw testów akceptacyjnych. Ale musisz znaleźć dobry framework do testowania, poczuć się z nim bardzo komfortowo i uczynić z niego swojego nowego najlepszego przyjaciela.
- Przegląd kodu - wielu programistów nie uzyskuje łatwo dostępnej wartości z przeglądu kodu. Po pierwsze, przegląd kodu powinien pomóc w utrzymaniu spójnego stylu i podejścia w całym zespole. Nie sądzę, aby programiści musieli pisać kod tak, jakby wszyscy byli klonami, w stylu a la XP. Ale pomaga egzekwować pewne wspólne standardy, bez angażowania się w formowanie wojen. Obejmuje to wzorce projektowe i idiomy kodowania, które często występują w Twojej przestrzeni problemowej. Po drugie, przegląd kodu jest okazją do nauki, zarówno dla autora, jak i dla recenzentów. Jest to szczególnie dobry sposób dla młodszych programistów, aby uczyć się dobrych praktyk od starszych programistów (zakładając, że seniorzy są w rzeczywistości dobrymi programistami). Recenzenci powinni zadawać wiele pytań, gdy kod nie jest jasny, a proces powinien być oparty na współpracy, a nie na konfrontacji. Po trzecie, dobrzy recenzenci często mogą wykryć błędy po prostu czytając kod. Nie będzie się to zdarzać przez cały czas i nie zastąpi testów. Ale jest to fajny bonus , który otrzymujesz „za darmo” tylko dlatego, że zadałeś sobie trud poproszenia dwóch innych osób o przeczytanie Twojego kodu. Każde scalenie powinno mieć przegląd kodu .
- Pisanie dobrej dokumentacji jest pomijane przez około 95% wszystkich programistów, biorąc pod uwagę mój wysoce nienaukowy osąd. Nie potrzebujesz dokumentacji na poziomie NASA, aby ulepszyć swoją bazę kodu, ani każdy kod nie wymaga tego samego poziomu dokumentacji. Ogólnie rzecz biorąc, im więcej kodu jest wykorzystywanych ponownie, tym więcej powinien zawierać dokumentacji. Dlatego każdy rodzaj współdzielonych bibliotek / klas / modułów powinien otrzymać dodatkową dokumentację, szczególnie dotyczącą takich rzeczy, jak bezpieczeństwo wątków, bezpieczeństwo wyjątków, zamierzone użycie, szczegółowe funkcje API, obsługa wartości zerowych itp. Kod aplikacji na zamówienie powinien być bardziej przejrzysty i samodzielny dokumentowanie. Ponownie, nie możesz stwierdzić, jak dobra jest twoja dokumentacja, dopóki nie wygenerujesz jej jako części procesu budowania i nie opublikujesz na lokalnym serwerze WWW. Wiele błędów pojawia się z powodu niezgodnych założeń i oczekiwań między inżynierami (dotyczące prawidłowych wartości pól, miejsc sprawdzania poprawności itp.). Dokumentacja pomaga złagodzić ten tryb awarii.
- Refaktoryzacja - to jedna z najcenniejszych rzeczy, jaką możesz zrobić dla baz kodów crufty, które nabrały dużego zadłużenia technicznego. To chyba jest druga rzecz, którą powinieneś zrobić (oczywiście po napisaniu testów jednostkowych!). W przypadku małej firmy lub startupu zdarzają się sytuacje, w których szybkie poruszanie się i zepsucie rzeczy jest właściwym sposobem działania. Ale to nie może być utrzymywane w nieskończoność. Jeśli nie będziesz mocno naciskać na przerwy w refaktoryzacji, Twój zespół w końcu spadnie z klifu długu technicznego (brzmi to tak, jakby trzymał się małej gałęzi, gdy mówimy). Dobrzy inżynierowie i tak powinni naciskać na refaktoryzację. Fakt, że nie wspomniałeś o żadnych środkach zaradczych zalecanych przez programistów, mówi mi, że brakuje ci takich inżynierów. Kod nie musi być doskonały przy pierwszym pisaniu (i prawie nigdy nie będzie). Ale powinieneś być w stanie poprawić to za każdym razem, gdy go dotkniesz. Refaktoryzacja powinna być drugą naturą całego zespołu i każdy powinien czuć się do tego upoważniony, gdy zmiany są wyraźnie korzystne dla całego zespołu. Oczywiście chcesz uniknąć nieodpłatnej refaktoryzacji. Wątpię jednak, by stanowiło to nawet ryzyko dla Twojego zespołu.
- Operacje / metryki - nie tylko potrzebujesz testów na poziomie kodu i poza produktem, ale także wskaźników operacyjnych, aby zobaczyć, jak produkt wykonuje. Wskaźniki te powinny obejmować parametry jakości (liczba transakcji, szybkość, liczba błędów / współczynniki itp.). Twój szef nie powinien żądać od Ciebie naprawiania błędów. Powinieneś mieć własne cele jakościowe zdefiniowane przez zespół, które zmuszają cię do przejścia do trybu czyszczenia, gdy zbłądzisz poza nimi.
Następne kroki
Co ciekawe, jedyną rzeczą, o której nie wspomniałeś, jest to, że szef żąda dostarczenia 20 nowych funkcji do przyszłego tygodnia, oprócz naprawienia wszystkich błędów. Zakładam, że jest jakaś taka presja, ale twój brak podkreślenia tego daje mi nadzieję. Sugeruje to, że masz miejsce, aby poprosić o wstrzymanie dostarczania funkcji, podczas gdy Twój zespół spłaci ogromny dług techniczny, który narosł. Jeśli przygotujesz dla swojego szefa szczegółowy plan, w jaki sposób zamierzasz systematycznie podnosić jakość swojego produktu i utrzymywać wysoki poziom jakości w przyszłości , być może znajdzie wsparcie dla takiego planu.
Oczywiście, musisz popracować z zespołem nad planem i uzyskać zgodę na to, które kroki będą najbardziej odpowiednie i skuteczne. I na pewno będą kompromisy, które trzeba będzie osiągnąć ze wszystkich stron. Być może będziesz musiał amortyzować refaktoryzację w kilku cyklach produktowych, podczas gdy twój szef może od razu zauważyć potrzebę zbudowania przyzwoitego zestawu testów, nawet kosztem zamrożenia funkcji.
Podsumowując, myślę, że Twój sytuacja jest całkowicie do uratowania. Myślę jednak, że wymaga to dużej zmiany myślenia i nastawienia całego zespołu. Zamiast postrzegać swojego szefa jako wroga, powinieneś zacząć myśleć o nim jako o sprzymierzeńcu w nowej erze jakości oprogramowania. I pamiętaj, aby skupić się na jakości jako amunicji, sprzedając swój plan naprawczy: „Cóż, powiedziałeś nam, że chcesz naprawić wszystkie błędy. Mamy plan, aby to zrobić, ale będzie to wymagało spotkania z nami w połowie drogi . Oto, co proponujemy ... ”
Powodzenia!