14 February 2010
Combining TDD/BDD with DDD
Its not unnatural to think that the prototypical xDD combinations (TDD, BDD, DDD, and friends) are somehow in competition with each other. If you are unsure of their exact meanings, why wouldn’t you believe that TDD is in opposition to BDD and DDD? I mean, they all mean “Hmmhmm Driven Design/Development”. How many things can really drive design or development at the same time?
But, luckily, this turns out to be a misconception. At least in this case: Domain-driven design (DDD) can be very well applied together with Test-driven development or Behaviour-driven development. This post describes one way you might think about this. You may find a much better way for your situation.
Read the rest of this entry »
8 February 2010
xDD: An Overview
I don’t know if it’s more comical or tragical to see all those xDD combinations that exist in software development. By “xDD” I mean any one of TDD, BDD, DDD, RDD, FDD, etcetera. Software developers often make fun of this our tendency to suffix everything with “DD”. I have three points to make about this:
- People get confused. They have a hard time understanding and keeping up with all the buzzwords that float around, especially if they are similar. There is some risk that they’ll simply discard all of them, even though some xDDs are truly invaluable techniques for a professional developer.
- Even if someone thinks that one of the xDDs would be useful she may, falsely, believe that the xDDs are mutually exclusive. Some of them are, some are not, some are in-between.
- This is a power-struggle, in some sense. The whole issue revolves around what should drive software development, i.e. what should be the most important thing. That’s a pretty big issue. What if you could go down in history as the person who understood software development so well that you found the magic key to unlock the whole field? Mind-boggling. (For the record, I don’t think there is one.)
This first post focuses on the first point; what these xDDs are. I have selected three of the most popular ones today, which I know pretty well, and tried to describe them concisely. I’ll also mention a few other xDDs as well.
4 February 2009
TDD/BDD-kursen är tillbaka
Jag och min kurskollega Måns har arbetat hårt under hösten med att vidareutveckla vår kurs i TDD/BDD. Vi har redan tidigare kört kursen en handfull gånger och fått mycket goda vitsord, men världen förändras och även vi. En nyhet är att vi delat upp kursen i flera kurser som riktar sig till personer på olika nivå. Vi har en kurs för nybörjare, en för erfarna och en för experter. En annan nyhet är att vi satsat hårt på att förbättra vår didaktik, hur vi får personer att lära sig ämnet. Vi har också utökat tiden för praktik, för det går inte att lära sig TDD utan att göra det själv.
Om du eller någon du känner är intresserad så kan jag tipsa om att kursen för nybörjare kommer att ges publikt igen, 9-10 mars i Stockholm, i arrangemang av Jaybis. Den här kursen är lämplig både om man är helt ny på området eller om man är erfaren på enhetstestning men inte på TDD. Vi kör i javamiljö, men det är inte viktigt, vi har haft många dotnetutvecklare som har gått kursen utan problem. På två dagar går det inte att bli expert på TDD, men vi siktar på att ge deltagarna en god start på sin TDD-bana.
Permalink Comments off
2 May 2008
Kritik mot TDD (och några svar)
På sista tiden har det dykt upp en del kritik mot Testdriven utveckling (TDD). Som stark förespråkare av TDD är jag naturligtvis intresserad av att se vad folk opponerar sig mot. Kanske har de en poäng och kanske bör jag vara mindre entonig i mitt TDD-mantra? Låt oss se efter.
Coplien på JAOO
Från JAOO och andra konferenser har Jim Coplien basunerat ut sitt budskap att TDD inte är bra (“the ugly step-child of XP”, som jag har för mig att han kallade det i en intervju som jag läste). Jag tycker personligen att hans attityd mot Robert C Martin var burdus och tämligen respektlös. Men låt oss förbise sådana saker och koncentrera oss på hans budskap, i den mån jag kan förstå dem.
Om jag tolkar honom rätt är hans första kritik den att TDD inte skapar bra arkitektur eftersom man fokuserar på att göra det enklast möjliga som kan fungera (YAGNI). Hans exempel är att reducera ett bankkonto till ett tal, en siffra, vilket aldrig kan fungera i en seriös bankapplikation.
Mitt svar: Jag tror att det finns en uppenbar risk att man missuppfattar YAGNI. Det innebär inte den enklaste jag kan tänka ut utan den enklaste, snyggaste lösningen av de som faktiskt skulle kunna fungera. För en större bankapplikation kommer inte en siffra att vara ett element i mängden av möjliga lösningarna. (För en applikation som hanterar privatekonomi kan det kanske vara det.) Jag tror att Coplien utnyttjar detta missförstånd för sina egna syften, eller så har han helt enkelt inte förstått.
Jag tror vidare att Coplien kraftigt undervärderar värdet av refaktorisering och hur vi kan bygga design och arkitektur bit för bit, mer och mer generellt, komplexare bara när det behövs, det vi kallar evolutionär design. Vissa saker kan inte TDD:as fram, helt korrekt, men paket, lager och delsystem är faktiskt inte någon av dessa saker (aspekter, loggning, trådhantering är det däremot).
Copliens andra kritik är mer svårförståelig. Han påstår att han har sett applikationers gränssnitt, deras GUI:n, förstöras på grund av TDD. Tyvärr har jag inte förstått exakt varför han tror att TDD har något med detta att göra.
Mitt svar: Jag kan tänka mig många skäl till att gränssnitt blir ointuitiva, men TDD skulle nog inte vara med på min lista. Om skälet skulle vara att utvecklarna har tvingats att arbeta med en funktionsbit i taget (s.k. sashimi) förstår jag att resultatet kan bli plottrigt… om man samtidigt inte har haft en vision, en informations- och navigationsstruktur och en bra UX-designer i sitt team. Jag har svårt att se detta annat än som ett misslyckande hos personerna med det övergripande blicken över det gränssnitt som ska skapas – inte hos TDD. Om Coplien menar att GUI:t blev dåligt därför att utvecklarna testdrev fram det så förstår jag nog ännu mindre. Om någon som läser detta kan se kopplingen så vill jag gärna veta.
Cédric Beust på QCon San Fransisco 2007
Jag har precis hört en intervju med Cédric Beust på InfoQ. Cédric jobbar på Google och är bl.a. en av personerna bakom testramverket TestNG. Cédric är, enligt egen utsago, “något skeptisk” mot TDD. En av sakerna han menar är att eftersom så mycket av arbetet med TDD är vad han kallar “mikrodesign” (metoder eller delar av metoder) så har TDD en tendens att göra dig “närsynt”. Jag förmodar här att Cédric här menar att man inte har en bra överblick av designen.
Mitt svar: Jag håller med Cédric att detta är en fara, men bara om du inte använder seriös refaktorisering och designskisser på tavla. I refaktorisering ingår just att “ta ett steg tillbaka och reflektera över din design”. Det är tyvärr en vanlig missuppfattning att dessa saker inte ingår i TDD. Som vanligt i XP stödjer arbetssätten varandra på ett subtilt sätt och om man enbart gör TFP, dvs Test-först-programmering, är garanterat risken att du får en svag design. Om du använder refaktorisering för utbyggbarhet och förvaltningsbarhet är risken för närsynthet liten, enligt min mening.
Cédrics andra kritik var att man om man arbetar med TDD “långa stunder” befinner sig i ett tillstånd där inte koden kompilerar och man därför inte kan använda alla finesser i våra fina IDE:er och det skulle vara ett steg tillbaka.
Mitt svar: Återigen en kritik som är svår att ens begripa. Om jag får gissa, läsandes mellan raderna, så arbetar Cédric med att skriva en komplett testmetod för en hel metod för att därefter skriva en metod som får testet att gå igenom. Detta skulle få effekten att vi är i rött, så att säga, en stor del av tiden. Detta är inte bra TDD, det är alldeles för stora steg. Genom att ta mycket mindre steg kan vi, och bör vi, minimera tiden i rött. Låt mig vara tydlig: Det ingår i TFP att vara i rött (inte kompilera eller test är trasigt), men helst ska enbart ett enda test vara trasigt och vi gör allt för att minimera tiden där (enligt tumregel: 1. Make it work 2. Make it right).
Vidare, Cédric kan inte ha sett Robert C Martin genomföra en TDD-session för då skulle han inse och lära sig hur mycket nytta man kan ha av en IDE för att göra TDD (t.ex. Quick Fix-funktionen).
Allmänt mummel
Till sist en kritik som jag inte kan tillskriva till någon enskild person men som vi ofta hör när vi är ute och pratar om TDD. Det är farhågan att man med TDD måste göra om alltihop, eventuellt flera gånger. Alltså, att TDD leder till mycket omarbetning.
Mitt svar: Ja, detta är delvis sant (men inte i så stor omfattning som vissa tycks tro). Vi kommer att få omarbeta vår “enkla” lösning då och då därför att behoven visade att den inte var tillräckligt avancerad (komplex). Poängen är här att behoven först måste manifestera sig innan vi inför en mer avancerad lösning. Detta är En God Sak, eftersom en mer avancerad lösning är mer komplicerad att använda, svårare att förstå och underhålla. Vi vill hålla detta till ett minimum i våra system.
Så, hade det då inte varit bättre att designa den avancerade lösningen från början? Jo, om du har en perfekt fungerande kristallkula och kan förutspå framtiden. Men det finns ganska få trollkarlar bland oss. Vad TDD menar är att många gånger kommer inte den där “uppenbara” funktionen att göras och den generella lösningen sitter bara där och kostar pengar och att detta uppväger kostnaderna för någon eventuell omarbetning.
Min uppfattning att TDD är en teknik som tar tid att lära sig, men som är oerhört kraftfull. Den personifierar Toyotas tanke att vi bör bygga in kvalitet från början istället för att ägna en massa tid på att testa in den i efterhand. Vad är din åsikt?
8 March 2008
TDD-kursen igång
Jag och Måns Sandström är väldigt stolta. Vi har nämligen dragit igång vår TDD-kurs på allvar nu och haft vår första kompletta kunddragning (introduktion, för utvecklare och för kravhanterare). En hel höst av förberedelser som äntligen har fått sättas på prov. Naturligtvis är det ganska tufft att hålla kurs samtidigt som man har andra uppdrag på heltid (jag har fått gå ned lite i tid) men det är också väldigt givande och lärorikt. Bara att diskutera igenom alltihop på djupet med en annan utvecklare ger många insikter.
Den svåraste utmaningen som vi har upptäckt hittills är att när vi beskriver den testdrivna miljö vi vill se i utvecklingsarbetet så reagerar ibland deltagare med både entusiasm och med tvivel därför att det ligger så långt ifrån deras egen verklighet, med gamla produkter, seg organisation och trögjobbad kod. Det är lätt att tänka att vårt budskap är orealistiskt, när vi hellre vill att de ska tänka: “Vilka steg kan jag börja ta för att närma mig detta som jag egentligen tror är bra?”. Det blir en utmaning för oss i våra kommande kurser.
Är du intresserad av att bli duktig på TDD så kommer vi att ge en publik kurs om en knapp månad och förhoppningsvis även i höst. De publika kurserna sker i samarbete med Jaybis. Läs mer om kursen på Jaybis webbplats. Där kan du också anmäla dig.
Permalink Comments off