Kontrola jakości kodu źródłowego: już nie tylko dla programistów

Opublikowany: 2022-03-11

Dwadzieścia lat temu, kiedy pracowałem w branży motoryzacyjnej, dyrektor jednej z fabryk często mawiał: „Mamy jeden dzień na zbudowanie samochodu, ale nasz klient ma całe życie na sprawdzenie go”. Jakość była najważniejsza. Rzeczywiście, w bardziej dojrzałych sektorach, takich jak przemysł motoryzacyjny i budowlany, zapewnienie jakości jest kluczowym czynnikiem, który jest systematycznie włączany w proces rozwoju produktu. Chociaż jest to z pewnością spowodowane presją ze strony firm ubezpieczeniowych, jest również podyktowane – jak zauważył dyrektor fabryki – długością życia produktu.

Jednak w przypadku oprogramowania krótsze cykle życia i ciągłe aktualizacje oznaczają, że integralność kodu źródłowego jest często pomijana na rzecz nowych funkcji, zaawansowanej funkcjonalności i szybkości wprowadzania na rynek. Menedżerowie produktu często tracą priorytet zapewniania jakości kodu źródłowego lub pozostawiają to programistom, mimo że jest to jeden z bardziej krytycznych czynników decydujących o losie produktu. Dla menedżerów produktu, którym zależy na zbudowaniu solidnych podstaw do rozwoju produktu i eliminowaniu ryzyka, niezbędne jest zdefiniowanie i wdrożenie systematycznej oceny jakości kodu źródłowego.

Definiowanie „jakości”

Przed zbadaniem sposobów prawidłowej oceny i wdrożenia procesu kontroli jakości kodu źródłowego ważne jest, aby określić, co oznacza „jakość” w kontekście tworzenia oprogramowania. Jest to złożone i wieloaspektowe zagadnienie, ale dla uproszczenia możemy powiedzieć, że jakość odnosi się do kodu źródłowego, który wspiera propozycję wartości produktu bez narażania zadowolenia konsumentów i narażania modelu biznesowego firmy deweloperskiej.

Dobry proces qa oprogramowania powinien uwzględniać wiele czynników.

Innymi słowy, jakościowy kod źródłowy dokładnie implementuje specyfikacje funkcjonalne produktu, spełnia wymagania niefunkcjonalne, zapewnia satysfakcję konsumentów, minimalizuje zagrożenia bezpieczeństwa i prawne oraz może być utrzymywany i rozszerzany w przystępnej cenie.

Dobry proces oprogramowania qa może obniżyć koszty związane z awariami oprogramowania, problemami ze starszymi systemami i anulowanymi projektami.
Źródło: CISQ

Biorąc pod uwagę, jak szeroko i szybko rozpowszechnia się oprogramowanie, wpływ defektów oprogramowania może być znaczący. Problemy takie jak błędy i złożoność kodu mogą zaszkodzić wynikom finansowym firmy, utrudniając wdrażanie produktów i zwiększając koszty zarządzania zasobami oprogramowania (SAM), podczas gdy naruszenia bezpieczeństwa i naruszenia zgodności licencji mogą wpłynąć na reputację firmy i wzbudzić wątpliwości prawne. Nawet jeśli defekty oprogramowania nie mają katastrofalnych skutków, wiążą się z niezaprzeczalnymi kosztami. W raporcie z 2018 r. firma Tricentis ustaliła, że ​​606 awarii oprogramowania z 314 firm spowodowało utratę 1,7 biliona dolarów w poprzednim roku. W opublikowanym właśnie raporcie z 2020 r. CISQ określił koszt oprogramowania złej jakości w Stanach Zjednoczonych na 2,08 biliona dolarów, a kolejne szacowane na 1,31 biliona dolarów poniosą w przyszłości koszty związane z długiem technicznym. Liczby te można złagodzić dzięki wcześniejszym interwencjom; średni koszt rozwiązania problemu podczas projektowania produktu jest znacznie niższy niż rozwiązanie tego samego problemu podczas testowania, co z kolei jest wykładniczo niższe niż rozwiązanie problemu po wdrożeniu.

Aby obniżyć koszty, proces oprogramowania qa musi identyfikować problem blisko źródła.
Źródło: IBM System Science Institute

Postępowanie z gorącymi ziemniakami

Pomimo zagrożeń, zapewnienie jakości w tworzeniu oprogramowania jest traktowane fragmentarycznie i charakteryzuje się podejściem reaktywnym, a nie proaktywnym stosowanym w innych branżach. Kwestionowana jest własność jakości kodu źródłowego, która powinna być postrzegana jako zbiorowa odpowiedzialność różnych funkcji. Menedżerowie produktu muszą postrzegać jakość jako wpływową cechę, a nie koszty ogólne, kierownictwo powinno zwracać uwagę na stan jakości i w niego inwestować, a funkcje inżynierskie nie powinny traktować czyszczenia kodu jako „gorącego ziemniaka”.

Te wyzwania związane z delegowaniem potęguje fakt, że istniejące metodologie i narzędzia nie rozwiązują całości problemu jakości kodu. Zastosowanie metodologii ciągłej integracji/ciągłego dostarczania zmniejsza wpływ kodu niskiej jakości, ale jeśli CI/CD nie jest oparte na dokładnej i holistycznej analizie jakości, nie może skutecznie przewidywać i rozwiązywać większości zagrożeń. Zespoły odpowiedzialne za testowanie jakości, bezpieczeństwo aplikacji i zgodność licencji pracują w silosach, korzystając z narzędzi, które zostały zaprojektowane w celu rozwiązania tylko jednej części problemu i oceny tylko niektórych wymagań niefunkcjonalnych lub funkcjonalnych.

Biorąc pod uwagę rolę Product Managera

Jakość kodu źródłowego wiąże się z licznymi dylematami, przed którymi staje menedżer produktu podczas projektowania produktu i podczas całego cyklu życia oprogramowania. Dług finansowy jest dużym obciążeniem ogólnym. Trudniejsze i droższe jest dodawanie i modyfikowanie funkcji w bazie kodu niskiej jakości, a obsługa istniejącej złożoności kodu wymaga znacznych inwestycji czasu i zasobów, które w przeciwnym razie można by przeznaczyć na rozwój nowego produktu. Ponieważ menedżerowie produktu nieustannie równoważą ryzyko z szybkością wejścia na rynek, muszą rozważyć pytania takie jak:

  • Czy powinienem używać biblioteki OSS (oprogramowania open source) czy budować funkcjonalność od podstaw? Jakie licencje i potencjalne zobowiązania wiążą się z wybranymi bibliotekami?
  • Który stos technologii jest najbezpieczniejszy? Co zapewnia szybki i tani cykl rozwoju?
  • Czy powinienem priorytetowo traktować konfigurowalność aplikacji (wysoki koszt/opóźnienie czasowe) czy wdrożyć niestandardowe wersje (wysokie koszty utrzymania/brak skalowalności)?
  • Jak wykonalna będzie integracja nowo nabytych produktów cyfrowych przy zachowaniu wysokiej jakości kodu, minimalizacji ryzyka i utrzymaniu niskich kosztów inżynieryjnych?

Odpowiedzi na te pytania mogą poważnie wpłynąć na wyniki biznesowe i reputację menedżera produktu, jednak decyzje są często podejmowane na podstawie intuicji lub wcześniejszych doświadczeń, a nie rygorystycznych badań i solidnych wskaźników. Dokładny proces oceny jakości oprogramowania nie tylko dostarcza danych potrzebnych do podejmowania decyzji, ale także łączy interesariuszy, buduje zaufanie i przyczynia się do kultury przejrzystości, w której priorytety są jasne i uzgodnione.

Wdrażanie 7-etapowego procesu

Kompletny proces oceny jakości kodu źródłowego skutkuje diagnozą, która uwzględnia pełny zestaw określeń jakości, a nie kilka pojedynczych symptomów większego problemu. Przedstawiona poniżej siedmioetapowa metoda jest zgodna z zaleceniami CISQ dotyczącymi doskonalenia procesów i ma na celu ułatwienie realizacji następujących celów:

  • Znajdź, zmierz i napraw problem blisko jego pierwotnej przyczyny.
  • Mądrze inwestuj w poprawę jakości oprogramowania w oparciu o ogólne pomiary jakości.
  • Rozwiąż problem, analizując pełny zestaw pomiarów i identyfikując najlepsze, najbardziej opłacalne ulepszenia.
  • Rozważ całkowity koszt oprogramowania, w tym koszty posiadania, utrzymania i dostosowania licencji/regulacji bezpieczeństwa.
  • Monitoruj jakość kodu w całym SDLC, aby zapobiec nieprzyjemnym niespodziankom.

Siedem kroków potrzebnych do pełnego oprogramowania qa procesu.
Kompleksowy siedmioetapowy proces oceny jakości kodu

1. Mapowanie produktu do kodu: śledzenie funkcji produktu z powrotem do ich bazy kodu może wydawać się oczywistym pierwszym krokiem, ale biorąc pod uwagę tempo wzrostu złożoności programowania, niekoniecznie jest to proste. W niektórych sytuacjach kod produktu jest podzielony między kilka repozytoriów, podczas gdy w innych wiele produktów korzysta z tego samego repozytorium. Zidentyfikowanie różnych lokalizacji, w których znajdują się określone części kodu produktu, jest konieczne, zanim będzie można przeprowadzić dalszą ocenę.

2. Analiza stosu technologicznego: Ten krok uwzględnia różne języki programowania i używane narzędzia programistyczne, procent komentarzy na plik, procent kodu wygenerowanego automatycznie, średni koszt rozwoju i inne.

Sugerowane narzędzia: cloc

Alternatywy: Tokei, scc, sloccount

Analiza stosu technologicznego jest częścią dobrego procesu qa oprogramowania.
Analiza stosu technologicznego za pomocą cloc

3. Analiza wersji: Na podstawie wyników tej części audytu, która obejmuje identyfikację wszystkich wersji bazy kodu i obliczenie podobieństw, można połączyć wersje i wyeliminować duplikaty. Ten krok można połączyć z analizą błędów (gorących punktów), która identyfikuje trudne części kodu, które są najczęściej poprawiane i generują wyższe koszty utrzymania.

Sugerowane narzędzia: cloc, scc, sloccount

4. Zautomatyzowany przegląd kodu: ta inspekcja bada kod pod kątem defektów, naruszeń praktyk programistycznych i ryzykownych elementów, takich jak zakodowane na sztywno tokeny, długie metody i duplikaty. Narzędzia wybrane do tego procesu będą zależeć od wyników powyższej analizy stosu technologicznego i wersji.

Sugerowane narzędzia: SonarQube, Codacy

Alternatywy: RIPS, Veracode, Micro Focus, Parasoft i wiele innych. Inną opcją jest Sourcegraph, uniwersalne rozwiązanie do wyszukiwania kodu.

Zautomatyzowany przegląd kodu jest częścią dobrego procesu qa oprogramowania.
Zautomatyzowany przegląd kodu za pomocą SonarQube

5. Statyczna analiza bezpieczeństwa: Ten krok, znany również jako statyczne testowanie bezpieczeństwa aplikacji (SAST), bada i identyfikuje potencjalne luki w zabezpieczeniach aplikacji. Większość dostępnych narzędzi skanuje kod pod kątem często występujących problemów bezpieczeństwa zidentyfikowanych przez organizacje takie jak OWASP i SANS.

Sugerowane narzędzia: WhiteSource, Snyk, Coverity

Alternatywy: SonarQube, Reshift, Kiuwan, Veracode

Statyczna analiza bezpieczeństwa jest częścią dobrego procesu qa oprogramowania.
Analiza bezpieczeństwa za pomocą Snyk

6. Analiza komponentów oprogramowania (SCA)/analiza zgodności licencji: Ten przegląd obejmuje identyfikację bibliotek typu open source połączonych bezpośrednio lub pośrednio z kodem, licencji chroniących każdą z tych bibliotek oraz uprawnień związanych z każdą z tych licencji.

Sugerowane narzędzia: Snyk, WhiteSource, Black Duck

Alternatywy: FOSSA, Sonatype i inne

7. Analiza ryzyka biznesowego: Ten ostatni środek obejmuje konsolidację informacji zebranych w poprzednich krokach w celu zrozumienia pełnego wpływu stanu jakości kodu źródłowego na biznes. Wynikiem analizy powinien być obszerny raport, który dostarczy zainteresowanym stronom, w tym kierownikom produktów, kierownikom projektów, zespołom inżynierskim i kadrze kierowniczej, szczegółowych informacji potrzebnych do oceny ryzyka i podejmowania świadomych decyzji dotyczących produktów.

Chociaż poprzednie kroki w tym procesie oceny można zautomatyzować i ułatwić dzięki szerokiej gamie produktów typu open source i produktów komercyjnych, nie ma istniejących narzędzi, które wspierałyby pełny siedmioetapowy proces lub agregację jego wyników. Ponieważ kompilacja tych danych jest żmudnym i czasochłonnym zadaniem, jest ona wykonywana przypadkowo lub całkowicie pomijana, potencjalnie zagrażając procesowi tworzenia. Jest to moment, w którym dokładny proces kontroli oprogramowania często się rozpada, co czyni ten ostatni krok prawdopodobnie najbardziej krytycznym w procesie oceny.

Wybór odpowiednich narzędzi

Chociaż jakość oprogramowania wpływa na produkt, a tym samym na wyniki biznesowe, wybór narzędzi jest generalnie delegowany do działów rozwoju, a wyniki mogą być trudne do interpretacji przez osoby nie będące programistami. Menedżerowie produktu powinni być aktywnie zaangażowani w wybór narzędzi zapewniających przejrzysty i przystępny proces zapewniania jakości. Chociaż powyżej sugerowane są konkretne narzędzia dla różnych etapów oceny, istnieje szereg ogólnych kwestii, które należy uwzględnić w każdym procesie wyboru narzędzi:

  • Obsługiwany stos technologii: należy pamiętać, że większość dostępnych ofert obsługuje tylko niewielki zestaw narzędzi programistycznych i może skutkować częściowymi lub mylącymi raportami.
  • Prostota instalacji: narzędzia, których procesy instalacji są oparte na złożonych skryptach, mogą wymagać znacznych inwestycji inżynieryjnych.
  • Raportowanie: Preferowane powinny być narzędzia, które eksportują szczegółowe, dobrze ustrukturyzowane raporty, które identyfikują główne problemy i dostarczają zaleceń dotyczących poprawek.
  • Integracja: Narzędzia należy sprawdzać pod kątem łatwej integracji z innymi używanymi narzędziami programistycznymi i zarządzającymi.
  • Cennik: Narzędzia rzadko są dostarczane z wyczerpującym cennikiem, dlatego ważne jest, aby dokładnie rozważyć inwestycję. Różne modele cenowe zazwyczaj uwzględniają takie rzeczy, jak liczba osób w zespole, rozmiar kodu i zaangażowane narzędzia programistyczne.
  • Wdrożenie: Rozważając wdrożenie lokalne w porównaniu z wdrożeniem w chmurze, należy wziąć pod uwagę takie czynniki, jak bezpieczeństwo. Na przykład, jeśli oceniany produkt obsługuje dane poufne lub wrażliwe, preferowane mogą być narzędzia lokalne i narzędzia wykorzystujące podejście ślepego audytu (FOSSID).

Utrzymanie tego w ruchu

Gdy ryzyko zostanie zidentyfikowane i przeanalizowane metodycznie, menedżerowie produktu mogą dokładniej podejmować przemyślane decyzje dotyczące priorytetyzacji i selekcji defektów. Zespoły można zrestrukturyzować i przydzielić zasoby, aby rozwiązać najbardziej pojawiające się lub rozpowszechnione problemy. „Pokonujące przeszkody”, takie jak naruszenia licencji wysokiego ryzyka, miałyby pierwszeństwo przed defektami o mniejszej wadze, a większy nacisk byłby położony na działania, które przyczyniają się do zmniejszenia rozmiaru i złożoności kodu.

Nie jest to jednak jednorazowy proces. Pomiar i monitorowanie jakości oprogramowania powinno odbywać się w sposób ciągły przez cały SDLC. Pełna siedmioetapowa ocena powinna być przeprowadzana okresowo, a wysiłki na rzecz poprawy jakości rozpoczynają się natychmiast po każdej analizie. Im szybciej zostanie zidentyfikowany nowy punkt ryzyka, tym tańsze lekarstwo i mniejsze skutki. Uczynienie oceny jakości kodu źródłowego centralnym elementem procesu rozwoju produktu skupia zespoły, dopasowuje interesariuszy, łagodzi ryzyko i daje produktowi największą szansę na sukces — a to jest biznes każdego menedżera produktu.