Albéric Trancart
Fullstack dev @ Theodo
Albéric Trancart
Photo d'un rookie, circa 2025
Rare photo d'un senior avant son départ pour une autre boîte
💥
Soudure
qui lâche
Déconnecté
en changeant
de page
Mauvaise font
Page qui plante une fois
sur deux au refresh
Dure 30 ans
Dure depuis 160 ans
Sadao Nomura
Many companies seem to be in trouble because product quality is not getting better despite company-wide [...] "quality first" policy
92% de réduction des défauts en 3 ans
Le A3 principal : une procédure en 8 étapes pour
analyser les défauts et les éradiquer via des contremesures
Photo d'un rookie, circa 2025
Rare photo d'un senior avant son départ pour une autre boîte
expérience
ex - periri
Au delà
Épreuve
Même racine que
"periculum" = danger !
Combat de la facture cloud qui a augmenté de 3.000€
Souvenir des 2000 emails envoyés par accident
Cicatrice du
truncate de la table user en prod
Chaque semaine, on regarde un défaut avec tous les devs
Problème
Lors de la mise en production, il y a un downtime de 10 minutes
Défaut
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE product ADD enabled TINYINT(1) NOT NULL');
}Le dev ne savait pas que :
Cause racine
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: (this.authenticationService.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Est-ce qu'un technicien de maintenance d'avions
demande aux 150 passagers
"Je peux prendre 30 minutes avant le vol pour inspecter ?"
Est-ce qu'un pompier demande au syndic de copro
"Je peux enfoncer la porte de l'immeuble en feu ?"
Est-ce qu'un dev demande au PO
"Je peux faire cette refacto ?"
Le pouvoir ça ne se demande pas, ça se prend
Moins de 40 events par semaine pour :
1 app mobile
1 app de caisse
1 backend cloud
1 backend on premise
2 frontends web
Utilisés par 250 personnes chaque jour
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: this.mcbUserAsClaims(this.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: (this.authenticationService.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: (this.authenticationService.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: (this.authenticationService.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: (this.authenticationService.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: (this.authenticationService.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: (this.authenticationService.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Problème
Le frontend crash à cause d'une erreur 500 renvoyée par le back
Défaut
getTokenInformation(): Claims {
return this.isIsamAuthenticated()
? (this.authenticationService.getUserData() as Claims)
: (this.authenticationService.getMcbUserData() as McbUserData);
}
mcbUserAsClaims(userData: McbUserData): Claims {
return {
firstName: userData.given_name, // userData is null
lastName: userData.family_name,
emailAddress: userData.email,
// ...
};
}
L'utilisation de `as` met sous silence les erreurs du compilateur
Cause de détection tardive
Albéric Trancart
By Albéric Trancart