Jakie są zalety modelowania systemów oprogramowania w porównaniu z robieniem wszystkiego w kodzie?

20

Większość, jeśli nie wszyscy informatycy, których znam, uważają, że przed kodowaniem korzystne jest modelowanie oprogramowania za pomocą UML lub innych typów diagramów. (Moje pytanie nie dotyczy konkretnie UML, może to być dowolny graficzny lub tekstowy opis projektu oprogramowania).

Nie jestem tego taki pewien. Głównym powodem jest: Kod nie kłamie. Jest sprawdzany przez kompilator lub tłumacza. Mam nadzieję, że ma zautomatyzowane testy i musi przejść analizę kodu statycznego. Jeśli moduł nie komunikuje się poprawnie z innym modułem, zwykle jest to oczywiste w kodzie, ponieważ pojawia się komunikat o błędzie.

Nie można tego wszystkiego zrobić za pomocą diagramów i innych dokumentów. Tak, istnieją narzędzia sprawdzające UML, ale wszystko, co do tej pory widziałem, jest bardzo ograniczone. Dlatego dokumenty te są zwykle niekompletne, niespójne lub fałszywe.

Nawet jeśli same diagramy są spójne, nie możesz być pewien, że kod faktycznie je implementuje. Tak, istnieją generatory kodu, ale nigdy nie generują całego kodu.

Czasami mam wrażenie, że obsesja na punkcie modelowania wynika z założenia, że ​​kod nieuchronnie musi być jakimś niezrozumiałym bałaganem, z którym architekci, projektanci lub inni dobrze opłacani ludzie, którzy dostają duży obraz, nie powinni mieć do czynienia. W przeciwnym razie byłoby o wiele za drogo. Dlatego wszystkie decyzje projektowe należy odejść od kodu. Kod należy pozostawić specjalistom (małpy kodowe), które potrafią go napisać (i być może przeczytać), ale nie muszą zajmować się niczym innym. Prawdopodobnie miało to sens, gdy asembler był jedyną opcją, ale współczesne języki pozwalają na kodowanie na bardzo wysokim poziomie abstrakcji. Dlatego tak naprawdę nie widzę już potrzeby modelowania.

Jakich argumentów przemawiających za modelowaniem systemów oprogramowania brakuje?

Nawiasem mówiąc, uważam, że diagramy to świetny sposób na dokumentowanie i komunikowanie niektórych aspektów projektowania oprogramowania, ale to nie znaczy, że powinniśmy na nich opierać projektowanie oprogramowania.

Wyjaśnienie:

Pytanie zostało zawieszone jako niejasne. Dlatego dodam kilka wyjaśnień:

Pytam, czy warto używać dokumentów (niekodujących), które modelują oprogramowanie jako podstawowe źródło prawdy o projektowaniu oprogramowania. Nie mam na myśli przypadku, w którym znaczna część kodu jest generowana automatycznie z tych dokumentów. Gdyby tak było, uważałbym same dokumenty za kod źródłowy, a nie za model.

Wymieniłem wady tej procedury, które sprawiają, że zastanawiam się, dlaczego tak wiele osób (z mojego doświadczenia) uważa ją za preferowany sposób projektowania oprogramowania.

Frank Puffer
źródło
5
Myślę, że jest to całkowicie uzasadnione pytanie. Jeśli nasz model ma jakąkolwiek wartość, musi pasować do kodu. Dlaczego więc nie zaprojektować modelu w tym samym języku, którego później użyjemy do jego wdrożenia? Następnie są zawsze zsynchronizowane. A jeśli wolisz fantazyjne grafiki, można je wygenerować z kodu.
Ralf Kleberhoff,
3
W takim razie powinieneś poznać więcej ludzi z branży IT. A może powinienem powiedzieć, że powinieneś zapoznać się z większą liczbą społeczności w ramach tego parasola.
Derek Elkins opuścił SE
@DocBrown: Podczas gdy odpowiedzi na to pytanie, a zwłaszcza artykuły, do których prowadzi link w komentarzu, zawierają istotne informacje, oryginalne pytanie jest zupełnie inne.
Frank Puffer,
@FrankPuffer: Zdaję sobie z tego sprawę, głosowałem za ponownym otwarciem. Niemniej jednak myślę, że sedno twojego pytania - „czym jest projektowanie oprogramowania” i „rola modelowania w projektowaniu oprogramowania”, jest bardzo szerokim pytaniem, być może zbyt szerokim, aby można było na nie odpowiedzieć w rozsądny sposób.
Doc Brown

Odpowiedzi:

23

Zaletą modelowania systemów oprogramowania w porównaniu do całego kodu jest to, że mogę dopasować model do tablicy.

Wierzę w magię komunikowania się na jednym arkuszu papieru. Gdybym próbował umieścić kod na tablicy, ucząc nasz system nowych koderów, po prostu nie ma kodu o wymaganym poziomie abstrakcji, który mieści się na tablicy.

Znam obsesję na punkcie modelowania, o której mówisz. Ludzie robią rzeczy, bo tak właśnie robili wcześniej, nie zastanawiając się, dlaczego to robią. Przyszedłem nazywać to formalizmem. Wolę pracować nieformalnie, ponieważ trudniej jest ukryć głupotę za tradycją.

To nie znaczy, że od czasu do czasu nie wyciągam szkicu UML. Ale nigdy nie będę facetem, który zażąda od ciebie dokumentu UML, zanim będziesz mógł kodować. Mogę potrzebować poświęcić 5 minut i znaleźć NIEKTÓRY sposób na wyjaśnienie tego, co robisz, ponieważ nie mogę znieść istnienia kodu, który rozumie tylko jedna osoba.

Fowler zidentyfikował różne sposoby używania UML, które nazwał trybami UML . Niebezpieczną rzeczą jest to, że można je ukryć przed wykonaniem pożytecznej pracy. Jeśli robisz to, aby kodować za pomocą myszy, dobrze widziałem wielu prób. Nie widziałem, żeby ktoś sprawił, że to naprawdę działa. Jeśli robisz to w celu komunikacji, lepiej upewnij się, że inni cię rozumieją. Jeśli robisz to w celu zaprojektowania, cholernie lepiej znajdź i rozwiąż problemy podczas pracy. Jeśli wszystko idzie gładko, a większość czasu spędzasz na ładnym strzale, odrzuć go i wróć do pracy.

Co najważniejsze, nie twórz diagramów, które mają być ważne dłużej niż jeden dzień. Jeśli w jakiś sposób możesz, nie udało ci się. Ponieważ oprogramowanie ma być miękkie. Nie spędzaj tygodni na tworzeniu diagramów we właściwy sposób. Po prostu powiedz mi, co się dzieje. Jeśli musisz, użyj serwetki.

To powiedziawszy, wolę koderów, którzy znają swój UML i wzorce projektowe. Łatwiej się z nimi komunikuje. O ile wiedzą, że tworzenie diagramów nie jest pracą na pełny etat.

candied_orange
źródło
2
„po prostu nie ma kodu na tym poziomie abstrakcji, który zmieściłby się na tablicy”. To nasuwa interesujące pytanie. Dlaczego nie? Co musiałoby być prawdą, aby punkt wejścia systemu wyjaśnił na bardzo wysokim poziomie, co robi?
RubberDuck,
2
Ponieważ kod musi być wszystkim dla wszystkich ludzi (i przynajmniej jednego kompilatora). Model może mieć skoncentrowaną grupę odbiorców.
candied_orange
Myślę, że używanie do tego słowa „formalizm” jest niefortunne. Albo zawyża to, co robią „modelerzy”, albo ogranicza rzeczywiste modelowanie formalne. (Wydaje się również, że tak naprawdę nie oddaje twoich intencji z tego, co mogę tutaj powiedzieć. Wygląda na to, że twoja troska nie dotyczy samego modelowania, ale wykorzystania go jako bramy lub z przyczyn biurokratycznych, nawet jeśli nie dodaje wartości).
Derek Elkins opuścił SE
3
Mój problem nie dotyczy modelowania. Polega na wykorzystaniu formalnych ceremonii jako zamiennika krytycznego myślenia. Staram się powiedzieć, że wiele z modelowania się dzieje, ponieważ większość modelowania wpadła w tłum. Modelowanie może być bardzo dobre. Ale ma ciemną stronę.
candied_orange
1
„Potrafię dopasować model do tablicy” to bardzo konkretny (doskonały!) Sposób powiedzenia „Potrafię stworzyć abstrakcję czegoś, co jest bardziej skomplikowane, aby pomóc zrozumieć lub przekazać aspekt, który moim zdaniem jest ważny”. To właśnie robi ogólnie dobre modelowanie, bez względu na to, czy jest to oprogramowanie, czy coś innego.
Fuhrmanator
6

Pytam, czy sensowne jest używanie (niekodowanych) dokumentów, które modelują oprogramowanie jako główne źródło prawdy o projektowaniu oprogramowania

Nie. To nigdy nie ma sensu. Twój kod jest podstawowym dokumentem projektowym, tj. „Głównym źródłem prawdy o projektowaniu oprogramowania”. Tylko kod opisuje dokładnie to, co robi aplikacja, ponieważ kompilator pobiera ten projekt i tworzy z niego aplikację.

Używaj diagramów jako dodatkowych dokumentów projektowych, ale jeśli nie są one generowane automatycznie z kodu, strzeż się, że opowiadają inną historię niż prawdziwy projekt. Jeśli UML pływa łodzią, użyj tego. Jeśli nie, użyj czegoś innego.

Niektórzy ludzie uważają, że warto naszkicować swoje myślenie w formie diagramu przed rozpoczęciem pisania kodu. Pamiętaj jednak, co powiedział wujek Bob w tej sprawie:

Tak, tak, diagramy mogą być czasami nieodpowiednie. Kiedy są nieodpowiednie? Kiedy tworzysz je bez kodu, aby je zweryfikować, a następnie zamierzasz ich przestrzegać. Nie ma nic złego w rysowaniu diagramu w celu zbadania pomysłu ”.

Jeśli używasz UML do eksploracji projektu, wyrzuć je, gdy zaczniesz kodować. Napisz test, a następnie napisz kod, aby go przejść. Powtarzać. W ten sposób uzyskasz zatwierdzony projekt. UML nigdy nie może zaoferować tego samego poziomu weryfikacji twojego projektu.

David Arno
źródło
Kontrprzykład (?) :: separacja widoku modelu (lub dowolny wzór GoF) może być łatwo narysowana jako zamierzona prawda projektowa (plan) zaproponowana przez architekta. Programiści, którzy zbaczają z tego zamiaru, nie czynią bezużytecznym (zamierzonego) modelu. Tak, kod jest „prawdą”, ale niekoniecznie jest projektem. Walidacja nie musi być automatyczna w przypadku UML lub jakiegoś modelu. Fakt, że tak nie jest, nie czyni modelu godnym śmieci.
Fuhrmanator
Jeśli chodzi o testy, nie jestem pewien, czy przydatne jest sprawdzenie poprawności projektu. Czy potrafisz pisać testy, które pokazują, że logika domeny nie znajduje się w warstwie prezentacji (bardzo częsty problem z implementacjami, które odbiegają od zamierzonego projektu)? Przedstawienie programistom schematu warstw i wyjaśnienie, że actionPerformed()metoda znajduje się w warstwie prezentacji i że powinna ona po prostu przekazać kontrolę nad warstwą domeny, jest kluczowym aspektem separacji. (Trywialny przykład, ale można go zastosować do wszelkiego rodzaju strategii projektowych, które nie są łatwe do pokazania tylko w kodzie).
Fuhrmanator
5

Większość, jeśli nie wszyscy informatycy, których znam, uważają, że przed kodowaniem korzystne jest modelowanie oprogramowania za pomocą UML lub innych typów diagramów.

Nie zgadzam się z tym, że wszyscy znajomi w to wierzą, ale nie sądzę, że jest to powszechne. W 1970 roku Winston Royce wiedział, że rozwój oprogramowania ma pewien poziom iteracji między działaniami projektowymi a kodowymi. W 1992 r. Jack Reeves napisał o kodowaniu jako prawdziwej działalności projektowej ( omawianej również na Wiki Wiki ).

Nie oznacza to, że ludzie próbowali tworzyć narzędzia programistyczne oparte na modelu. Istnieją narzędzia, które próbują generować kod z modeli UML (i nie tylko diagramy klas, ale łącząc ze sobą różne typy diagramów i generując z nich kod). Ale to nie są, przynajmniej z tego, co widziałem, powszechnie używane narzędzia.

Nie oznacza to również, że powinieneś przejść od wymagań do pisania kodu. Istnieją pewne decyzje projektowe, które mają kluczowe znaczenie dla wczesnego podjęcia decyzji, a pewien poziom modelowania może być przydatny, aby upewnić się, że wszyscy rozumieją opcje, ich wpływ i mogą się komunikować. Niektórzy ludzie (w tym ja) nazywają to „architekturą oprogramowania” .

Kod nie kłamie. Jest sprawdzany przez kompilator lub tłumacza. Mam nadzieję, że ma zautomatyzowane testy i musi przejść analizę kodu statycznego. Jeśli moduł nie komunikuje się poprawnie z innym modułem, zwykle jest to oczywiste w kodzie, ponieważ pojawia się komunikat o błędzie.

To tak naprawdę stanowi sedno niektórych aspektów modelowania zwinnego, zwłaszcza specyfikacji wykonywalnych i pojedynczego źródła informacji . Niekoniecznie zgadzam się z TDD, ale pomysł, aby kod i powiązane testy (od jednostki przez testy akceptacyjne, najlepiej przechwycone jako testy automatyczne) były jednym źródłem prawdy, jest dobrym pomysłem.

Nawet jeśli same diagramy są spójne, nie możesz być pewien, że kod faktycznie je implementuje. Tak, istnieją generatory kodu, ale nigdy nie generują całego kodu.

Myślę, że ogólną zasadą jest przejście z kodu model-> w niewłaściwy sposób. Zamiast tego kod powinien generować modele. Oznacza to, że narzędzia powinny być w stanie badać kod i generować graficzne i tabelaryczne reprezentacje, które mogą być dalej ulepszane, gdy inżynierowie piszą wokół nich tekst. Ta generacja modeli z kodu powinna być bezproblemową częścią procesu kompilacji i wydania.

Istnieją narzędzia, które w różnym stopniu obsługują to w różnych językach. Biorąc pod uwagę naturę języków i paradygmatów, dla niektórych jest to łatwiejsze niż dla innych.

Wymieniłem wady tej procedury, które sprawiają, że zastanawiam się, dlaczego tak wiele osób (z mojego doświadczenia) uważa ją za preferowany sposób projektowania oprogramowania.

Nie sądzę, aby ci ludzie koniecznie rozumieli inżynierię oprogramowania i projektowanie oprogramowania. Myślę, że ci ludzie patrzą na to, co robią inne dyscypliny inżynieryjne i przypisują to do rzeczy, które według nich powinni robić inżynierowie oprogramowania. Ale ignorują jedną zasadniczą różnicę. Inne dziedziny inżynierii tworzą najpierw modele i symulacje, ponieważ zbudowanie rzeczywistego produktu jest niezwykle kosztowne i czasochłonne. W inżynierii oprogramowania możemy wziąć części naszego projektu i wyprodukować coś, co można przetestować w środowisku rzeczywistym w bardzo krótkim czasie i przy bardzo niskich kosztach. Ekonomia jest bardzo różna.

Jakie są zalety modelowania systemów oprogramowania w porównaniu z robieniem wszystkiego w kodzie?

Gdy masz wyjątkowo skomplikowany system oprogramowania, posiadanie modeli oznacza posiadanie czegoś, co jest łatwiejsze do zrozumienia. To inny poziom abstrakcji, coś, co pomaga ludziom zrozumieć różne aspekty twojego systemu. Jest to jeden z powodów, dla których istnieje tak wiele różnych języków modelowania i różnych typów modeli dozwolonych przez każdy język lub notację modelowania - aby umożliwić różnym interesariuszom szybkie i łatwe zrozumienie systemu oprogramowania.

Thomas Owens
źródło
5

Pytam, czy warto używać dokumentów (niekodujących), które modelują oprogramowanie jako podstawowe źródło prawdy o projektowaniu oprogramowania. Nie mam na myśli przypadku, w którym znaczna część kodu jest generowana automatycznie z tych dokumentów. Gdyby tak było, uważałbym same dokumenty za kod źródłowy, a nie za model.

Wiele dokumentów niekodowanych jest przydatnych jako plany . Oznacza to, że „prawda” projektu powinna podążać w tym kierunku. Jest to sposób na modelowanie elementów, które musi spełnić projekt. Można nazwać je dokumentami wymagań, ale może to być zbyt mocne we wszystkich przykładach, które mógłbym podać. Użyłem PlantUML przez PlantText.com do ich produkcji.

  • Diagramy przypadków użycia mogą przedstawiać zamierzone funkcje i interakcje z użytkownikami lub systemami zewnętrznymi. wprowadź opis zdjęcia tutaj

  • Diagramy aktywności mogą pokazywać procesy biznesowe, które oprogramowanie musi obsługiwać. wprowadź opis zdjęcia tutaj

  • Diagramy stanów mogą pokazywać zamierzoną dynamikę na stronie internetowej: wprowadź opis zdjęcia tutaj

  • Wzory projektowe Gang of Four są przedstawiane jako modele statyczne i dynamiczne. Na przykład Memento:
    wprowadź opis zdjęcia tutaj
    wprowadź opis zdjęcia tutaj

Wymieniłem wady tej procedury, które sprawiają, że zastanawiam się, dlaczego tak wiele osób (z mojego doświadczenia) uważa ją za preferowany sposób projektowania oprogramowania.

Jeśli interesują Cię prawdziwe informacje o korzystaniu z UML poza twoim doświadczeniem, są pewne badania, które zostały wykonane (starałem się znaleźć linki do artykułów niepłacących):

Fuhrmanator
źródło
0

My, programiści, uwielbiamy używać zdjęć do wyjaśnienia naszego świata, dlatego oto jedno z produkcji samochodu:

  • Samochód jest wynikiem łańcucha produkcyjnego, tak samo dla kodu (oczywiście dodaj proces wdrażania).
  • Dokument projektowy samochodu jest taki sam jak dokument projektowy oprogramowania.

W naszych światach często zdarza się, że ci, którzy wymyślają i tworzą dokument projektowy, są tacy sami, jak ten, który tworzy kod. Nie dotyczy to innych dziedzin. Nie oznacza to jednak, że naprawdę możesz osiągnąć ten sam poziom jakości, wykonując je wszystkie razem.

Tworząc najpierw ten dokument bez kodowania (z wyłączeniem czegoś takiego jak dowód słuszności koncepcji ...):

  • Z pewnością pomyślisz przed zrobieniem, kodowanie, gdy wiesz, co musisz zrobić, jest ŁATWE.
  • Jesteś w stanie zmusić bardziej doświadczone osoby do skupienia się na najtrudniejszej części twojego oprogramowania: projektowanie, algorytm / matematyka są dowolne, z wyjątkiem bardzo specyficznego celu (wbudowany, w czasie rzeczywistym, montaż).
  • Możesz przekazać mniej doświadczonym ludziom dużą część procesu kodowania, podczas gdy bardziej doświadczeni ludzie skupiają się tylko na tych najbardziej krytycznych częściach, które potrzebują poziomu ich umiejętności. Mniej doświadczeni ludzie wiele się o tym dowiedzą.
  • Możesz dyskutować z osobami niebędącymi informatykami poprzez obraz dokumentu projektowego, a jeśli miałbyś tylko kod, musiałbyś wyodrębnić obraz tego, co zrobiłeś, z całym ryzykiem zapomnienia o czymś (gdzieś zapomniany słuchacz ...). Zobacz odpowiedź CandiedOrange, aby uzyskać więcej informacji na temat komunikacji.
  • Gdy musisz dokonać ewolucji oprogramowania, możesz lepiej przewidzieć, jaki będzie wpływ.
  • Projektowanie ułatwi wycięcie części oprogramowania i jednoczesne rozwijanie części oprogramowania.
  • Napisz te cholernie rebeliatywne testy jednostkowe będą o wiele łatwiejsze, gdy nie będziesz musiał mieć kłopotów z koniecznością pokrycia wszystkich przypadków podczas ich kodowania, w podejściu TDD kodującym test, zanim kod będzie łatwy.
  • ...

Uwaga: te afirmacje zakładają, że kod jest naprawdę odzwierciedleniem projektu i oba są na bieżąco ...

Walfrat
źródło
Ta odpowiedź opisuje niemal najlepszy scenariusz. Na końcu wspominasz o jednym zastrzeżeniu, które samo w sobie jest dość duże. Jest wiele innych. Możesz łatwo pominąć niezbędne aspekty, nie docenić złożoności jakiejś części, nie brać pod uwagę ograniczeń, które nakładają biblioteki / frameworki, nie uwzględniać błędów w zależnościach, nie brać pod uwagę wydajności lub innych niefunkcjonalnych wymagań, ponad inżyniera, nie przewidujemy zmian lub po prostu nie jesteśmy tak dobrzy w projektowaniu. Jest mało prawdopodobne, aby ten najlepszy scenariusz został zrealizowany nawet w profesjonalnym kontekście.
Derek Elkins opuścił SE
Jeśli zaczniesz od rozważenia każdego zastrzeżenia wszystkiego, nigdzie nie pójdziesz. Jakąkolwiek metodę zastosujesz. I długa lista tego, co powiedziałeś, jest całkowicie poprawna, gdy tworzysz tylko kod.
Walfrat,