On 07/22/2012 05:59 PM, Emmanuel L�charny wrote:
> Le 7/22/12 3:54 PM, Nicolas Capponi a �crit :
>> Lorsqu'on fait du TDD, on n'�crit pas tous les tests d'un coup puis
>> ensuite le code de l'appli. On �crit un test, puis le code, puis un autre
>> test, puis le code.
>> Donc au bout d'une heure par exemple, tu n'as pas que des tests, tu a bien
>> �crit du code pour ton appli, qui partira en production. Et tu as les tests
>> qui vont avec.
>> Projet petit ou gros, tu ne repousse par l'�crire de ton appli � la fin.
>
> Je ne suis pas d'accord. Je ne vois pas pourquoi commencer par un test pourrait �tre un plus. Tout d'abord, cela
> suppose que tu sais ce que tu dois tester, donc tu as d�j� d�fini les sp�cifications de ta m�thode. Le fait d'avoir
> �crit le test d'abord fige cette m�thode, et te pousse � ne pas la modifier par la suite (sinon, tu risques d'avoir
> des dizaines de tests � modifier). Ce n'est pas comme cela que l'on code dans la pratique. Quand je code, et je pense
> que c'est la m�me chose pour la majorit� des personnes, j'ai une id�e assez pr�cise de l� o� je vais, mais pas
> compl�tement. Je pr�f�re me laisser une certaine latitude de fa�on � avoir de la place pur de meilleures id�es qui
> pourrait surgir en cours de codage. Va peut para�tre �trange, mais je pense que c'est une libert� qui conduit � plus
> de souplesse et au final, � un mellieur code.
Je ne suis pas d'accord avec le fait qu'on fige la m�thode, c'est m�me le contraire. Le cycle de TDD met explicitement
en avant le refactoring, autre fa�on d'exprimer le fait d'avoir "une certaine latitude de fa�on � avoir de la place pur
de meilleures id�es qui pourrait surgir en cours de codage". Les tests existants te �galement permettent d'avoir un
filet de protection sur tes changements.
>
> Bien �videmment, je rajoute les tests apr�s, et j'essaye d'arriver � la couverture fonctionnelle qui me semble utile
> pour l'applicaton en cours de d�veloppement.
>
> Je vais plus loin : il m'arrive souvent de 'penser' mes tests en fonction du code que j'�cris. Je me dis : "l�, si on
> me passe telle valeur ou telle valeur, il y a un risque que �a plante : va falloir rajouter un test". Au final, comme
> ce sont de toutes fa�on des tests en bo�te blanche, je suis plus couvert que si j'avais fait mes tests en amont et que
> si javais cod� en fonction de mes tests.
Je pense mes tests en fonction du code que je veux �crire. Je peux aussi rajouter des tests si je pense n'avoir pas
couvert certains cas.
>
> Et surtout : je me suis focalis� sur le code de mon appli, et non pas sur le code de mes tests. J'ai commenc� par
> coder mon appli, quand tu termines par cela (m�me si tu as l'impression de progresser dans ton appli au fur et �
> mesure que tu �cris tes tests, tu progresses juste dans la couverture fonctionnelle de tes tests)
>
Donc quand j'ai fini de coder, en fait je n'ai pas vraiment une appli ? Juste des bouts de code qui ne servent � rien ?
Heureusement les utilisateurs ne s'en sont pas aper�u !
Je ne comprend pas ce raisonnement.
>>
>>
>> 2) L'approche TDD est stupide
>> Argument gratuit, sans plus de pr�cisions je ne vois pas ce qu'on pourrait
>> r�pondre.
> Bien s�r que c'est gratuit. Mais je maintiens cette affirmation. En fait, qu'on me prouve que c'est intelligent, et
> que �a am�liore la qualit� du code produit, comparativement � une m�thode naturelle. Ca me rappelle la m�thode globale
> qui a �t� enseign�e dans les �coles fran�aises dans les ann�es 1970 (dieu merci, j'y ai �chapp�), et qui a men� des
> millions de petits �coliers � perdre leur orthographe. Ce n'est pas parce qu'une m�thodologie est nouvelle qu'elle est
> plus intelligente.La meilleure preuve en est que cette "m�thodologie" a �t� 'r�invent�e' en 2003 et qu'elle n'a pas
> remplac�e les m�thodes existantes, malgr� 9 ans de marketing...
Beau retournement de situation. Tu affirmes que quelque chose est stupide et c'est � ton interlocuteur de prouver le
contraire...
Sur le marketing, la nouveau produit qui lave plus blanc que l'ancien, j'ai d�j� dit ce que j'en pensais, mais ca ne
prouve rien ni dans un sens ni dans l'autre.
Java n'a pas remplac� C malgr� plus de 15 ans de marketing :-)
>
> Sinon, je te renvoie �
http://en.wikipedia.org/wiki/Test-driven_development#Shortcomings. Bien �videmment, toutes ces
> limitations s'appliquent stricto sensu aux tests unitaires, mais au moins, on ne base pas les d�veloppements des
> applications sur la base de pr�misses qui sont faux.
Comme tu le dis, le fait d'avoir des tests unitaires vient avec son cort�ge de probl�mes, qu'il faut g�rer. Si on les
fait quand m�me c'est parce qu'on consid�re que cela apporte plus que �a ne co�te au final.
Le d�veloppement d'une appli n'est pas le d�roulement d'une preuve formelle, je n'adh�re pas � ton analogie sur les
pr�misses.
>
>>
>> 3) L'approche TDD est infantilisante
>> C'est un reproche fait au discours autour du TDD (et que je trouve valide
>> comme dit plus haut). En soi je ne vois pas en quoi la pratique elle-m�me
>> est infantilisante.
> Le vrai probl�me de TDD est qu'elle suppose que l'on doit �crire du code simple, qui doit �tre utile (KISS et YAGNI).
> Je suis pour que le code soit le plus simple possible, mais ce n'est pas un pr�requis. C'est juste une cons�quence
> d'une analyse du probl�me bien pos�e, et d'une reflexion sur l'architecture du code. Un code devient compliqu�
> (j'insiste sur 'compliqu�' en opposition � 'complexe' : on peut �tre oblig� d'�crire du code complexe) quand il est
> construit sans r�elle r�flexion globale.
>
> En conduisant les d�veloppeurs � penser leurs tests d'abord, on abouti � un processus o� ils vont �crire leur code en
> fonction d'un test, puis le modifier en fonction d'un second, etc. Au final, on aura une sorte de mille-feuilles qui
> sera la r�sultat de dizaines d'it�rations sur les tests.
>
> Mais comme on insiste pour que le d�veloppeur travaille de cette fa�on, on lui nie toute capacit� � comprendre le
> probl�me dans sa globalit� : c'est une n�gation de sa responsabilit�, ce que j'appelle de l'infantilisation.
Ok, �a c'est un argument qui me semble valide. C'est un risque effectivement, m�me si je ne suis jamais tomb� sur
l'effet mille-feuilles que tu d�cris.
En pratique, rien ne t'emp�che de r�fl�chir avant, pendant, apr�s, et d'adapter ce discours KISS/YAGNI au contexte de
ton appli.
Pour le c�t� infantilisant, cela suppose que tu suives religieusement la m�thode, sans ne jamais te poser de questions.
Mais dans ce cas, quelle que soit ta m�thode pour �crire du code, naturelle ou pas, je ne suis pas s�r qu'au final le
r�sultat soit tr�s bon.
>
>
>>
>> 4) L'approche TDD est contre-productive
>> L'exp�rience que j'en ai est positive de ce point de vue. J'ai constat�
>> une am�lioration (forc�ment subjective) de la qualit� de code produit.
> Quelle taille d'application ? Quelle type d'application ? Quelle complexit� d'application ? Quelle taille d'�quipe ?
>
> Je suis s�r que pour certains projets, assez simples, avec une �quipe petite, TDD peut s'av�rer efficace. Comme je
> l'ai �crit dans de mes mails pr�c�dent, il m'arrive d'�crire mes tests avant d'�crire le code, mais simplement dans le
> cas o� je d�finis une API 'grand public', qui est sp�cifi�e pr�cis�ment (pas de variation de l'API), et parce que je
> veux �tre s�r que je n'aurais pas de trou dans ma raquette (et �a me prend un temps non n�gligeable, quand je vais
> avoir 99% des tests qui seront bons).
1) Quelques milliers de ligne de code, web service, traitements sur des dizaine de milliers d'items avec des r�gles
m�tiers complexes, �quipe variant de 2 � 3 personnes, sur 5 mois
2) Quelques dizaines de milliers de lignes de code, processing/web services/back-office, traitements plus ou moins
complexes sur des millions d'items
, �quipe variant entre 5 et 7 personnes, sur plus de 18 mois
Les 2 applications sont en maintenance �volutive, plus ou moins active selon les besoins.
Sur la taille des �quipes et des applications, si ton architecture est suffisamment d�coupl�e et que le type d'appli le
permet, tu peux te permettre d'avoir de petites �quipes qui travaillent (relativement) ind�pendamment sur des parties
diff�rentes. C'est la cas dans ma bo�te. Je n'ai pas l'impression que cette situation soit exceptionnelle.
>
>> Mais je me garderais bien de g�n�raliser et de pr�tendre que c'est tout le
>> temps le cas, en fonction des types d'applis et contextes, de l'�quipe.
>> Les quelques �tudes scientifiques existantes sont apparemment contrast�es
>> la "silver bullet" que d'affirmer que �a ne fonctionne jamais.
> Je dis simplement que c'est une m�thode qui est bas�e sur l'intuition d'une personne, qui par ailleurs a pass� plus de
> temps � se focaliser sur comment �crire du code qu'� en �crire lui-m�me, sans avoir fait ses preuves.
>
> Je n'ai pas connaissance d'un seul projet de taille raisonnable qui ait �t� un succ�s bas� sur du TDD (je parle de
> projet de plus de quelques centaines de milliers de lignes de code)
C'est s�r qu'avec une telle contrainte �a �limine pas mal de monde. Je pense que je n'ai jamais travaill� sur un projet
d'une telle taille (en supposant qu'on �limine tous les projets que l'on peut d�couper en sous-projets relativement
ind�pendants, o� une partie pourrait �tre r�alis�e en TDD). Et la plupart de ceux que je connais non plus.
>
> je pense que c'est un gadget pour chefs de projets en manque de nouveaut�s et pour consultants en manque d'argent.
>
> Je pense qu'on impose cette m�thodologie aux jeunes d�veloppeurs pour s'assurer qu'ils pondent leurs tests, comme les
> poules pondent leurs oeufs.
>
> bref, c'est punitif, castrateur, d�bilitant, simpliste, donc stupide.
OK, c'est bon, je crois que j'ai bien compris cette partie l� de ton argumentation :-)
>
>>
>> 5) L'application sera �crite en fonction des tests plut�t que du besoin
>>> Tu designes des tests, pas une appli. Du coup, ton appli sera �crite en
>> focntion de tes tests, et non en fonction de ton besoin. C'ets juste
>> aberrant.
>>
>> Uh ? Les tests sont juste une technique qui te permet d'�crire ton appli
>
> Et bien c'est stupide. C'est mettre la charrue avant les boeufs.
>> (ta classe en fait puisqu'on parle de test U) d'un point de vue externe
>> plut�t qu'interne. Et le design des tests est suffisamment
>> contraint pour ne pas te d�router du design de ton appli. Pour le coup, tu
>> exprimes ton besoin - quel r�le joue l'objet, quelle interface il expose ?
>> - avant de te lancer dans l'impl�mentation.
>
> D�sol�, mais je n'ai pas besoin de tests pour 'exprimer mon besoin'. Le mec qui pense que les tests l'aide � exprimer
> son besoin, j'ai un doute sur sa compr�hension du m�tier d'informaticien...
Stupide, ne comprend pas le m�tier d'informaticien, .... Paradoxalement, pour quelqu'un qui n'aime pas la m�thode
globale, tu es assez globalisant dans tes propos !
>> Cela n�cessite un certain entra�nement au d�but car on n'a pas l'habitude.
>
> Bien s�r ! Marcher � l'envers aussi, ce n'est pas facile...
>> Ce qui explique aussi qu'on perd en productivit� lorsqu'on commence
>> l'approche TDD, ceux qui disent le contraire sont malhonn�tes.
>
> Et je pense m�me qu'on ne va pas plus vite avec de l'exp�rience. Avec tous les probl�mes qui viennent avec une
> d�marche qui va � l'encontre des principes m�mes du d�veloppement.
>>
>> 7) Comment ecrire les tests si le code n'existe pas ?
>>> Sans compter qu'il faudra m'expliquer comment tu peux �crire tout tes
>> tests sans code, sauf � mocker comme un fou tous les composants dont tu ne
>> sais pas d'avance comment ils vont s'architecturer dans l'avenir.
>> Les mocks sont une solution, mais leur utilisation est beaucoup moins
>> fastidieuse que ce que sous-entend cette phrase. Mocker le comportement
>> d'un collaborateur, c'est 1 ou 2 lignes de code dans un test.
> Non. Dans les cas simples seulement. D�s que tu dois simuler une connexion SGBDD, r�seau ou autre, ton mock va �tre
> complexe.
Tu ne les simules pas. Dans la cas d'une connexion SGBD, tu mockes ton DAO (ou interface d'acc�s � ta base que tu
appelles comme tu veux) pour valider que les appelants fonctionnent correctement (cas nominaux + cas d'erreurs) et tu
fais un test d'int�gration pour v�rifier que ton DAO fonctionne bien avec ton SGBD.
>>
>> 8) Dans 10 ans l'approche TDD sera d�finitivement oubli�e (sauf pour
>> critiquer le code legacy qui a �t� �crit en TDD)
>>> Mais, bon, s'il y en a pour qui �a marche, pas de soucis. On se revoit
>> dans 10 ans !
>> C'est possible. Le contraire aussi est possible. On sera probablement
>> entre les deux avec des projets ayant r�ussis et des projets ayant �chou�s.
>> Et il y a aura aussi des commentateurs de tous bords qui en tireront les
>> conclusions qui les arrangent :-)
>>
>> Nicolas Capponi
>> PS : pour ceux qui veulent un texte s�rieux sur l'approche TDD, je vous
>> conseille Growing Object Oriented Software Guided by Tests de Freeman et
>> Pryce
http://www.growing-object-oriented-software.com/
>
> " Test-Driven Development (TDD) is now an established technique for delivering better software faster"
>
> Affirmation gratuite.
Effectivement
>
> Freeman, c'est un mec qui se d�clare comme "senior developer" au bout de 2 ans sur linkedin, et qui a pass� le reste
> de sa carri�re comme "coach" et consultant. Ca me fait doucement rigoler... Par contre il a boss� pour thougtwork,
> comme Nat Pryce. Bref, je suis plus que sceptique sur leur comp�tence en tant que codeurs, par contre je suis
> intimmement persuad� qu'ils sont tr�s tr�s fort pour vendre leur soupe...
Je n'adh�re pas � ce genre d'arguments. D'autant que les meilleurs codeurs ne sont pas forc�mment les plus � m�me
d'expliquer leur m�thode.
Bref, j'ai trouv� ce bouquin int�ressant, et je le conseille � ceux que le TDD ne rebute pas.
>
>
> Sur ce, je retourne � mes tests, j'en ai plein � coder pour v�rifier que ce que j'ai �crit fonctionne. Et merveille
> des merveille, �a me permet de trouver des bugs, et de les corriger !
>
>
Je retourne � mon code.
Rendez-vous � une prochaine discussion !