Делают ли шаблоны дизайна подавление творчества

21

Много лет назад я разговаривал с профессором экономики о шаблонах проектирования, о том, как они устанавливают общий язык для программистов и как они хорошо решают известные проблемы и т. Д. И т. Д.

Затем он сказал мне, что это совершенно противоположный подход, который он использовал бы для своих студентов-экономистов. Обычно он представлял проблему и просил их сначала найти решение, чтобы они могли сначала подумать об этом и сначала попытаться найти способы решения проблемы, и только после этого он представил «классическое» решение.

Так что я подумал, действительно ли подход «шаблона проектирования» действительно делает программистов умнее или тупее, поскольку они часто просто получают «правильное решение этой проблемы», а не используют творческий подход и воображение для решения какой-то проблемы в новый и инновационный способ.

Как вы думаете?

Лео
источник
5
Я бы предложил прочитать «Язык шаблонов» (книгу, а не статью в Википедии), на которой основаны концепции шаблонов в архитектуре программного обеспечения. Они не являются строительными блоками или кусочками мозаики, которые можно просто соединить.
11
Обучение / обучение отличается от занятий. Таким образом, действительно хороший курс по CS может позволить вам написать компилятор - если вы предложите своему работодателю, что вам нужно написать компилятор для его системы обработки заказов, вы / должны быть уволены.
Джеймс Андерсон
2
Я не думаю, что они обязательно сопоставимы - шаблоны проектирования - это не классическое решение, а подход ко множеству решений.
Jmoreno
1
возможно дублирование шаблонов дизайна - вы их используете? - вопрос может звучать иначе, но ответы на этот вопрос хорошо подходят для этого случая.
Док Браун
2
Я не знаю о творчестве, но множество "Что это за образец?" или "Есть шаблон для этого?" Вопросы создают впечатление, что некоторые разработчики думают, что есть образец для всего.
JeffO

Ответы:

43

Ваш профессор экономики абсолютно прав.

Шаблоны проектирования программного обеспечения - это, прежде всего, способ для опытных разработчиков программного обеспечения общаться друг с другом . Они являются сокращением для устоявшихся решений известных проблем.

Но их должны использовать только люди, которые понимают, как решить проблему без шаблона, или придумали аналогичный шаблон самостоятельно. В противном случае они будут иметь ту же проблему, что и кодер копирования / вставки; у них будет код, но они не поймут, как он работает, и поэтому не смогут его устранить.

Кроме того, многие из шаблонов проектирования являются шаблонами предприятия , шаблонами, которые предназначены для использования в больших корпоративных системах программного обеспечения. Если вы изучите чудеса контейнера Inversion of Control, вы захотите использовать его в каждой написанной вами программе, даже если большинству программ это не нужно (есть более эффективные способы внедрения зависимостей в меньшие программы, чем не требуется контейнер IoC).

Изучите шаблоны. Понять шаблоны и их правильное использование. Знать, как решить ту же проблему без шаблона (все программные шаблоны являются абстракциями над фундаментальными алгоритмами). Тогда вы сможете уверенно использовать шаблоны программного обеспечения, когда это имеет смысл.

Роберт Харви
источник
3
Я почти уверен, что есть так много разработчиков, что без использования шаблонов проектирования они будут писать такой некачественный код, что никто даже не захочет на него смотреть. Я не согласен с тем, что он должен использоваться ТОЛЬКО людьми, которые понимают, как решить проблему без шаблона ... Для меня это весь смысл шаблона проектирования; Если я знал, как это сделать, почему я должен идти по шаблону дизайна? И что должны делать другие разработчики, если мы заставим их не использовать шаблон проектирования? Они должны сделать реальное программное обеспечение со своими идеями и позволить ему провалиться, а затем узнать что-то новое?
Махди
18
@ Махди, когда много людей находят одно и то же решение, это решение называется шаблоном. Это не наоборот - вы не смотрите на шаблоны и используете их в качестве решений, вы смотрите на решения и находите шаблоны.
user253751
13
@Mahdi Я вижу гораздо больше начинающих, которые думают, что если только они используют шаблон XXX, они будут каждый раз создавать идеальное программное обеспечение (где, конечно, XXX - то, о чем они читали в последний раз), а затем изо всех сил пытать каждый проект в соответствии этот шаблон.
jwenting
5
@Mahdi: не воспринимайте предложение «людьми, которые понимают, как решить проблему без шаблона» слишком буквально. Роберт наверняка имеет в виду «людей, которые достаточно хорошо поняли проблему, чтобы принять разумное решение о том, когда использовать шаблон, а когда нет».
Док Браун
2
@ Данк Я могу попробовать что-то креативное на вершине хорошо известного паттерна, или я могу сделать это с нуля, но после того, как попробую кучу других вещей и пойму, каковы точные плюсы и минусы каждого паттерна. Если вы попросите меня пойти и построить дом в первый раз и просто сказать мне, чтобы я был креативным, то я не пойду так далеко, чтобы построить что-то солидное, просто потому, что это слишком сложно, во-первых. Если вы хотите быть креативным, а не использовать шаблон, у вас уже должно быть четкое понимание самой проблемы, и вы получите ее только после многолетнего опыта ...
Mahdi
21

Люди с шаблонами проектирования хотят, чтобы вы смотрели на шаблоны проектирования, - это набор решений, которые вы можете применить, если возникнут похожие проблемы. Они не хотят, чтобы вы думали о них как о единственно возможных решениях, данных Богом Моисею, высеченному в каменных скрижалях на горе.

К сожалению, некоторые люди воспринимают их как нечто более близкое к священному писанию, чем к куче примеров проектов, из которых можно извлечь уроки. Это убивает креативность и создает культ груза.

Ваш профессор экономики упомянул, что нужно представить студентам проблему и попросить их сначала решить ее, что является хорошей методикой обучения, но у него было решение показать их. Хорошо иметь в голове кучу решений для множества разных проблем, и это то, что пытается сделать Design Patterns. Я думаю, что в некотором смысле это не удается (Синглтон поощряет плохие подходы, близорукий акцент на императивных ОО и т. Д.), Но его можно использовать с умом и вкусом. Однако ошибочно думать, что каждое возможное примерное решение в программном обеспечении должно быть официальным шаблоном проектирования.

Если вы посмотрите на проблему и спросите себя: «Каков шаблон проектирования для этого?», То вы делаете это неправильно, и у вас будет меньше шансов увидеть решение, которое смотрит вам в лицо.

Если вы посмотрите на проблему и спросите себя: «Как я могу решить эту проблему?», То, если есть решение, не основанное на шаблонах, вы увидите его, и если есть шаблон, который подходит, вы тоже это увидите.

Майкл Шоу
источник
10

Я также думаю, что ваш профессор экономики прав, и это способ научиться чему-либо в первую очередь; Однако давайте посмотрим на это так: вы бы сохранили Колесо в тайне и позволили бы всем заново его изобрести, ради Творчества ? Я ожидаю, что вы скажете «Нет», потому что не все люди созданы / способны изобрести свои колеса - и если они это сделают, они это сделают в какой-то момент, независимо от того, знают ли они о существовании колеса или не.

Вернемся к программистам; Я веб-разработчик днем, поэтому MVC - это одна из тех вещей, с которыми я ежедневно общаюсь. Несколько раз я пытался построить свои собственные структуры, я многому научился, но все они были в основном неудачными. Я старался изо всех сил, но что случилось бы, если бы там не было никакого MVC? Ну, просто, мой исходный код отстой - с точки зрения надежности, ремонтопригодности и расширяемости.

Я думаю, что это то же самое для большинства из нас. Если никто не говорит вам о DI - как хорошая практика, то сколько корпоративных приложений должно бороться или терпеть неудачу, пока их разработчики не усвоят урок?

Второй момент - отраслевые стандарты . Если вы не будете учить MVC веб-разработчикам, то готовы ли вы столкнуться со всеми этими нестандартными структурами, с которыми вам нужно потратить некоторое время, чтобы сначала изучить их способ работы, а затем вы понимаете, что некоторые из этих структур могут У меня есть хорошая идея, но у большинства из них будут серьезные недостатки дизайна, которые могут иметь серьезные последствия для вашего программного проекта - даже хорошо известные фреймворки все еще время от времени борются с недостатками дизайна.

Но что произойдет, если у нас появятся все эти хорошие идеи и соберем их все воедино, и эти умные разработчики возьмут все хорошее из всех этих экспериментов и создадут действительно классную структуру, которая лучше всего подходит для этой конкретной проблемы? Тогда вы только что создали шаблоны проектирования . Если вы живое существо, то другого пути нет; Даже животные следуют передовым методам и моделям дизайна в своей повседневной жизни.

мессия
источник
3
«Я многому научился, но все они в основном не увенчались успехом. Я старался изо всех сил, но что бы произошло, если бы не было MVC там? Ну, просто, мой исходный код отстой» - слова из чистого золота!
ankush981
5

Не изобретайте молоток, но не относитесь к каждой проблеме как к гвоздю

Шаблоны программирования значительно экономят время, потому что они дают вам готовые к использованию решения, хорошо документированы и протестированы со средними случаями, о которых вы легко можете забыть. Но вам нужно научиться (и подумать), когда их использовать.

Перефразируя ваш вопрос: заставит ли меня учиться водить быстрее или просто ходить медленнее?

Изучение того, как использовать шаблон программирования, не означает, что вы не должны заниматься поиском собственных решений. По-прежнему будет достаточно проблем, чтобы проявить свою креативность. Знание шаблонов программирования позволит вам быстро справиться с хорошо известными проблемами и сосредоточиться на тех, которые менее тривиальны.

Возвращаясь ко второй части вашего вопроса - ваш профессор прав?

Да, он прав . Основная цель обучения - научить студентов мыслить . Им нужно попытаться найти собственные решения проблемы, а затем сопоставить их с существующими решениями. Только так они могут их понять. Если вы сначала изучите их шаблоны, вы рискуете, что они научатся применять их только механически, а не понимать, что стоит за ними.

Это причина, по которой вы сначала учите студентов программировать, а шаблоны будут представлены в следующих семестрах.

Дунайский моряк
источник
5

Я бы совершенно не советовал преподавать программирование, обучая шаблонам проектирования Вы не можете применять их хорошо, не понимая принципы, лежащие в их основе, поэтому обучение этим принципам гораздо важнее.

Я склонен думать, что шаблоны проектирования на самом деле не так уж и ценны для работающих программистов. Если вы полностью понимаете принципы, используемые в данном шаблоне проектирования, то в ситуации, когда это хорошее решение, вы, естественно, будете склонны создавать его (или что-то подобное) в любом случае, как само собой разумеющееся, даже если вы не знали что это был шаблон с именем. Какое бы время вы ни потратили на изучение шаблонов, лучше потратить время на изучение того, как думать о коде в целом. Если ваши навыки «решения проблем в целом» не на пустом месте, то вы не сможете написать хороший код, независимо от того, насколько вы хороши в применении некоторого набора шаблонов. И если ваши навыки «решения проблем в целом» хороши, то вы можете решать проблемы, даже если вы не знаете ни одного паттерна.

Я также думаю, что в идеальном мире не было бы никаких шаблонов проектирования, потому что идеи, достаточно общие для того, чтобы называться шаблоном, были бы хорошо реализованы в библиотеках, и мы бы фактически использовали код вместо того, чтобы постоянно переписывать его. Представьте, что существует «шаблон проектирования регулярных выражений», который требует от вас внедрения небольшого движка регулярных выражений каждый раз, когда вы захотите его использовать. Шаблоны проектирования - это просто библиотеки, которые не могут быть написаны, потому что язык не предоставляет правильных средств абстракции.

На самом деле это еще одна причина, по которой они не очень заботятся; они не настолько универсальны, как иногда утверждают, но на самом деле очень сильно связаны с конкретными способами структурирования программ, которые позволяет / поощряет определенный язык. Книга шаблонов проектирования, написанная для Python, будет полностью отличаться от книги, написанной для Java, и даже более отличаться, чем книга, написанная для неимперативного языка, такого как Haskell. Лучше понять на более глубоком уровне, и вы сможете самостоятельно находить шаблоны проектирования на любом языке, с которым знакомы.

Бен
источник
Хм, интересный ответ. Но я слышал, что интервью по программированию сильно зависит от шаблонов дизайна. С чего бы это, если бы в них было мало ценности?
ankush981
@dotslash По той же причине, по которой тесты IQ тяжелы по математике / логике: они имеют определенную ценность и их легко тестировать. Тем не менее, в моей работе в качестве программиста я не сталкивался с ними во время собеседований; Я австралиец, поэтому, может быть, есть разница в моде.
Бен
Но разве изучение шаблонов проектирования не является отличным способом увидеть конкретные примеры того, как думать о коде? Что бы вы посмотрели, чтобы узнать, как думать о коде, если не о проблемах + общих решениях, которые решают проблемы, и о примере кода, который реализует решение?
Эми Бланкеншип
@ Эми Да, но есть большая разница между «вот проблема, вот решение, вот как я придумал это» и «вот шаблон, запомните его, чтобы вы могли применить его к этим проблемам в будущем». Вы хотите научить умению генерировать решения, потому что шаблоны могут применяться только иногда, поэтому им понадобится эта способность независимо от того, сколько шаблонов они знают. Если бы я преподавал курс, включающий шаблоны, я бы, вероятно, сделал это, установив упражнения, предназначенные для того, чтобы студенты сами заметили , что в решениях упражнений были общие понятия.
Бен
Отличный ответ. Лучшая среда программирования заключает в себе наиболее интересные шаблоны в библиотеках или языках, освобождая разработчиков для работы на более высоком уровне. Мне также нравится пункт о языковых зависимостях; многие распространенные шаблоны дизайна на самом деле устарели.
Фрэнк Хилман
3

Коммерция и образование преследуют разные цели. Если бы я обучал студентов шаблонам проектирования, я бы использовал тот же подход. Но в производственной среде время и эффективность - это все.

Более того, (макро) экономика вне классной комнаты - это совсем другое. Видите ли вы, как правительства говорят: «Ого! Теперь нам очень скучно делать налоги и все такое же, так что давайте попробуем что-нибудь сверхъестественное на этот раз»? Нет, нет, потому что такие дикие эксперименты могут разрушить экономику без возможности восстановления. Вместо этого они склонны придерживаться проверенных подходов: повысить процентную ставку, объявить налоговые каникулы и т. Д. Другими словами, они полагаются на шаблоны проектирования.

ankush981
источник
1

Ответ, конечно: да.

Шаблоны проектирования сами по себе являются замечательным инструментом обучения, если нужно время, чтобы понять, как они работают и почему они приносят ценность, которую они приносят.

Они также могут значительно повысить производительность, ускоряя процесс проектирования, поскольку они обеспечивают знакомые решения проблем, которые возникают постоянно.

Однако, если они слишком коротко замыкают конструкцию, или люди становятся догматичными и слишком точными в своем использовании, то они имеют противоположный эффект.

обкрадывать
источник
3
это ужасные инструменты для обучения программированию (а не дизайну). Они приводят к очень распространенному вопросу на интернет-форумах о том, «как я могу реализовать XXX с использованием шаблона YYY», - это неправильный вопрос, который должен быть задан (когда вы хотите использовать шаблоны), «какие шаблоны будут подходящими для реализации XXX ".
jwenting
1
LOL Я сказал инструмент обучения, а не инструмент обучения - если кто-то хочет учиться;)
Роб
-2

Шаблоны дизайна, конечно, менее креативны. Вот и вся идея. Творчество является дефицитным ресурсом. Вы не должны тратить его на проблемы, которые не требуют творчества. Это гораздо проще, быстрее и с большей вероятностью сработает, если вы решите проблему так же, как сотни разработчиков до вас. Скучный, неинтересный код, который делает свою работу, на самом деле хорош.

gnasher729
источник
2
это только ваше мнение или вы можете как-то это подтвердить?
комнат