@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
Na sprint review niestety nie widać wszystkiego
Dziwne, każda historyjka osobno wyglądała dobrze ...
@technites_pl
@technites_pl
Gdyby można było zobaczyć efekt,
zanim będzie
za późno ...
@technites_pl
Kod nie zawsze jest
optymalną reprezentacją
@technites_pl
zrozumienie biznesu i
aktualnego rozwiązania
Software development is a learning process,
working code is a side effect.
- Alberto Brandolini
szybsze i bezpieczniejsze
dostarczanie na produkcję
@technites_pl
Dokumentacja powinna zapewniać
efektywny wgląd w projektowany system
we wszystkich jego aspektach
dla osób o różnych kompetencjach
Skoro to takie ważne,
to dlaczego dobrej dokumentacji (prawie)zawsze brakuje ?
@technites_pl
@technites_pl
@technites_pl
public class Order
{
public void Place()
{
...
}
...
}
public interface DiscountPolicy
{
...
}
@technites_pl
Manufacturing is a popular metaphor for software development [...]
This metaphor has messed up a lot of projects for one simple reason
- software development is all design.
-Eric Evans
@technites_pl
Pełna dokumentacja nie może
powstać przed kodowaniem
bo projektowania nie da się oddzielić
od implementacji
Aktualna dokumentacja nie może
powstać po implementacji,
bo zmiany są zbyt częste
@technites_pl
most knowledge is already there
- Cyrille Martraire
living
=
samoaktualizująca
@technites_pl
@technites_pl
Ciężko jest
automatycznie uzupełnić brakujące informacje
@technites_pl
@technites_pl
@technites_pl
Tylko kod ma gwarancję aktualności, więc wokół niego trzeba zbudować narzędzia zapewniające wgląd w projektowany system
Żeby było to możliwe
kod musi mieć strukturę opartą o
dobrze zdefiniowane abstrakcje
@technites_pl
Problem jest w tym,
że nasze abstrakcje nie są jeszcze
dobrze usystematyzowane:
Odrzucenie abstrakcji nie jest
rozwiązaniem tego problemu
@technites_pl
Kod z abstrakcjami
nie gwarantuje czytelności
Kod bez abstrakcji
gwarantuje brak czytelności
@technites_pl
To co potrzebne
do zrozumienia
To co potrzebne
do kompilacji
@technites_pl
[DddAggregate]
[CoreConcept]
public class Order
{
...
}
[DddValueObject]
public class Offer
{
...
}
# ADR 007
## Kontekst
...
## Decyzja
...
## Alternatywa
...
[CqrsCommand]
[BusinessProcess("WholesaleOrdering")]
public class PlaceOrder
{
...
}
[GofAbstractFactory]
[Exemplary]
public class PricingPolicies
{
...
}
[assembly:DeployableUnit("Search", "ADR 007")]
[assembly:Tier(ThreeTiers.Application)]
[PublicContract]
public class PassengerType
{
...
}
@technites_pl
@technites_pl
Brakujące informacje lepiej
dodać do kodu
w postaci metadanych,
niż pozwolić im dezaktualizować się
z dala od niego
@technites_pl
@technites_pl
A software architecture is a complex entity that cannot be described in a simple
one-dimensional fashion
@technites_pl
wikipedia.org
chiefarchitect.com
rodzaj mapy = perspektywa
@technites_pl
np:
@technites_pl
abstrakcje + metadane w kodzie
automatyczne parsowanie
surowe dane do dokumentacji
wgląd z różnych perspektyw
narzędzia do wizualizacji
@technites_pl
Na system można patrzeć
z wielu perspektyw
Do jego zrozumienia
potrzebujemy ich wszystkich
@technites_pl
@technites_pl
|
|
||
---|---|---|---|
Domain | |||
Technology | |||
People | |||
Living |
@technites_pl
Logs
Metrics
Traces
Observability
@technites_pl
|
P3 Model |
---|---|
Domain | |
Technology | |
People | |
Living |
3 perspectives
@technites_pl
Potrzebujemy dokumentacji
żeby efektywnie rozwijać systemy
a to co mamy zwykle nie jest zbyt użyteczne
Nie chcemy jej robić ręcznie
bo wtedy jest wiecznie nieaktualna
Musimy generować ją z kodu
Kod musi mieć czytelną strukturę
i metadane
@technites_pl
Mamy do tego gotowe narzędzia
ale żadne z nich nie obejmuje wszystkich aspektów
Potrzebujemy czegoś więcej
P3 Model
Domain - Technology - People
Zapraszamy Was do tworzenia P3
Wspólnie rozwiążmy problem nieaktualnej
i bezużytecznej dokumentacji
@technites_pl
P3 Model
GitHub P3-model
Przykład użycia
GitHub DDD-starter-dotnet
(bonus)
@technites_pl
Mając informacje o zamierzonych wzorcach,
można automatycznie przetestować,
czy kod jest z nimi zgodny
Może w tym pomóc np:
noClasses().that().resideInAPackage("..Core..")
.should().dependOnClassesThat().resideInAPackage("..UseCases..")
(bonus)
@technites_pl
Mając informacje o modelu domenowym, sposobie wdrażania, scenariuszach biznesowych, etc.
można automatycznie wykrywać:
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl
@technites_pl