Twórz wzory, które stłumią kreatywność

21

Wiele lat temu rozmawiałem z profesorem ekonomii o wzorcach projektowych, o tym, jak ustanawiają wspólny język dla programistów i jak ładnie rozwiązują dobrze znane problemy itp. Itp.

Potem odpowiedział mi, że jest to dokładnie odwrotne podejście, którego użyłby wobec swoich studentów ekonomii. Zazwyczaj przedstawiał problem i prosił go, aby najpierw znalazł rozwiązanie, aby mogli najpierw pomyśleć o tym i spróbować znaleźć sposoby rozwiązania problemu, a dopiero potem przedstawił „klasyczne” rozwiązanie.

Zastanawiałem się więc, czy podejście „wzorzec projektowy” naprawdę sprawia, że ​​programiści są mądrzejsi lub głupsi, ponieważ wiele razy otrzymują po prostu „właściwe rozwiązanie tego problemu” zamiast być może za pomocą kreatywności i wyobraźni, aby rozwiązać jakiś problem w nowy i innowacyjny sposób.

Co myślisz?

Lew
źródło
5
Sugerowałbym przeczytanie A Pattern Language (książka, a nie artykuł w Wikipedii), na którym oparte są koncepcje wzorców architektury oprogramowania. Nie są klockami ani układankami, które pasują do siebie.
11
Krzywa / Nauczanie różni się od robienia. Tak więc naprawdę dobry kurs CS może wymagać napisania kompilatora - jeśli zasugerowałeś swojemu pracodawcy, że musisz napisać kompilator dla jego systemu przetwarzania zamówień, powinieneś / powinnaś zostać zwolniony.
James Anderson
2
Nie sądzę, aby oba były koniecznie porównywalne - wzorce projektowe nie są klasycznym rozwiązaniem, lecz podejściem do wielu rozwiązań.
jmoreno
1
możliwy duplikat wzorów projektowych - korzystasz z nich? - pytanie może brzmieć inaczej, ale odpowiedzi na to pytanie dobrze pasują do tego przypadku.
Doc Brown
2
Nie wiem o kreatywności, ale mnóstwo „Jaki to wzór?” lub „Czy jest na to jakiś wzór?” pytania sprawiają wrażenie, że niektórzy twórcy uważają, że istnieje wzorzec dla wszystkiego.
JeffO

Odpowiedzi:

43

Twój profesor ekonomii ma absolutną rację.

Wzory Software Design to przede wszystkim sposób na doświadczonych programistów, aby komunikować się ze sobą . Są one skrótem od ustalonych rozwiązań znanych problemów.

Ale powinny być używane tylko przez osoby, które rozumieją, jak rozwiązać problem bez wzoru lub same opracowały podobny wzór. W przeciwnym razie będą mieli ten sam problem co koder kopiuj / wklej; będą mieli kod, ale nie zrozumieją, jak to działa, i dlatego nie będą mogli go rozwiązać.

Ponadto wiele wzorców projektowych to wzorce korporacyjne , wzorce przeznaczone do stosowania w dużych korporacyjnych systemach oprogramowania. Jeśli poznasz cuda kontenera Inversion of Control, będziesz chciał używać go w każdym pisanym programie, nawet jeśli większość programów tak naprawdę go nie potrzebuje (istnieją lepsze sposoby na wstrzykiwanie zależności w mniejszych programach, dzięki czemu nie wymaga kontenera IoC).

Naucz się wzorów. Zrozum wzorce i ich właściwe użycie. Wiedzieć, jak rozwiązać ten sam problem bez wzorca (wszystkie wzorce oprogramowania są abstrakcjami w stosunku do podstawowych algorytmów). Będziesz wtedy mógł bezpiecznie korzystać z wzorców oprogramowania, gdy ma to sens.

Robert Harvey
źródło
3
Jestem pewien, że jest tak wielu programistów, że bez użycia wzorców projektowych napiszą tak niskiej jakości kod, że nikt nawet nie chce na niego patrzeć. Nie zgadzam się, że powinien on być używany TYLKO przez osoby, które rozumieją, jak rozwiązać problem bez wzoru ... Dla mnie to jest sedno wzoru; Gdybym wiedział, jak to zrobić, dlaczego powinienem wybrać wzór projektowy? A także, co ci inni programiści powinni zrobić, jeśli zmusimy ich do niestosowania wzorca projektowego? Powinni tworzyć prawdziwe oprogramowanie ze swoimi pomysłami i pozwolić mu zawieść, a następnie nauczyć się czegoś nowego?
Mahdi
18
@Mahdi, gdy wiele osób znajduje to samo rozwiązanie, nazywa się to wzorcem. Odwrotnie - nie patrzysz na wzorce i nie używasz ich jako rozwiązań, patrzysz na rozwiązania i znajdujesz wzorce.
user253751
13
@Mahdi Widzę o wiele więcej początkujących, którzy myślą, że jeśli użyją wzoru XXX, za każdym razem będą tworzyć doskonałe oprogramowanie (gdzie XXX to wszystko, o czym przeczytali na końcu), a następnie zrobią wszystko, aby torturować każdy projekt, aby dopasować ten wzór.
jwenting
5
@Mahdi: nie bierz zdania „przez ludzi, którzy rozumieją, jak rozwiązać problem bez wzorca” zbyt dosłownie. Robert z pewnością oznacza „przez osoby, które zrozumiały problem na tyle dobrze, aby podjąć rozsądną decyzję, kiedy użyć wzorca, a kiedy nie”.
Doc Brown
2
@Dunk Mogę wypróbować coś kreatywnego na znanym wzorze lub zrobić to od zera, ale po wypróbowaniu kilku innych rzeczy i po zrozumieniu, jakie są dokładne zalety i wady każdego wzoru. Jeśli poprosisz mnie, żebym po raz pierwszy zbudował dom i po prostu powiesz mi, że jestem kreatywny, to nie posunę się tak daleko, aby zbudować coś solidnego, po prostu dlatego, że jest to zbyt skomplikowane. Jeśli chcesz być kreatywny zamiast używać wzorca, powinieneś już dobrze rozumieć sam problem, a zdobędziesz go dopiero po latach doświadczenia ...
Mahdi
21

Sposób, w jaki ludzie projektują wzorce projektowe, polega na tym, że jest to zestaw rozwiązań, które można zastosować, jeśli pojawią się podobne problemy. Nie chcą, abyście myśleli o nich jako o jedynych możliwych rozwiązaniach, podanych przez Boga Mojżeszowi wykutych w kamiennych tablicach na górze.

Niestety, niektórzy uważają je za coś bardziej świętego niż pismo przykładowe, z których można się nauczyć. To zabija kreatywność i ustanawia kult ładunków.

Twój profesor ekonomii wspomniał o przedstawieniu uczniom problemu i zmuszeniu go do rozwiązania go w pierwszej kolejności, co jest dobrą techniką edukacyjną, ale miał rozwiązanie, aby im to pokazać. Posiadanie wielu rozwiązań wielu różnych problemów w twojej głowie jest dobrą rzeczą, a takie właśnie są Wzory projektowe. Myślę, że pod pewnymi względami zawodzi (Singleton zachęcający do złych podejść, krótkowzroczny nacisk na imperatywne OO itp.), Ale można go dobrze wykorzystać z inteligencją i gustem. Błędem jest jednak myśleć, że każde możliwe przykładowe rozwiązanie w oprogramowaniu musi być oficjalnym wzorcem projektowym.

Jeśli spojrzysz na problem i zadajesz sobie pytanie „Jaki jest wzorzec projektowy?”, To robisz to źle i mniej prawdopodobne jest, że zobaczysz rozwiązanie, które wpatruje się w ciebie.

Jeśli spojrzysz na problem i zadajesz sobie pytanie: „Jak mogę to rozwiązać?”, To jeśli istnieje rozwiązanie nieszablonowe, zobaczysz je, a jeśli istnieje pasujący wzór, również to zobaczysz.

Michael Shaw
źródło
10

Myślę też, że twój profesor ekonomii ma rację i to jest sposób na nauczenie się czegokolwiek w pierwszej kolejności; Spójrzmy jednak na to tak: czy zachowałbyś Koło w tajemnicy i pozwoliłby wszystkim je wynaleźć na nowo, ze względu na kreatywność ? Oczekuję, że powiesz „Nie”, ponieważ nie wszyscy ludzie są stworzeni / zdolni do wynalezienia swoich kół - a jeśli tak, zrobią to w pewnym momencie, nie ma znaczenia, czy są świadomi istnienia koła lub nie.

Wróćmy do programistów; Z dnia na dzień jestem programistą, więc MVC jest jedną z tych rzeczy, z którymi codziennie wchodzę w interakcje. Kilka razy próbowałem zbudować własne struktury, wiele się nauczyłem, ale wszystkie zakończyły się niepowodzeniem. Starałem się jak najlepiej, ale co by się stało, gdyby nie było MVC? Cóż, prosty, mój kod źródłowy jest do kitu - pod względem niezawodności, łatwości konserwacji i rozszerzalności.

Myślę, że dla większości z nas to samo. Jeśli nikt nie mówi ci o DI - jako dobrej praktyce, to ile aplikacji korporacyjnych powinno się zmagać lub nie działać, dopóki ich programiści nie nauczą się tej lekcji?

Drugi punkt to standardy branżowe . Jeśli nie nauczysz MVC programistów internetowych, czy jesteś gotowy stawić czoła wszystkim niestandardowym strukturom, które musisz poświęcić trochę czasu, aby najpierw nauczyć się, jak to robić, a potem zdajesz sobie sprawę, że niektóre z tych struktur mogą masz dobry pomysł, ale większość z nich będzie miała poważne wady projektowe, które mogą mieć poważne konsekwencje dla twojego projektu oprogramowania - nawet dobrze znane frameworki wciąż zmagają się z wadami projektowymi od czasu do czasu.

Ale co by się stało, gdybyśmy mieli te wszystkie fajne pomysły i połączyli je wszystkie, a ci inteligentni programiści wzięli dobre rzeczy z tych wszystkich eksperymentów i stworzyli naprawdę fajną strukturę, która najlepiej pasuje do tego konkretnego problemu? Właśnie utworzyłeś wzorce projektowe . Jeśli jesteś żywym stworzeniem, nie ma innej możliwości; Nawet zwierzęta stosują najlepsze praktyki i wzorce projektowe w swoim codziennym życiu.

Mahdi
źródło
3
„Dużo się nauczyłem, ale wszystkie zakończyły się niepowodzeniem. Starałem się jak najlepiej, ale co by się stało, gdyby nie było MVC? Cóż, prosty, mój kod źródłowy jest do bani” - słowa z litego złota!
ankush981
5

Nie wymyślaj na nowo młotka, ale nie traktuj każdego problemu jak gwoździa

Wzorce programowania są świetną oszczędnością czasu, ponieważ zapewniają gotowe rozwiązania, dobrze udokumentowane i przetestowane ze średnimi przypadkami, o których łatwo zapomnieć. Ale musisz się nauczyć (i pomyśleć), kiedy z nich korzystać.

Parafrazując pytanie: czy nauka jazdy sprawiłaby, że poruszam się szybciej, czy po prostu chodzę wolniej?

Nauka korzystania ze wzorca programowania nie oznacza, że ​​nie powinieneś ćwiczyć znajdowania własnych rozwiązań. Nadal będzie wystarczająco dużo problemów, aby wykorzystać swoją kreatywność. Znajomość wzorców programowania pozwoli ci tylko szybko rozwiązać znane problemy i skoncentrować się na tych, które są mniej trywialne.

Wracając do drugiej części pytania - czy twój profesor ma rację?

Tak, ma rację . Podstawowym celem studiów jest nauczenie studentów myślenia . Muszą spróbować znaleźć własne rozwiązania problemu, a następnie skonfrontować je z istniejącymi rozwiązaniami. Tylko w ten sposób mogą je naprawdę zrozumieć. Jeśli najpierw nauczysz się wzorców, ryzykujesz, że nauczą się tylko mechanicznie, aby je zastosować, a nie zrozumieć, co jest za nimi.

To jest powód, dla którego najpierw uczysz studentów programowania, a wzorce są wprowadzane w kolejnych semestrach.

Żeglarz dubajski
źródło
5

Absolutnie odradzam nauczanie programowania, ucząc wzorców projektowych. Nie można ich dobrze zastosować bez zrozumienia zasad leżących u ich podstaw, dlatego nauczanie tych zasad jest o wiele ważniejsze.

Wydaje mi się, że wzorce projektowe i tak nie są tak cenne dla pracujących programistów. Jeśli w pełni rozumiesz zasady związane z danym wzorcem projektowym, to w sytuacji, gdy jest to dobre rozwiązanie, naturalnie i tak skonstruujesz go (lub coś podobnego) oczywiście, nawet jeśli nie wiedziałeś że był to wzór z imieniem. Niezależnie od tego, jaki czas poświęcisz na naukę wzorców, lepiej poświęcić na naukę myślenia o kodzie w ogóle. Jeśli twoje umiejętności „rozwiązywania problemów w ogólności” nie są do zera, to nie możesz napisać dobrego kodu, bez względu na to, jak dobrze potrafisz zastosować pewien zestaw wzorców. A jeśli twoje umiejętności „ogólnego rozwiązywania problemów” są dobre, możesz rozwiązać problemy, nawet jeśli nie znasz żadnego wzorca.

Myślę też, że w idealnym świecie nie byłoby mieć jakieś wzorce projektowe, ponieważ idee wspólne wystarczy nazwać wzór by wszystko się dobrze realizowane w bibliotekach i chcemy być rzeczywiście ponowne wykorzystanie kodu zamiast stale przepisanie go. Wyobraź sobie, że istnieje „wzorzec projektowania wyrażeń regularnych”, który wymagałby wdrożenia małego silnika wyrażenia regularnego za każdym razem, gdy chciałeś go użyć. Wzorce projektowe to tylko biblioteki, których nie można napisać, ponieważ język nie zapewnia odpowiednich funkcji abstrakcji.

To właściwie kolejny powód, by nie przejmować się nimi tak bardzo; nie są one wcale tak uniwersalne, jak się czasem twierdzi, ale w rzeczywistości są bardzo silnie powiązane ze szczególnymi sposobami strukturyzacji programów, na które zezwala / zachęca dany język. Książka wzorców projektowych napisana dla Pythona byłaby zupełnie inna niż książka napisana dla Javy, a nawet bardziej odmienna od książki napisanej dla języka, który nie jest konieczny, takiego jak Haskell. Lepiej zrozumieć na głębszym poziomie, a będziesz w stanie samodzielnie odkryć wzorce projektowe w dowolnym języku, który znasz.

Ben
źródło
Hmm, interesująca odpowiedź. Ale słyszę, że wywiady programistyczne są bardzo obciążające wzorce projektowe. Dlaczego miałoby tak być, gdyby ich wartość była niewielka?
ankush981
@dotslash Z tego samego powodu, dla którego testy IQ są ciężkie w matematyce / logice: mają pewną wartość i są łatwe do przetestowania. To powiedziawszy, podczas mojej pracy jako programista nie spotkałem ich aż tak często w wywiadach; Jestem Australijczykiem, więc może jest różnica w modzie.
Ben
Ale czy nauka wzorców projektowych nie jest świetnym sposobem na zobaczenie konkretnych przykładów myślenia o kodzie? Na jakie rzeczy chciałbyś się nauczyć, jak myśleć o kodzie, jeśli nie o problemach + ogólne rozwiązania, które rozwiązują problemy i przykładowy kod, który implementuje rozwiązanie?
Amy Blankenship
@Am Tak, ale istnieje duża różnica między „oto problem, oto rozwiązanie, oto jak go wymyśliłem” i „oto wzór, zapamiętaj go, abyś mógł zastosować go do tych problemów w przyszłości”. Chcesz nauczyć umiejętności generowania rozwiązań, ponieważ wzorce mogą mieć zastosowanie tylko przez pewien czas, więc będą potrzebować tej umiejętności bez względu na liczbę znanych im wzorców. Gdybym prowadził kurs zawierający wzorce, prawdopodobnie zrobiłbym to, ustawiając ćwiczenia zaprojektowane tak, aby uczniowie sami zauważyli , że w rozwiązaniach do ćwiczeń były wspólne koncepcje.
Ben
Doskonała odpowiedź. Najlepsze środowisko programistyczne zawierałoby najciekawsze wzorce w bibliotekach lub językach, uwalniając programistów do pracy na wyższym poziomie. Podoba mi się też kwestia zależności językowych; wiele typowych wzorców projektowych jest obecnie przestarzałych.
Frank Hileman
3

Handel i edukacja mają różne cele. Gdybym uczył uczniów wzorców projektowych, przyjąłbym to samo podejście. Ale w środowisku produkcyjnym czas i wydajność są wszystkim.

Co więcej, (makro) ekonomia poza klasą to inna sprawa. Czy widzisz rządy mówiące: „Łał! Teraz jesteśmy bardzo znudzeni robieniem podatków i tak samo, więc spróbujmy teraz czegoś bardzo szalonego”. Nie, nie wiesz, ponieważ takie dzikie eksperymenty mogą zniszczyć gospodarkę nie do naprawienia. Zamiast tego mają tendencję do trzymania się sprawdzonych metod: podwyższania stóp procentowych, ogłaszania świąt podatkowych itp. Innymi słowy, opierają się na wzorach projektowych.

ankush981
źródło
1

Odpowiedź brzmi oczywiście: tak.

Wzory projektowe same w sobie są wspaniałym narzędziem do nauki, o ile poświęca się czas na zastanowienie się, jak działają i dlaczego wnoszą wartość, którą wnoszą.

Mogą również być świetnymi środkami zwiększającymi produktywność, przyspieszając proces projektowania, ponieważ zapewniają znane rozwiązania stale pojawiających się problemów.

Jeśli jednak za bardzo zwarciowo projektują lub ludzie stają się dogmatyczni i nadmiernie precyzyjni w kwestii ich zastosowania, wówczas mają odwrotny skutek.

Obrabować
źródło
3
są okropnymi narzędziami dydaktycznymi do nauczania programowania (a nie projektowania). Prowadzą one do tak powszechnego pytania na forach internetowych: „w jaki sposób mogę wdrożyć XXX przy użyciu wzorca YYY”, co jest niewłaściwym pytaniem, pytanie powinno brzmieć (kiedy chcesz wymusić wzorce) „jakie wzorce byłyby odpowiednie za wdrożenie XXX ”.
jwenting
1
lol Powiedziałem narzędzie do nauki, a nie narzędzie do nauczania - jeśli ktoś chce się uczyć;)
Rob
-2

Wzory projektowe są oczywiście mniej kreatywne. To jest cały pomysł. Kreatywność to rzadki zasób. Nie należy marnować go na problemy, które nie wymagają kreatywności. Jest to o wiele łatwiejsze, szybsze i bardziej prawdopodobne, że rozwiążesz problem w taki sam sposób, jak setki programistów przed sobą. Nudny, nieciekawy kod, który wykonuje swoją pracę, jest w rzeczywistości dobry.

gnasher729
źródło
2
czy to tylko Twoja opinia, czy możesz jakoś to zrobić?
komar