Doc1st, dokumentum-vezérelt fejlesztés
A múlt heti budapesti Agilis meetupon tartott előadást Vég Csaba az általa kidolgozott Doc1st (Document First) fejlesztési módszertanról és hozzá kapcsolódó eszközről. A Doc1st a Test-Driven Development (tesztvezérelt fejlesztés) elgondolásán alapul, azt bővíti ki. A Doc1st lényege, hogy a fejlesztést a dokumentáció írásával kezdjük. Ahogy a TDD-vel tulajdonképpen a felhasználói eseteket, peremfeltételeket fektetjük le kódként megfogalmazva, addig Doc1st esetén magát a követelményt, a use case-t fogalmazzuk meg és illesszük be a kódba emberi nyelven megjegyzésként.
A koncepció saját jelölési szinteket definiál, így lehetőség van a kódból különböző nézetek szerint generálni a dokumentációt, így az átfogó, csak a nagyobb rendszer komponensek leírását tartalmazó kivonattól kezdve akár API referencia mélységű felhasználói kézikönyvet is kinyerhetünk. A Doc1st projekt egyelőre kísérleti stádiumban van, a JUnit keretrendszerhez érhető el kiegészítésként. Képes jelezni azt, ha adott funkció dokumentálatlan, és a dokumentumációk meglétéből a fejlesztés készültségére vonatkozólag is visszaad statisztikát.
Mindenféleképpen érdekes az elgondolás, Document Driven Development kifejezéssel már értekeztek róla többen is. Különösen izgalmas lehet a módszer olyan környezetekben, ahol a dokumentáció maga is nyelvi elem (Python, Lisp), és a dokumentációkban elhelyezett teszt esetek kezelésére kiforrott eszköz áll a rendelkezésre (import doctest).
■
Ertetlenul allok az egesz elott...
En is szoktam hasonlokat csinalni, amikor kodvazlatot keszitek masoknak. De ezek csak vazlatok a reszletesebb leirast a funkcionalis specifikaciobol meg tudja irni barki. (Persze, hozzateve a hasznalt kornyezethez szukseges infokat).
Viszont amit itt latok, az a leghorrorisztikusabb kommenteles: gyakorlatilag felesleges, redundans zaj, semmi plusz informaciot nem hordoz ahhoz kepest, ami a kodban is le van irva. Ha meg mar a kommentet leirom, le tudom irni egybol a kodot is.
A masik dolog: az API referenciakkal az a bajom, hogy onmagaban keves kodban meg nehol felesleges zaj. Egy komolyabb - pl. MSDN szintu - API referencia osszeallitasa a kodban nehezkes es sok zavaro elemet termel a kodba. Pl. egy PHPDoc eseten is, sokkal jobb egy rovid, nehany soros osszefoglalot irni, hogy mire is szolgal, maximum a legfontosabb dolgokra kell felhivni a figyelmet. A reszletesebb dolgokat meg valahova mashova kiszervezni.
Ellenben, amit sokkal-sokkal inkabb bele kellene venni a jo kommentalasba az az, hogy egy adott modositas/megvalositas miert es miert ugy szuletik (nalunk pl. szabaly, hogy ha bugfixel valaki, akkor kommentben jelezze, hogy hol mit javitott + ha van, akkor redmine ticket szama.). Ezekrol viszont senki nem beszel, senki nem ad ra ajanlasokat, mindenki csak a nyilvanvalot akarja meginnovalni.
De ha mar szoba hoztam a kommentelest: utobbi idoben ugy erzem kisse elszaporodtak a kulonfele kommentekben es/vagy meta infokban (annotaciok, tagek, hol epp mi a neve) hordozott plusz informaciok. Egyfelol nem rossz eszkozok ezek, de idonkent ez a sok plusz informacio mar a kodolasban zavar. Nem is olyan reg a Visual Studiohoz kerestem is eszkozt, amivel ki/be kapcsolhatoak a kommentek megjelenitese. (Off: (PDT) Eclipse-hez nem tud vki hasonlot?) Egy ido utan zavarova valik, hogy az ember atnezne mondjuk egy osztalyban az adattagok listajat es ahelyett, hogy latja egy kepernyon az osszeset, azt latja, hogy a kepernyon kifer ketto-harom, a maradek helyet mindenfele komment meg annotacio tolti ki, amely az adott pillanatban nem erdekel senkit.
Viszont, ha ez a jovobeli irany, akkor szerintem surgosen at kell gondolni a hasznalt eszkozoket is. (Otletek: ki/be kapcsolhato nezetek, Word szeru oldalt bubborekos kommenteles, stb.)
Szerk: de nem mondom azt, hogy nem vagyok meggyozheto a modszer hasznossagarol, csak akkor valaki tenyleg magyarazza el, hogy mire jo ez es mi szukseg van erre?
+1
Detto, ugyanez szokott lenni a bajom nekem is. A kedvencem, amikor van egy pár soros metódus, hozzá 30 sor commenttel, ami azt magyarázza, hogy mit csinál. Én annak a híve vagyok, hogy a metódus neve majd megmondja, hogy mit csinál, comment meg csak minimális kell, olyan esetekre, ahol zavar van az erőben, és nem teljesen érthető a kód első ránézésre. (Nyilván ez a nézet nem tartható minden esetben.)
A word szerű szövegbuborékos kommentelés szerintem nagyon jó ötlet.
code folding és társai
Elsiklottál a lényeg felett
Vagy nézd meg a doc1st példakódjait, gyakorlatilag elveszik a kód a sok rizsa között:
TDD->BDD
int i;
deklarációt látok, elsőre még nem kiabálom le a haját, de már akkor is csúnyán nézek. Minden változó, metódus, konstans és egyéb elem a nevében le kell írja a funkcióját és a saját absztrakciós szintjén meg az osztályon belül is a single responsibility-nek meg kell hogy feleljen.getR
helyett használj egyrésztgetRadius()
-t, mert az jobban elmondja mit csinál, másrészt maga a kód olvashatóbbá válik. A felette írt komment haszontalan zaj. Főleg ha valami okból kifolyólag hirtelen a 0.0 átalakul 0.5-e de elfelejtik frissíteni. Márpedig a dev egy büdös, lusta disznó. Minél hamarább elfogadjuk ezt a tényt, annál kevesebb csalódás ér. :-)Ha már le akarod írni a kód viselkedését, akkor használj BDD-t, amit a nagyok csak úgy definiálnak, mint a jól csinált TDD. Én pl. JBehave-vel annotációkban leírom az elvárt acceptance criteria-kat - de a Cucumber is igen jó erre a célra, és sokkal olvashatóbb - egyeztetem a business analyst-tel és a QA-val, aztán optimális esetben pair programming-ben implementálok egy QA-val vagy egy devvel. Ha minden teszt szépen futogat, akkor oda tudok állni a BA elé, hogy kész a user story, és lehet sign-off-olni, és ő nem tud belekötni, hogy olyan funkció hiányzik, amit ő követelt.
Ne a kódot dokumentáld, hanem az elfogadási kritériumokat (ez de ronda így lefordítva baszki...), mert a legelső és legfontosabb dolog mindenek felett: olyan rendszert szállítani a megrendelőnek határidőre, amit kért.
Ez a dokumentálásos dolog visszalépés az időben olyan 5÷10 évet és szinte SSADM/waterfall szaga van.