mbator.pl / Dlaczego zaczynać pracę od pliku README?
Autor: Maciek Bator

Dlaczego zaczynać pracę od pliku README?

(w skrócie) Aby za 5 minut, które zajmie Ci napisanie krótkiej notatki wiedzieć dlaczego, jak i jaki kod napisać, a za 4 miesiące gdy będziesz potrzebować dopisać dwie litery wiedzieć gdzie szukać odpowiedniej linijki w kodzie.

Czym jest plik README?

Jak sama nazwa wskazuje prosi się on o przeczytanie. Zawiera on zwykle informacje o licencji, prawach autorskich, wymaganiach sprzętowych, sposobie instalacji i uruchomienia, krótkim opisie oprogramowania. Nazwa sugeruje, że mamy go przeczytać przed próbą uruchomienia oprogramowania. W erze GitHub’a pliki README stały się wizytówkami wielu projektów, zawierają odnośniki do zrzutów ekranu, celach projektu, sposobie współpracy i czy nawet informacje o tym czy aktualna wersja przechodzi automatyczne testy. Co jednak najważniejsze, jest formą dokumentacji.

Dokumentacja jest ważna…

…i każdemu kto spędził z dowolnym kodem skomplikowanym choćby minimalnie bardziej niż „Hello world!” nie trzeba tego tłumaczyć. Mimo tego chciałbym podać parę powodów dla których warto pisać dokumentację:

No dobra ale co mam dokumentować skoro jeszcze nie napisałem kodu, a README mam pisać jako pierwsze?

Cały czas piszę o udokumentowaniu napisanego kodu, jednak celem tego tekstu jest tak naprawdę zachęcenie do napisania (bardzo nie wymagającej) specyfikacji jako pierwszej. Spełniającej jednocześniej funkcję dokumentacji.

Co to specyfikacja?

Specyfikacja mówi o tym jak ma działać kod, jakie wymagania ma spełniać. Może opisywać na przykład co wkładamy do jednej funkcji i co ma ona zwrócić, ale nie jest implementacją.

Bardzo ciekawym przykładem ukazującym co pozwala osiągnąć specyfikacja jest (z lekkim przymróżeniem oka) Międzynarodowa Stacja Kosmiczna międzynarodowa stacja kosmiczna.

A konkretniej chciałbym pokazać tu piękną wizualizację stacji rozłożonej na moduły. ISS w modułach Prawie żaden z tych modułów nie miał próbnego podpięcia do reszty stacji na ziemii, ale każdy z nich został zbudowany zgodnie ze specyfikacją. Pierwsze sprawdzenie czy moduły pasują do siebie odbywało się przy prędkości ~7,7 kilometrów na sekundę ~400 kilometrów nad naszymi głowami. I wiecie co? Wszystkie pasowały idealnie, dlatego że każdy milimetr stacji jest dokładnie udokumentowany i zaprojektowany zgodnie ze specyfikacją.

Wracając na ziemię…

(niestety…)

Napisanie nawet najprostszej specyfikacji dla dużej biblioteki czy prostego skryptu pozwoli na zdefiniowanie jasno, przejrzyście i obiektywnie czego oczekujemy od kodu, bo nasze wyobrażenie będziemy musieli „przelać na papier”, „ubrać w słowa”, a te mają takie samo (bądź bardzo podobne) znaczenie dla każdego z nas w przeciwieństwie do mglistego zarysu w naszej głowie.

Dla bardzo ogólnego przykładu

Budzik
Ma pokazywać aktualną godzinę oraz odtwarzać zwracający uwagę dźwięk o określonych godzinach.

Funkcje:
 - Pokazuje aktualną godzinę i minutę
 - Alarm - Odtwarza denerwujący dźwięk o określonej godzinie
 - Alarm - Pozwala na ustalenie godziny alarmu
 - Alarm - Można wyłączyć bądź włączyć
 - Pozwala na zmianę formatu wyświetlania pomiędzy 24 a 12 godzinnym
 - Odtworzenie dźwięku o godzinie 12:00

Alarm:
 - Jeśli godzina jest równa zapisanej oraz alarm jest włączony to odtwórz dźwięk
 - Jeśli alarm jest wyłączony bądź godziny różnią się nic nie rób.

Sposób ustawiania godziny i godziny alarmu:
 - Pokrętło zmieniające godzinę
 - Pokrętło zmieniające minuty
 - Przełącznik przełączający pomiędzy trybem nastawiania godziny a godziny alarmu
 - Przełącznik włączający/wyłączający alarm
 - Przełącznik włączający/wyłączający format godziny

Pomysły na przyszłość:
 - Możliwość wyłączenia alarmu
 - Zdalne wyłączanie alarmu?

Już z tej krótkiej notatki wiemy dokładnie co musimy napisać, musimy mieć możliwość wyświetlania godziny, zapamiętywania godziny alarmu, potrzebujemy 4 wejścia od użytkownika i możliwość odtwarzania dźwięku.

Tak napisana specyfikacja, jeśli będziemy się jej trzymać, stanie się automatycznie bardzo prostą dokumentacją, wystarczy, że po napisaniu kodu dodamy na przykład nazwy funkcji odpowiedzialnych za podane w jej treści założenia.

Nie jest to oczywiście substytut prawdziwej dokumentacji czy specyfikacji, jednak w każdym wypadku jest przydatną informacją. Nie będziemy przecież pisać 30 stronnicowej encyklopedii dla prostego skryptu ściągającego wiadomości z reddita, z drugiej strony nawet pisząc wielgachną bibliotekę przekształceń graficznych po przeczytaniu takiego pliku znamy zamysł autora jaką funkcję ma dana biblioteka i jakie zadanie spełnia.