Dlaczego nie możemy efektywniej uchwycić projektu oprogramowania? [Zamknięte]


14

Jako inżynierowie wszyscy „projektujemy” artefakty (budynki, programy, obwody, molekuły ...). To działanie (design-the-czasownik), które daje pewien wynik (design-the-rzeczownik).

Myślę, że wszyscy się zgadzamy, że rzeczownik jest innym bytem niż sam artefakt.

Kluczowym działaniem w branży oprogramowania (a właściwie w każdej firmie, w której należy ulepszyć powstały artefakt produktu) jest zrozumienie „projektu (rzeczownika)”. Wydaje się jednak, jako społeczność, całkowicie kompletnymi niepowodzeniami w rejestrowaniu tego, o czym świadczy wysiłek, jaki ludzie wkładają w odkrywanie faktów na temat swojej bazy kodu. Poproś kogoś, aby pokazał Ci projekt swojego kodu i zobaczył, co dostajesz.

Myślę, że projekt oprogramowania ma:

  • Wyraźna specyfikacja tego, co oprogramowanie ma robić i jak dobrze to robi
  • Wyraźna wersja kodu (ta część jest łatwa, wszyscy ją mają)
  • Wyjaśnienie, w jaki sposób każda część kodu służy do osiągnięcia specyfikacji (np. Związek między fragmentami specyfikacji i fragmentami kodu)
  • Uzasadnienie , dlaczego kod jest taki, jaki jest (na przykład, dlaczego dany wybór raczej niż inny)

To, co NIE jest projektem, jest szczególną perspektywą kodu. Na przykład [nie wybieraj specjalnie] diagramy UML nie są projektami. Są to raczej właściwości, które można uzyskać z kodu, lub prawdopodobnie właściwości, które można uzyskać z kodu. Ale z reguły nie można uzyskać kodu z UML.

Dlaczego po ponad 50 latach tworzenia oprogramowania dlaczego nie mamy regularnych sposobów na wyrażenie tego? (Zaprzeczaj mi wyraźnymi przykładami!)

Nawet jeśli to zrobimy, większość społeczności wydaje się tak skupiona na zdobywaniu „kodu”, że i tak gubi się rzeczownik projektu. (IMHO, dopóki projekt nie stanie się celem inżynierii, a artefakt zostanie wyjęty z projektu, nie będziemy tego omijać).

Co widziałeś jako środek do nagrywania projektów (w sensie, w którym to opisałem)? Przydałyby się wyraźne odniesienia do artykułów. Jak myślisz, dlaczego konkretne i ogólne środki okazały się nieskuteczne? Jak możemy to zmienić?

[Mam własne pomysły które podkreślają wypunktowany punkt widzenia powyżej, ale interesują mnie odpowiedzi innych ludzi ... i trudno jest wdrożyć mój plan [[i może to prawdziwy problem: -]]]

EDYCJA 2011/1/3: Jeden wątek odpowiedzi wskazuje, że „dokumentacja” (przypuszczalnie tekstowa, w szczególności nieformalna) może być odpowiednia. Chyba powinienem wyjaśnić, że nie wierzę w to. Narzędzia CASE pojawiły się na scenie od lat 80., ale wczesne narzędzia w większości przechwytywały piksele na schematach tego, co narysowałeś; chociaż narzędzia były prawdopodobnie komercyjnie udane, tak naprawdę nie były zbyt pomocne. Kluczowym wnioskiem było to, że jeśli dodatkowych artefaktów „projektowych” nie da się formalnie zinterpretować, nie można uzyskać poważnej pomocy ze strony narzędzia. Uważam, że ten sam wgląd dotyczy każdej długoterminowej użytecznej formy przechwytywania projektu: jeśli nie ma formalnej struktury, nie będzie miał żadnego rzeczywistego zastosowania. Dokumenty tekstowe prawie nie spełniają tego testu.


1
Uzgodniono UML - w najlepszym razie narzędzie komunikacji, które przyczynia się do opisu projektu, ale samo w sobie nie jest projektem. W najgorszym przypadku UML to graficzny kod źródłowy.
Steve314,

obliczyć „jak dobrze to robi”
Steven A. Lowe,

Kiedy buduję systemy, spełniam wiele „niefunkcjonalnych” wymagań: zakodowane w tym języku, używa tej bazy danych, obsługuje rekordy 1E10 ze średnim czasem reakcji 100 ms, ... Nie można ich pominąć w specyfikacji. (Bez niefunkcjonalnych wymagań pętla na zawsze jest odpowiednim programem dla dowolnej specyfikacji funkcjonalnej). Chodzi mi o to, żeby uchwycić „projekt”, aby poradzić sobie z innym niefunkcjonalnym wymogiem: „utrzymywalnym”.
Ira Baxter,

Twoja dyskusja wygląda interesująco, ale wciąż nie jestem pewien, o co dokładnie chodzi. Czy uważasz, że możesz spróbować podać konkretny przykład lub wyjaśnić, czym dokładnie jesteś zainteresowany? Myślę o czymś takim jak przykład FFT, w którym możesz dać pełny obraz 4 punktów wypunktowania w swoim pytaniu, tak jak je widzisz, a może jakie rzeczy chciałbyś zrobić z wynikami po ich zarejestrowaniu.
n1ckp

Nie mam pojęcia, po co ten problem, ale jest to temat Freda Brooksa „Design of Design” . (Przepraszam, jeśli już znasz.) Omawia przykłady z programowania i architektury. W szczególności zauważa, że ​​przechwytywanie uzasadnień (zarówno dla projektu, jak i odrzuconych projektów alternatywnych) jest naprawdę przydatne i nie jest dobrze obsługiwane przez obecne narzędzia.
Paul D. Waite,

Odpowiedzi:


8

Myślę, że istnieje kilka powodów, dla których wciąż nie jesteśmy w tym dobrzy.

  1. Ludzie przez długi czas choć oprogramowanie było jak domy, korzystali z procesów i pomysłów z budownictwa. „Architekt oprogramowania” był tytułem, którego pragnęli wszyscy programiści. W ciągu ostatnich dziesięciu lat architekt oprogramowania prawie wymarł. Pomysł na procesy kaskadowe, w których najpierw masz architekta mówiącego, jak oprogramowanie powinno działać i wyglądać, a następnie zachęcić ludzi do tworzenia diagramów tego, jak powinien być skonstruowany, a na końcu kod małpki implementujący te fajne schematy przepływu pracy / UML do specyfikacji, ten pomysł jest teraz szeroko wyśmiewane. Tak więc cały przemysł szczekał złą ścieżkę przez 40 lat.

  2. Narzędzia, których używamy, ciągle się zmieniają i ulepszają. Programowanie to logiczna łamigłówka, a my opracowujemy lepsze pomysły i techniki, aby ją streścić i uczynić zrozumiałym. Sposób, w jaki to modelujemy, musi ewoluować z tą samą prędkością, ale pozostaje w tyle. Udoskonalone techniki wyodrębniania łamigłówki programowania oznaczają również, że możemy zwiększyć złożoność. I tak robimy. Programowanie zawsze leży na granicy złożoności, którą my, programiści, możemy sobie poradzić.

  3. Tworzenie sposobów opisu programu jest rodzajem abstrakcji. Jeśli uda nam się wymyślić dobry sposób abstrakcji oprogramowania, możemy również umieścić tę abstrakcję bezpośrednio w narzędziach programistycznych, a tym samym dodać kolejną abstrakcję / uproszczenie do programowania. Stało się to wiele razy. Przykładami takich abstrakcji są funkcje, klasy i biblioteki.

  4. W związku z tym; Jeśli masz udany i dokładny model oprogramowania, ten model będzie równoważny oprogramowaniu. Który rodzaj sprawia, że ​​cały wysiłek jest bezcelowy, co z kolei potwierdza punkt 1 powyżej: Modelowanie oprogramowania jest znacznie mniej przydatne niż wcześniej sądzono. Zamiast tego lepiej jest wyodrębnić dane o oprogramowaniu z kodu. Tworzenie modelu UML na podstawie wyglądu kodu jest znacznie bardziej pouczające niż tworzenie modelu UML i próba zaimplementowania tego modelu teoretycznego.


2
Nie zgadzaj się ze swoim ostatnim punktem. Tak, będzie to raczej odpowiednik oprogramowania, ale nadal łatwiej jest przerysować model niż refaktoryzować rzeczywiste oprogramowanie, gdy (nie jeśli) okazało się, że coś wcale nie było tak dobrym pomysłem. Nie doceniłbym znaczenia etapu projektowania.
Joris Meys,

1
@Joris Meys: Problem polega na tym, że nie będziesz wiedział, co i co nie jest dobrym pomysłem, dopóki go nie zaimplementujesz. (Z wyjątkiem trywialnych przypadków, ale i tak nie będziesz zbyt często używać diagramu UML). Nie należy też przeceniać, jak trudno jest zmienić kod. Polecam lekturę książek Kent Becks na temat XP i Test Driven Design.
Lennart Regebro

@Lennart: dziękuję za napiwek
Joris Meys

2
@ Lennart: Różnica między tobą a Hiobem polega na tym, że wydajesz się zgadzać, że specyfikacja wyrażona w jakiś sposób może być konieczna, chociaż nie wiem, jak robi to twój zestaw obecnie programowalnych abstrakcji. Ale wyobraź sobie, że potrzebuję programu do przetwarzania sygnałów, który wyodrębni główne częstotliwości. Zauważ, że nie zasugerowałem jak. Możesz zdecydować o użyciu Fast Fourier Transform, a ja na pewno znaleźć ślady całego kodu, który implementuje FFT bitów. Ale gdzie jest fakt, że zdecydowałeś się na użycie FFT wyraźnie zarejestrowane? Uważam, że potrzebujesz go, chyba że twoi czytelnicy są wszechwiedzący.
Ira Baxter,

1
@Ira Baxter: Co powiesz na „Postanowiliśmy zaimplementować przetwarzanie sygnału za pomocą FFT”? Wiesz, kod źródłowy ma komentarze. Mogę też zapisać go w pliku README. Wyraźnym wyrażeniem specyfikacji jest kod. Wiersze tekstu, takie jak „Postanowiliśmy zaimplementować to z FFT”, nie są wyraźne, ani nie mają charakteru oryginalnego posta. To dokumentacja wdrożenia. Wygląda na to, że skończyłeś w trybie kłótni, ale nie rozumiem, o co próbujesz się kłócić.
Lennart Regebro

5

Być może zechcesz przejrzeć literaturę dotyczącą identyfikowalności oprogramowania. W szczególnej kolejności:

  • CUBRANIC, D., MURPHY, GC, SINGER, J., AND BOOTH KELLOGG, S. Hipikat: pamięć projektu do tworzenia oprogramowania. Transakcje dotyczące inżynierii oprogramowania 31, 6 (2005), 446–65.
  • TANG, A., BABAR, MA, GORTON, I., AND HAN, J. Badanie wykorzystania i dokumentacji uzasadnienia projektowania architektury. W Proc. V roboczej konferencji IEEE / IFIP nt. Architektury oprogramowania (2005).
  • RAMESZ, B., POWERS, T., STUBBS, C. I EDWARDS, M. Identyfikowalność wymagań wykonawczych: studium przypadku. W Proc of the Int'l Symp on Requirements Engineering (York, 1995).
  • HORNER, J., AND ATWOOD, ME Uzasadnienie projektowe: uzasadnienie i bariery. W Proc 4. Konferencji Nordyckiej na temat interakcji człowiek-komputer: zmiana ról (Oslo, Norwegia, 2006).
  • CLELAND-HUANG, J., SETTIMI, R., ROMANOVA, E., BERENBACH, B., AND CLARK, S. Najlepsze praktyki w zakresie automatycznej identyfikowalności. Komputer 40, 6 (czerwiec 2007), 27–35.
  • ASUNCION, H., FRANÇOIS, F., AND TAYLOR, RN Kompleksowe narzędzie do śledzenia oprogramowania przemysłowego. W Proc. Szóstego wspólnego spotkania European Software Eng Conf i ACM SIGSOFT Int'l Symp na temat podstaw inżynierii oprogramowania (ESEC / FSE) (Dubrownik, 2007).

Zauważ, że to tylko wierzchołek góry lodowej i jestem pewien, że pominąłem kilka kluczowych dokumentów.

W osobnej notatce moja własna praca nad Arcum była dla programistów sposobem na wyrażenie IDE użycia przekrojowych idiomów projektowych. Po wyrażeniu, programiści mogli następnie przekształcić kod źródłowy, aby użyć alternatywnych implementacji:

Nawiasem mówiąc, Arcum jest również związane z twoją pracą w DMS.


1
+1 za to. RT to nie wszystko, ale jest to jeden z kilku pozytywnych kroków w kierunku rozwiązania problemu, zamiast robić te same stare wymówki.
Aaronaught

2

UML jest dla programu tym, czym są plany budynku w moim skromnym widoku. Same plany nie są oczywiście projektem, potrzebujesz do tego specyfikacji materiałowych (używanych narzędzi kodowych), ogólnego widoku budynku (niektóre schematyczne przedstawienie całego oprogramowania, w tym projektów GUI), jak budynek jest sadzony w otoczeniu (wyraźny schemat interakcji oprogramowania z innymi / jest instalowany w systemie operacyjnym), jego wpływ na klimat i glebę (interakcja ze sprzętem), ... Wiele książek o projektowaniu próbuje to zdefiniować, ale tak jak w przypadku wiele rzeczy w nauce, każdy naukowiec ma trochę swoją własną definicję.

Teraz również nie zgadzam się z twoją obserwacją, że nie możesz uzyskać kodu z UML. Możesz, jeśli masz dodatkowe informacje wymienione. Ale prawdziwy kod nie jest już projektem, to artefakt. Nie możesz też wydobywać prawdziwych kamieni i betonu z planu, ale potrzebujesz planu, aby umieścić prawdziwe kamienie i beton we właściwej formie i we właściwym miejscu.

W tym świetle uważam następujący artykuł za interesujący (spotkałem go w innym kontekście, kiedy szukałem oprogramowania graficznego, ale mimo to ...). Graficzne podejście do opisu projektu miało dla mnie sens, chociaż - znowu - to moim zdaniem tylko część projektu. Interesujące jest to, że takie podejście daje ramy do zrozumienia i refaktoryzacji projektów (w przeciwieństwie do refaktoryzacji oprogramowania), jak wskazano w następujących dokumentach:

Istnieje wiele innych podejść do opisu (części) projektu, takich jak projektowanie strukturalne (wykresy HIPO) lub projektowanie programów zintegrowanych , wzorce projektowe , ...

Jednak dopóki nie ma ustalonego standardu branżowego, uzyskanie „zwykłego” sposobu na wyrażenie tego jest mało prawdopodobne. Nawet po ponad 50 latach. I szczerze mówiąc, jeśli Twoja firma znajdzie dobry sposób na wyrażenie projektu, czy podzieliłbyś się nim ze światem?


Jeśli Twoja firma znajdzie dobry sposób na zrobienie tego, programiści powiedzą wszystkim innym, do cholery, szybko. :-)
Lennart Regebro

Myślę, że nie rozumiesz mojego zdania na temat UML (i jakiejkolwiek innej „pojedynczej” notacji). UML-before-code jest ograniczeniem w sposobie tworzenia oprogramowania. Podobnie jak wszystkie inne zapisy (tak, widziałem wiele z nich, byłem już jakiś czas). Biorąc pod uwagę ograniczenie, możliwe jest wygenerowanie kodu spełniającego to ograniczenie (metoda żartu: wygeneruj wszystkie możliwe programy i sprawdź, które z nich pasują do ograniczenia, wybierz jeden z nich). W tym sensie możesz „wygenerować kod z UML”. Ale (jeśli trzymamy się diagramów klas) ten kod nie zaimplementuje żądanej funkcji ...
Ira Baxter

... i cierpi na to większość innych schematów notacyjnych, tak naprawdę nie przechwytują specyfikacji tego, co program ma zrobić. Nie podają też uzasadnienia; dlaczego twój wykres UML ma taki kształt? Którą część kodu mogę zmienić bez zerwania wykresu? Czy mogę zmienić sposób, który nie zaszkodzi zamiarom związanym z tabelą?
Ira Baxter,

@Ira: Po odwiedzeniu twojej strony stało się dla mnie bardziej jasne. Ale muszę przyznać, że dyskusja semantyczna na wysokim szczeblu na te tematy wykracza poza moją wiedzę. Jeśli jednak weźmiesz pod uwagę prawdziwy kod jako część projektu, to gdzie jest prawdziwy artefakt? UML - lub jakakolwiek inna notacja - jest moim skromnym zdaniem schematem struktury kodu i to coś, co lubię nazywać częścią projektu. Więcej niż sam kod. uważaj na tę część . To nie jest projekt, ale nadal istotny wkład. znowu, moim skromnym zdaniem. Uzasadnienie można dodać do tego, jak wyjaśniono.
Joris Meys,

@Joris: Większość diagramowych notacji można traktować jako projekcje (wywnioskowane artefakty) z kodu (przynajmniej po jego zakończeniu) lub można je traktować jako wskazówki dotyczące budowania kodu (plan). Istnieje wiele możliwych schematów (niektóre wymienione w odpowiedzi). Które są fundamentalne dla twojego kodu, a które są tylko wypadkami? Schematy blokowe to digramy, więc powinny się kwalifikować; jednak jestem całkiem pewien, że schematy blokowe niektórych fragmentów kodu nie będą uważane za część jego projektu. Więc co jest fundamentalne? Co jest przypadkowe?
Ira Baxter,

2

Z własnego doświadczenia twierdziłbym, że dobrze wychwytujemy projektowanie oprogramowania. Posiadamy bazę danych dokumentów wymagań i projektu dla każdej pojedynczej funkcji, którą kiedykolwiek wdrożyliśmy na naszej platformie. Przypuszczam, że moja okoliczność może być wyjątkowa. Oto kilka rzeczy do przemyślenia.

Każda osoba w moim zespole ma dyplom inżyniera ... głównie EE lub CE. Inżynieria uczy projektowania w ramach programu nauczania.

Myślę, że jest wielu tak zwanych inżynierów oprogramowania, którzy pochodzą ze środowisk CS. Projektowanie oprogramowania nie jest integralną częścią większości programów CS. Nie twierdzę, że wszystkie kierunki CS są kiepskie w projektowaniu, ale chciałbym się założyć, że większość nie ma formalnego wykształcenia, które ich nauczyłoby. Myślę, że wiele osób zakłada, że ​​jeśli potrafisz programować, możesz projektować oprogramowanie, co nie jest prawdą. Biorąc pod uwagę, że wielu programistów nie ma wykształcenia inżynierskiego, nie jest zaskakujące, że w wielu projektach programowych nie ma zespołu, który byłby dobry w przechwytywaniu projektów.


Więc jakiej konkretnej metody pisania wymagań i dokumentów projektowych używasz? (Spojrzałem na twoją biografię i spodziewałem się zobaczyć kogoś z przestrzeni obrony i byłem zaskoczony). Zakładam, że przez wymagania rozumiesz tekst w języku naturalnym? ... jeśli tak, nie masz żadnych argumentów na ich temat? (Rozróżniam wymagania dotyczące języka naturalnego od specyfikacji formalnych). Czy są kompletne? A dokumenty projektowe? Czy są one całkowicie aktualne dla aktualnie wysyłanego systemu? Zgadzam się, że wielu tak zwanych programistów i inżynierów oprogramowania nie jest, więc możemy trzymać się dyskusji na temat tego, co powinni zrobić.
Ira Baxter,

1
Nie jestem pewien, czy nasza metoda ma określoną nazwę. Nasze wymagania są tym, co nazwałbym hybrydą między wymaganiami dotyczącymi języka naturalnego a dokumentami projektowymi wysokiego poziomu. Zwykle mamy dwie rundy edycji. Po pierwsze, dokumentujemy, co funkcja musi zrobić prostym językiem angielskim. Następnie określamy dokładnie, jak to będzie działać z perspektywy użytkownika. Dokument ma dwa cele. Po pierwsze, chcemy przedstawić dokument, który nasz zespół marketingowy może sprawdzić, aby upewnić się, że zaspokajamy nasze potrzeby biznesowe. Po drugie, chcemy dostarczyć dokument, który może być używany przez nasz zespół kontroli jakości do testowania.
Pemdas

1
Nasze dokumenty projektowe są znacznie bardziej formalne i szczegółowe. Zawsze obejmują one: Analiza przypadków użycia, wyjaśnienie transakcji lub powody, dla których wybraliśmy konkretny sposób wykonywania zadań, odniesienia do innych projektów, wyraźne definicje interfejsów, struktury danych ... itd. Nie koniecznie mamy wyraźne komentarze dotyczące tego, w jaki sposób określony kod spełnia określone wymagania. Nie jestem zdecydowany, czy moim zdaniem jest to ważne.
Pemdas

1
Powiedziałbym, że nasze dokumenty są w 95% aktualne. Kilka rzeczy tu i tam prześlizguje się przez szczeliny.
Pemdas,

2

Widzę dwa problemy.

Po pierwsze, cholernie trudno jest zsynchronizować kod i dokumentację. Jeśli są oddzielne, będą się rozchodzić, a dokumentacja stanie się bezużyteczna. Programiści próbowali używać narzędzi do synchronizacji (takich jak narzędzia CASE), ale narzędzia te dostały się między programistami a ich kodem, co spowodowało więcej szkód niż pożytku. Jednym z kluczowych wniosków dotyczących projektowania opartego na domenach (Evans, 2004) jest to, że dobry projekt jest naprawdę trudny, więc aby coś z niego uzyskać, musisz:

  • wybierz najmniejszy możliwy obszar programu, w którym dobry projekt przyniesie ogromne korzyści, tzw. domena podstawowa
  • bardzo ciężko pracować, aby uzyskać dobry projekt w postaci wszechobecnego języka, którego wszyscy członkowie zespołu używają przez cały czas
  • w miarę możliwości, uczyń część projektu kodem

Innym dużym problemem związanym ze sposobem projektowania jest to, że nasze metody projektowania nie są wystarczająco matematyczne. Nieszczelne abstrakcje nie pozwalają na wyciąganie z nich rzetelnych wniosków, a świat ściśle stosowanej logiki i jasnej prawdy nazywa się matematyką, przed którą programiści w większości się unikają.

Nieliczne narzędzia matematyczne, jakie posiadamy, takie jak metody formalne, są bardzo nieporęczne.

Mapa-redukcja jest dobrym przykładem matematyki w programowaniu. Podstawowa idea jest taka: gdy masz asocjacyjną, binarną operację, możesz bardzo łatwo rozdzielić jej wykonanie. Operacja binarna jest funkcją o dwóch parametrach, skojarzenie oznacza, że ​​(a + b) + c = a + (b + c)

a1 + a2 + ... + a99 + b1 + b2 + ... + b99 + c1 + c2 + ... + c99 to

(a1 + a2 + ... + a99) + (b1 + b2 + ... + b99) + (c1 + c2 + ... + c99), gdzie As, Bs i Cs można w prosty sposób dodawać w różnych lokalizacjach, ich wyniki są gromadzone i podsumował w mgnieniu oka.

Zmniejszenie mapy to absurdalnie prosty pomysł. Można to opisać na jednym kawałku papieru. Jeśli możesz założyć, że czytelnik dobrze orientuje się w koncepcji asocjatywności, jeśli mieści się na dość małym kawałku papieru. Teraz spróbuj wyjaśnić komuś redukcję mapy bez używania terminu „skojarzenie” lub odwoływania się do niego pośrednio. Wyzywam cię.

Projektowanie oprogramowania bez abstrakcji matematycznych przypomina próbę tworzenia architektury bez zawracania sobie głowy nauką geometrii.

Może Haskell może to naprawić z czasem. Zastosowanie pojęć z teorii kategorii do opisywania programów wydaje mi się obiecujące. Teoria kategorii jest tak abstrakcyjna, że ​​nawet matematycy mieli z niej niewiele pożytku, ale najwyraźniej kategorie, które są abstrakcyjne nie do poznania, wydają się wystarczająco abstrakcyjne, aby opisać strukturę oprogramowania. Dowiemy się. Powoli.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.