Odłóżmy na chwile zagadnienia związane z czystym kodem i pisaniem testów jako "samoaktualizująca się" dokumentacją kodu - bo pytanie dotyczy "tego czegoś" poza tymi zagadnieniami.
No to ja się od razu wypowiem, że na starcie to Cię stawia w przegranej pozycji, a to z prostego powodu: Kod zawsze jest up-to-date, dokumentacja tylko wtedy jest up-to-date jak ktoś ją zaktualizuje. Kod się wiecznie zmienia, powinien się wiecznie zmieniać, więc utrzymywanie takiej dokumentacji to jest ogromny koszt, na który większość nie może sobie pozwolić, i wręcz czasem nie może sobie pozwolić. Jest to piekielny wysiłek, bo praktycznie po każdym commicie musisz wejść do takiej dokumentacji i poprawić jeden lub kilka paragrafów. Nie wiem czy jesteś w stanie wprowadzić jakąkolwiek nietrywialną zmianę, żebyś nie był zmuszony również zaktualizować dokumentacji. Z tego powodu jednak znacznie lepszym podejściem byłoby napisanie kodu jak najprościej jak się da, i napisanie dobrych testów do niego, żeby ciężar dokumentacji zmniejszyć. Nie chodzi tylko o to żeby ją napisać, tylko o to żeby utrzymać ją zgodną z kodem od teraz już po wsze czasy.
Więc zastanów się czy się nie porywasz z motyką na słońce. Być może jesteś od startu skazany na porażkę.
Przeszedłem pozytywnie rekrutację, zmieniam profesje na programistę i na rozmowie wstępnej jestem umówiony tak ze "przynoszę" swoje projekty i zaczynam doszlifowywać swój warsztat rozwijając swoje projekty z domeny którą znam, ale nawet zanim to nastąpi mam nauczyć się pisać dokumentację do swojego kodu. Generalnie nakierowano mnie żebym sobie poczytał, o przypadkach użycia, diagramach klas itp. No i poczytałem:
Diagramy klas to jest najgorsze co możesz zrobić, ktokolwiek Ci to poradził chce tylko patrzeć jak cierpisz, nie rób tego.
Co do pozostałych rzeczy, to zależy jaką dokumentację chcesz pisać, bo masz dwie do wyboru:
- Albo piszesz dokumentację dla użytkowników Twoich programów (albo bibliotek), i wtedy je musisz pisać z punktu widzenia tego kto ich używa (czyli bez technicznych szczegółów)
- Albo piszesz dokumentację dla przyszłych programistów, i tutaj trud jest znacznie większy bo musisz opisać zarówno wszystkie problemy i funkcjonalności, jak również pomoc której może ktoś potrzebować podczas developowania.
- Jak piszesz dokumentację do biblioteki, to to jest kolejny poziom zagnieżdżenia, bo Twoimi użytkownikami są inni programiści - ale nie ma sensu o tym pisać, bo Ty masz aplikację, nie bibliotekę, prawda?
Więc pytanie którą z nich faktycznie chcesz napisać.
Zacząłem w oparciu o to co wyczytałem tworzyć dokumentację do projektów które mam "przynieść" i rozwijać już na nowym stanowisku, ale wychodzi mi potworek z tego dokumentu.
Zależy co masz na myśli mówiąc "potworek". Jeśli chodzi Ci o samą objętość, to to jest spodziewane. Nawet proste aplikacje mają bardzo obszerne dokumentacje, i to jest normalne. Jeśli chodzi Ci o to że jest nieuporządkowana, to faktycznie trochę słabo, ale to przychodzi z doświadczeniem.
Pamiętaj że dokumentacja ewoluuje tak samo jak kod. Jeśli napiszesz jakiś rozdział, to jest bardzo prawdopodobne, że zmienisz go jeszcze 30 razy w ciągu życia aplikacji.
Pyt.1. Mam problem z tym do jakiego poziomu szczegółowości schodzić, czy skupiać się tylko na założeniach, wymaganiach i ogólnych przypadkach użycia?
To zależy który typ dokumentacji piszesz, o którym mówiłem wyżej. Jeśli dokumentacja jest dla użytkowników, to nie piszesz nic o kodzie, a jedynie o tym jak używać aplikacji. Co do szczegółów, to chodzi o to żeby było opisane wszystko co można zrobić przy użyciu tej aplikacji. Jeśli piszesz dokumentacje dla programistów którzy mają rozwijać projekt, to musisz opisać wszystko czego może potrzebować programista który właśnie wszedł w Twój projekt.
Pyt.2. Czy przypadki użycia rozpisywać wg algorytmu jak to ma działać, czy w odniesieniu do rzeczywistego kodu który to wykonuje, aby "ten ktoś inny" mógł za pomocą tej dokumentacji szybciej wejść w projekt i zorientować się co gdzie jest?
Jeśli dokumentacja ma być dla programistów, to dobrze jest podlinkować miejsca w kodzie, oraz ewentualnie wkleić przykłady kodu, tylko wtedy musisz pamiętać żeby je zaktualizować jak kod się zmieni.
Pyt.3. Jak podejść do miejsc gdzie w projekcie nie ma nic poza planem wdrożenia jakiegoś przypadku użycia, ale już wiadomo że jeżeli zacznę implementować tą funkcjonalność to ona pociągnie za sobą konieczność refaktoryzacji bo na podstawie wcześniejszych wymagań podjąłem błędne decyzje projektowe.
Najlepsze podejście to byłoby: teraz jest zrefakorować.
Jeśli nie chcesz tego robić, to po prostu opisz to: "Jest plan żeby dodać feature X, ale nie da się go zrobić bez refaktoryzacji", po prostu opisz to jak dla człowieka który wejdzie i będzie chciał to zrobić.
Pyt.4. Jak opisać już zarys co, jak i dlaczego trzeba będzie refakturować? czy tylko w części dotyczącej wdrożenia nowej funkcjonalności która wymusi refaktoring? czy również w innych miejscach obecnie działających ale jeszcze nie przystosowanych do przyjęcia tych kolejnych nowych funkcjonalności?
Również w miejscach obecnie działających.
Pyt.5. Są jakieś ogólne standardy pisania takich dokumentów? można gdzieś do nich trafić /jakiś szablonów/przykładów/ a jeżeli tak to interesowały by mnie takie nie wyidealizowane tylko takie które faktycznie gdzieś u kogoś w firmie są używane (w sensie szukam czegoś praktycznego a nie idealnego/życzeniowego ale nie do wdrożenia w rzeczywistości)
Standardów i szablonów nie ma.