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ć?
źródło
Odpowiedzi:
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.
źródło
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
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:
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.
źródło
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ą.
źródło
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.
źródło
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ć.
źródło
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.
źródło
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.
Mają też przyzwoitą książkę opisującą wszystkie swoje wskaźniki w praktyce, które warto przeczytać: „Budowanie oprogramowania, które można utrzymać” .
źródło