7
Jan

kłołt Commit Driven Development ankłołt

Kilka miesięcy temu natknąłem się na bardzo ciekawą koncepcję dotyczącą sposobu budowania commitów (a jak można wydedukować po niedawnym poście – zwracam na to dość dużą uwagę). W polskiej blogosferze nie znalazłem odniesienia do proponowanej przez Arialdo Martini metody (nie on to wymyślił, ale u niego przeczytałem o tym najpierw), więc ja będę tutaj jej “przedstawicielem”:).

Najprostszym określeniem opisywanego podejścia jest “Commit driven development”. Jednak to raczej nawiązanie-z-mrugnięciem do wszystkich popularnych “development driverów” z ostatnich lat, stąd też “kłołty” w tytule.

W TDD najpierw piszemy testy, a potem kod. W BDD najpierw definiujemy dokładne zachowanie kodu (także poprzez pisanie testów, ale nieco innych), a potem kod. W Commit Driven Development – najpierw piszemy commit message, a dopiero potem “doklejamy” do takiego pustego commita kolejne kawałki kodu aż do momentu, gdy jego zawartość zgadza się z opisem.

Jest to zdecydowane odwrócenie “normalnego” sposobu commitowania pracy. Zwykle najpierw modyfikujemy kod, a dopiero potem go opisujemy i wysyłamy “gdzieś”. Co może dać takie eksperymentalne, świeże spojrzenie na ów proces?

Po pierwsze – definiujemy co dokładnie mamy osiągnąć w ciągu najbliższych minut/kwadransów/godzin. Dość regularnie zdarza mi się na chwilę zawiesić przy pracy. Może to już taki wiek po prostu;). Mając gotowe commit message – wystarczy zerknąć na jedną linijkę tekstu (git log -n1) aby ponownie wpaść w odpowiedni kontekst.

Po drugie – skupiamy się na implementacji tej jednej rzeczy, która jest aktualnie naszym celem. Nie ma miejsca na nagłe rozproszenie typu “o, literówka w nazwie metody, poprawię od razu za jednym zamachem“. A potem się okazuje że ta literówka była z jakiegoś powodu konieczna (bo np ktoś gdzieś w jakimś XMLu też jej użył i system się po zmianie wywali). Po prostu – określamy co mamy do zrobienia, a potem dążymy do – najlepiej niewielkiego – celu.

Efektem pobocznym opisywanej praktyki jest piękna historia projektu. Nie znajdziemy modyfikacji kodu procedury składowanej (fu!) w commicie mającym zmienić kolor przycisku na stronie bo ktoś “akurat pomyślał że fajnie byłoby przy okazji w końcu tą procedurę tknąć“. Trzymając się napisanej wcześniej commit message – nikt nie będzie robił zmian “pobocznych” bo najzwyczajniej w świecie nie będą one pasować do całej reszty commita.

Ciekawe zjawisko, które da się zaobserwować, to inny typ treści komentarzy do commitów. Nie znajdziemy tam opisu implementacji – ponieważ na etapie pisania comit message nie jesteśmy w stanie dokładnie określić jak ta implementacja wygląda. Opisy będą zawierać treści zrozumiałe nawet dla nowego programisty za pół roku ze względu na brak odniesień do klas czy komponentów. Tylko informacje “biznesowe”. “Co się zmieniło w zachowaniu systemu” vs “jak zmodyfikowałem kod“.

Czy to dobrze czy nie – nie jestem w stanie na tą chwilę z całą pewnością określić. Dlatego poruszam to jako “ciekawe zjawisko”, a nie zaletę.

W Gicie bardzo łatwo jest wypróbować taki workflow – wystarczy utworzyć pusty checkin (git commit –allow-empty). A potem “dorzucać” do niego zmiany (git commit –amend).

Co o tym sądzicie? Nie będę ukrywał, nie jest sposób jaki bym zawsze zdecydowanie rekomendował. Warto jednak czasem odświeżyć umysł takim nowym podejściem i zobaczyć jak to działa. Ja zrobiłem eksperyment i zastosowałem to kilka razy – w pewnych okolicznościach naprawdę się sprawdza!

Oryginalny post Arialdo: “Preemptive commit comments“.

Autor

Maciej Aniserowicz

Maciej Aniserowicz
"Procent"
developer / architect

MVP
MCP

Search
Facebook
Twitter
Archiwum
Kategorie
© Copyright 2008-2013 Maciej Aniserowicz. All rights reserved. Running on WordPress.