Au-delà de l'Event-Storming
Favoriser le partage de connaissance métier entre les experts et les tech
Le langage ubiqutaire
Le jargon commun entre les experts et les tech
Langage valide au sein d'un context précis
It’s not stakeholder knowledge but developers' ignorance that gets deployed into production
— Alberto Brandolini
Loïc Broquet
lolo101
29%
31%
Sonar
- Test coverage
- Code smells
- Bogus code
- Security vulnerabilities
JetBrains Qodana
- Code smells
- Bogus code
- IDE integration
CodeScene
- Hot spots
- Code health
- Teams topology
Quels outils ?
public double calculatePrice(Collection<Item> items, int discount, int vat) {
double price = 0;
for (Item item : items) {
price += item.price;
}
double discountedPrice = price * ( 1 - discount / 100.0);
double netPrice = discounterPrice * (1 + vat / 100.0);
return netPrice;
}
💀 Item.price < 0 ?
NaN ?
discount < 0 ? > 100 ?
On a inversé discount et vat ?
public record Amount(BigDecimal value) {
public Amount {
if (value.compareTo(BigDecimal.ZERO) < 0) {
throw new NegativeAmount(value);
}
}
}
public record Price(Amount amount, Currency currency) {}
public Price calculatePrice(Basket basket, Discount discount, Vat vat) {
Price rawPrice = basket.totalPrice();
Price discountedPrice discount.appliedTo(rawPrice);
Price netPrice = vat.appliedTo(discountedPrice);
return netPrice;
}
pour quantifier,
la liste des mots c'est mieux !
# list java files in "service" or "domain" packages, excluding tests
find "../$PROJECT" -type f -not -path "*/test/*" \( -path "*/service/*" -o -path "*/domain/*" \) -name "*.java"
# concatenate files contents
| xargs sed
# remove comment blocs
-e '/\/\*/,/\*\//d'
# remove comment lines
-e 's/\/\/.*$//g'
# remove imports section
-e '/^import /d'
# remove package declaration
-e '/^package /d'
# replace non-identifiers symbols with linefeeds
-e 's/[^A-Za-z0-9_]/\n/g'
# remove empty lines
| grep .
# convert to lowercase
| tr '[:upper:]' '[:lower:]'
# sort alphabetically
| sort
# distinct and count
| uniq -c
# sort by number of occurrences
| sort -nr
~50 ms / 30 kloc !
Définir le lexique
Catégoriser les mots
Calculer un score
Attention le langage nous impose des keywords
(class, public, return, etc.)
Il faut choisir soigneusement ceux qu'on ignore
Un "bon" score est 50% ou plus
Tech Lead
Tech Lead
On a un score de 30%
mais on ne sait pas comment l'améliorer
L'indicateur DDD, on ne le suit plus parce qu'on ne tirait pas d'action
Event Storming ?
C'est quoi ?
Tech Lead
Effort récurrent
Pas automatisable
Effort récurrent
Pas automatisable
On ne maintient plus
le langage ubiquitaire
=> Supporter de nouveaux langages
=> Maintenabilité de l'indicateur
=> L'indicateur devient entièrement automatisable
Mesure de la
primitive obsession
Abandon du script ultra rapide
On se base sur un AST JavaScript
~600 ms / 30 kloc
L'indicateur est beaucoup moins bruité puisqu'il ne sélectionne que les types
Un "bon" score est 20% ou moins
Mine de rien c'est déjà une innovation !
# list java files in "service" or "domain" packages, excluding tests
find "../$PROJECT" -type f -not -path "*/test/*" \( -path "*/service/*" -o -path "*/domain/*" \) -name "*.java"
# concatenate files contents
| xargs sed
# remove comment blocs
-e '/\/\*/,/\*\//d'
# remove comment lines
-e 's/\/\/.*$//g'
# remove imports section
-e '/^import /d'
# remove package declaration
-e '/^package /d'
# replace non-identifiers symbols with linefeeds
-e 's/[^A-Za-z0-9_]/\n/g'
# remove empty lines
| grep .
# convert to lowercase
| tr '[:upper:]' '[:lower:]'
# sort alphabetically
| sort
# distinct and count
| uniq -c
# sort by number of occurrences
| sort -nr
Un indicateur de primitive obsession
Support de Kotlin, Typescript
Inférence de langage ubiquitaire avec LLM + RAG
(Retrieval-Augmented Generation)
Inclus dans la pipeline d'intégration continue (CI)
"Domain-driven Sonar"
https://github.com/lolo101/indddy
https://openfeedback.io/dd2024/2024-11-07/639461