SlideShare uma empresa Scribd logo
1 de 54
Dwa sposoby na pisanie
aplikacji bez błędów
Michał Łukaszewski
Software Engineer, Tech Lead
SUCHAR TIME!
There are two ways to write error-free programs; only the third works.
- Alan J. Perlis
Rodzaje błędów
Błędy
implementacji
Błędy
projektowe
Błędy wymagań
Agenda
• Projektowanie
• Testowanie
• Implementacja
Projektowanie
Zrozumienie wymagań
• „Dlaczego?” zamiast „co?”
• Zrozumienie intencji ważniejsze od listy funkcji
• Odtworzenie aktualnego procesu klienta
• Optymalizacja wymaga wiedzy eksperckiej.
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.
Zrozumienie wymagań
Błędy wymagań
Zrozumienie wymagań
Zrozumienie wymagań
• Impact mapping
• DDD
• Event storming
• SIWZ
Zrozumienie wymagań
„Oprogramowanie szyte na miarę”
Michał Bartyzel
Modelowanie
„A model is a simplification which fosters understanding.”
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
Architektura jako most między modelem, a
kodem
Business
requirements
Architecture Implementation
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.
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.
Planowanie
Pośpiech jest skuteczniejszym generatorem błędów niż junior na kacu.
Szacowanie
Szacowanie
• Metody szacowania
• Kosztorysowa (cocomo/cocomo2)
• Bottom-up/Top-down
• Opinia ekspercka
• Szacowanie przez analogię
• Windeband Delphi
Szacowanie
• Pewne
• Prawdopodobne
• Wróżenie z fusów
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.
Szacowanie
• Sceptycyzm
• Błędy szacowania
• Reguła 8 godzin
Szacowanie
• Nie uwzględnia
• Urlopów
• Spotkań
• Realnego czasu pracy
Planowanie
• Szacowanie
• Bufory (spotkania, urlopy, zmiany, błędy szacowania)
• Zarządzanie ryzykiem
• Reguła 9 matek
• Kontrola postępów
• Replanning (adaptacja)
Projektowanie
• Zbieranie i zrozumienie wymagań
• Modelowanie
• Architektura jako most między modelem, a kodem
• Szacowanie i planowanie.
Testowanie i implementacja
Błędy
implementacji
Błędy
projektowe
Błędy wymagań
Testowanie
Credits: https://www.sealights.io/blog/making-code-coverage-relevant-for-qa-teams/
TDD a rzeczywistość
• „Wszyscy” piszą testy.
• Część pisze testy z sensem.
• A część nawet przed implementacją.
• „To tylko prosta klasa, co tu testować?”.
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.
TDD a rzeczywistość
Code coverage jako największy bait w historii programowania.
Specification as example
• Test jednostkowy nie jest testem.
• Jest specyfikacją.
• Czyli dokumentacją.
• Opisuje oczekiwane zachowania.
• API
• Sprawdza obsługę błędów.
Specification as example
• Test nie jest testem.
• Jest specyfikacją.
• Czyli dokumentacją.
• Opisuje oczekiwane zachowania.
• Sprawdza obsługę błędów.
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%
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.
Testowanie
• TDD -> BDD -> ...
• Specification as example
• Testy jako miara jakości kodu
Implementacja
SOLID jako droga wojownika
S
O
L
I
D
ingle Responsibility Principle
pen Close Principle
iskov substitution principle
ependency inversion principle
nterface segregation principle
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.
SOLID jako droga wojownika
SOLID to sposób myślenia o projektowaniu i implementacji.
Programowanie defensywne
• Agresywna technika programowania
• Optymalna dla projektów o długim czasie życia
• Bronisz kodu przed błędami
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.
Dla kogo powstaje kod (i dokumentacja)?
• Kodujesz dla przeciwnika
Dla kogo powstaje kod (i dokumentacja)?
• Kodujesz dla przeciwnika
Dla kogo powstaje kod (i dokumentacja)?
• Kodujesz dla innych programistów.
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
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ę.
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
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!
Good enough
Implementacja
• SOLID jako droga wojownika
• Programowanie defensywne
• Dla kogo powstaje kod (i dokumentacja)?
• „Good enough”
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”.
Lectures
• https://www.fs.blog/2017/06/all-models-are-wrong/
• http://ocramius.github.io/blog/when-to-declare-classes-final/
• https://ocramius.github.io/extremely-defensive-php/
• https://martinfowler.com/articles/feature-toggles.html

Mais conteúdo relacionado

Semelhante a Dwa sposoby na pisanie aplikacji bez błędów

Slajdy z wykładu o Agile
Slajdy z wykładu o AgileSlajdy z wykładu o Agile
Slajdy z wykładu o Agileinfrared
 
Pomysł na analizę w Agile: Agile Modeling
Pomysł na analizę w Agile: Agile ModelingPomysł na analizę w Agile: Agile Modeling
Pomysł na analizę w Agile: Agile ModelingPaweł Jarosiński
 
J2EE. Podstawy programowania aplikacji korporacyjnych
J2EE. Podstawy programowania aplikacji korporacyjnychJ2EE. Podstawy programowania aplikacji korporacyjnych
J2EE. Podstawy programowania aplikacji korporacyjnychWydawnictwo Helion
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowychTomasz Borowski
 
4Developers 2015: Jak przekonać managera, że czas na refaktoring jest potrzeb...
4Developers 2015: Jak przekonać managera, że czas na refaktoring jest potrzeb...4Developers 2015: Jak przekonać managera, że czas na refaktoring jest potrzeb...
4Developers 2015: Jak przekonać managera, że czas na refaktoring jest potrzeb...PROIDEA
 
Sprzedaj swój program. Droga do udanych projektów programistycznych
Sprzedaj swój program. Droga do udanych projektów programistycznychSprzedaj swój program. Droga do udanych projektów programistycznych
Sprzedaj swój program. Droga do udanych projektów programistycznychWydawnictwo Helion
 
Zawód: programista gier. Jak zacząć pracę w branży?
Zawód: programista gier. Jak zacząć pracę w branży?Zawód: programista gier. Jak zacząć pracę w branży?
Zawód: programista gier. Jak zacząć pracę w branży?GameDesire Company
 
Modele wdrażania i zarządzania projektami erp
Modele wdrażania i zarządzania projektami erpModele wdrażania i zarządzania projektami erp
Modele wdrażania i zarządzania projektami erpJaroslaw Zelinski
 
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gierKonrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gierGameDesire Academy
 
MS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowychMS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowychMarcin Samsonowski
 
Girls in It - Front-end & Back-end. Jak zacząć
Girls in It - Front-end & Back-end. Jak zacząćGirls in It - Front-end & Back-end. Jak zacząć
Girls in It - Front-end & Back-end. Jak zacząćmonterail
 
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31kraqa
 
Tajniki współpracy z (trudnym) klientem
Tajniki współpracy z (trudnym) klientemTajniki współpracy z (trudnym) klientem
Tajniki współpracy z (trudnym) klientemKatarzyna Mrowca
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymDariusz Jagieło
 

Semelhante a Dwa sposoby na pisanie aplikacji bez błędów (20)

Slajdy z wykładu o Agile
Slajdy z wykładu o AgileSlajdy z wykładu o Agile
Slajdy z wykładu o Agile
 
Pomysł na analizę w Agile: Agile Modeling
Pomysł na analizę w Agile: Agile ModelingPomysł na analizę w Agile: Agile Modeling
Pomysł na analizę w Agile: Agile Modeling
 
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
User Experience – wpływ internetu na aplikacje enterprise - Netcamp #14
 
J2EE. Podstawy programowania aplikacji korporacyjnych
J2EE. Podstawy programowania aplikacji korporacyjnychJ2EE. Podstawy programowania aplikacji korporacyjnych
J2EE. Podstawy programowania aplikacji korporacyjnych
 
Lean Hardware
Lean HardwareLean Hardware
Lean Hardware
 
KICK ME
KICK MEKICK ME
KICK ME
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
4Developers 2015: Jak przekonać managera, że czas na refaktoring jest potrzeb...
4Developers 2015: Jak przekonać managera, że czas na refaktoring jest potrzeb...4Developers 2015: Jak przekonać managera, że czas na refaktoring jest potrzeb...
4Developers 2015: Jak przekonać managera, że czas na refaktoring jest potrzeb...
 
Olga Żądło - Robot Framework
Olga Żądło - Robot FrameworkOlga Żądło - Robot Framework
Olga Żądło - Robot Framework
 
Sprzedaj swój program. Droga do udanych projektów programistycznych
Sprzedaj swój program. Droga do udanych projektów programistycznychSprzedaj swój program. Droga do udanych projektów programistycznych
Sprzedaj swój program. Droga do udanych projektów programistycznych
 
Zawód: programista gier. Jak zacząć pracę w branży?
Zawód: programista gier. Jak zacząć pracę w branży?Zawód: programista gier. Jak zacząć pracę w branży?
Zawód: programista gier. Jak zacząć pracę w branży?
 
Aim szkolenie
Aim szkolenieAim szkolenie
Aim szkolenie
 
Modele wdrażania i zarządzania projektami erp
Modele wdrażania i zarządzania projektami erpModele wdrażania i zarządzania projektami erp
Modele wdrażania i zarządzania projektami erp
 
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gierKonrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
 
MS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowychMS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowych
 
Girls in It - Front-end & Back-end. Jak zacząć
Girls in It - Front-end & Back-end. Jak zacząćGirls in It - Front-end & Back-end. Jak zacząć
Girls in It - Front-end & Back-end. Jak zacząć
 
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
 
Tajniki współpracy z (trudnym) klientem
Tajniki współpracy z (trudnym) klientemTajniki współpracy z (trudnym) klientem
Tajniki współpracy z (trudnym) klientem
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastym
 
Projektowanie ewolucyjne
Projektowanie ewolucyjneProjektowanie ewolucyjne
Projektowanie ewolucyjne
 

Mais de Michal Lukaszewski

How we built a tools stack for the benchmarking AI and what happened next
How we built a tools stack for the benchmarking AI and what happened nextHow we built a tools stack for the benchmarking AI and what happened next
How we built a tools stack for the benchmarking AI and what happened nextMichal Lukaszewski
 
How to fix a code to not corrupt an application
How to fix a code to not corrupt an applicationHow to fix a code to not corrupt an application
How to fix a code to not corrupt an applicationMichal Lukaszewski
 
Distributed Systems @ Code Europe
Distributed Systems @ Code EuropeDistributed Systems @ Code Europe
Distributed Systems @ Code EuropeMichal Lukaszewski
 
Budowanie aplikacji PHP bez użycia frameworków
Budowanie aplikacji PHP bez użycia frameworkówBudowanie aplikacji PHP bez użycia frameworków
Budowanie aplikacji PHP bez użycia frameworkówMichal Lukaszewski
 
Domain Events in Distributed Architecture
Domain Events in Distributed ArchitectureDomain Events in Distributed Architecture
Domain Events in Distributed ArchitectureMichal Lukaszewski
 
Technologie mobilne w platformach edukacyjnych. Kosmikus, studium przypadku
Technologie mobilne w platformach edukacyjnych. Kosmikus, studium przypadkuTechnologie mobilne w platformach edukacyjnych. Kosmikus, studium przypadku
Technologie mobilne w platformach edukacyjnych. Kosmikus, studium przypadkuMichal Lukaszewski
 

Mais de Michal Lukaszewski (9)

How we built a tools stack for the benchmarking AI and what happened next
How we built a tools stack for the benchmarking AI and what happened nextHow we built a tools stack for the benchmarking AI and what happened next
How we built a tools stack for the benchmarking AI and what happened next
 
How to fix a code to not corrupt an application
How to fix a code to not corrupt an applicationHow to fix a code to not corrupt an application
How to fix a code to not corrupt an application
 
Distributed Systems @ Code Europe
Distributed Systems @ Code EuropeDistributed Systems @ Code Europe
Distributed Systems @ Code Europe
 
Budowanie aplikacji PHP bez użycia frameworków
Budowanie aplikacji PHP bez użycia frameworkówBudowanie aplikacji PHP bez użycia frameworków
Budowanie aplikacji PHP bez użycia frameworków
 
Domain Events in Distributed Architecture
Domain Events in Distributed ArchitectureDomain Events in Distributed Architecture
Domain Events in Distributed Architecture
 
Action Domain Response
Action Domain ResponseAction Domain Response
Action Domain Response
 
Wydajność i optymalizacja
Wydajność i optymalizacjaWydajność i optymalizacja
Wydajność i optymalizacja
 
Technologie mobilne w platformach edukacyjnych. Kosmikus, studium przypadku
Technologie mobilne w platformach edukacyjnych. Kosmikus, studium przypadkuTechnologie mobilne w platformach edukacyjnych. Kosmikus, studium przypadku
Technologie mobilne w platformach edukacyjnych. Kosmikus, studium przypadku
 
Solid vs php
Solid vs phpSolid vs php
Solid vs php
 

Dwa sposoby na pisanie aplikacji bez błędów

Notas do Editor

  1. NASTĘPNY SLAJD: PODSUMOWANIE
  2. PODSUMOWANIE
  3. Trzeba pamiętać, że ważną cechą CA jest to, że nawiązuje do wcześniejszych opracowań Wujka Boba, z SOLID na czele
  4. "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
  5. "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