Tworzę silnik fizyki, a śledzenie tego wszystkiego staje się coraz trudniejsze. Często po powrocie do kodu po przerwie po prostu nie pamiętam, dlaczego to nie działa. Większość problemów nie jest prostymi błędami programistycznymi, ale wadami projektowymi mojego silnika fizyki. Dlatego właśnie powinienem skończyć projektowanie przed programowaniem.
Potrzebuję jednak sposobu na napisanie na papierze całego projektu mojego silnika fizyki. W przeciwnym razie jutro po prostu zapomnę i znów się zgubię. Diagram klas UML w ogóle nie jest odpowiedni do projektowania silnika fizyki. Naprawdę nie dbam o zajęcia, ale sam proces. Nie uważam diagramu procesu biznesowego za bardzo przydatny, ponieważ modelowanie jednego kroku (ramki) mojego procesu nie pomoże mi zrozumieć końcowego zachowania mojego silnika na wielu etapach.
Jakiego schematu powinienem użyć, aby pomóc mi śledzić proces? Jakiego rodzaju profesjonaliści używają diagramów do stworzenia silnika fizyki?
Odpowiedzi:
Listy DO ZROBIENIA to cudowne rzeczy.
Nie mówię o // #TODO: komentarze bla bla. Mam na myśli zdobądź szczery notatnik do Boga.
Nigdy nie wiadomo, kiedy zapamiętasz coś ważnego do zrobienia. Zeszyt będzie cicho tam siedział i pozwoli ci myśleć bez narzekania na to, jak twoje pismo ręczne się nie skompiluje. Niektóre z moich najlepszych pomysłów dzieją się w łazience (tak, mam wodoodporny notatnik, ale nie musisz iść tak daleko).
Możesz dostać kieszonkowe, które są szyte (nie klejone), aby nie rozpadły się w kieszeni. Nie udało ci się zdobyć fantazyjnego z wbudowanym znacznikiem książki? Taśma, nożyczki, wstążka i nikt nigdy się nie dowie.
Kiedy pojawi się pomysł, zanotuj go. Narysuj małe pola obok każdego pomysłu, aby łatwo oznaczyć go jako gotowy. Umieść pole u góry strony, a wiesz, kiedy strona jest skończona.
Jaki dostęp sekwencyjny nie jest dla Ciebie wystarczająco dobry? Tak, robią też kieszenie. To wszystko może wydawać się trochę dużo, ale jest lepsze niż utopienie w notatce pocztowej lub próba uchwycenia wszystkiego w Jira.
Nie zostawiaj rzeczy w połowie zaimplementowanych
Dbaj o to, by Twoje ulepszenia były małe i osiągalne. Nie zaczynaj niczego, czego nie da się ukończyć za jednym razem. Jeśli jest na to za duży, podziel go na mniejsze kroki. Zawsze zostawiaj kod, który się kompiluje i przechodzi testy. Aha i nie zostawiaj pozytywnych testów, których nigdy nie widziałeś. Wykonanie testu zarówno pozytywnego, jak i negatywnego jest sposobem na przetestowanie testu.
Przestań myśleć, że potrzebujesz całego projektu na papierze
Musisz uchwycić swój ewoluujący plan. Nie wiesz, jak wszystko będzie wyglądać, kiedy skończysz, więc przestań udawać, że tak. Uchwyć to, co odkryłeś, jak potrafisz. W razie potrzeby użyj serwetki i kredki. Zresztą niewiele osób rozumie 90% UML. Użyj wszelkich możliwych sposobów, aby pokazać to, co musisz pokazać. Koncentruję się na pokazaniu moich interfejsów i tego, co wie o czym.
Pisz notatki, gdy przestaniesz kodować
Moment, w którym zdejmujesz palce z klawiszy, po raz ostatni zrozumiesz, co zrobiłeś (i co zaplanowałeś) tak jak teraz. Uchwyć to zrozumienie najlepiej, jak potrafisz, w niektórych notatkach. Jeśli masz tylko komentarze, nadal jesteś przywiązany do komputera i prawdopodobnie zostawisz kałużę na krześle. Ponownie, posiadanie notebooka jest niesamowitą rzeczą.
W ten sposób możesz z wdziękiem wylądować w mózgu, uratować pęcherz i ponownie wystartować później, bez uciekania się do kofeiny i zgrzytania zębami.
źródło
Don't start anything that can't be finished in one sitting. If it's to big for that then break it down into smaller steps.
. To jedna z najważniejszych rzeczy, których nauczyłem się w branży.„Wszystko powinno być budowane odgórnie, z wyjątkiem pierwszego razu”, mówią.
Zaczynam od najniższego poziomu (np. Podstawowej matematyki wektorowej) i upewniłem się, że dobrze ją rozumiem i ma dobry zasięg testowy. Następnie zbudowałbym jeszcze jedną warstwę, pozwalając na więcej operacji abstrakcyjnych (np. Grupy / byty, wykrywanie kolizji, mechanika kolizji). Znowu objąłbym to testami; pomogłoby mi to pomyśleć o rzeczywistych przypadkach użycia tych abstrakcji w silniku.
O ile nie bardzo dobrze rozumiesz cały silnik (np. Kiedy ponownie wdrażasz dobrze znany istniejący silnik), zwykle dobrze jest mieć te warstwy; pozwala myśleć na konkretnej warstwie w kategoriach poprzedniej warstwy i zwykle niewiele głębiej. Możesz eksperymentować i budować warstwę z nowymi przydatnymi abstrakcjami; to, co okazuje się praktyczne w rzeczywistości, często odbiega od początkowych pomysłów.
Mamy nadzieję, że każda warstwa jest na tyle mała, że nie potrzebujesz do niej skomplikowanego schematu lub łatwo jest znaleźć przydatny.
Nigdy nie spotkałem złożonego diagramu kodu, który byłby przydatny. Jednak przydatne są diagramy interakcji i cyklu życia . Dość często taki schemat jest ograniczony do 1-2 warstw, a zatem jest prosty.
To, co zwykle najbardziej cenię, to opisy interfejsów i gwarancje zapewniane przez każdy poziom. Np. Format matematyki wektorowej i co dzieje się w przypadku błędów numerycznych; format opisów większych obiektów (zawsze wypukły? zawsze zgodny z ruchem wskazówek zegara ?, jak przecinać się itp.), parametry mechaniczne interakcji (jak postępuje czas? w jaki sposób przetwarzana jest masa? czy pęd jest zawsze zachowywany? jak obliczane są siły?) właściwe interakcje (jak poradzić sobie z tarciem? deformacją? fragmentacją? czy przekształcanie energii mechanicznej w straty ciepła jest czymś?).
Każda warstwa powinna być na tyle mała, aby mieć zauważalną ilość rzeczy, które wprowadza i gwarantuje. Opis ten można nawet napisać bez pisania kodu implementacyjnego (jeszcze). Zmniejsza to szansę ustalenia, że zrobiłeś coś okropnie złego na trzech warstwach; gdyby tak było, byłoby to widoczne już co najwyżej na dwóch warstwach.
źródło
Twórz diagramy architektury! OpenGL rurociąg Schematy FrustratedWithFormsDesigner pisał w komentarze są doskonałym przykładem dla programu przepływu , ale to tylko jeden rodzaj wykresu, które mogą być użyteczne.
Projektując diagramy, chcesz uczynić zrozumienie kodu prostym i intuicyjnym; może to obejmować zarówno koncepcje wysokiego poziomu (jak górna linia węzłów na schemacie potoku OpenGL, mówiąc coś), jak i bardzo szczegółowe szczegóły techniczne (takie jak wykres wywołania pełnej funkcji).
Idealnie, twoja dokumentacja powinna również ułatwić zrozumienie kodu innym osobom; może to ułatwić przeglądanie kodu lub współpracę typu open source. Spójrz na duże projekty, aby zobaczyć, jak to osiągają - podczas pracy z setkami tysięcy lub milionami wierszy kodu zrozumienie, jak działa program bez konieczności czytania, jest niezwykle ważne dla śledzenia bazy kodu lub przedstawiania go innym osobom . Repozytorium Vima z 1,3 milionami LOC ma całkiem dobrą dokumentację wysokiego poziomu (IMO) na ten temat w /src/README.txt . Wprowadza:
Jeśli chcę dodać łatkę, ogólnie wiem, który plik muszę zmodyfikować, aby osiągnąć swoje cele bez większego kopania.
Jedną z najlepszych cech Vima
/src/README.txt
jest łatwość jego znalezienia i wszechstronność; w żadnym sensie nie jest szczegółowy, ale jeśli kliknieszsrc
folder w Github, zostanie on automatycznie załadowany i poda kierunek wyszukiwania innego kodu lub dokumentacji. Porównaj to z repozytorium Powershell, którego szukałem na przykład, ale nie byłem w stanie znaleźć żadnego równoważnego pliku lub plików do Vima/src/README.txt
. (Zły znak dla projektu z 988 tysiącami LOC!)Niektóre rzeczy, które możesz chcieć schemat lub dokumentować to:
Jak zrobić te diagramy? Na twoim poziomie i przy pierwszych szkicach ołówek i papier są prawdopodobnie najlepszą / najszybszą metodą. Kiedy diagramy i dokumentacja stają się bardziej dopracowane, możesz przyjrzeć się:
.dot
plików.egypt
przechwytujegcc
i generuje.dot
wykres połączeń. Może być zautomatyzowany lub osadzony wmake
poleceniu, co jest miłe!cflow
może generować wykresy wywołań tylko dla tekstu w języku C. W przypadku innych języków mogą istnieć równoważne narzędzia, chociaż ogólnie możesz zrezygnować z narzędzi automatycznych - nie tworzenie wykresu ręcznie może utrudniać zrozumienie kodu lub dostarczać niewłaściwe złożony poziom szczegółowości (wiedza o tym, które wywołanie funkcjiprintf()
jest zwykle bardzo nieprzydatna).źródło
Spróbuj użyć diagramu opartego na sieciach Petriego. Możliwe jest systematyczne tłumaczenie schematu na programy komputerowe, a także integracja diagramów wysokiego poziomu ze schematami niskiego poziomu.
Bibliografia
Elementy sieciowe i adnotacje: język programowania wizualnego ogólnego przeznaczenia (2016). Dostępne na https://www.academia.edu/31341292/Net_Elements_and_Annotations_A_General-Purpose_Visual_Programming_Language .
Elementy sieciowe i adnotacje do programowania komputerowego: obliczenia i interakcje w PDF (2014). Dostępne na https://www.academia.edu/26906314/Net_Elements_and_Annotations_for_Computer_Programming_Computations_and_Interactions_in_PDF .
źródło