TL; DR : 해결하려는 대상에 따라 다릅니다.
C #의 Func 와 Action이 얼마나 멋진 지에 대해 이야기하는 동안 Gramps와 비슷한 대화를 나 ve습니다 . My Gramps는 매우 오래된 타이머 프로그래머로, 소프트웨어가 방 전체를 차지한 컴퓨터에서 실행 된 이후 소스 코드 주변에있었습니다.
그는 인생에서 기술을 여러 번 바꿨습니다. 그는 C, COBOL, Pascal, BASIC, Fortran, Smalltalk, Java로 코드를 작성했으며 결국 C #을 취미로 시작했습니다. 필자는 IBM의 SideKick의 파란색 편집기에서 코드의 첫 줄을 새기면서 슬프게도 무릎에 앉아 프로그래밍하는 방법을 배웠다. 내가 20 살이되었을 때, 나는 이미 밖에서 연주하는 것보다 코딩에 더 많은 시간을 보냈다.
그것들은 약간의 추억이므로, 실마리를 밝히지 않을 때 실례합니다. 나는 그 순간을 좋아합니다.
그가 저에게 말한 것입니다.
"문제의 일반화를 위해 가야합니까 아니면 특정 범위에서 문제를 해결해야합니까? 그렇지 않습니까? 질문입니다."
Gramps는 잠시 동안 안경에 대한 생각을 잠시 멈추고 안경의 위치를 얼굴에 고정시켰다. 그는 오래된 사운드 시스템에서 Deep Purple의 LP를 들으면서 컴퓨터에서 매치 3 게임을하고있었습니다.
"글쎄, 그것은 당신이 해결하려는 문제에 달려있다"고 말했다. "모든 디자인 선택을위한 하나의 거룩한 솔루션이 존재한다고 믿기 힘들지만, 하나도 없습니다. 소프트웨어 아키텍처는 치즈와 같습니다."
"... 치즈, 그램즈?"
"당신이 가장 좋아하는 것에 대해 어떻게 생각하든 상관없이 항상 냄새가 나다고 생각하는 사람이있을 것이다."
나는 잠시 혼란스러워했지만 Gramps가 계속 진행되고 있다고 말할 수 있기 전에.
"자동차를 만들 때 부품의 재료를 어떻게 선택합니까?"
"나는 ... 나는 그것이 관련된 비용과 그 부분이 무엇을해야하는지에 달려 있다고 생각한다."
"부품이 해결하려는 문제에 따라 달라집니다. 강철로 만든 타이어 나 가죽으로 만든 앞 유리를 만들지 않을 것입니다. 현재 직면하고있는 문제를 가장 잘 해결할 수있는 재료를 선택하십시오. 이제는 무엇입니까? 일반적인 솔루션 또는 특정 솔루션 어떤 문제, 어떤 유스 케이스, 한 번만 사용할 코드에 최대한의 유연성을 부여하기 위해 완전한 기능적 접근 방식을 취해야합니까? 자동차의 일부를 위해 선택하는 재료 또는 작은 집을 짓기 위해 선택한 레고 벽돌의 모양과 같은 디자인 선택과 같은 디자인 선택 "최고의 레고 벽돌은 무엇입니까?"
노인 프로그래머는 계속하기 전에 테이블에 가지고있는 작은 레고 기차 모델을 찾았습니다.
" 벽돌이 필요한 것이 무엇인지 아는 경우에만 대답 할 수 있습니다 . 특정 솔루션이 일반적인 솔루션보다 나은지, 또는 그 반대인지, 어떤 문제인지조차 모를 경우 어떻게 알 수 있습니까? 이해하지 못하는 과거의 선택을 볼 수 없습니다. "
".. 방금 매트릭스를 인용 했습니까? "
"뭐?"
"아무것도하지 않습니다."
"음, 국가 송장 시스템에 무언가를 만들려고한다고 가정 해 봅시다.이 지옥의 API와 3 만 라인의 XML 파일이 내부에서 어떻게 보이는지 알고 있습니다. 해당 파일을 만들기위한 '일반적인'솔루션은 어떻게 보일까요? 파일에는 선택적 매개 변수가 포함되어 있으며 매우 특정한 비즈니스 지점에서만 사용해야하는 경우가 많습니다. 대부분의 경우 안전하게 무시할 수 있습니다. 유일한 경우에는 일반 송장 시스템을 만들 필요가 없습니다. 구두를 판매 할 것입니다. 신발을 판매하기위한 시스템을 만들어 그 중에서도 최고의 신발 판매 송장 시스템으로 만드십시오. 이제 모든 유형의 고객을 위해보다 광범위한 응용 프로그램에서 송장 시스템을 만들어야하는 경우- 독립적 인 일반 판매 시스템으로 재판매예를 들어, 이제 가스, 음식 또는 알코올에만 사용되는 옵션을 구현하는 것이 흥미 롭습니다.이제는 가능한 사용 사례입니다. 그것들이 단지 가상의 사용 사례가 아니기 전에는 사용하지 않는 사례를 구현하고 싶지 않습니다 . 사용하지 마십시오 의 동생입니다 필요가 없습니다 . "
Gramps는 레고 기차를 다시 제자리에 놓고 경기 3 게임으로 돌 렸습니다.
"따라서 주어진 문제에 대해 일반적인 솔루션이나 특정 솔루션을 선택할 수 있으려면 먼저 그 문제가 무엇인지 이해해야합니다. 그렇지 않으면 그냥 추측하고 추측하는 것은 프로그래머가 아닌 관리자의 일입니다. "IT의 모든 것이 달려 있습니다."
그래서 거기 있습니다. "그것은 달려있다". 그것은 아마도 소프트웨어 디자인을 생각할 때 가장 강력한 두 단어 표현 일 것입니다.