1 of 36

Archeologia kodu źródłowego

Paweł Ślusarz @pslusarz

Confitura 2014

Prezentacja jest oparta o 15 lat doświadczeń obserwacji ewolucji projektów oprogramowania i systemów. Dwa lata temu, kiedy zdecydowaliśmy się na standardyzację bibliotek JAR w naszej firmie, rozpocząłem swoje pierwsze prace archeologiczne. Te prace stanowiły punkt wyjścia do badań nad niewykorzystaną wiedzą drzemiącą w repozytoriach kodu źródłowego. Jednym z kluczowych wyznaczników, który nie jest dostępny w narzędziach szacowania długu technologicznego jak Sonar, jest popularność pewnych klas w systemie. Wyjaśnieniu dlaczego popularne klasy są tak ważne poświęcę częsć prezentacji. Odpowiemy też na podstawie danych co jest lepsze: Java, czy Groovy. Na końcu zademonstruję jak techniki archeologii kodu mogą nam pomóc poznać prawa rządzące rozwojem oprogramowania.

2 of 36

3 of 36

4 of 36

Jak programiści spędzają czas

Źródło: ankieta Electric Cloud z 2013, 443 osoby

5 of 36

Co programiści produkują

  • 10-20 linii kodu dziennie

Co się dzieje przez te 4 godziny?

Źródło: “Mityczny osobomiesiąc” oraz Worldwide IT Trends & Benchmark Report 2001”, produced by META Group (cyt.)

6 of 36

Jak programiści programują

Źródło: Peter Hall, architekt C#, 2006 blog

7 of 36

Przykład: interfejsy i implementacje

Liczba implementacji

Liczba interfejsów

1

21

2

5

3

2

8 of 36

Przykład: Zależności bibliotek

9 of 36

Przykład: Zależności bibliotek

  • około 250 bibliotek
  • 350 tys. linii kodu
  • wizualizacja zależności...

Zadanie:

  • Zidentyfikować wszystkie biblioteki
  • Opracować plan migracji
    • 2 tygodnie na migrację
    • bez zatrzymywania produkcji

10 of 36

Przykład: Zależności bibliotek

Wszystkie zależności

Krawędzie biegną w góre i w dół

Jak migrować nie zatrzymując produkcji?

11 of 36

Przykład: Zależności bibliotek

Uproszczenie przez wyznaczenie poziomów

12 of 36

Przykład: Zależności bibliotek

Uproszczone zależności

Krawędzie biegną tylko w góre

Migracja piętrami w górę

13 of 36

Przykład: Zależności bibliotek

Dalsze upraszczanie podczas migracji

Zbędne zależności

Nieaktywne biblioteki

14 of 36

Przykład: Zależności bibliotek

Efekt końcowy

15 of 36

Korpus Carfaxu

Data pobrania: Marzec 2013

Liczba modułów: 1,130

Liczba plików: 159,072

Liczba klas: 35,677

Linie kodu: 3,404,573

Rozmiary na dysku (Gb): 6.5

16 of 36

Popularność klas

17 of 36

Popularność klas

18 of 36

Zwodniczy “hotspot” Sonara

19 of 36

Popularne klasy - badania

20 of 36

Archeologia w służbie pokoju

Co jest lepsze, Java czy Groovy?

21 of 36

Java kontra Groovy - linie kodu

Java

Groovy

liczba klas

26,135

5,681

średnia LOC

98

70

mediana LOC

57

38

Groovy jest tylko 30% krótszy od Javy?

…ale to nie wszystko

22 of 36

Java kontra Groovy - małe klasy

30% klas w Groovym ma poniżej 30 linii!

23 of 36

Dodatkowe informacje

  • Blog: 10kftcode.blogspot.com
  • Moje narzędzia: archeology3d na Github
  • “Konferencja” - TICOSA.org, 2014
  • Audycja “Software Archeology” - Dave Thomas (2009, Software Engineering Radio)

24 of 36

Dodatkowe materiały

Poniższe slajdy nie były częścią prezentacji, ale zostały przygotowane na potrzeby dyskusji. Część z nich wkrótce zostanie obszerniej omówiona na blogu http://10kftcode.blogspot.com

25 of 36

Zbiór zamkniętych klas

Źródło: Michael Feathers blog (2012)

RSpec

Anonimowa aplikacja z problemami

26 of 36

Zbiór zamkniętych klas - Apache

27 of 36

Zbiór zamkniętych klas - Apache

28 of 36

Zmiany złożoności wg. godziny dnia

Źródło: Michael Feathers TICOSA (2014)

29 of 36

Apache Website Catalog

30 of 36

What Apache Catalog could look like

31 of 36

Querying the data

32 of 36

Video: Compare 5 high profile project classes (5mins)

33 of 36

Video: Fly-by overview of Apache projects

34 of 36

Video: Compare 5 high profile project classes (5mins)

35 of 36

Archeologia kodu - Kopciuszek do zadań specjalnych

36 of 36

Carfax vs Apache Code Corpus

Snapshot date

March 2013

March 2014

Number of projects

1,130

299

Number of files

159,072

497,794

Number of classes

35,677

264,588

Lines of code

3,404,573

44,972,408

Size on disk (Gb)

6.5

16