디자인 패턴이 눈에 띄는가? 않기 때문에 악몽이되는

저는 20 년 동안 사업을해온 수석 개발자 중 한 명과 토론을했습니다. 그는 온타리오에서 자신이 작성한 블로그로 유명합니다.

이상한 것은 그가 나에게 말한 것입니다. 그는 교과서에서 작성되었으므로 실제 세계를 설명하지 않기 때문에 악몽이되는 코드가 있다고 말했습니다. UI / 데이터베이스 / 데이터 레이어에 새 필드를 추가하는 데 2-3 시간이 걸리지 만 코드에서는 30 분이 걸립니다.

또 다른 문제는 대부분의 프로그래머가 디자인 패턴을 이해하지 못하고 유지 관리 측면에서 좋지 않기 때문에 디자인 패턴을 피한다는 것입니다.

캐나다의 대부분의 웹 개발자는 데이터 모델을 격리하지 않고 데이터 계층 클래스에서 상속받는 것을 선호한다는 생각도 있습니다. “모델이 데이터 계층과 분리되는 것이 업계 표준이 아닙니까?” 그는 때때로 말했다. 그러나 대부분의 사람들은 너무 많은 일을하기 때문에 그렇게하지 않는 것을 선호한다.

모범 사례를 사용하여 코딩하지 않는 이유는 유지 관리의 악몽이기 때문에 직원 중 일부가 자신을 이해하지 못하고 며칠 안에 새로운 기능이나 필드를 푸시 해야하는 경우 작업 속도가 느리기 때문입니다. 시각.

Stack Overflow는 대부분 사람들이 업계 표준을 따르도록 권장한다는 점을 고려하면 이와 같은 의견을 듣는 것은 매우 이상합니다. 우리가 며칠 만에 새로운 분야와 기능을 끊임없이 끌어 내야 만하는 문제가 충분히 유연한 패턴을 추론하는 것이 불가능합니까? 이것이 내가 이해하는 것의 요지 인 것 같습니다.

이 진술에서 무엇을 만드십니까?



답변

이것들은 성공을 거둔 사람의 말이며, 자신이 이해하지 못하는 패턴 전문 용어로 무엇을해야하는지 말하는 사람들을 무시합니다.

디자인 패턴과 모범 사례는 동일하지 않습니다. 어떤 사람들은 자신을 생각하고 자신이하는 일을 알고있는 사람들을 몰아냅니다. 그들이하는 일에 대한 올바른 이름을 모르더라도.

디자인 패턴은 이름이 있기 전에 존재했습니다. 우리는 그들에게 이야기하기 쉽도록 이름을 지어주었습니다. 이름이있는 패턴은 좋은 것이 아닙니다. 그것을 인식 할 수 있게 만듭니다 .

이 녀석은 여러분 중 누구도 들어 본 적이없는 패턴을 사용했을 것입니다. 어떤 일이 어떻게되는지 그에게 이야기해야 할 때까지는 괜찮습니다. 그는 당신과 대화하는 법을 배워야하거나 당신과 대화하는 법을 배워야 할 것입니다. “옳은”사람과는 아무 상관이 없습니다.


답변

당신과 당신의 친구가 묘사하는 종류의 많은 디자인 패턴은 실제로 프로그래밍 언어의 결함에 대한 해결책입니다 . 보다 표현적인 프로그래밍 언어를 사용하면 이러한 디자인 패턴에 대한 필요성이 사라집니다.

가능한 많은 사용 시나리오를 충족시키기 위해서는 우수한 디자인 패턴이 필요하기 때문에 과도하게 엔지니어링되는 경향이 있습니다. 과도하게 엔지니어링 된 코드에는 비용이 발생합니다. 코드를 읽고, 수행하는 작업을 이해하고, 전체 소프트웨어 시스템의 맥락에서 작동하는 방식을 이해해야합니다. 결과적으로 다른 소프트웨어 개발 기술과 마찬가지로 기술 사용 비용과 비교하여 기술을 평가하고 이점이 비용을 초과하는지 결정해야합니다.

다른 모든 것들은 같고 코드는 적을수록 좋습니다. 나는 여러 프로젝트를 통해 문자 그대로 3-6 개의 홉을 만들어서 흥미로운 코드, 즉 실제로 오버 헤드를 추가하는 이외의 다른 것을 수행 하는 코드를 찾아야하는 계층 구조를 사용했습니다 .

잘 알려진 소프트웨어 패턴은 설계 전략을 전달할 수있는 공통 어휘를 제공합니다. 불행히도 많은 소프트웨어 개발자는 소프트웨어 패턴 어휘를 프로그래밍 문제에 적절히 적용 할만큼 충분히 이해하지 못합니다. 경험이 부족한 개발자는 이러한 패턴이 전문가 영역 내에있는 것으로 간주합니다. 그들은 전문가로 여겨지기를 원하므로 준비하기 전에 패턴을 너무 빨리 배우고 적용하려고합니다. 그들이 실제로해야하는 것은 프로그래밍의 기본 원리를 먼저 배우고 각 패턴이 스스로 해결하는 문제를 해결하는 것입니다. 이렇게하면 패턴을 올바르게 이해하고 적용 할 수있는 훨씬 나은 위치에있게됩니다.


답변

Stackoverflow.SE와 Programmers.SE는 대부분 업계 표준이 아닌 SOLID와 같은 모범 사례 를 따르도록 권장 합니다 . 그리고 믿거 나 말거나, 사실상의 업계 표준은 종종 “진흙의 큰 공” 아키텍처입니다.

그러나 귀하의 질문에 직접 대답하기 위해 : 디자인 패턴의 문제는 상속의 경우와 유사합니다. 많은 평범한 개발자가이를 과도하게 사용하여 과도하게 엔지니어링되고 유지하기 어려운 코드를 생성 할 위험이 있습니다. 그러나 이것에 대한 대답은 디자인 패턴 (또는 상속)의 사용을 완전히 피하거나 금지하는 것이 아니며, 대답은 의미가있는 상황에서만 이러한 도구를 사용하는 법을 배우는 것입니다. 그리고 이것은 “민첩한”작업과는 완전히 독립적입니다.


답변

  1. 디자인 패턴은 아이디어를 전달하는 데 사용되는 이름 일뿐입니다. 나는 종종 나 자신이 이름을 가진 것들을하는 것을 발견했다. 따라서, “비 디자인 패턴 방식”과 달리 “디자인 패턴 방식”은 없다.

  2. 디자인 패턴은 지침입니다. 모든 것과 마찬가지로 각각의 장단점이 있습니다. 핵심은 패턴을 배우고 그것이 맞는 곳에 적용하는 것이 아니라 패턴의 아이디어, 장점과 단점을 이해하고 문제 해결에 영감을주기 위해 사용하는 것입니다.

  3. 충분한 이유가있는 경우 모든 모범 사례 및 지침을 무시할 수 있습니다. 유효한 이유에는 개발 시간과 응용 프로그램의 기대치가 포함됩니다. 예를 들어, 값을 하드 코딩하는 것은 좋지 않지만 (어리석은 예) 개념 증명의 경우 이점이 비용보다 중요 할 수 있습니다 (이 경우 대부분 개발 시간). 그러나 이와 같은 결정이 내려지면 역효과가 발생할 수 있으며 어느 시점에서 리팩토링이 필요할 수 있습니다.


답변

수프에 또 다른 비유를 추가하기 위해 디자인 패턴은 Microsoft Office 도우미 인 Clippy입니다. “당신은 많은 것들에 대해 똑같은 일을하고있는 것 같습니다. 반복 자나 방문자를 제공함으로써 당신을 도울 수 있습니까?”

이러한 패턴을 잘 작성하면 이전에 여러 번 수행했던 것과 같은 방식으로 유용한 것이 언제 유용한 지, 처음 시도 할 때의 실수 및 이러한 실수를 피하기 위해 발견 된 일반적인 방법을 알 수 있습니다 . 따라서 디자인 패턴을 읽거나 메모리에서 검토 한 다음 작업을 시작합니다. 당신이 할 수없는 것은 Clippy와 마법사 사용하는 것입니다.

경험이없는 사람들이 실수를하고 현실을 고려하지 않는 코드를 작성할 수있는 곳은 디자인 패턴 목록이 소프트웨어의 문제를 해결하기위한 모든 가능한 접근 방식의 완전한 목록이라고 생각하고 디자인을 연결하여 코드를 디자인하려고하는 경우입니다 끝날 때까지 패턴. 야생에서 관찰 된 또 다른 열악한 전술은 디자인 패턴이 “모범 사례”라는 사실에 근거하여 디자인 패턴을 실제로 적합하지 않은 상황으로 끌어 올리는 것입니다. 아니요, 실제로 해결되는 문제 클래스에 대해서는 모범 사례 일 수도 있고 아닐 수도 있지만, 해결 하지 못한 문제 또는 더 간단한 솔루션이있을 때 불필요한 복잡성을 도입하여 해결해야하는 문제에 대해서는 최상의 사례가 아닙니다. .

물론 누군가가 YAGNI를 기반으로 패턴을 피할 수 있으며, 그것이 필요하다는 것을 깨닫고 정상적인 솔루션을 향해 모색하는 것이 가능합니다. 이는 일반적으로 처음부터 요구 사항을 실현하는 것보다 항상 나쁜 것은 아니며, 민첩한 개발에서도 완전히 예측 가능한 요구 사항이 조기에 발견되지 않으면 실망스러운 이유입니다. Java가 처음에는 일반 컨테이너를 불필요하게 복잡한 것으로 거부 한 다음 나중에 다시 볼트로 고정한다는 것을 매우 기쁘게 생각한 유일한 C ++ 프로그래머가 될 수 없었습니다.

따라서 디자인 패턴을 피하는 것을 선호하기 때문에 원칙적 으로 Iterator 작성하지 않는 것은 거의 실수 입니다.

UI / 데이터베이스 / 데이터 레이어에 새 필드를 추가하는 데 2 ​​~ 3 시간이 걸리며 코드에서 30 분이 걸립니다.

당신은 그것에 대해 실제로 논쟁 할 수 없습니다 :이 측정 항목에 의해 그의 디자인은 다른 것보다 훨씬 좋습니다. 그가 디자인 패턴을 피 했는지 여부 는 의심의 여지가 있지만, 디자인 할 때 올바른 “실제”문제를 고려했을 가능성이 높으며 경험상의 이점이 있으면 교과서만으로 무장 한 사람보다 자신의 직업에서 더 낫습니다. 높은 이상.

따라서 코드에서 필드를 추가하기 위해 여러 지점을 터치해야하는 패턴은 “필드를 쉽게 추가 할 수 있도록”하는 작업에 나쁜 패턴이며 이러한 패턴을 사용하지 않았다는 것을 인식했습니다. 계층 적 아키텍처는 실제로 그런 점에서 어려움을 겪을 수 있으며, 단점을 인식하지 않고 디자인 패턴을 사용하는 것은 잘못입니다.

이에 반해 디자인에 새 UI를 작성하는 데 시간이 얼마나 걸리고 계층 구조에서 시간이 얼마나 걸립니까? 프로젝트가 필드를 지속적으로 추가하는 대신 고정 된 데이터 모델을 통해 새로운 UI를 지속적으로 구축하고 배포하도록 요구했다면, 대신 그를 위해 설계했을 것입니다. 또는 또한. 그러나 “애자일을하고있다”고 슬프게도 다른 이점을 얻지 않아도된다는 의미는 아닙니다!

디자인 패턴 메뉴에서 선택하면 가장 중요한 문제에 대한 생각을 멈출 수 있습니다. 그러나 방문자를 작성할 때 인식하고 독자가 신속하게 정보를 얻는 데 도움이되도록 “방문자”를 문서화하거나 명명하는 것은 아무 것도 방해가되지 않습니다. “이것은 방문자는”작성 하는 대신 제대로 문서화하면 수석 디바이스가 제공하는 이유 끔찍한 실수입니다 – 프로그래머가 이해되지 않습니다. 방문자가 무엇인지 아는 프로그래머조차도 “이것은 방문자입니다”보다 더 많은 정보가 필요합니다.


답변

동료가 NIH 증후군 ( “발명되지 않음”) 으로 고통 받고있는 것 같습니다 .

그의 코드로 인해 새로운 필드를 쉽게 추가 할 수 있다는 것은 완벽하게 그럴듯합니다. 다른 사람이 작성한 코드보다 내 코드를 업데이트하는 것이 훨씬 빠릅니다. 그러나이 단기 속도는 코드의 유지 관리 성과 이식성에 대해 아무 것도 말하지 않습니다. 나는 그에게 의심의 이익을 줄 것이다. 기존의 코드가 교과서를 잘못 따르거나 잘못된 맥락에서 좋은 레시피를 따랐다면 실제로 구조가 잘못되었을 수있다.

디자인 패턴을 피하는 것은 정말 놀라운 일입니다. 지난 30 년간 코더를 코딩하고 관리하는 데있어 디자인 패턴은 본능적으로 수행 된 것에 대해 단어를 넣는 데 도움이되었으며, 의도, 장점, 불편, 위험, 기회 및 관련 패턴을보다 신속하게 이해하는 데 도움이되었습니다. 디자인 패턴은 복잡한 마스터 링을위한 진정한 가속기임이 입증되었습니다!

  • 아마도 당신의 동료는 우리 대부분보다 훨씬 더 지능적이며 눈에 띄는 생산성 저하없이 패턴을 재발 명하는 오버 헤드를 감당할 수 있습니까?

  • “프로그래머가 디자인 패턴을 이해하지 못한다”는 주장은 “내가하는 일을 실제로 설명 할 수 없다”는 것처럼 들린다. 또는 “내 자신의 디자인에 대해 논쟁하고 싶지 않다”. 패턴 화는 전체적인 이해를 활용할 수 있으며, 선임 동료가 덜 소중한 의견을 공유 할 수 있다고 생각합니다. 그러나 어쩌면 당신의 선임 동료는 그것을 피하고 싶어 할 것입니다.

계층화 된 접근 방식은 대부분의 엔터프라이즈 응용 프로그램에서 다른 아키텍처보다 우수한 것으로 입증되었습니다. 세계적인 수준의 패키지는이 아이디어를 중심으로 구성되며 장인 아키텍처보다 성능이 뛰어납니다. Martin Fowler는 “엔터프라이즈 아키텍처 패턴”에 대한 그의 훌륭한 저서 에서이 접근 방식제시합니다 . 오! 다시 한 번 죄송합니다. 입증 된 패턴에 관한 것입니다. 동료의 NIH 관점에서 기회가 없다 😉


답변

많은 사람들이 놓친 핵심 통찰력은 소프트웨어 디자인이 맥락 적이라는 것입니다. 비즈니스 목표를 달성하기 위해 존재하며 다른 목표에는 다른 접근 방식이 필요할 수 있습니다. 다르게 말하면, 항상 최고의 디자인이 있지만 항상 최고의 디자인은 없습니다.

디자인 패턴은 표준 문제에 대한 표준 솔루션입니다. 그러나 문제가 없으면 해결하는 데 많은 노력이 필요합니다.

폭포와 애자일 소프트웨어 디자인의 주요 차이점은 디자인 결정이 이루어집니다. Waterfall에서는 모든 요구 사항을 수집하고 필요한 디자인 패턴을 식별 한 다음 코딩을 시작합니다. 민첩한 아키텍처에서 우리는 YAGNI 원칙에 따라 가능한 한 선택에 대해 많은 것을 알고있을 때 책임있는 마지막 순간까지 설계 결정을 연기합니다.

즉, 폭포에서 디자인 패턴 은 실제로 필요할 때 민첩 하게 요구가 예상 되는 경우에 적용되는 경향이 있습니다 . 결과적으로, 민첩한 프로젝트는 예상되는 모든 요구가 실제가 아니기 때문에 설계 패턴을 덜 자주 적용하는 경향이 있습니다.