Jakość oprogramowania jest rozbudowaną dziedziną wiedzy, którą każdy programista zna doskonale, ale ilu tak naprawdę stosuje skutecznie? W prelekcji przedstawię zarówno najważniejsze, zweryfikowane praktycznie sposoby podnoszenia i utrzymywania jakości oprogramowania na założonym poziomie, jak również omówię kilka pułapek, w które nadzwyczaj łatwo wpadamy.
6. Zrozumienie wymagań
• „Dlaczego?” zamiast „co?”
• Zrozumienie intencji ważniejsze od listy funkcji
• Odtworzenie aktualnego procesu klienta
• Optymalizacja wymaga wiedzy eksperckiej.
7. Zrozumienie wymagań
• „Dlaczego?” zamiast „co?”
• Zrozumienie intencji ważniejsze od listy funkcji
• Odtworzenie aktualnego procesu klienta
• Optymalizacja wymaga wiedzy eksperckiej.
• Klient nie zna się na Twojej robocie
• nie wie czego od Ciebie wymagać.
• Ale zna się na swoim biznesie.
• W przeciwieństwie do Ciebie.
13. Modelowanie
• Modelowanie procesu biznesowego klienta
• Jego rzeczywistości biznesowej.
• Wszystkie modele są uproszczone
• Więc wszystkie modele są błędne
• Ale niektóre są użyteczne
• „Mental model” jako MVP
14. Architektura jako most między modelem, a
kodem
Business
requirements
Architecture Implementation
15. Architektura jako most między modelem, a
kodem
• Model opisuje w przybliżeniu rzeczywistość klienta.
• Architektura opisuje techniczne ramy, na których oprze się model.
• Programista implementuje zachowania w ramach przyjętej
architektury.
16. Architektura jako most między modelem, a
kodem
• Architektura musi być mądra, nie musi mieć mądrej nazwy.
• Ale architektura heksagonalna i czysta architektura naprawdę są super!
• Architektura musi być optymalna biznesowo.
21. Szacowanie
• Szacowanie pewne
• <= 1MD
• Szacowanie prawdopodobne
• 2-3MD
• Wszystko powyżej to wróżbiarstwo
Reguły te nie zmieniają się wraz z doświadczeniem zespołu.
28. TDD a rzeczywistość
• „Wszyscy” piszą testy.
• Część pisze testy z sensem.
• A część nawet przed implementacją.
• „To tylko prosta klasa, co tu testować?”.
29. TDD a rzeczywistość
• Testy są często większe niż implementacja.
• Są kosztowne w utrzymaniu.
• Wrażliwe na zmiany implementacji.
• Ciężko uzasadnić ten wydatek w budżecie projektu.
31. Specification as example
• Test jednostkowy nie jest testem.
• Jest specyfikacją.
• Czyli dokumentacją.
• Opisuje oczekiwane zachowania.
• API
• Sprawdza obsługę błędów.
32.
33. Specification as example
• Test nie jest testem.
• Jest specyfikacją.
• Czyli dokumentacją.
• Opisuje oczekiwane zachowania.
• Sprawdza obsługę błędów.
34. Testy jako miara jakości kodu.
• Kod, który się nie zmienia nie wymaga zmiany testów
• Prosty kod wymaga prostych testów
• Proste testy prostego kodu są szybkie
• Problem z odcięciem zależności jako flaga spartolonego projektu
• Prawo Demeter i Dependency Injection, ftw!
• Specyfikacja zawsze pokrywa kod w 100%
35. Testy wspierają utrzymanie jakości kodu.
• Nie tylko testy jednostkowe:
• Lintery
• Analiza statyczna
• Regularne profilowanie
• Automatyzacja
• per Pull Request
• Testy funkcjonalne
• Testy integracyjne
• Blokowanie zmian wprowadzających regresję jakości.
• Code Review jako bezwymiarowa ocena jakości kodu.
36. Testowanie
• TDD -> BDD -> ...
• Specification as example
• Testy jako miara jakości kodu
40. SOLID jako droga wojownika
• SOLIDny kod to kod czysty, prosty i stabilny.
• SOLIDny kod łatwo uczynić kodem bezpiecznym.
• SOLIDny kod świetnie się rozwija minimalizując ryzyko regresji.
• SOLIDny kod banalnie się testuje.
• SOLIDny powinien być kod, ale i architektura.
41. SOLID jako droga wojownika
SOLID to sposób myślenia o projektowaniu i implementacji.
43. Programowanie defensywne
• YAGNI!
• Konstruktor jako jedyny punkt wstrzyknięcia zależności
• Tylko niezbędne zależności
• Minimalna ilość metod publicznych
• A każda z nich – finalna.
46. Dla kogo powstaje kod (i dokumentacja)?
• Kodujesz dla innych programistów.
47. Dla kogo powstaje kod (i dokumentacja)?
• Kodujesz dla innych programistów.
“Any fool can write code that a computer can understand. Good
programmers write code that humans can understand.”
– Martin Fowler
48. Dla kogo powstaje kod (i dokumentacja)?
Wszystkie techniki czystego kodu obniżają koszt utrzymania, nie
wytworzenia.
• Wszystkie „skróty i hacki” obniżają koszt wytworzenia, ale mogą doprowadzić
do śmierci projektu/kodu na dłuższą metę.
49. Dla kogo powstaje kod (i dokumentacja)?
Kod wyspecyfikowany (np. testami) jest przenaszalny pomiędzy
programistami.
• Chroń swoje stanowisko robiąc dobrą robotę
• Nie kod, który tylko ty rozumiesz
50. Good enough
• Proces wytwarzania oprogramowania to (technicznie) nieograniczona
ilość iteracji cyklu Deminga.
• Lepsze jest gorsze.
• Refactoring jako stały proces towarzyszący
• Nie akcja naprawcza!
52. Implementacja
• SOLID jako droga wojownika
• Programowanie defensywne
• Dla kogo powstaje kod (i dokumentacja)?
• „Good enough”
53. Mniej błędów gdy
• Sumiennie zebrane wymagania.
• Rozumiesz wymagania.
• Masz dobry model (wystarczające przybliżenie).
• Architektura jest optymalna biznesowo.
• Szacowanie, planowanie, kontrola postępów.
• Specyfikacja „zamiast” testowania.
• Stała kontrola jakości kodu (CI + analiza statyczna + automatyzacja).
• Dobry projekt kodu (SOLID, programowanie defensywne).
• Czytelny kod („twój kod opowiada historię”).
• „Good enough”.
Trzeba pamiętać, że ważną cechą CA jest to, że nawiązuje do wcześniejszych opracowań Wujka Boba, z SOLID na czele
"Eagleson's Law: Any code of your own that you haven't looked at for six or more months might as well have been written by someone else." - Alan Eagleson
"Eagleson's Law: Any code of your own that you haven't looked at for six or more months might as well have been written by someone else." - Alan Eagleson