Mișcarea Software Craftsmanship a prins contur în 2009, ca reacție la ideea că putem reduce temporar calitatea codului pentru a scoate produse mai repede. Promotorii mișcării consideră că dimpotriva, ceea ce trebuie sa îmbunătățim este viteza cu care un programator scrie cod de calitate. Altfel, utilizatorii, clienții și compania care produce software au de suferit: primii din cauza greșelilor introduse în aplicații (bug-uri), iar compania datorită scăderii vitezei de producție a noilor versiuni și a nemulțumirii utilizatorilor.
Pentru a sprijini nevoia aspiranților la software craftsmanship de a ajunge la acest nivel, promotorii mișcării au recurs la o metaforă bazată pe istoria breslelor și a meșterilor.
În epoca medievală bunurile erau produse manual. Fiecare profesie era structurată în bresle, unde meșteșugarii puteau să se întâlnească, să învețe unii de la ceilalți și să-și apere profesia. Pentru că unele bresle din anumite cetăți controlau foarte bine calitatea produselor, acestea dobândeau faimă. Acesta este motivul pentru care breasla era o instuție închisă; orice meșter ce intra în breaslă trebuia să producă la o anumită calitate.
Între breslele dintre diverse orașe era o competiție acerbă, de aceea calitatea produselor creștea constant. Fiecare breaslă avea un statut care reglementa funcționarea internă a sa. De asemenea organizarea breslelor era reglementată prin legi.
Pentru a deveni meșter, un tânăr trebuia să treacă câteva etape: să devină ucenic, apoi să devină calfă, să călătorească între cetăți pentru a învăța de la alți meșteri si doar apoi putea să devină și el meșter. Ascensiunea în cadrul breslelor nu era deloc simplă și necesita ani lungi de pregătire.
Un tânăr intra în ucenicie încă de la 10-12 ani. Înainte de a intra în ucenicie tânărului i se testau 2-3 săptămâni aptitudinile. Ucenicia dura în jur de patru ani, timp în care ucenicul era un fel de slugă în casa stăpânului având sarcini de la răsăritul până la apusul soarelui.
După terminarea uceniciei, ucenicului i se elibera un certificat de învățare a meșteșugului, care îi permitea să fie angajat drept calfă. După acest moment calfa avea trei opțiuni: să rămână în atelierul meșterului, să se angajeze la alt meșter sau să-și facă timpul de călătorie1. Călătoria avea scopul de a-l ajuta pe calfă să-și însușească mai bine meseria. Timpul obligatoriu de călătorie era de 2-4 ani.
După călătorie, calfa trecea un examen de meșter: o proba practică, o lucrare de măiestrie sau capodoperă. Breasla analiza lucrarea pe care o aproba sau o respingea printr-o comisie. Doar după un proces de acceptare în breasla tânărul meșter avea voie să-și deschidă un atelier. Un meșter era un cetățean al orașului în care locuia și putea să participe la deciziile politice ale orașului.
În cadrul unei bresle, exista o conducere aleasă. Meșterul cu cea mai mare experiența și cu reputatie imaculată era de obicei conducătorul breslei. Această conducere avea grijă ca breasla să prospere, stabileau standardele de calitate ale produselor și realizau toate actele administrative.
După cum menționam mai sus, Software Craftsmanship este o abordare in industria de Software Development care accentuează importanța abilităților dezvoltatorilor. Inițiatorii mișcării doresc să ridice standardele profesiilor din industria IT prin aplicarea acestor concepte din epoca medievală. Mișcarea a luat ființă în anul 2009 prin realizarea unui manifest
Acest manifest este o continuare al "Manifesto for Agile Software Development", care presupunea existența software-ului funcțional, să putem răspunde rapid la schimbări, valorizarea interacțiunilor între persoanele implicate în dezvoltarea unui software și colaborarea intensivă cu clientul. Software Craftsmanship vrea să completeze "Manifesto for Agile Software Development" prin faptul că nu se dorește doar software funcțional, ci un software creat cu grijă și pricepere. Pe lângă a răspunde schimbării rapid și eficient, adăugăm valoare prin funcționalități importante pentru utilizatori. E important ca nu doar să valorizăm interacțiunea dintre oameni, ci dorim să creăm o comunitate de profesioniști.
Începând cu anul 2009 când a fost publicat acest manifest, tot mai mulți programatori au început să se auto-denumească "Aspiring Software Craftsman", echivalentul ucenicului din istoria breslelor de meșteșugari. Scopul lor este ca programatorilor să le pese de calitatea produselor, calitate codului și să dorească să învețe continuu. Dupa cum un ucenic lucra de la răsărit până la apus, la fel și un aspiring software craftsman ar trebui să exerseze cât mai mult pentru a-și îmbunătați abilitățile. Astfel au devenit și mai cunoscute practicile următoare: coding kata, coding dojo, pair-programming, dar a fost inventat și un alt concept: code retreat. Vom reveni la ele în detaliu.
Corey Haines este printre primii programatori care a preluat modelul călatoriei ucenicilor și s-a autodenumit "software journeyman". Ceva mai mult de un an Corey a călătorit în lume cu singurul scop de a învăța lucruri noi de la alți programatori. În timpul călătoriei dorea doar sa aiba unde să doarmă și să aibă ce să mănânce, în schimb dezvolta orice aplicatie era nevoie. După ce și-a încheiat călătoria, Corey a revenit la maestrul său, Robert C. Martin, și i-a povestit ce a învățat, la fel ca în timpul breslelor.
Spre deosebire de alte profesii, un programator nu are un set de practici standardizate pe care trebuie neapărat să le învețe. Există desigur practici pe care o echipă sau alta le folosesc, dar la nivel de industrie avem foarte puține dovezi despre ce anume ajută și ce nu la dezvoltarea aplicațiilor complexe.
Aceasta a fost o problemă pentru Software Craftsmanship, pentru nu poți dezvolta abilitățile programatorilor atunci când nu știi care ar trebui să fie. Inițiatorii mișcării au făcut două lucruri: au selectat câteva practici din experiența unor programatori cu zeci de ani de experiență și au insistat ca fiecare programator sa învețe în continuu în cadrul comunității, în speranța că vor reuși să descopere ce definește profesia.
Câteva din aceste practici recomandate pentru orice aspirant software craftsman sunt: testarea automată sub forma unit testing sau test driven development, refactoring continuu, menținerea "curățeniei" codului prin urmarea unor reguli de "clean code", elemente de design și arhitectură, paradigme diferite de programare - object oriented și funcțional și pair programming. Această listă este doar o bază pe care membrii comunităților construiesc.
La nivel personal, recomandarea mișcării este ca fiecare programator să încerce să stăpânească aceste practici, să le discute în comunitate și sa le aleagă pe cele care îl ajută cel mai mult în cadrul unui proiect.
Mișcarea este uneori criticată pentru această listă de practici. Multe din critici vin ca reacție la afirmațiile lui Robert C. Martin, probabil cel mai vocal promotor al software craftsmanship, care susține cu îndârjire practicile de mai sus. Scopul lui este acela de a defini un standard al profesiei, dar metodele folosite înstrăinează unii programatori interesați de mișcare. În realitate, majoritatea celor care aspiră la craftsmanship sunt persoane pragmatice care preferă să stăpânească toate uneltele meseriei, pentru a le putea selecta pe cele utile la un moment dat.
O dată ce o listă de practici de programare care trebuie stăpânite sunt definite, programatorii au nevoie de metode de a le învăța. Așa cum arată experiența lui Corey Haines (și nu numai), una din cele mai bune metode de a învăța programare este prin interacțiunea cu comunitatea. În același timp însă, este important ca un programator să își dezvolte și singur abilitățile.
Software craftsmanship propune câteva metode de a învăța aceste practici.
Coding kata este o metodă împrumutată din arte marțiale și se referă la exersarea unei practici de programare prin rezolvarea repetată a unei probleme simple folosind acea practică. Există pe web destule probleme documentate în acest scop, la fel cum există înregistrări video ale unor programatori din comunitate care o demonstrează. Cel mai important lucru este ca după fiecare rezolvare, programatorul să se gândească ce l-a încetinit în timpul exercițiului și ce ar trebui să schimbe pentru a elimina această frână.
Coding dojo este o altă metodă împrumutată din artele marțiale. Se referă la un exercițiu de grup cu scopul de a transmite cunoștințe între participanți. Grupul va încerca să rezolve o problemă, exersând anumite practici. În forma lui cea mai răspândită, doi programatori scriu cod folosind un proiector pentru ca toată lumea să poată vedea. La un interval de timp (în jur de 7 minute), unul dintre ei este înlocuit de următorul programator din sală. Astfel, prin rotație, toată lumea va scrie cod și va vedea cum scriu cod ceilalți.
Code retreat este un alt format, de această dată preluat de la comunități de scriitori. Ideea unui code retreat este de a combina mai multe din elementele dintr-un coding dojo sau coding kata într-o singură zi de exersare. Code retreat-urile au loc de obicei sâmbăta și durează toată ziua. Evenimentul este structurat în 6 sesiuni de 45 de minute, separate în retrospective scurte. Regulile sunt simple: în cadrul fiecărei sesiuni, programatorii lucrează în pereche cu scopul de a scrie cod cu anumite constrângeri impuse de facilitator și care facilitează învățarea. După fiecare sesiune, codul scris este șters complet, perechile și constrângerile se schimbă și scrisul de cod reîncepe.
Primele code retreat-uri au avut loc în SUA în 2009, urmate foarte curând de România, unde au fost facilitate de Maria Diaconu și Alexandru Bolboacă în cadrul comunității AgileWorks. Corey Haines a avut un rol foarte important în răspândirea evenimentului în întreaga lume, totul culminând cu "Global Day of Code Retreat" când timp de 24 de ore au loc code retreat-uri non-stop în toată lumea. Adrian Bolboacă este responsabilul pe Europa al acestui eveniment global.
În foarte scurt timp aceste practici au fost preluate și de comunitatea de testare, iar acum există testing kata si testing dojo. De asemenea de curând Markus Gärtner a realizat primul test automation retreat.
La fel, aceste practici au fost adaptate și pentru arhitectură, apărând architecture kata și architecture retreat.
Noi tipuri de exerciții au apărut în timp. Adrian Bolboacă a inventat sesiunea numită "Taking baby steps" cu scopul de a învăța refactoring și a avut succes la conferințe internaționale, în cadrul comunităților și la code retreat-uri. Adrian Bolboacă și Alexandru Bolboacă au inventat sesiunea "Brutal refactoring", care a fost preluată în întreaga lume. Keith Braithwaite a inventat sesiunea numită "TDD As If You Meant It", acum preluată în aproape fiecare code retreat.
În afara acestor evenimente de comunitate, există și posibilitatea de a învăța prin pair programming. Orice programator ar trebui să poată invita pe un altul la o sesiune privată de exersare. Câțiva programatori fac acest lucru și la distanță; Alexandru Bolboacă a deschis de câțiva ani un "Remote Pair-programming Tour" în acest scop.
Comunitatea de software craftsmanship organizează câteva conferințe. Cele mai cunoscute sunt în SUA și Londra, iar România se alătură anul acesta prin conferința I. T.A.K.E. Pe 30-31 mai, evenimentul va aduna programatori din întreaga Europă și invitați din SUA cu scopul de a discuta, exersa și învăța împreună aceste practici de programare. Nu doar că toți vorbitorii vor scrie cod, dar și participanții vor programa în cadrul workshop-urilor, concursului kata lounge, dezvoltării unui produs open source într-un format hiper-agil numit "Open Space Software Development" sau în timpul track-ului de unconference organizat sub formatul "Open Space". Liderii multora din comunitătile europene de software craftsmanship vor participa la conferință ca vorbitori și cu workshop-uri. Acest eveniment deschide tuturor programatorilor din România porțile către nivelul cel mai înalt de cunoștințe despre dezvoltarea de software din Europa.
În concluzie, Software Craftsmanship este o mișcare de amploare internațională, care are la bază ideea că profesia de programator înseamnă putința de a livra cod de calitate sub presiune. Pentru a ajunge acolo, programatorii trebuie sa stăpânească o listă de practici. Pentru a le stăpâni, ei pot exersa singuri și în cadrul comunităților folosind anumite formate specifice de întâlniri. Code retreat-ul este formatul care s-a răspândit cel mai rapid în ultimii ani, culminând cu Global Day of Code Retreat. În România, mișcarea este promovată de comunitatea agile "AgileWorks", de conferința I T.A.K.E., precum și de programatori pasionați din țară.
http://arheologie.ulbsibiu.ro/publicatii/bibliotheca/bresle/4%20capitolul%20II.htm
http://manifesto.softwarecraftsmanship.org
http://en.wikipedia.org/wiki/Kata_%28programming%29
http://codingdojo.org/cgi-bin/wiki.pl?WhatIsCodingDojo
http://www.testingdojo.org/tiki-index.php
http://blog.adrianbolboaca.ro/2013/04/the-history-of-brutal-refactoring-game/
http://blog.adrianbolboaca.ro/2013/01/the-history-of-taking-baby-steps/
http://www.alexbolboaca.ro/wordpress/articles/how-to-organize-a-code-retreat
http://www.alexbolboaca.ro/wordpress/the-remote-pair-programming-tour