디자인 패턴 Stifle Creativity


21

몇 년 전 저는 경제학 교수와 디자인 패턴, 프로그래머가 공통 언어를 설정하는 방법, 잘 알려진 문제를 어떻게 잘 해결했는지 등에 대해 이야기했습니다.

그리고 나서 그는 이것이 경제학 학생들에게 사용하는 것과 정반대의 접근법이라고 내게 말했습니다. 그는 일반적으로 문제를 제시하고 먼저 해결책을 찾도록 요청했습니다. 그래서 먼저 문제에 대해 생각하고 먼저 문제를 해결하는 방법을 찾도록 시도한 후에야 "고전적인"해결책을 제시했습니다.

그래서 "디자인 패턴"접근 방식이 실제로 프로그래머를 더 똑똑하거나 어리석게 만드는 것이라고 생각했습니다. 새롭고 혁신적인 방법.

어떻게 생각해?


5
패턴 의 소프트웨어 아키텍처 개념이 확립 된 패턴 언어 (wikipedia 기사가 아닌 책)를 읽는 것이 좋습니다 . 그들은 그렇게 맞추기 위해 빌딩 블록이나 직소 퍼즐 조각이 아닙니다.

11
학습 / 교육은 수행과 다릅니다. 따라서 정말 훌륭한 CS 과정을 통해 컴파일러를 작성해야 할 수도 있습니다. 고용주에게 주문 처리 시스템을 위해 컴파일러를 작성해야한다고 제안한 경우 해고해야합니다.
James Anderson

2
디자인 패턴은 고전적인 솔루션이 아니라 여러 솔루션에 대한 접근 방식입니다.
jmoreno

1
가능한 디자인 패턴 복제 -사용합니까? -질문이 다르게 들릴 수 있지만 해당 질문에 대한 답변이이 경우에 적합합니다.
Doc Brown

2
나는 창의성에 대해 잘 모르지만, "이것은 어떤 패턴입니까?" 또는 "이 패턴이 있습니까?" 질문은 일부 개발자가 모든 패턴이 있다고 생각한다는 인상을줍니다.
JeffO

답변:


43

경제학 교수는 절대적으로 정확합니다.

소프트웨어 디자인 패턴은 주로 숙련 된 소프트웨어 개발자 가 서로 통신 있는 방법입니다 . 알려진 문제에 대한 기존 솔루션의 약어입니다.

그러나 패턴없이 문제를 해결하는 방법을 이해하거나 비슷한 패턴을 스스로 찾은 사람들 만 사용해야합니다. 그렇지 않으면 복사 / 붙여 넣기 코더와 동일한 문제가 발생합니다. 코드가 있지만 작동 방식을 이해하지 못하므로 문제를 해결할 수 없습니다.

또한 많은 디자인 패턴은 엔터프라이즈 패턴으로, 대규모 회사 소프트웨어 시스템 에서 사용하기위한 패턴입니다 . Inversion of Control 컨테이너의 경이를 배우면 대부분의 프로그램이 실제로 필요하지는 않지만 작성하는 모든 프로그램에서 컨테이너를 사용하려고 할 것입니다 (작은 프로그램에 의존성을 주입하는 더 좋은 방법이 있습니다) IoC 컨테이너가 필요하지 않습니다).

패턴을 배우십시오. 패턴과 적절한 사용법을 이해하십시오. 패턴없이 동일한 문제를 해결하는 방법을 알아야합니다 (모든 소프트웨어 패턴은 기본 알고리즘에 대한 추상화입니다). 그러면 소프트웨어 패턴이 적절할 때 자신있게 소프트웨어 패턴을 사용할 수 있습니다.


3
디자인 패턴을 사용하지 않고 아무도보고 싶지 않은 품질이 낮은 코드를 작성하는 개발자가 너무 많습니다. 패턴없이 문제를 해결하는 방법을 이해하는 사람들 만 사용해야한다는 데 동의하지 않습니다 ... 그것은 디자인 패턴의 요점입니다. 어떻게해야하는지 알면 왜 디자인 패턴을 찾아야합니까? 또한 다른 개발자가 디자인 패턴을 사용하지 않도록 강요하면 어떻게해야합니까? 그들은 자신의 아이디어로 실제 소프트웨어를 만들어 실패하고 새로운 것을 배워야합니까?
Mahdi

18
@Mahdi 많은 사람들이 동일한 솔루션을 찾으면이 솔루션을 패턴이라고합니다. 다른 방법은 아닙니다. 패턴을 보지 않고 솔루션으로 사용하지 않고 솔루션을보고 패턴을 찾습니다.
user253751

13
@Mahdi 저는 패턴 XXX 만 사용하는 경우 매번 완벽한 소프트웨어를 작성하고 (XXX는 마지막으로 읽은 내용 임) 모든 프로젝트를 적합하게 고문하는 방법을 벗어나는 초보자를 더 많이보고 있습니다. 그 패턴.
jwenting

5
@Mahdi : 문자 그대로 "패턴없이 문제를 해결하는 방법을 이해하는 사람들"이라는 문장을 받아들이지 마십시오. Robert는 반드시 "패턴을 사용할시기와 그렇지 않은시기에 대해 합리적인 결정을 내릴만큼 충분히 스테이크의 문제를 이해 한 사람들"을 의미합니다.
Doc Brown

2
@ 덩크 나는 잘 알려진 패턴 위에 창의적인 것을 시도하거나 처음부터 만들 수 있지만, 다른 많은 것들을 시도하고 각 패턴의 정확한 장단점을 이해 한 후에. 집에 가서 처음으로 집을 짓고 창의력을 발휘 해달라고 요청하면 처음에는 너무 복잡하기 때문에 단단한 것을 짓기 위해 그렇게 멀리 가지 않을 것입니다. 패턴을 사용하는 대신 창의력을 발휘하려면 이미 문제 자체에 대해 잘 알고 있어야하며 수년간의 경험을 거쳐야 얻을 수 있습니다.
Mahdi

21

사람들이 디자인 패턴을보고 싶어하는 방식은 비슷한 문제가 발생하는 경우 적용 할 수있는 일련의 솔루션입니다. 그들은 당신이 그들을 산 위에 돌판에 새겨진 모세에게 주신 유일한 해결책이라고 생각하기를 원하지 않습니다.

불행하게도, 어떤 사람들은 그것들을 배울 수있는 여러 가지 예시적인 디자인보다는 성서에 더 가까운 것으로 받아들입니다. 그것은 창의력을 죽이고화물 컬트를 설정합니다.

당신의 경제학 교수는 학생들에게 문제를 제시하고 그들이 먼저 해결하도록 노력하는 것을 언급했습니다. 이것은 훌륭한 교육 기법이지만, 그것을 보여줄 해결책이있었습니다. 당신의 머리에있는 많은 다른 문제들에 대한 많은 해결책을 갖는 것은 좋은 일이며, 그것은 Design Patterns가 시도하는 것입니다. 나는 그것이 어떤면에서 실패한다고 생각하지만 (Singleton은 나쁜 접근 방식, 명령 OO에 대한 근시 초점 등) 지능과 취향에 잘 사용될 수 있습니다. 그러나 소프트웨어의 모든 가능한 예제 솔루션은 반드시 공식적인 디자인 패턴이어야한다고 생각하는 것은 실수입니다.

문제를보고 "이것에 대한 디자인 패턴은 무엇입니까?"라고 스스로에게 물어 보면, 잘못하고있는 것입니다. 그리고 당신을 응시하는 해결책을 찾지 못할 것입니다.

문제를보고 "어떻게 해결할 수 있습니까?"라고 스스로에게 물어 보면 패턴이 아닌 솔루션이있는 경우이를 볼 수 있으며, 맞는 패턴이있는 경우에도 해당 패턴을 볼 수 있습니다.


10

또한 경제학 교수가 정확하다고 생각합니다. 이것이 처음부터 무엇이든 배울 수있는 방법입니다. 그러나 다음과 같이 봅시다 : 창의성을 위해 휠을 비밀로 유지하고 모두가 재창조하도록 하시겠습니까 ? 모든 사람들이 바퀴를 발명 할 수있는 것은 아니기 때문에 아니오라고 말할 것으로 기대합니다. 그렇다면 어느 시점에서 바퀴를 만들 것인지, 바퀴의 존재를 알고 있는지 여부는 중요하지 않습니다. 아니.

프로그래머에게 돌아가 봅시다. 나는 매일 웹 개발자이기 때문에 MVC는 내가 매일 상호 작용하는 것들 중 하나입니다. 여러 번 내 자신의 구조를 만들려고했지만 많은 것을 배웠지 만 기본적으로 모두 실패했습니다. 최선을 다했지만 MVC가 없으면 어떻게됩니까? 글쎄, 내 소스 코드는 신뢰성, 유지 보수성 및 확장 성 측면에서 짜증납니다.

나는 그것이 우리 대부분에게 동일하다고 생각합니다. 모범 사례로서 DI에 대해 아무도 말하지 않는다면 개발자가 교훈을 배울 때까지 얼마나 많은 엔터프라이즈 애플리케이션이 어려움을 겪거나 실패해야합니까?

두 번째 요점은 산업 표준 입니다. 웹 개발자에게 MVC를 가르치지 않으면 먼저 비표준 구조에 직면 할 준비가되었으므로 먼저 일을 수행하는 방법을 배우기 위해 시간을 소비해야합니다. 그런 다음 그 구조 중 일부는 좋은 아이디어를 가지고 있지만, 대부분은 소프트웨어 프로젝트에 심각한 결과를 초래할 수있는 심각한 디자인 결함이있을 수 있습니다. 잘 알려진 프레임 워크도 여전히 디자인 결함으로 인해 어려움을 겪고 있습니다.

그러나 우리가 멋진 아이디어를 모두 모아서 함께 모아서 똑똑한 개발자가 모든 실험에서 좋은 것을 취하고 특정 문제에 가장 적합한 정말 멋진 구조를 만들면 어떻게 될까요? 그런 다음 디자인 패턴을 만들었습니다 . 당신이 살아있는 생물이라면, 다른 방법은 없습니다. 동물조차도 일상 생활에서 모범 사례와 디자인 패턴을 따릅니다.


3
"많은 것을 배웠지 만 그들 모두는 기본적으로 실패했습니다. 최선을 다했지만 MVC가 없으면 어떻게 될까요? 음, 간단하고, 소스 코드가 빨라요"– 순금의 단어!
ankush981

5

망치를 재발 명하지 말고 모든 문제를 못처럼 다루지는 마십시오.

프로그래밍 패턴은 즉시 사용할 수있는 솔루션을 제공하고 쉽게 문서화하고 쉽게 잊을 수있는 일반적인 사례로 테스트했기 때문에 시간을 절약 할 수 있습니다. 그러나 언제 사용해야하는지 배우고 생각해야합니다.

당신의 질문을 역설 : 운전을 배우는 것이 나를 더 빨리 움직이게합니까, 아니면 천천히 걷습니까?

프로그래밍 패턴을 사용하는 방법을 학습한다고해서 자체 솔루션을 찾는 연습을해서는 안된다는 의미는 아닙니다. 창의력을 발휘하기에는 여전히 충분한 문제가있을 것입니다. 프로그래밍 패턴을 아는 것은 잘 알려진 문제에 빠르게 대처하고 사소한 문제에 집중할 수있게합니다.

당신의 질문의 두 번째 부분으로 돌아 가기-당신의 교수가 맞습니까?

네, 그렇습니다 . 연구의 주요 목표는 학생들이 생각 하는 것을 배우는 것 입니다. 문제에 대한 자신의 솔루션을 찾은 다음 기존 솔루션과 직면해야합니다. 그런 식으로 만 그들은 정말로 그들을 이해할 수 있습니다. 패턴을 먼저 배우면, 그 뒤에 무엇이 있는지 이해하지 못하고 기계적으로 적용하는 것만 기계적으로 배울 위험이 있습니다.

이것이 학생들에게 처음으로 프로그램을 가르치는 이유이며, 패턴은 다음 학기에 소개됩니다.


5

디자인 패턴을 교육함으로써 프로그래밍 교육에 대해 절대적으로 조언합니다. 배후의 원리를 이해하지 않고는 제대로 적용 할 수 없으므로 해당 원리를 가르치는 것이 훨씬 중요합니다.

어쨌든 디자인 패턴이 실제로 프로그래머에게 가치있는 것은 아니라고 생각하는 경향이 있습니다. 주어진 디자인 패턴과 관련된 원칙을 완전히 이해한다면, 좋은 솔루션 인 상황에서는 당연히 알지 못하더라도 당연히 그 개념을 구성하는 경향이 있습니다. 그것은 이름을 가진 패턴이었다. 패턴을 배우는 데 시간이 오래 걸리면 일반적으로 코드에 대해 생각하는 방법을 배우는 것이 좋습니다. "일반적인 문제 해결"기술이 처음부터 다뤄지지 않은 경우, 패턴 세트를 얼마나 잘 적용하더라도 좋은 코드를 작성할 수 없습니다. "일반적인 문제 해결"기술이 우수하면 단일 패턴을 모르더라도 문제를 해결할 수 있습니다.

또한 이상적인 세계에 존재하지 않을 것이라고 생각 아이디어 일반적인만큼이 패턴이 모든 라이브러리에서 잘 구현 될 것이며, 우리가 실제로 할 것이라고 할 수 있기 때문에, 어떤 디자인 패턴 재사용 지속적으로 코드를 대신 재 작성 을. "정규 표현식 디자인 패턴"이 있다면, 사용할 때마다 작은 정규식 엔진을 구현해야한다고 상상해보십시오. 디자인 패턴은 언어가 올바른 추상화 기능을 제공하지 않기 때문에 작성할 수없는 라이브러리 일뿐입니다.

그것이 실제로 그들에 대해 크게 신경 쓰지 않는 또 다른 이유입니다. 그것들은 때때로 주장되는 것만 큼 보편적 인 곳은 아니지만, 실제로 특정 언어가 허용 / 장려하는 프로그램을 구성하는 특정 방법과 매우 밀접한 관련이 있습니다. Python으로 작성된 디자인 패턴 책은 Java 용으로 작성된 책과 완전히 다르며 Haskell과 같은 비 제한적 언어로 작성된 책과는 훨씬 다릅니다. 더 깊은 수준에서 이해하는 것이 더 좋으며, 익숙한 모든 언어로 디자인 패턴을 직접 발견 할 수 있습니다.


흠, 흥미로운 답변입니다. 그러나 프로그래밍 인터뷰는 디자인 패턴이 무겁다 고 들었습니다. 그들에게 가치가 거의 없다면 왜 그런 것입니까?
ankush981

IQ 테스트는 수학에 무거운 / 논리를 것을 같은 이유로 @dotslash : 그들이 가지고있는 몇 가지 값을 그들이 시험에 쉽다. 즉, 프로그래머로서의 구직에서 나는 인터뷰에서 그렇게 많이 만나지 않았다. 나는 호주인이므로 패션에 차이가있을 수 있습니다.
Ben

그러나 디자인 패턴에 대해 배우는 것이 코드를 생각하는 방법에 대한 구체적인 예를 보는 좋은 방법이 아닙니까? 문제가 아닌 경우 코드 + 문제를 해결하는 일반적인 솔루션 및 솔루션을 구현하는 예제 코드에 대해 생각하는 방법을 배우기 위해 어떤 것들을 살펴볼 것입니까?
Amy Blankenship

@Amy 예, 그러나 "문제가 있습니다. 여기에 해결책이 있습니다. 여기에 제가 어떻게 생각해 냈는지"와 "패턴이 있습니다. 기억해 두십시오. 나중에 이러한 문제에 적용 할 수 있습니다". 패턴은 시간의 일부만 적용 할 수 있기 때문에 솔루션 을 생성 하는 능력을 가르치고 싶어 하므로 패턴 수에 관계없이 해당 기능이 필요합니다. 패턴을 포함한 과정을 가르치는 경우, 연습 솔루션에 공통된 개념이 있음을 학생들 이 스스로 알 수 있도록 고안된 연습을 설정 하여 수행 할 수 있습니다.
Ben

훌륭한 답변입니다. 최고의 프로그래밍 환경은 가장 흥미로운 패턴을 라이브러리 나 언어로 캡슐화하여 개발자가 더 높은 수준에서 작업 할 수 있도록합니다. 언어 의존성에 대한 요점도 좋아합니다. 많은 일반적인 디자인 패턴이 실제로는 더 이상 사용되지 않습니다.
Frank Hileman

3

상업과 교육의 목표는 다릅니다. 학생들에게 디자인 패턴을 가르치고 있다면 같은 방식으로 접근 할 것입니다. 그러나 프로덕션 환경에서는 시간과 효율성이 가장 중요합니다.

또한, 교실 밖에서의 (매크로) 경제학은 다릅니다. 당신은 정부가 "누가! 이제 세금과 같은 방식으로 지루해하고 있으므로 이번에는 엉뚱한 무언가를 시도하자"고 말하는 것을 보십니까? 아니, 당신은 그런 야생 실험이 수리 이상의 경제를 산산조각 낼 수 있기 때문에 아닙니다. 대신, 이자율 상승, 세금 공고 발표 등과 같은 검증 된 접근 방식을 고수하는 경향이 있습니다. 즉, 디자인 패턴에 의존하고 있습니다.


1

대답은 물론입니다 : 예.

디자인 패턴은 작동 방식과 가치를 가져 오는 이유를 파악하는 데 시간이 걸리는 한 훌륭한 학습 도구입니다.

또한 항상 발생하는 문제에 대해 친숙한 솔루션을 제공하기 때문에 설계 프로세스를 빠르게 추적하여 생산성을 높일 수 있습니다.

그러나, 회로 설계가 너무 많이 단락되거나 사람들이 독단적으로 사용하여 사용에 대해 지나치게 정밀하게되면 반대의 효과가 있습니다.


3
그들은 (디자인이 아닌) 프로그래밍을 가르치기위한 끔찍한 교육 도구입니다. 그들은 "YYY 패턴을 사용하여 XXX를 어떻게 구현할 수 있습니까?"라는 인터넷 포럼에서 매우 일반적인 질문으로 이어집니다. XXX를 구현하기 위해 "
jwenting

1
lol 나는 도구를 가르치는 것이 아니라 학습 도구라고 말했다-배우고 싶다면;)
Rob

-2

디자인 패턴은 물론 창의성이 떨어집니다. 그게 전부입니다. 창의력은 희소 한 자원입니다. 창의성을 필요로하지 않는 문제로 낭비해서는 안됩니다. 이전에 수백 명의 개발자와 같은 방식으로 문제를 해결하면 훨씬 쉽고 빠르며 작동하기 쉽습니다. 작업을 수행하는 지루하고 흥미 진진한 코드가 실제로 좋습니다.


2
이것이 당신의 의견일까요, 아니면 어떻게 든 백업 할 수 있습니까?
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.