Wiki C2 ma dyskusję na temat dowodów empirycznych dla programowania obiektowego, która zasadniczo stwierdza, że nie ma odwołania do autorytetu. To było ostatnio edytowane w 2008 roku. Wydaje się, że dyskusja tutaj potwierdza : pytania, czy OO jest nieaktualny , kiedy programowanie funkcjonalne jest złym wyborem, a na zalety i wady AOP odpowiadają opinie autorów bez polegania na dowodach.
Oczywiście opinie uznanych i uznanych praktyków są mile widziane i cenne, ale są bardziej prawdopodobne, gdy są zgodne z danymi eksperymentalnymi. Czy istnieją takie dowody? Wiem, że inżynieria oprogramowania oparta na dowodach to rzecz, ale czy mogę ćwiczyć w tym kontekście? W szczególności, jeśli mam szczególny problem, P
który chcę rozwiązać, pisząc oprogramowanie, czy istnieje bogata wiedza, badania i badania, które pozwoliłyby mi zobaczyć, jak wynik rozwiązania podobnych problemów P
zależał od wyboru paradygmatu programowania?
Wiem, że który paradygmat wyłania się jako „właściwa odpowiedź”, może zależeć od tego, na jakie wskaźniki zwraca uwagę dane badanie, na jakich warunkach badanie jest stałe lub różne i bez wątpienia także od innych czynników. Nie wpływa to na moje pragnienie znalezienia tych informacji i ich krytycznej oceny.
Staje się jasne, że niektórzy myślą, że szukam rozwiązania „przekręć korbę” - jakiejś maszyny do kiełbas, w której umieszczam informacje o moim problemie, z której pochodzi słowo takie jak „funkcjonalny” lub „uporządkowany”. To nie jest moja intencja. To, czego szukam, to badanie, w jaki sposób - przy wielu zastrzeżeniach i założeniach, że nie będę się tutaj zajmował, ale dobra literatura na ten temat - pewne właściwości oprogramowania różnią się w zależności od problemu i wyboru paradygmatu.
Innymi słowy: niektórzy twierdzą, że „OO daje większą elastyczność” lub „programy funkcjonalne mają mniej błędów” - (część) o to proszę. Reszta prosi o dowody przeciwko temu lub założenia, na podstawie których te stwierdzenia są prawdziwe, lub dowody wskazujące, że te rozważania nie są ważne. Istnieje wiele opinii na temat tego, dlaczego jeden paradygmat jest lepszy od drugiego; czy kryje się za tym jakikolwiek cel?
źródło
Odpowiedzi:
W przypadku poprzedniego ujęcia zobacz wersję 1 tej odpowiedzi . Jednak komentarze i zmiany do pytania wyjaśniają, czego szuka pytanie, i pozwalają mi być bardziej klarownym.
Tak, inżynieria oprogramowania oparta na dowodach (EBSE) to coś. Wydaje się, że podjęto kilka wysiłków w kierunku baz danych EBSE, takich jak ten na Durham University i SEED, który został zapoczątkowany przez profesora z Cal Poly . Wszystkie te wysiłki, a także te omówione w wielu artykułach, które można znaleźć za pośrednictwem serwera IEEE Xplore lub biblioteki cyfrowej ACM(wymagana subskrypcja lub zakup wielu artykułów w obu), oparte są na medycynie opartej na dowodach. Zapewniają przegląd literatury opublikowanych danych empirycznych (obserwacyjnych i eksperymentalnych). W rzeczywistości uwzględnienie „przeglądu literatury” w ciągu wyszukiwania dowolnej wyszukiwarki publikacji dostarcza informacji na większość tematów - ponad 14000 trafień w ACM i ponad 1000 w bazie danych IEEE (przy ograniczeniu do tylko zagadnień komputerowych).
Patrząc na ogólne typy tematów omawianych w tych bazach danych EBSE i przeglądach literatury, widzę wspólny wątek - są one zwykle niezależne od technologii. Wydaje się, że nacisk kładziony jest głównie na proces i metodologię, a nie na konkretne narzędzia wykorzystywane do przeprowadzania inżynierii oprogramowania.
Tak więc ta koncepcja istnieje w inżynierii oprogramowania. Academia jest świadoma koncepcji opartej na dowodach i może z powodzeniem zastosować ją w inżynierii oprogramowania.
W szczególności pytanie dotyczy zastosowania technik EBSE do wyboru paradygmatu wydaje się trudne ze względu na samą liczbę zmiennych, które wymuszają przyjęcie założeń, a także ograniczają możliwość powtórzenia eksperymentu lub obserwacji. Jest powiedziane wprost w pytaniu - „jaki paradygmat wyłania się jako„ właściwa odpowiedź ”może zależeć od tego, na jakie wskaźniki zwraca uwagę dane badanie, na jakich warunkach badanie jest stałe lub różne, i bez wątpienia także od innych czynników” . Chociaż nie oznacza to, że badanie, który paradygmat jest „najlepszy” w danej sytuacji, sprawia, że jakikolwiek przegląd literatury tych dokumentów jest niezwykle trudny do uzupełnienia i nadal wyodrębnia informacje.
Zdecydowanie nie ma rozwiązania „obróć korbą” do wyboru paradygmatu.
Biorąc pod uwagę paradygmat programowania, można znaleźć badania w różnych akademickich i branżowych bazach danych na temat tego, jak ten paradygmat wpływa na różne aspekty rozwoju oprogramowania - jakość, wady, wydajność itd. - w różnych specyficznych warunkach, począwszy od wiedzy i doświadczenia zespół do domeny problemu. Każdy rygorystyczny dokument powinien jasno określać warunki, w jakich dane były gromadzone, i założenia. Problemem staje się próba wyodrębnienia czynników, które czynią go dobrym w każdym z tych warunków.
Naukowo istnieją pewne stwierdzenia, które można łatwo zbadać. Na przykład stwierdzenie, że paradygmat funkcjonalny dobrze nadaje się do aplikacji wymagających współbieżności, wynika z twierdzenia Churcha-Rossera . Z tego powodu jest prawdopodobne, że system oprogramowania napisany w języku funkcjonalnym będzie miał mniej wad związanych z współbieżnością niż ten sam system napisany w języku proceduralnym lub obiektowym.
Jednak z praktycznego punktu widzenia zespół programistów nie zawsze może stosować „najlepsze” narzędzie lub technikę do pracy tylko dlatego, że wskazują na to badania. Chociaż dążymy do produkcji systemów oprogramowania najwyższej jakości, działamy w ramach ograniczeń. Często widzę, że ograniczenia te są zminimalizowane (lub nawet usunięte z równania) podczas omawiania skuteczności dowolnej metodologii.
Jako praktykujący, kiedy biorę udział w wyborze technologii do zastosowania, staram się znaleźć najlepsze możliwe narzędzia. Ale potem ograniczam się do tego, co jest znane i dobrze rozumiane przez zespół, który mam. Wracając do mojego poprzedniego przykładu, jeśli mam zespół dobrze zorientowany w tworzeniu współbieżnych aplikacji w C ++ i brak doświadczenia w Haskell, nie ma sensu proponować zbudowania systemu w Haskell, ponieważ prawdopodobnie nie będę w stanie ograniczenia harmonogramu i budżetu, a moja jakość prawdopodobnie ucierpi z powodu braku doświadczenia w łańcuchu narzędzi.
Reasumując, inżynieria oprogramowania oparta na dowodach jest ogólnie dobrą rzeczą, a istnieją przeglądy literatury i są łatwo dostępne. Istnieją jednak aspekty inżynierii oprogramowania, w których zastosowanie podejścia opartego na dowodach ma niewielką wartość. Jednym z nich jest wybór paradygmatu programowania do prac rozwojowych na dużą skalę.
Jeśli chcesz dowiedzieć się, w jaki sposób obiektowa orientacja rozwiązuje problem ponownego użycia lub defektów w programowaniu funkcjonalnym - z łatwością znajdziesz publikacje na ich temat. Jednak nie znalazłem (ani nie zaufałbym) publikacji, która byłaby w stanie skutecznie zająć się wyborem paradygmatu w szerokim zakresie rzeczywistych projektów inżynierii oprogramowania.
źródło
Czytałem The Art of Unix Programming autorstwa Erica S. Raymonda. Ma kilka bardzo ciekawych spostrzeżeń historycznych na temat rzeczy, które teraz bierzemy za pewnik. Przytacza kilka dobrych badań z oprogramowania IEEE, które wykorzystują dowody empiryczne, takie jak gęstość wad. To może być dobre źródło, jeśli szukasz studiów w stylu akademickim.
Nawet techniki takie jak modularyzacja przy użyciu funkcji nie zawsze były powszechną praktyką. Jeden z moich ulubionych cytatów z tej książki:
Są jednak naprawdę dwa problemy ze zbytnim doświadczeniem. Po pierwsze, jakość kodu jest bardzo subiektywna. Kod może być okropny i nadal być poprawny. Ludowej postrzeganie paradygmatu programowania jest bardzo ważny parametr, ponieważ kod jest napisany dla ludzi, aby czytać jak w przypadku komputerów, jeśli nie więcej.
Drugi problem polega na tym, że 50% programistów ma poniżej przeciętnego talentu programistycznego. Nie ma znaczenia, czy Twój najlepszy programista jest bardziej produktywny przy użyciu programowania funkcjonalnego, jeśli „motłoch” ma trudności z pisaniem działającego oprogramowania, nie mówiąc już o pięknym, dobrze zaprojektowanym oprogramowaniu. Podobnie z językami programowania TMTOWTDI , twój najlepszy programista nadal będzie pisał czysty, modułowy kod, ale mniej utalentowani koderzy piszą szum linii z powodu braku narzuconej struktury.
Dlatego myślę, że OOP zyskał najwyższą popularność pomimo swoich braków. Nie jest tak restrykcyjny, że hobbluje najbardziej utalentowanych, ale jego struktura zapewnia zwięzły sposób komunikowania się i narzucania dobrych zasad projektowych najmniej utalentowanym.
W naszej pracy mamy tendencję do oceniania rozwiązania w oparciu o same zalety techniczne. Udane przedsięwzięcie musi również uwzględniać ludzką stronę równania.
źródło
Istnieją konkursy programistyczne, które wykorzystują komputerowy system oceniania i umożliwiają pisanie w różnych językach oraz publikowanie wszelkiego rodzaju wyników i rzeczy. Założę się, że mają dla ciebie dobre dane. Oto lista 8: http://www.makeuseof.com/tag/8-onlineprogramming-contests-challenge-win/
Wyobrażam sobie, że można dokonać sensownych porównań rozwiązań bardzo prostych i jednoznacznych problemów, takich jak suma kwadratów lub seria Fibonacciego, lub narysować linię prostą za pomocą algorytmu linii Bresenhama. Większość rzeczywistych zadań programistycznych nie ma tak jednoznacznych celów, a każdy język ma swoje ulubione punkty. Duża część zalet języka jest subiektywna. Bardziej sensowne dane można znaleźć, badając zadowolenie programistów i klientów, niż licząc wiersze kodu lub liczbę błędów.
Pamiętam, jak spędziłem pół dnia, pisząc jeden z moich pierwszych programów Awk, pomyślałem, że zajęłoby mi to cały tydzień, aby zrobić to samo w Javie. Ale to dlatego, że moje rozwiązanie Java koncentrowało się na byciu solidnym, ponieważ rozwiązanie Awk było szybkie i brudne i wymagało ręcznego dostrajania wejścia i wyjścia i było naprawdę wyrzucane, kiedy skończyłem. Awk i Java są świetne, ale nie do tych samych rzeczy.
Myślę, że mówię o tym, że w rzeczywistych aplikacjach porównywanie języków lub narzędzi w znaczący sposób jest niezwykle trudne - problem starych jabłek i pomarańczy. Powodzenia! Chciałbym zobaczyć, co się dowiesz.
źródło
Od ponad 30 lat badam różne sposoby tworzenia oprogramowania. Istnieje niewiele dobrych opublikowanych dowodów na wybór paradygmatu.
Złożyłem dużą przeszukiwalną bibliografię ASCII. Obejmuje to wiele artykułów i artykułów IEEE i ACM. Oznaczam elementy dostarczonym dowodem. Oto najczęstsze tagi:
Teraz wyszukaj PARADIGM i policz tagi
Jeśli chcesz kopać głębiej, http://cse.csusb.edu/dick/lab.html i mam nadzieję, że to pomoże ...
źródło
Wydaje się, że w wielu przypadkach nie ma wystarczająco dużego zbioru badań lub wystarczająco wysokiej jakości, aby można było wyciągnąć ogólne wnioski na temat tego, czy jedna praktyka w inżynierii oprogramowania jest lepsza od innej. W szczególności szukałem badań nad pracą w różnych paradygmatach, ale brak dostępności nie ogranicza się do tej dziedziny, więc sformułuję swoją odpowiedź w szerszym znaczeniu.
Artykuł z 2004 r., Inżynieria oprogramowania oparta na dowodach autorstwa Kitchenham i in. , Opisuje w zwięzły sposób korzyści płynące z podejścia opartego na dowodach oraz problemy z jego wdrożeniem w inżynierii oprogramowania. Nie będę tutaj omawiał strony korzyści (z pytania wynika, że chciałbym móc w ten sposób pracować), ale problemy są istotne jako odpowiedź na pytanie, które zadałem.
Więc odpowiedź, której szukam, brzmi „nie”, prawdopodobnie dowodów, których szukam, nie ma. Powinienem wybrać mój paradygmat w oparciu o istniejące popularne kryteria tego, co wiem, co jest fajne i eksperta.
źródło
Nie wierzę, że tego typu badania istnieją. Można by sądzić, że to nie paradygmat programowania jest tak ważny, jak stosowany algorytm. Na przykład, biorąc pod uwagę każdy nietrywialny system, który opiera się na algorytmach małej przestrzeni, werset pierwszy, który opiera się na algorytmach małego czasu, generowałby różne metryki. Ten, który ma lepszy czas, najprawdopodobniej zostanie uznany za bardziej prawidłowy, chyba że problemem jest miejsce, to odwrotność jest prawdziwa. Uważam, że przypomina to brukowanie drogi. Podczas gdy algorytm lub przepis na wytwarzanie materiałów jest stały we wszystkich procesach, możliwe jest, że jedna firma uważa, że brukowanie dwóch pasów jednocześnie (po jednym z każdej strony drogi) jest lepsze niż brukowanie dwóch pasów po tej samej stronie drogi jednocześnie . Pod koniec dnia nie ma to znaczenia, ponieważ proces tworzenia czarnego blatu jest nadal taki sam, jedyną różnicą jest podejście. Wracając do programowania, jeśli masz zespół programistów C, napisz kod w sposób proceduralny, jeśli masz zespół programistów Java, napisz go w OO. Nie rozłączaj się z paradygmatem tak bardzo, jak implementacja algorytmu. Ponieważ pod koniec dnia możesz pisać Java jak C i możesz próbować pisać C jak Java.
AKTUALIZACJA
Aby odpowiedzieć na komentarz, Graham mnie zostawił:
Zakładam, że przez architekturę masz na myśli paradygmat programowania. Jeśli zamierzasz korzystać z Clojure, może powinieneś zatrudnić zespół programistów Clojure. Jednak w oparciu o szybkie wyszukiwanie Clojure jest językiem opartym na Javie, tak się składa, że działa. Biorąc pod uwagę te informacje, wziąłbym programistów Java (ponieważ technicznie mogą po prostu napisać Javę i da to te same wyniki) lub szukać funkcjonalnych programistów, takich jak programiści Haskell. Teraz, jeśli chodzi o wybór tego, co najlepsze, jest całkowicie zależne od twojego zespołu. Nigdy nie miałbym zespołu ekspertów ds. Relacyjnych baz danych, który organizowałby dla mnie rozwiązanie w chmurze, ani nie miałbym zespołu funkcjonalnych programistów opracowujących dla mnie rozwiązanie zorientowane obiektowo. Musisz wykorzystać mocne strony zespołu, w którym nie masz uwielbianej wizji, do tego, co zespół „powinien”
źródło
Różne paradygmaty prowadzą do różnych rozwiązań. To, które dopasowanie jest „najlepsze”, zależy w dużej mierze od:
Nie znam takich ostatecznych badań i nawet jeśli takie byłyby, nie ufałbym temu.
To jest praca architekta.
Zastąpienie mądrości architekta potencjalnie nieistotnymi wnioskami z badania jest receptą na katastrofę.
Uwaga: komentarz wspomina o podjęciu decyzji o „algorytmie”, a następnie o wyborze języka. Algorytmy są centralnym mechanizmem strukturalnym języków proceduralnych. Języki obiektowe koncentrują się na klasach i wzorcach współpracy / komunikacji. Jeśli jesteś przekonany (jako architekt), że rozwiązanie zorientowane na algorytm jest „najlepsze”, trzymaj się języków proceduralnych lub funkcjonalnych.
Dodatek: brak zaufania do badań nie jest „przesądem”, to zdrowy rozsądek. Eksperymenty naukowe muszą być obiektywne i powtarzalne. Projekty oprogramowania są wysoce subiektywne, ale co gorsza są to niepowtarzalne eksperymenty . Po prostu nie można wdrożyć projektu X z zespołem Y, zmierzyć wyniki, a następnie cofnąć czas, usunąć wspomnienia i ponownie wykonać ten sam projekt z tym samym zespołem. Informacje odkryte lub dorozumiane w badaniach mogą być przydatne dla architekta, ale nigdy nie mogą być ostateczne.
źródło