Obiektywne wskaźniki jakości oprogramowania [zamknięte]

12

Istnieją różne rodzaje jakości, które można mierzyć w oprogramowaniu, np. Przydatność do określonego celu (np. Zastosowanie końcowe), łatwość konserwacji, wydajność. Niektóre z nich są nieco subiektywne lub specyficzne dla danej dziedziny (np. Dobre zasady projektowania GUI mogą być różne w różnych kulturach lub zależą od kontekstu użytkowania, w zależności od użycia w celach militarnych i konsumenckich).

Interesuje mnie głębsza forma jakości związana z siecią (lub wykresem) typów i ich wzajemnymi powiązaniami, to znaczy do jakich typów odnosi się każdy typ, czy istnieją wyraźnie identyfikowalne klastry wzajemnych połączeń odnoszące się do właściwie architektura wielopoziomowa, lub odwrotnie, istnieje duża „kula” odniesień typu (kod „monolityczny”). Również rozmiar każdego typu i / lub metody (np. Mierzony ilością kodu bajtowego Java lub .Net IL) powinien dać pewne wskazanie, gdzie duże złożone algorytmy zostały zaimplementowane jako monolityczne bloki kodu zamiast być rozkładane na łatwiejsze w zarządzaniu / utrzymywaniu kawałki.

Analiza oparta na takich pomysłach może być w stanie obliczyć wskaźniki, które są co najmniej wskaźnikiem jakości. Podejrzewam, że dokładne progi / punkty decyzyjne pomiędzy wysoką a niską jakością są subiektywne, np. Ponieważ przez łatwość utrzymania rozumiemy przez to możliwość utrzymania przez ludzkich programistów, a zatem rozkład funkcjonalny musi być zgodny z tym, jak działają ludzkie umysły. Jako taki zastanawiam się, czy kiedykolwiek może istnieć matematycznie czysta definicja jakości oprogramowania, która wykracza poza wszelkie możliwe oprogramowanie we wszystkich możliwych scenariuszach.

Zastanawiam się również, czy to niebezpieczny pomysł, że jeśli obiektywne wskaźniki jakości staną się popularne, presja biznesowa spowoduje, że programiści zastosują te wskaźniki kosztem ogólnej jakości (tych aspektów jakości, które nie są mierzone przez proxy).

Innym sposobem myślenia o jakości jest z punktu widzenia entropii. Entropia to tendencja systemów do zmiany stanu z uporządkowanego na nieuporządkowany. Każdy, kto kiedykolwiek pracował nad prawdziwym światowym projektem oprogramowania o średniej i dużej skali, z pewnością doceni stopień, w jakim jakość bazy kodu z czasem spada. Presja biznesowa generalnie powoduje zmiany, które koncentrują się na nowej funkcjonalności (z wyjątkiem sytuacji, gdy sama jakość jest głównym punktem sprzedaży, np. W oprogramowaniu awionicznym), a także obniżaniu jakości poprzez problemy z regresją i funkcjonalność „klaksonu”, gdzie nie pasuje dobrze perspektywa jakości i utrzymania. Czy możemy zmierzyć entropię oprogramowania? A jeśli tak, to w jaki sposób?

redcalx
źródło
Zgadzam się z S. Lottem. W życiu często występuje różnica między „jak powinno być” a „jak jest”. Chłopcze, chciałbym, żeby więcej ludzi na tej planecie przezwyciężyło podejście oparte na „dobrych intencjach” i ciężko patrzyło na „jak to jest”. Oprócz niewłaściwych zachęt będzie istniało niebezpieczne fałszywe poczucie bezpieczeństwa. Połącz to z ludźmi próbującymi grać w system (co jest naturalne, ponieważ ZAWSZE starają się poprawić swoje warunki (pieniężne lub inne)), a dostaniesz kiepską sytuację. Nie powinno dziwić, że załamanie rynku „raz na tysiąc lat” zdarza się raz na 2 dekady.
Job

Odpowiedzi:

20

To niebezpieczny pomysł. „Obiektywne” parametry pośrednie w zakresie jakości prowadzą bezpośrednio do nagród dla kierownictwa, a programiści zastosują się do tych wskaźników kosztem rzeczywistej jakości.

To jest prawo niezamierzonych konsekwencji.

Jakość - choć ważna - jest tylko jednym małym aspektem oprogramowania. Funkcjonalność i wartość tworzone przez oprogramowanie są o wiele ważniejsze niż jakość.

Wszystkie dane prowadzą do aktywności w celu optymalizacji danych. To z kolei ma konsekwencje, których możesz nie lubić.

Oprogramowanie jest bardzo złożone. Trudno zrozumieć, jak naprawdę jest złożona.

Nawet takie „oczywiste” rzeczy, jak pokrycie kodu testu jednostkowego, mogą tracić czas. Osiągnięcie 100% może wymagać stworzenia testów, które są w rzeczywistości bardziej złożone niż testowany trywialny kod. Dotarcie do 100% ubezpieczenia może wiązać się z niedopuszczalnym kosztem. [Alternatywą dla trywialnego, małego, rzadko używanego kodu jest test przez kontrolę. Ale to nie pasuje do 100-metrowej gry.]

Innym przykładem jest cykliczność. Jest to jedna z najlepszych miar jakości kodu. Ale można w nią grać, tworząc wiele małych funkcji, które mogą być trudniejsze do odczytania (i trudniejsze w utrzymaniu) niż jedna większa funkcja. Kończymy w recenzjach kodu, w których zgadzasz się, że może nie być bardzo czytelny, ale spełnia próg złożoności.

S.Lott
źródło
3
„Wszystkie dane prowadzą do działań mających na celu ich optymalizację”. Myślę, że to zbyt często prawda. Jednak nie powinno tak być. Wskaźniki powinny, jak wspomniałem w moich ostatnich akapitach, kierować zarządzaniem. Jednak zbyt często decyzje są podejmowane wyłącznie z powodu liczb, bez zrozumienia znaczenia liczb oraz ryzyka i kompromisów związanych z decyzją.
Thomas Owens
3
„Jednak nie powinno tak być”. Wyjaśnij, w jaki sposób można powiedzieć ludziom, aby nie optymalizowali swoich nagród. Znajdź jeden przykład ludzkiego zachowania, w którym nagrody kulturalne (oparte na wszelkiego rodzaju szalonych strukturach społecznych) nie są najważniejsze, najważniejsze i najważniejsze dla ludzi. Wszystko, co wiąże się z „powinno” lub „nie powinno”, musi być porównane z tym, co ludzie naprawdę robią. Naprawdę optymalizują swoje nagrody. Jeśli dane są częścią nagród, ludzie je optymalizują. Proszę nie używać „należy” do opisywania ludzkich zachowań.
S.Lott,
2
@Thomas Owens: „Po prostu nie masz żadnych nagród do optymalizacji na podstawie danych”. Zabawne. Jak utrzymasz je w tajemnicy? Gdy dowiem się, że Twój kod został zaakceptowany wcześniej niż mój, chcę wiedzieć, w jaki sposób kierownictwo zdecydowało, że moduł został ukończony, a mój nie. Gdy znajdę metrykę, która „kieruje” tą decyzją, całkowicie sprawdzę metrykę, aby wykonać ją już ty. Jeśli nie ma danych, które mógłbym zagrać, zobaczę, że decyzja była arbitralna, zarząd lubi cię lepiej niż ja, i zrezygnuję, ponieważ nie ma standardu wydajności, który byłbym w stanie postrzegać.
S.Lott
2
@Thomas Owens: „Nigdy nie widziałem, by wskaźniki prowadziły do ​​nagród”. Zachęty kulturowe istnieją we wszystkich sytuacjach, w których dwie lub więcej osób pracuje razem. „Osoby są uznawane za ich wyniki”. Metryka złożoności cyklicznej staje się celem. Jeśli osiągniesz swój cykliczny cel złożoności szybciej niż ja, wówczas są nagrody kulturalne: jesteś bardziej „produktywny” niż ja. Muszę sprawdzić swoją metrykę złożoności, aby wyglądać tak „produktywnie” jak Ty.
S.Lott,
2
@Thomas Owens: „To kwestia osobistej dumy”. To świetny przykład kulturalnego systemu nagród. Metryki mogą to zniekształcać z powodu niezamierzonych konsekwencji stworzenia dobrze wyglądającej metryki, która nie pasuje do dobrego kodu. Podałeś doskonały przykład nagród kulturalnych, które można wypaczyć za pomocą wskaźników.
S.Lott
4

Zastanawiam się również, czy to niebezpieczny pomysł, że jeśli obiektywne wskaźniki jakości staną się popularne, presja biznesowa spowoduje, że programiści zastosują te wskaźniki kosztem ogólnej jakości (tych aspektów jakości, które nie są mierzone przez proxy).

Bingo, a nie „jeśli” o tym. Nazywa się to „dysfunkcją pomiaru” i zostało zaobserwowane i napisane wiele razy, gdy Joel napisał na ten temat artykuł w 2002 roku, odnosząc się do książki profesora Harvarda.

To nie znaczy, że takie wskaźniki są bezużyteczne, tylko że nigdy nie należy opierać zachęt ani zasad wyraźnie na takich pomiarach zastępczych. Jeśli chcesz poprawić jakość, dobrym pomysłem jest rozpoczęcie pomiaru proxy o bardzo złej wartości. Ale nie można stwierdzić, że jakość jest dobra tylko dlatego, że wszystkie dane mają świetne wartości.

Michael Borgwardt
źródło
3

Interesuje mnie głębsza forma jakości związana z siecią (lub wykresem) typów i ich wzajemnymi powiązaniami, to znaczy do jakich typów odnosi się każdy typ, czy istnieją wyraźnie identyfikowalne klastry wzajemnych połączeń odnoszące się do właściwie architektura wielopoziomowa, lub odwrotnie, istnieje duża „kula” odniesień typu (kod „monolityczny”).

To brzmi jak wachlowanie i wachlowanie. Fan-in zlicza liczbę modułów, które wywołują dany moduł, a fan-out zlicza liczbę modułów wywoływanych przez dany moduł. Znakiem ostrzegawczym do użycia byłyby moduły, które mają duży wachlarz i duży wachlarz, ponieważ może to wskazywać na słabą konstrukcję i kluczowy cel dla refaktoryzacji lub przeprojektowania.

Również rozmiar każdego typu i / lub metody (np. Mierzony ilością kodu bajtowego Java lub .Net IL) powinien dać pewne wskazanie, gdzie duże złożone algorytmy zostały zaimplementowane jako monolityczne bloki kodu, zamiast być rozkładane na łatwiejsze w zarządzaniu / utrzymywaniu kawałki.

Prostym pomiarem byłyby linie kodu. Możesz podzielić go na wszystkie wiersze kodu w całym projekcie i wiersze kodu na moduł (być może przy użyciu modułów o różnych rozmiarach). Możesz użyć tego jako wskaźnika ostrzegawczego wskazującego, że powinieneś przejrzeć poszczególne moduły. Książka o pomiarach i pomiarach jakości oprogramowania omawia niektóre prace, które wskazują, że związek między współczynnikami defektów a rozmiarem modułu jest krzywoliniowy, przy czym średni defekt na KSLOC pochodzi z modułów o wielkości od 175 do 350 SLOC.

Coś nieco bardziej złożonego byłoby złożonością cykliczną, która ma na celu wskazanie testowalności, zrozumiałości i możliwości utrzymania systemu. Cyklomatyczna złożoność zlicza liczbę niezależnych ścieżek przez aplikację lub moduł. Liczba testów, a co za tym idzie wysiłek potrzebny do wykonania i wykonania testów, jest ściśle związana ze złożonością cykliczną.

Podejrzewam, że dokładne progi / punkty decyzyjne pomiędzy wysoką a niską jakością są subiektywne, np. Ponieważ przez łatwość utrzymania rozumiemy przez to możliwość utrzymania przez ludzkich programistów, a zatem rozkład funkcjonalny musi być zgodny z tym, jak działają ludzkie umysły.

Nie jestem pewien, czy tak jest.

Na przykład, istnieją badania sugerujące, że pamięć robocza człowieka może pomieścić tylko 7 obiektów plus / minus 2 . Prawdopodobnie jest to interesujące w przypadku pomiaru wachlarza i wachlarza - jeśli pracuję w module i jest on podłączony do więcej niż ~ 7 innych modułów, prawdopodobnie nie będę w stanie dokładnie śledzić, co te inne moduły są w mojej głowie.

Pracowano także nad powiązaniem defektów z miernikami, takimi jak złożoność cykliczna. Ponieważ chcesz zminimalizować defekty w systemie, możesz zidentyfikować punkty, które wymagają większego wysiłku w testowaniu lub refaktoryzacji, na co wskazuje duża złożoność cykliczna.

Zastanawiam się również, czy to niebezpieczny pomysł, że jeśli obiektywne wskaźniki jakości staną się popularne, presja biznesowa spowoduje, że programiści zastosują te wskaźniki kosztem ogólnej jakości (tych aspektów jakości, które nie są mierzone przez proxy).

Tak jest w przypadku wszelkich pomiarów lub miar. Muszą być używane do zrozumienia systemu i podejmowania świadomych decyzji. Przyszło mi na myśl wyrażenie „nie możesz zarządzać tym, czego nie możesz zmierzyć”. Jeśli potrzebujesz oprogramowania wysokiej jakości, potrzebujesz kilku pomiarów i wskaźników, aby ocenić tę jakość. Istnieje jednak druga strona. Nie możesz zarządzać wyłącznie za pomocą liczb. Możesz używać liczb do podejmowania świadomych decyzji, ale nie możesz podejmować decyzji tylko dlatego, że tak mówią liczby.

Thomas Owens
źródło
Problem z włączaniem / wyłączaniem polega na tym, że podaje dwie liczby na moduł / klasę (lub cokolwiek innego) i dlatego ignoruje niektóre głębsze struktury organizacyjne sposobu łączenia modułów. Np. Możesz mieć mały klaster wysoce połączonych modułów związanych z warstwą logiczną i można oczekiwać, że połączenia między warstwami będą minimalne (w porównaniu), reprezentując dobrze zdefiniowany interfejs / kontrakt między warstwami. Myślę, że cieszymy się, że niektóre moduły są mocno połączone (np. Powszechnie używane metody / klasy pomocnicze), ale w zależności od „struktury” łączności (to moja hipoteza).
redcalx
@locster Prawdopodobnie chcesz go rozwinąć i zanotować na przykład, w których pakietach znajdują się klasy, do których jesteś podłączony. Nie patrz tylko na liczby surowe, ale podziel je na elementy takie jak klasy X w moim pakiecie, Y klasy poza moim pakietem lub klasy Z w tym konkretnym pakiecie. Jeśli widzisz rozkład między modułami w modelu danych a modułami w interfejsie użytkownika, może to wskazywać na problem. Musisz kopać nieco głębiej niż tylko liczby surowe.
Thomas Owens
3

Istnieją wskaźniki lub wskaźniki zastępcze dla wielu cech, którymi jesteś zainteresowany:

  1. Linie kodu
  2. Wachluj, wachluj
  3. Współczynnik błędów na 1000 linii kodu
  4. Złożoność cykliczna
  5. Pokrycie kodu
  6. Zasięg punktów decyzyjnych
  7. Współczynnik błędów naprawionych / wprowadzonych przez czynności konserwacyjne
  8. Analiza punktu funkcji

Występują pewne problemy ze wszystkimi tymi elementami:

  1. Trwają prace nad optymalizacją miernika - trend uniwersalny; znacznie zaostrzone, jeśli którykolwiek z mierników zostanie wykorzystany jako podstawa oceny lub nagrody dla zespołów lub osób.
  2. Nie znam żadnych danych, które nie zawierają kontekstu. Oznacza to, że porównanie nie jest możliwe w różnych sklepach - z czasem tylko w sklepach. Dane wynikające z takich porównań są nadal cenne - „czy kod produkujemy teraz bardziej poprawnie niż rok temu”.

Całkowitym skutkiem tych problemów jest to, że takie wskaźniki mogą być cenne tylko w szerszej kulturze - takie jak TQM, zapewnienie jakości (nie kontrola), ciągłe doskonalenie, kaizan itp. Konieczne jest zdefiniowanie elementów zarówno kultury i jak trzeba to zmienić. Jeśli masz ich definicję, wówczas takie metryki stają się niezbędnymi narzędziami pomagającymi poprawić jakość kodu, praktyki robocze, wydajność itp. Bez tego szerszego kontekstu metryki generują pracę w celu optymalizacji metryki; stanie się narzędziem beancounter do zwiększania wydajności i obniżania kosztów; i stanie się przeszkodą do grania przez personel programistyczny.

Chris Walton
źródło
2

Możesz mieć obsesję na punkcie wskaźników lub obsesję na punkcie najlepszych ludzi, narzędzi, praktyk inżynierskich i kontroli jakości, na jakie Cię stać. Byłbym znacznie szczęśliwszy, mając kilku paranoicznych geniuszy QA, którzy przeczytali „Fooled by Randomness” i lubią automatyzować niż kilka ładnie sformatowanych raportów z liczbami.

Praca
źródło
+1 za odniesienie do książki Nassim Taleb. Błędne rozumowanie / epistemologia znajduje się w łańcuchu przyczynowości niskiej jakości.
redcalx,
@locster, twój komentarz przypomniał mi operatora F # pipeline :). Zaczynasz od „Odniesienia do książki Nassima Taleba”, a kończysz na „łańcuch przyczynowości dla niskiej jakości” (zamiast „łańcuch przyczynowości niskiej jakości”). Podobnie jak w języku angielskim, czasami lubimy mieć dwa sposoby mówienia rzeczy, możemy też preferować to w języku programowania.
Job
1

Jest ten podstawowy problem z pomiarami.

Wykazano, że prawie wszystkie proponowane metryki, w prawdziwym świecie na prawdziwym kodzie, są silnie lub bardzo silnie skorelowane z surowym SLOC (wierszami kodu źródłowego).

Właśnie to zabiło miary Halsteada w latach siedemdziesiątych. (Przez przypadek, pewnego dnia, około 1978 r., Zasiadłem w rozmowie nowego doktora na temat wskaźników Halsteada, w której to zauważył).

Niedawno wykazano, że cykliczna złożoność McCabe'a jest bardzo silnie skorelowana z surowym SLOC, do tego stopnia, że ​​facet, który przeprowadził badanie, zastanawiał się głośno, czy metryka McCabe powiedziała nam coś pożytecznego.

Od dziesięcioleci wiemy, że duże programy mają większe problemy niż małe. Od dziesięcioleci wiemy, że większe podprogramy częściej zawierają błędy niż małe. Dlaczego potrzebujemy tajemniczych wskaźników, aby nam to powiedzieć, gdy patrzenie na cztery strony drukarki rozłożone na stole powinno być wystarczająco przekonujące?

John R. Strohm
źródło
Aby był łatwy w utrzymaniu, potrzebujemy kodu znajdującego się w kawałkach ludzkich, dlatego metryka SLOC wygląda całkiem dobrze z tej perspektywy. Jednak dla danego rozmiaru możesz mieć różną liczbę unikalnych ścieżek (zależnie od złożoności cyklicznej) i argumentowałbym, że więcej ścieżek jest proxy dla mniej zrozumiałych. Dlatego argumentowałbym, że CC prawdopodobnie dodaje / trochę / dodatkową wartość do SLOC, o ile pozwalasz na pewną elastyczność, wyjątki od reguły itp. Oznacza to, że nie egzekwuj ściśle CC.limitów / celów.
redcalx
1
@locster: Biorąc pod uwagę dwa 100 modułów SLOC, jeden z CC 47 może mieć więcej problemów niż jeden z CC 3. JEDNAK, w przypadku kodu w świecie rzeczywistym, w dużych ilościach, okazuje się, że krótkie moduły mają zwykle niski CC i długie moduły mają zwykle wysokie CC, do tego stopnia, że ​​znajomość SLOC daje bardzo dobre domysły w CC i odwrotnie. To właśnie oznacza „bardzo silnie skorelowane”. TAKIE TAKIE, jak na prawdziwym kodzie, każda korzyść, jaką dostaniesz po zauważeniu CC = 47, jest BARDZIEJ ŁATWIEJSZA uzyskana dzięki zauważeniu SLOC = 1500. (Liczby losowane, zasada jest taka sama.)
John R. Strohm
Tak, zgadzam się, że będą one zwykle silnie skorelowane, chociaż relacja jest zasadniczo nieliniowa. np. wynik CC jest z grubsza podniesiony przez LOC do pewnej mocy. Zatem z psychologicznego punktu widzenia wynik CC może być bardzo duży, bardzo szybki, podczas gdy powiązany wynik SLOC wydaje się „tylko nieco wyższy”. Tak, wiem, że trzymam się tutaj słomek :)
redcalx
@locster: Robię to od ponad 30 lat. W dzisiejszych czasach rutynowo widzę procedury biegania w strumieniu świadomości, które trwają i trwają przez kilkaset SLOC, bez powodu. Przez te wszystkie lata widziałem dokładnie jedną (1) procedurę, która faktycznie POTRZEBOWAŁA więcej niż jednej strony kodu drukarki (około 60 linii). Cała reszta mogła być dość opłacona, a czytelność i niezawodność znacznie wzrosły. (To nie liczy dużych automatów stanowych. Mogą być problemem w tej dziedzinie, ale są RZADKIE.)
John R. Strohm
-2

Biorąc pod uwagę wszystkie inne odpowiedzi tutaj, czuję się trochę głupio z tym małym. Spójrz na Crap4j , który próbuje uszeregować metody w Javie według ich smrodu. (Projekt wygląda na opuszczony).

Wykorzystuje połączenie złożoności cyklicznej i zasięgu testu. Jak każda inna metryka, jest dostępna.

Sean McMillan
źródło