đ« Newsletter #2
OĂč on parle de la queen of dev Barbara Liskov, de comment Ă©valuer son propre niveau en dev et de nos actusđ§
News News News
Campagne Ulule : on a dĂ©passĂ© les 50 % â
TLDR : des micro-bootcamps solidaires sur un week-end pour progresser en algo, en system design et en craft
đ https://fr.ulule.com/micro-bootcamps
Il reste 13 jours, on a dĂ©passĂ© les 50 %, on ne lĂąche pas la patate đ„
On donne et on fait tourner lâinfo autour de nous !
(et pourquoi on a soudain un ton de prof de gym, câest une vraie bonne question.)
Tu te demandes si nos futurs micro-bootcamps sont pour toi ? Ăcris-nous Ă contact@electronictales.io, on fera un diagnostic flash personnalisĂ© ensemble (sans appel ni visio gĂȘnante, câest promis).
Modern World
Auto-évaluer son niveau
Un des points douloureux, quand on dĂ©bute dans le dev (et mĂȘme ensuite), est de rĂ©ussir Ă Ă©valuer son propre niveau de compĂ©tences.
Lâassociation Code Collectif a traduit en français une matrice dâauto-Ă©valuation des compĂ©tences en programmation, qui permet de mieux se situer, Ă lâimage des niveaux de langues (A1, B1, etc.).
Câest super utile et câest ici.
Ancient World
Le âElleâ de SOLID đ„
Une chronique par Officier Azarov
Lâautre jour, il y a trois ou quatre ans, jâĂ©tais tranquille chez ma psy, Ă parler du capitalisme et de ma mĂšre, comme tout le monde. Ce quâil sâest passĂ© ensuite, je ne saurais pas dire. Peut-ĂȘtre quâil se faisait tard et quâelle commençait Ă ĂȘtre grognon de faim. Peut-ĂȘtre quâelle sâĂ©tait rappelĂ© quâelle devait changer les piles du dĂ©tecteur de fumĂ©e du cabinet aprĂšs mon dĂ©part. Toujours est-il que, soudain, elle mâa demandĂ© de dĂ©crire les Ă©motions que je ressentais.
Je ne sais pas si ça nâarrive quâĂ moi, ce problĂšme, mais il y a toujours un moment oĂč les psys veulent que je dĂ©crive mes Ă©motions. Sâensuit un Question pour un champion bizarre oĂč je tente, pĂȘle-mĂȘle, âanxiĂ©tĂ©â, âculpabilitĂ©â ou encore âangoisseâ, mais Ă chaque fois on me rĂ©pond que ce nâest pas une Ă©motion. Comme si on Ă©tait tou·te·s censé·e·s connaĂźtre la liste par coeur â un truc que les psys voient probablement en premier semestre de L1, soit dit en passant. Sauf que je ne suis pas allĂ©e en L1 de psycho, moi, bon sang.
Dans ce moments-lĂ , tandis que je sĂšche honteusement, tout au fond de moi, un ĂȘtre odieux et malfaisant â probablement un·e dev Ă qui son manager demande de pousser en prod un vendredi soir â a envie de hurler âmais est-ce que je vous demande de mâĂ©numĂ©rer les principes SOLID, moi ?â.
En vrai, je ne les connais mĂȘme pas, ces principes. Câest bon, personne ne les connaĂźt. Tout le monde google en douce sur son tĂ©lĂ©phone quand un·e collĂšgue un peu plus surexcité·e que les autres dĂ©cide que câest le moment dâen parler, lĂ maintenant tout de suite, en plein pendant le dĂ©jeuner. Câest pour quoi, dĂ©jĂ , le S ? Et le I ? Est-ce que câest pour âinjectionâ ? âInversionâ ? âIndĂ©pendenceâ ? â(Salade) Icebergâ ?
DerriĂšre cette abrĂ©viation aussi engageante quâun pain de mie oubliĂ© dans le toaster la veille dâun dĂ©part en vacances, il y a pourtant un principe qui vaut le dĂ©tour dâun point de vue historique et militant : le principe de Liskov â aka le âLâ de SOLID.
đŠ«đŠ« Avant de voir ensemble le principe en lui-mĂȘme, moment PĂšre (MĂšre ? Parent ?) Castor đŠ«đŠ«
Once upon a time
Dans la famille âincroyable mais vrai, il nây pas quâAda Lovelace et Margaret Hamilton dans lâhistoire de la programmationâ, je demande Barbara Liskov, donc. Car oui, le seul nom propre, dans lâacronyme SOLID, est bien celui dâune femme.
Comme elle le raconte dans cette interview, Liskov doit participer Ă une conf en 1987. Ă ce moment lĂ , elle se dit que ce serait une bonne occasion de se mettre Ă jour sur ce quâil se fait de beau dans le monde de la programmation orientĂ©e objet, qui parlait beaucoup de classes et de types Ă lâĂ©poque. Elle compulse des articles scientifiques. Et lĂ , attention moment Queen of Dev absolu :Â
Okay Barbara, mic drop đ€đ¶ïž
(Petite blague en option â peu importe si on ne sait pas trop ce quâest une stack et une queue, la formulation reste savoureuse Ă souhait : )
Huhuhu.
Je ne sais pas vous, mais moi, Ă ce stade, je remplis dĂ©jĂ les papiers pour lui demander de mâadopter.
Donc voilĂ , on est dans les annĂ©es 80, Barbara Liskov participe Ă une conf en prĂ©sentant un principe quâelle arrive Ă dĂ©gager âde façon informelleâ, nomme ça âBehavioral subtypingâ et retourne travailler sur CLU, un langage de programmation sur lequel elle bosse pour le MIT (en toute simplicitĂ©).
Ce nâest que dans les annĂ©es 90 quâelle reçoit, un jour, un e-mail de quelquâun lui demandant de confirmer sâiel avait bien compris le âprincipe de substitution de Liskovâ. Et lĂ , elle dĂ©couvre quâil y a tout un tas de gens, sur Internet, qui dĂ©battent de ce quâest le principe de Liskov.
Pour la petite histoire, Barbara Liskov a fait des Ă©tudes de mathĂ©matiques. Au dĂ©but des annĂ©es 1960, elle a postulĂ© Ă Berkeley et Princeton pour continuer en master, mais Princeton nâacceptait pas les femmes dans sa filiĂšre mathĂ©matiques Ă lâĂ©poque. Dommage pour eux : elle a Ă©tĂ© une des premiĂšres femmes au monde Ă obtenir un doctorat en informatique, a eu le prix Turing et enseigne au MIT depuis presque 50 ans.
A quand une sĂ©rie Apple TV uchronique qui imaginerait un monde oĂč Barbara aurait eu pour nom de famille Piskov, Miskov ou Viskov ? đż
Mais câest quoi, ce principe ?!
Allez, voyons ensemble ce quâest ce fameux principe de Liskov !
Bon, dĂ©jĂ , ce principe sâapplique Ă la programmation orientĂ©e objet (= POO).
Petit recap de lâhĂ©ritage en POO
Peu importent les subtilitĂ©s. En gros, ce quâil faut savoir, câest quâen POO, on a des classes (dites aussi âtypesâ), et quâĂ partir de ces classes on peut crĂ©er des sous-classes (dites aussi âsous-typesâ). Comme dans la vraie vie mais en plus flippant, les classes enfants hĂ©ritent des propriĂ©tĂ©s de leur parent.
Imaginons quâon veuille coder un simulateur de colocation inter-espĂšces (oui dĂ©so, on va utiliser la mĂ©taphore vue et revue des animaux â mais, hey, nâest-ce pas plus tech et woke avec ce superbe design ?).Â
Disons que, dans notre coloc, on veut quâil y ait des chiens, des canards et des lions (parce que pourquoi pas). On pourrait crĂ©er une classe pour reprĂ©senter chaque type dâanimal et dĂ©finir pour chacun que celui-ci a un nom, respire, mange, boit, dort, etc. Puis Ă©crire le code correspondant.Â
Par exemple, pour Lion :Â
mĂącher() {
print(âJe mĂąche.â)
}
Et pour Canard :Â
mĂącher() {
print(âJe mĂąche.â)
}
Et lĂ bim, on se rend compte quâils font TOUS ça, les petits mignons. Ni une ni deux, notre Surmoi crie, fulmine et pleure : on a du code dupliquĂ© dans tous les sens, le principe Donât Repeat Yourself nâest pas respectĂ©.
Pour Ă©viter ça, on sort notre plus beau monocle de dev orientĂ© objet et on crĂ©e une classe Animal qui va centraliser les Ă©lĂ©ments communs Ă toutes nos petites bĂȘtes :
La classe Animal est la classe parent. Les classes Chien, Lion et Canard sont les classes enfants. Tous les enfants hĂ©ritent des propriĂ©tĂ©s dâAnimal, Ă savoir avoir un nom et mĂącher()
(et câest dĂ©jĂ beaucoup).
Avec la création de cette classe parent, on a réglé le problÚme du code qui se répÚte.
Mais ce nâest pas tout !Â
La beautĂ© de la programmation objet, câest quâon peut aussi utiliser cette classe parent pour Ă©crire un code gĂ©nĂ©rique, câest-Ă -dire un code qui marchera aussi bien pour la classe Chien que Lion ou Canard. Et mĂȘme pour des classes qui nâexistent pas encore, du moment quâelles sont dĂ©rivĂ©es dâAnimal â par exemple, Chat ou ElĂ©phant.
Moins de mots, plus de dodo code (oui oui, câest du pseudo code â les jedis du Java, rangez vos sabres laser, merci) :
VoilĂ . Basta. Finito. Ce code va nous permettre de gĂ©rer tous les cas oĂč on a besoin de mĂącher()
.
âMais oĂč sont les lions, oĂč sont les canards, oĂč sont les chiens ?â, me direz-vous.
Lâinjection de dĂ©pendances
Entre en scĂšne encore un autre truc gĂ©nial, qui sâappelle lâinjection de dĂ©pendances đ
No worries, on nâa pas besoin de savoir en dĂ©tails ce que câest ici. Imaginons juste que, dans un programme fait en POO, on va avoir des classes qui se baladent (et qui sont, chacune, un petit fichier) et un fichier principal, qui va dire ce que fait le programme. Ce fichier principal a une sorte de conseiller de lâombre, qui orchestre tous ces Ă©lĂ©ments : le manager de dĂ©pendances.
Ainsi, lorsque, par exemple, nous cliquerons sur le canard sur notre interface graphique, le manager va recevoir lâinfo de remplacer lâinstance dâAnimal pour une instance de Canard. En code, câest comme si le manager faisait ça :Â
Et sur notre application, voilà quel sera le résultat :
Maintenant, imaginons quâon invite des bactĂ©ries Ă venir vivre avec nous. On veut quâelles soient des habitantes Ă part entiĂšre de la coloc, donc on crĂ©e une classe Bacteria dĂ©rivĂ©e dâAnimal (Ă ce stade, je prie dĂ©finitivement pour quâaucun·e biologiste qualifié·e ne tombe sur cet article).
Bacteria va hériter de mùcher(), comme les autres.
Allez super, on a bien avancĂ©, on peut fermer lâordi et aller boire un mojiâŠ
WAIT A MINUTE ! MAIS ĂA NE MĂCHE PAS, UNE BACTĂRIE !!
Sans le savoir, nous venons dâenfreindre le principe de Liskov :Â
Si S (ici, Bacteria) est une sous-classe de T (ici, Animal), alors les objets de type T (Animal) peuvent ĂȘtre remplacĂ©s par des objets de type S (Bacteria) sans altĂ©rer la cohĂ©rence du programme.
Eeeeeh oui. On se retrouve dans une situation fascinante : par erreur, on a créé un Ă©cart entre lâordinateur et nous, les ĂȘtres humains qui avons conçu le programme.
Pour lâordinateur, tout va bien : la syntaxe est ok, le code tourne, tout sâaffiche.Â
Mais pour nous, ça chauffe. Sur le plan sémantique, ça ne va plus. Notre programme a un comportement inattendu.
Ce que demande le principe de Liskov, câest que les mĂ©thodes hĂ©ritĂ©es (comme mĂącher()
) soient utilisables par toutes les sous-classes, avec des rĂ©sultats conformes aux attentes du·de la programmeur·se.Â
Or là , on a fait hériter Bacteria de la méthode mùcher()
telle quelle, sans lâadapter au cas prĂ©cis de notre petite bactĂ©rie (pourquoi est-ce que je mets âpetiteâ devant âbactĂ©rieâ, allez savoir).
Et, du coup, notre code gĂ©nĂ©rique nâest plus si gĂ©nĂ©rique que ça.
Pas de drame, que des solutions
On lâ a dit : dans cette situation, lâordi est content, mais lâĂȘtre humain voit lâincohĂ©rence sĂ©mantique. Câest donc au·à la programmeur·euse dâaller rĂ©tablir lâharmonie de lâUnivers, et ce en redĂ©finissant la mĂ©thode mĂącher()
pour Bacteria :
class Bacteria extends Animal {
mĂącher() {
print(âJe ne mĂąche pas, je dĂ©grade des macromolĂ©cules.â)
}
}
Maintenant, notre programme respecte Ă nouveau le principe de Liskov : toutes les sous-classes dâAnimal, y compris Bacteria, peuvent utiliser mĂącher()
sans crĂ©er dâincohĂ©rence sĂ©mantique.
Pour le mot de la fin, je ne rĂ©siste pas Ă lâenvie de citer une derniĂšre fois la professeure Liskov :
Passionnant !