O wydajności i SLOC
Problem z SLOC
Problem z metryką SLOC polega na tym, że mierzy ona przybliżoną ilość napisanego kodu, nie biorąc pod uwagę:
- jakość kodu (tj. co jeśli na każde 100 SLOC trzeba dodać kolejne 90 SLOC z powodu błędów, ale których nie znasz w momencie dostarczenia kodu?)
- cele osiągnięte za pomocą kodu (tj. czy 10K SLOC obsługuje wszystkie oczekiwane przypadki użycia lub historie użytkowników? czy tylko niewielki podzbiór?)
- łatwość konserwacji kodu (tj. czy będziesz musiał dodać 1% lub 50% więcej kodu w celu dostosowania kodu do oczekiwanych ewoluujących wymagań?).
W przeciwnym razie produkcja podatnego na błędy, niemożliwego do utrzymania kodu spaghetti z dużą ilością skopiowanych części zostanie uznana za bardziej produktywną niż starannie zaprojektowany kod wielokrotnego użytku.
Dlatego SLOC zdecydowanie nie jest najlepszym sposobem pomiaru wydajności.
Jaką produktywność rozważamy?
Wydajność jest mierzona dla procesu. Tak więc SLOC może być doskonale ważnym wskaźnikiem dla samego procesu kodowania.
Jeśli na przykład źle zrozumiesz słabe wymagania, poświęcisz pięć miesięcy na wyprodukowanie oprogramowania, pokażesz go użytkownikowi, odkryjesz, że jest po prostu źle i poświęcisz kolejne 5 miesięcy na przepisanie go na dobre od zera, będziesz mieć taką samą produktywność w SLOC / miesiąc, że zespół pisze kod po raz pierwszy, na przykład dlatego, że zastosował zwinny proces, który zmniejsza nieporozumienia poprzez częste informacje zwrotne. Ta pozorna równa wydajność kryje ogromne problemy.
Tak więc pomiar produktywności oprogramowania musi uwzględniać cały proces, w tym analizę wymagań, projektowanie kodu, kodowanie, testowanie, debugowanie i sprawdzanie, czy spełnione są oczekiwania użytkowników. Ponieważ wszystkie te czynności są bardzo różne, najlepszą rzeczą jest zmierzenie jedynej ważnej myśli: działającego oprogramowania, czyli tego, co wyprodukowane oprogramowanie oznacza dla użytkownika .
Jak mierzyć elementy oprogramowania?
Istnieje kilka podejść:
- Typowym podejściem w klasycznej inżynierii oprogramowania są punkty funkcyjne (FP). Punkty funkcyjne są mierzone w oparciu o wymagania, które należy spełnić (np. Liczba formularzy, liczba pól w każdym formularzu itp.). Wydajność jest następnie mierzona w FP na jednostkę czasu i na osobę. Niektóre firmy dysponują nawet danymi określającymi, ile punktów funkcyjnych programista może wygenerować na jednostkę czasu w danym języku dla danej domeny. Problem z FP polega na tym, że wymaga on z góry bardzo szczegółowych wymagań i jest czasochłonny.
- Bardziej nowoczesne i pragmatyczne podejście to punkty historii (SP). Służą one do oceny złożoności kodu, który ma zostać wygenerowany, i są rutynowo wykorzystywane do oceny szybkości pracy zespołów programistycznych. Jednak SP jest miarą szacunkową dla pracy wykonanej przed poznaniem wszystkich szczegółów. To nie jest ostateczna miara tego, co się naprawdę wydarzyło. Dlatego należy zachować ostrożność przy stosowaniu go jako miary wydajności, ponieważ może to mieć negatywny wpływ na proces szacowania .
O wydajności pisania statycznego vs. dynamicznego
Muszę wyznać, że osobiście jestem fanem statycznie pisanych języków, ponieważ w moim wnętrzu wiem, że jest bardziej niezawodny (lata kodowania mi to udowodniły).
Tak więc jedną rzeczą, którą z całą pewnością biorę pod uwagę, jest to, że język o typie statycznym jest w stanie zapobiec znacznie większej liczbie błędów / błędów w czasie kompilacji (np. Literówki, niedopasowanie w oczekiwanych typach itp.) Niż języki o typie niestatycznym. Ale z całą obiektywnością nie odważyłbym się obelżywie uogólnić to jako wyższą wydajność.
Czy twój architekt ma rację?
Może, może nie.
Ale jego argumenty nie wydają się słuszne: wzrost produktywności języka o typie statycznym wynika ze znacznej liczby błędów wykrytych z góry przez kompilator.
W związku z tym nie można dowiedzieć się o tym „wyższym” wzroście produktywności, patrząc tylko na SLOC, bez analizowania poprawek wymaganych dla dynamicznie typowanych języków. Więc jego porównanie nie może być uczciwe.
Argument porównywalnych okoliczności również nie ma miejsca. Niektóre języki o typie dynamicznym pozwalają na konstrukcje wyższego poziomu, które wymagają mniej kodu niż robienie tego samego w jednym z klasycznych języków o typie statycznym. Możesz więc potrzebować mniej czasu, pisać mniej kodu, ale dodać te same koszty analizy, testowania i weryfikacji. Zatem pomiar wydajności przez SLOC osłabiłby potencjalny wzrost wydajności, tworząc w ten sposób uprzedzenie względem dynamicznie typowanego języka.
Jakieś badania na poparcie tego twierdzenia?
Istnieje kilka najnowszych badań akademickich na ten temat. Chociaż niektóre z nich widzą zaletę pisania statycznego, generalnie są ograniczone do określonego celu (dokumentacja, ponowne użycie źle udokumentowanego kodu lub API itp.). Rozsądne sformułowanie jest również stosowane, ponieważ współczesne IDE znacznie zmniejszyło ryzyko związane z dynamicznym pisaniem: