Skąd wiesz, czy oprogramowanie jest dobre czy złe na podstawie danych empirycznych?

18

Obecnie jestem proszony o przyjrzenie się projektowi, który zakończył podstawowy rozwój pięć miesięcy temu, ale nadal ma wysoki poziom wad. To, co się dzieje, dotyczy około 10 naprawionych wad, zgłaszamy co najmniej 4, aw niektórych przypadkach 8 wad.

Uważam, że praktyka kodowania u dostawcy jest słaba i istnieje ogólna zgoda w tej sprawie. Zastanawiam się jednak, czy istnieje problem strukturalny z oprogramowaniem? Gęstość defektów jest użyteczną miarą, ale bardziej, jeśli podstawowe oprogramowanie jest źle napisane, to wszystko, co robi dostawca, przesuwa problem.

W infrastrukturze jest bardziej zdefiniowane, jeśli coś jest źle zbudowane, jakie pomiary można zastosować dla oprogramowania oprócz defektów na LOC?

Produkt znajdował się w fazie naprawy defektów od 4 miesięcy i nadal nie usunął wystarczającej liczby defektów krytycznych. Nie wprowadzamy nowych funkcji, tylko naprawiamy problemy z regresją.

Wskazuje to na problem z jakością programowania, który nie jest zadowolony. Jeśli jednak sam produkt jest zasadniczo wadliwy, jest to inny problem. Zaniepokojenie jest to, że podstawowa baza kodu została źle napisana i ma ograniczoną dokumentację, wszyscy zewnętrzni programiści przenoszą problem z A do B. Gdy wewnętrzne zespoły programistyczne przejmą, obawiam się, że będą musieli zasadniczo przepisać kod, aby spraw, by było funkcjonalne.

Kiedy więc zaakceptujesz produkt od strony trzeciej i zostaniesz poproszony o jego wsparcie, jakich kryteriów akceptacji użyłbyś do zdefiniowania standardów?

Oprócz tego, aby nasz główny programista dokonał przeglądu kodu dla każdej wersji, nie jesteś pewien, co jeszcze można zrobić?

Nomadyczna technologia
źródło
8
Gdyby istniała przydatna metryka empiryczna (automatycznie obliczalna) dla dobrego oprogramowania, ludzie używaliby jej w dokumentach wymagań. Autorzy kompilatorów po prostu zoptymalizowaliby to. Nigdy nie może być sporu o to, jak dobre jest oprogramowanie. Najwyraźniej świat nie jest taki. To mocna wskazówka, że ​​taki środek nie istnieje lub przynajmniej żaden nie jest znany.
Kilian Foth,
Wady powstają z wielu powodów - błędy w specyfikacji, błędy w testowaniu, niejasne / zmieniające się wymagania. Nie wszystkie z nich można przypisać błędom programisty.
Robbie Dee,
weź debaty metafizyki, zastanów się nad przeczytaniem O dyskusjach i dlaczego nie robią dobrych pytań
gnat
1
Pytanie może być sformułowane nieoptymalnie ze zbyt dużym naciskiem na wady. Myślę, że pytanie w tytule jest prawidłowe i nie jest duplikatem (oceniając tutaj jakość sw vs. produktywność programistów w powiązanym pytaniu)
Frank

Odpowiedzi:

23

Ty nie.

Jakość oprogramowania jest naprawdę trudna do obiektywnego zmierzenia. Na tyle trudne, że nie ma rozwiązania. W tej odpowiedzi nie zastanawiam się, czy w ogóle można znaleźć rozwiązanie, ale po prostu wskazuję, dlaczego zdefiniowanie takiego rozwiązania byłoby naprawdę trudne.

Uzasadnienie według status quo

Jak zauważył Kilian Foth, gdyby istniał prosty sposób na „dobre” oprogramowanie, wszyscy byśmy go używali i wszyscy by tego wymagali.

Są projekty, w których menedżerowie zdecydowali się na egzekwowanie określonych wskaźników. Czasami działało, czasem nie. Nie znam żadnych istotnych korelacji. Szczególnie krytyczne oprogramowanie systemowe (np. Samoloty, samochody itp.) Ma wiele wymagań metrycznych w celu „zapewnienia” jakości SW - nie jestem świadomy żadnych badań wskazujących, że wymagania te faktycznie prowadzą do wyższej jakości, i mam osobiste doświadczenia z przeciwnie.

Uzasadnienie kontrwywiadu

Również wskazany przez Kiliana i bardziej ogólnie wyrażony jako „każda metryka może i będzie odtwarzana”.

Co to znaczy grać w metrykę? To zabawna gra dla programistów: zapewniasz, że wartości metryk wyglądają naprawdę dobrze, a robisz naprawdę gówniane rzeczy.

Powiedzmy, że mierzysz wady według LOC. Jak mam w to zagrać? Łatwe - wystarczy dodać więcej kodu! Stwórz głupi kod, który spowoduje brak operacji na 100 liniach i nagle będziesz mieć mniej defektów na LOC. A co najważniejsze: w ten sposób obniżyłeś jakość oprogramowania.

Braki w narzędziach są nadużywane, definicje są rozciągnięte do maksimum, wymyślane są zupełnie nowe sposoby. Zasadniczo programiści są naprawdę inteligentnymi ludźmi i jeśli masz tylko jednego programistę w zespole, który dobrze się bawi, to Twoje dane będą wątpliwe.

Nie oznacza to, że wskaźniki są zawsze złe - ale nastawienie zespołu do tych wskaźników ma kluczowe znaczenie. W szczególności oznacza to, że nie będzie działać dobrze w przypadku relacji podwykonawcy / zewnętrznego dostawcy.

Rozumowanie przez nieprawidłowe kierowanie

To, co chcesz zmierzyć, to jakość oprogramowania. Mierzysz jeden lub więcej wskaźników.

Istnieje różnica między tym, co mierzysz, a tym, co według ciebie to powie. Ta luka jest nawet ogromna.

Zdarza się to cały czas w różnego rodzaju firmach wokół nas. Widziałeś kiedyś decyzje oparte na KPI (kluczowe wskaźniki wydajności)? To tylko ten sam problem - chcesz, aby firma dobrze sobie radziła, ale mierzysz coś innego.

Uzasadnienie według kwantyfikowalności

Metryki można zmierzyć. To jedyny powód, dla którego sobie z nimi radzimy. Jakość oprogramowania wykracza jednak daleko poza te mierzalne jednostki i ma wiele trudnych do oszacowania: jak czytelny jest kod źródłowy? Jak rozbudowywalny jest twój projekt? Jak trudno jest nowym członkom zespołu wejść na pokład? itd itd.

Ocena jakości oprogramowania tylko na podstawie wskaźników i przymykanie oka na te części jakości, których nie da się określić ilościowo, z pewnością nie zadziała dobrze.

edytować:

streszczenie

Zaznaczę, że powyższe dotyczy obiektywnego oceniania, czy oprogramowanie jest dobre, czy złe na podstawie wskaźników. Oznacza to, że nie mówi nic o tym, czy i kiedy należy zastosować wskaźniki.

W rzeczywistości jest to jednokierunkowa implikacja: złe metryki oznaczają zły kod. Jednokierunkowy oznacza, że ​​zły kod nie gwarantuje złych danych, ani dobre dane nie gwarantują dobrego kodu. Z drugiej strony, to samo w sobie oznacza, że ​​możesz zastosować metryki, aby ocenić oprogramowanie - jeśli pamiętasz o tych implikacjach.

Mierzysz oprogramowanie A, a wskaźniki okazują się naprawdę złe. Możesz być pewien, że jakość kodu jest zła. Mierzysz oprogramowanie B, a wskaźniki są w porządku, więc nie masz pojęcia o jakości kodu. Nie daj się zwieść myśleniu „metryka dobra = kod dobry”, gdy tak naprawdę jest to po prostu „kod dobry => metryka dobry”.

Zasadniczo możesz używać wskaźników do znajdowania problemów z jakością, ale nie samej jakości.

Szczery
źródło
Czekaj. W rzeczywistości mówisz, że oprogramowanie jest podobne do fragmentu tekstu, czyli formy literatury. Zrozumienie porównania między fizycznymi produktami i kodem jest inne. Jednak nauki humanistyczne od dawna zaznaczają doktoraty i muszą oceniać jakość. Myślę, że problemem jest techniczne oznaczenie kodu jest trudne. Ale zastosuj inne dane, takie jak dwie aplikacje za tę samą cenę w sklepie z aplikacjami, ale jedna ma więcej funkcji i lepszą ocenę, czyli tę, którą kupujesz.
Nomadic tech
W innym punkcie pomiaru, jest to porównanie. Jeśli wspierasz trzy różne produkty, argumentujesz, że twoja funkcja wsparcia naturalnie spodobałaby się temu, który może z łatwością odczytać kod źródłowy i przyjąć nowych członków. Byłby to produkt, o którym otrzymujesz najmniej biletów / wniosków o zmianę. Być może w skrócie odpowiedź brzmi: nie można oceniać kodu oprogramowania według linii. Ale przez użytkowników końcowych i tych, którzy go wspierają, i czy można go kontynuować, minimalizując zakłócenia w systemach produkcyjnych.
Nomadic tech
1
Zgadzam się, że ogólna jakość oprogramowania jest trudna do zmierzenia za pomocą metryki, ale istnieje kilka metryk, które mogą wskazywać lub obniżać jakość.
Jon Raynor,
Ok, granie w metrykę może stanowić problem. Myślę jednak, że jeszcze gorzej jest, jeśli zostanę ukarany za właściwe postępowanie. Właśnie naprawiłem defekt, zastępując 100 wierszy złego kodu jednowierszowym wywołaniem biblioteki, a ty mówisz mi, że pogorszyłem kod zgodnie z twoimi danymi? To nie zmotywuje mnie do dobrej pracy.
svick,
Jeśli zostaniesz „ukarany”, i tak nie używasz poprawnie wskaźników. Wiązanie wskaźników z wydajnością programisty jest pewnym, choć typowym, sposobem na niepowodzenie.
Frank
13

Tak, możesz stwierdzić, że kod ma problemy z jakością, patrząc do pewnego stopnia na wskaźniki.

Mówiąc dokładniej, uruchom narzędzie analizy złożoności na podstawie kodu, a dowiesz się, czy kod jest dobry, czy zły.

Na przykład możesz uruchomić monitor źródła .

To powie ci, jak skomplikowany jest kod. Mogę powiedzieć, że każdy problematyczny system, którego doświadczyłem, miał złe liczby. Złożoność metod od 10 do 100 metod znacznie przekracza dopuszczalne limity. Straszne liczby. Straszna złożoność, zagnieżdżanie, głębokość itp. Doprowadzi to do wielu problemów, stałej wysokiej częstotliwości defektów, trudnych do wprowadzenia zmian, bez niszczenia czegoś innego itp.

Kolejną rzeczą są wady. Z czasem system powinien się ustabilizować. Idealnie nowe wady powinny zmierzać w kierunku zera lub spłaszczać się do niskiej liczby, co oznacza, że ​​nowe i obecne wady powinny z czasem maleć.

Fabuła powinna wyglądać mniej więcej tak:

Wady w czasie Defekty w czasie

Jeśli pozostaną stałe lub wzrosną, oprogramowanie nie będzie dobre. Masz tylko 4 miesiące, więc dałbym to jeszcze kilka miesięcy do roku. Po 6 miesiącach do roku, jeśli masz ciągły strumień wad, to jest to zła jakość. Twój zespół opracował kolejną kulę błota .

Następne testy. Masz ich? Jeśli nie, to mniej jakości, więcej błędów, więcej rezygnacji. Jeśli je masz, wskaźniki takie jak pokrycie kodu są dobre, aby dowiedzieć się, ile kodu jest objęte, ale nie będzie mierzyć jakości . Widziałem świetne numery pokrycia kodu, ale rzeczywiste testy były bzdurne. Nie testowali żadnego zachowania ani funkcjonalności systemu. Programiści właśnie je pisali, aby poprawić liczby wskaźników do zarządzania. Więc musisz mieć testy, a one muszą być dobre. Same wskaźniki zasięgu kodu nie są wskaźnikiem jakości.

Recenzje kodu, czy je przeprowadzasz? Jeśli nie, gorsza jakość. Jest to szczególnie ważne w przypadku młodszych programistów. Jeśli pracujesz sprawnie, po prostu dodaj do swojej historii zadanie przeglądu kodu o nazwie „przegląd kodu”. Jeśli kierownictwo chce śledzić liczby, potrzebujesz narzędzia, które śledzi recenzje, takie jak Crucible . Sądzę, że liczby lub dane przeglądu kodu nie są tutaj tak ważne, poza tym, że powinny być częścią twojego procesu. Nie każde zameldowanie wymaga przeglądu. Ale recenzje mogą pomóc upewnić się, że ludzie nie wymyślają na nowo koła ani nie piszą kodu, którego inni nie mogą zrozumieć i / lub zachować.

Wreszcie, po prostu będziesz musiał ocenić kod, żadna metryka nie pomoże. Każdy problematyczny projekt kodu miał następujące cechy:

  • Słabe struktury danych. Wszystko jest ciągiem znaków lub XML jest przekazywany wszędzie i analizowany wszędzie, obiekty Boga lub niepotrzebnie złożone lub ogólne struktury danych, bez modelu domeny.
  • Brak organizacji lub struktury, każdy nietrywialny projekt powinien mieć pewien podział lub warstwy, które oddzielają logikę. Spójrz tutaj ... Jeśli nie widzisz tego rodzaju organizacji lub separacji (mieszanie logiki wszędzie), system będzie trudniejszy do utrzymania i zrozumienia.
  • Ponad abstrakcje. Czasami jest odwrotnie, system jest zbyt abstrakcyjny. Jeśli wszystko jest interfejsem i klasą abstrakcyjną lub musisz nawigować przez masę klas typu „otokowego”, jakość będzie zła, ponieważ nowi programiści nie będą w stanie poruszać się po obiekcie rozdętym.
  • Trudny do zrozumienia kod. Jeśli jesteś doświadczonym programistą i jeśli szukasz kodu trudnego do zrozumienia, będzie on miał problemy z jakością. Moją osobistą miarą jest to, że jeśli patrzę na kod i trudno go śledzić lub sprawia, że ​​czuję się głupi lub mam wrażenie, że marnuję wiele cykli mózgowych, aby zrozumieć logikę, to jest to zły kod. Jeśli doświadczeni programiści mają trudności z obserwowaniem, wyobraź sobie, jak to będzie dla nowych deweloperów. Wprowadzą problemy.

Moja rada polegałaby na przeprowadzeniu analizy złożoności kodu. Nie udostępniaj wyników, zamiast tego wykonaj wyniki niezależnego dochodzenia (spójrz na kod) i określ ogólną kondycję bazy kodu. Na tej podstawie utwórz plan działania i spróbuj naprawić niektóre złożone obszary kodu.

Jon Raynor
źródło
3
Napisałeś: „Moją osobistą miarą jest to, że jeśli patrzę na kod i trudno go śledzić lub sprawia, że ​​czuję się głupi lub mam wrażenie, że marnuję dużo cykli mózgowych, aby zrozumieć logikę, to jest to zły kod”. Im starszy jestem, tym bardziej zdecydowanie się z tym zgadzam. Wcześniej myślałem, że to pompatyczny punkt widzenia. Jednak teraz, gdy widziałem wiele pozornie złożonych procesów przekształconych w elegancki kod, zdaję sobie sprawę, że trudny kod prawie zawsze mógł zostać napisany jaśniej.
Ivan
Dziękuję Jon. Podane przez Ciebie referencje są przydatne. Żeby było jasne, oprogramowanie ma ponad rok i defekty nie ustąpiły. Osobiście nie kodowałem od lat, zbyt długo jestem typem menedżera, a nie technicznym. Czytanie Zbuduj IT, a książka odzwierciedla moje myśli. IE, na którym działa oprogramowanie sprzętowe, będzie sygnałem ostrzegającym o tym, jak dobrze zostało napisane. Jeszcze raz wielkie dzięki.
Nomadic tech
Choć przeczucia, czy kod jest dobry, czy zły, mogą pomóc w wykryciu złego kodu, nie są to jednak wskaźniki. Zautomatyzowane procesy wykrywania „złego kodu” na podstawie formatowania i nazewnictwa metod / zmiennych tak naprawdę nie robią nic poza wymuszaniem spójnych konwencji nazewnictwa w zespole (co chociaż dobre nie gwarantuje ani nie mierzy rzeczywistej jakości kodu).
jwenting
2
Oprócz cyklicznej złożoności, głębokości dziedziczenia, stopnia sprzężenia klasowego i jestem pewien, że kilka innych, mogą być świetnymi wskaźnikami sub-par kodu. Nie można ich używać wyłącznie jako wskaźnika jakości, ale mogą dać całkiem dobry punkt wyjścia.
RubberDuck,
3

Smutne jest to, że metryki poprawiają wynikowe wartości metryk, ale nie jakość, która ma być przez nich mierzona ...

W programie Visual Studio istnieje ustawienie traktowania ostrzeżeń kompilatora jako błędów. Teraz niektórzy ludzie nie rozumieją ostrzeżeń, i aby skompilować kod, będą używać prostych sztuczek (takich jak „wyłączanie ostrzeżeń” lub dodawanie słowa kluczowego „nowe” do funkcji / właściwości ukrywającej nie-wirtualnego członka bazy klasa).

Jeśli masz dostęp do kodu źródłowego, możesz uruchomić analizę kodu statycznego. W przypadku projektów .Net możesz użyć np. FxCop lub ReSharper InspectCode. Przy prawidłowym użyciu przez zespół programistów narzędzia pomogą poprawić jakość. Ale oczywiście możliwe są niektóre „poprawki” usuwania ostrzeżeń bez ich zrozumienia.

Możesz spojrzeć na automatyczne testy / testy jednostkowe: jak dobre jest pokrycie kodu? Ale sam zasięg nie powie ci, czy testy faktycznie sprawdzają kod, czy tylko raz go wykonały.

Dążenie do wysokiej jakości to podejście, które może być wspierane przez wiele narzędzi i ich metryk, ale metryki bez postawy programistów nie pomagają.

Bernhard Hiller
źródło
3

Jedną z rzeczy, na które powinieneś zwrócić uwagę oprócz zbierania danych, takich jak wstrzykiwanie defektów, jest ustalenie źródła defektów. Często wiąże się to ze specyfikacją.

Zasadniczo jest to błąd w specyfikacji, dwuznaczność w specyfikacji, pozostawione do decyzji implantom lub błąd w implementacji.

Bardziej jakościowym podejściem jest pytanie, czy oprogramowanie jest przydatne? Jeśli spojrzysz wystarczająco uważnie, możesz znaleźć wady dowolnego oprogramowania. Jeśli jednak działa wystarczająco dobrze, aby zarabiać pieniądze, może nie być tak źle.

Robert Baron
źródło
1
+1 Świetna odpowiedź - brak odpowiedzi na źródło błędów pozostawia otwarte drzwi do dalszych błędów z tego samego źródła
Robbie Dee
3

Na dole nie ma sposobu, aby się dowiedzieć.

W przypadku pierwotnego pytania (przed odpowiedzią filozoficzną): co powinien zrobić produkt i czy to robi? Pomiar za pomocą liczby / gęstości defektów nie jest wystarczający. Nie wiedziałem, czy to była biblioteka, czy aplikacja, jak duża jest podstawa kodu, jak duża jest dziedzina problemowa, ani jaka jest waga wad. Na przykład brak obsługi jednego z 123 formatów wejściowych może być trywialną usterką lub ogranicznikiem pokazu, w zależności od znaczenia nieprawidłowo obsługiwanego formatu. A lepszy niż nic jest wysoki standard.

Założę, że postawię pytanie: istnieje różnica między kodem a oprogramowaniem. Oprogramowanie definiuję jako to, czego klient / użytkownik używa do rozwiązania problemu, podczas gdy kod jest materiałem budowlanym oprogramowania.

Oprogramowanie można mierzyć tylko subiektywnie.Oznacza to, że w przypadku oprogramowania ważne jest, czy ludzie używają go do rozwiązania problemu. Ta metryka zależy od zachowania innych, a zatem jej subiektywnie. Uwaga: W przypadku niektórych problemów oprogramowanie może być bardzo przydatne, a zatem uważane za wysokiej jakości (Excel do obliczeń), ale nie wysokiej jakości oprogramowanie do innego problemu (Excel do odtwarzania plików MP3).

Kod można (zwykle) mierzyć za pomocą mierników empirycznych . Ale interpretacja nie jest „tak / nie” w odniesieniu do jakości, ani nawet w skali od „0 do N”. Miary mierzą się ze standardem. Tak więc mierniki mogą znaleźć obszary budzące obawy określone przez standard, ale brak obszarów budzących obawy nie jest dowodem na to, że jest to kod jakości. Na przykład przydatne dane: czy się kompiluje? Nie -> Brak jakości. Tak -> ??? Czy przechodzi test jednostkowy? Nie? Może? (ponieważ, Czy kod jakości testu jednostkowego?), Tak -> ???.

Tak więc, podobnie jak dowód niekompletności Godela wykazany dla aksjomatów matematyki (to znaczy istnieją twierdzenia matematyczne, których nie można udowodnić jako prawdziwych lub fałszywych dla żadnego skończonego zestawu aksjomatów), nie sądzę, abyśmy mogli kiedykolwiek odpowiedzieć „jest to jakość kod?' dla każdego fragmentu kodu. Intuicyjnie istnieje prawdopodobnie odwzorowanie między metrykami oprogramowania, aby odpowiedzieć na jakość i matematyczne aksjomaty, aby odpowiedzieć na prawdę lub fałsz.

Innym sposobem wysunięcia tego argumentu jest wejście w język naturalny. William Shakespeare, Lewis Carroll i Mark Twain byli pisarzami odnoszącymi sukcesy i ukochanymi przez wielu za jakość swoich pism. Ale jaki standard gramatyki, słownictwa, stylu lub głosu moglibyśmy zastosować, aby konsekwentnie oceniać je wyżej niż losowi 12-ci równiarki? I chociaż może być możliwe stworzenie syntetycznej miary dla tych trzech, jak oceniłby Księgę Jana (KJV), JRR Tolkiena, Homera, Cervantesa itp.? Następnie wrzuć Burroughsa, Faulknera, Hemingwaya, Sylvia Plath i tak dalej. Metryka nie będzie działać.

Kristian H.
źródło
2

Zmierzyłbym to, kontrolując (i szukając odchyleń) ich proces.

Chciałbym znaleźć dowody na istnienie procesu zapewniającego centralną kontrolę źródła, centralny system kompilacji i proces zapewniający testowanie kodu przed integracją z wydaną gałęzią.

Chciałbym również znaleźć dowody na to, jak zmodyfikowali swoje procesy w odpowiedzi na sytuacje, w których usterki przeszły przez proces ich uwolnienia.

Jeśli nie są w stanie przejść tego poziomu audytu, nie można oczekiwać, że dostarczą spójne, niezawodne wersje.

Jeśli przejdą ten audyt i będą stale doskonalić swój proces, ich spójność wyników prawdopodobnie poprawi się z czasem.

Jeśli to nie rozwiąże problemu, jest prawdopodobne, że mają problem z architekturą kodu, co sprawia, że ​​rozszerzanie i testowanie ich bieżącej bazy kodu jest problematyczne, w którym to przypadku nie ma dobrych opcji.

Michael Shaw
źródło
Tego rodzaju odpowiedzi szukałem.
Nomadic tech
0

Jeśli szukasz całkowicie zautomatyzowanych pomiarów, polecam tych gości: Software Improvement Group

Zasadniczo jest to agregat różnych metryk, które można automatycznie wyodrębnić z kodu źródłowego (np. Zasięg testu jednostkowego, rozmiar funkcji, splątanie klas, duplikacja, LOC itp.). Wartości te są następnie przeliczane na 1-5 gwiazdek.

wprowadź opis zdjęcia tutaj

Mają też przyzwoitą książkę opisującą wszystkie swoje wskaźniki w praktyce, które warto przeczytać: „Budowanie oprogramowania, które można utrzymać” .

Eternal21
źródło