지나치게 복잡한 솔루션이나 설계를 방지하려면 어떻게 해야 합니까?[닫은]

StackOverflow https://stackoverflow.com/questions/86308

  •  01-07-2019
  •  | 
  •  

문제

우리는 문제를 해결하기 위해 노력하고 있지만 생성된 솔루션이 문제가 요구하는 것보다 훨씬 더 복잡하다는 사실을 깨닫는 경우가 많습니다.직장의 합병증을 통제하는 데 도움이 되는 통제, 모범 사례, 기술 등이 있습니까?

도움이 되었습니까?

해결책

새로운 사람이 그것을 보도록 유도하는 것입니다.

다른 팁

테스트하기가 너무 어렵다면 디자인이 너무 복잡한 것입니다.이것이 제가 사용하는 첫 번째 측정항목입니다.

내 경험상, 지나치게 일반적인 경우를 위한 디자인은 너무 많은 복잡성을 낳는 경향이 있습니다.

엔지니어링 문화는 환경에 대해 더 적은 가정을 하는 설계를 장려합니다.이것은 일반적으로 좋은 일이지만 어떤 사람들은 그것을 너무 멀리 받아들입니다.예를 들어, 그것은 ~할 것 같다 귀하의 자동차 설계가 특정한 중력 끌어당김을 가정하지 않는다면 아무도 실제로 달에서 귀하의 자동차를 운전하지 않을 것입니다. 만약 그렇게 하더라도 연료를 태울 산소가 없기 때문에 작동하지 않을 것입니다.

어려운 부분은 "어느 행성에서나 작동하는" 디자인을 개발한 사람이 종종 영리한 것으로 간주된다는 것입니다. 따라서 그의 디자인이 훌륭하다고 주장하려면 더 열심히 노력해야 할 수도 있습니다. ~도 영리한.

좋은 가정과 나쁜 가정 사이에서 결정을 내릴 수 있도록 장단점을 이해하면 불필요하게 복잡한 설계를 피하는 데 큰 도움이 됩니다.

디자인을 더욱 단순하게 만드는 몇 가지 아이디어는 다음과 같습니다.

  • 프로그래밍 책과 기사를 읽고 나서 적용하다 작업에 적용하고 코드를 작성하세요.
  • 오픈 소스 프로젝트와 같이 다른 사람이 작성한 많은 코드(좋은 코드와 나쁜 코드)를 읽고 무엇이 작동하고 무엇이 작동하지 않는지 알아보십시오.
  • 코드 실험을 가능하게 하는 안전망(단위 테스트) 구축
  • 실험이 잘못된 방향으로 진행되는 경우 버전 제어를 사용하여 롤백을 활성화합니다.
  • TDD(테스트 중심 개발) 그리고 BDD(행동 중심 개발)
  • 태도를 바꾸고, 어떻게 그렇게 할 수 있는지 물어보세요. "단순히 작동합니다" (구성에 대한 규칙이 도움이 될 수 있습니다.아니면 애플이 어떻게 할 것인지 물어보세요)
  • 연습(재즈 연주자처럼 -- 코드를 연주해 보세요. 코드 카타)
  • 동일한 코드를 다른 언어로 여러 번 작성하고 일정 시간이 지난 후
  • 새로운 개념으로 새로운 언어를 배우십시오(정적 언어를 사용하는 경우 동적 언어를 배우십시오.절차적 언어를 사용한다면 기능적 언어를 배우세요....) [1년에 한 언어가 적당합니다.]
  • 다른 사람에게 코드 검토를 요청하고 코드를 더 간단하고 우아하게 만들 수 있는 방법을 적극적으로 물어보세요(그리고 그걸 만들어)
  • 위의 일을 함으로써 수년간의 시간을 보낼 수 있습니다(시간은 활동적인 마음에 도움이 됩니다)

디자인 등을 만든 다음 그것을 보고 필요하지 않을 것 같은 모든 것을 (공격적으로) 제거하려고 노력합니다.나중에 디자인을 다듬을 때 필요하다는 것이 밝혀지면 다시 추가합니다.나는 이 작업을 여러 번 반복하면서 진행하면서 다듬어갑니다.

Michael C.의 "레거시 코드로 효과적으로 작업하기"를 읽어보세요.깃털.

요점은 작동하는 코드가 있고 디자인을 변경해야 하는 경우 코드 단위를 테스트 가능하게 만들고 코드를 더 작은 조각으로 나누는 것보다 더 나은 방법은 없다는 것입니다.

테스트 주도 개발을 사용하고 Robert C.마틴의 TDD의 세 가지 규칙:

  1. 실패한 단위 테스트를 통과하는 경우를 제외하고는 프로덕션 코드를 작성할 수 없습니다.
  2. 실패하기에 충분한 단위 테스트를 더 이상 작성하는 것은 허용되지 않습니다.컴파일 실패는 실패입니다.
  3. 하나의 실패한 단위 테스트를 통과하는 데 충분한 것보다 더 많은 프로덕션 코드를 작성할 수 없습니다.

이 방법을 사용하면 필요하지 않은 코드를 많이 얻을 가능성이 없습니다.당신은 항상 하나의 중요한 일을 수행하는 데 집중할 것이며 복잡성 측면에서 너무 앞서 나가지 않을 것입니다.

먼저 테스트하세요 여기서는 도움이 될 수 있지만 모든 상황에 적합하지는 않습니다.그리고 어쨌든 그것은 만병 통치약이 아닙니다.

작게 시작하세요 또 다른 좋은 아이디어입니다.정말 이 10가지 디자인 패턴을 모두 채워야 할까요?먼저 "어리석은 방법"으로 시도해 보세요.잘리지 않나요?좋아요, "조금 덜 어리석은 방법"으로 하세요.등.

검토를 받으세요.다른 사람이 쓴 것처럼 두 쌍의 눈이 더 좋습니다.더 좋은 점은 두뇌가 두 개라는 것입니다.당신의 배우자는 단지 단순화할 여지가 있는 부분을 볼 수도 있고, 당신이 해킹하는 데 많은 시간을 소비했기 때문에 괜찮다고 생각했던 문제가 있는 영역을 볼 수도 있습니다.

간결한 언어를 사용하세요. Java 또는 때로는 C++와 같은 언어는 때로 불쾌하고 복잡한 솔루션을 권장하는 것처럼 보입니다.간단한 것은 여러 줄의 코드에 걸쳐 있는 경향이 있으며, 이를 모두 관리하려면 3개의 외부 라이브러리와 큰 프레임워크만 사용하면 됩니다.Python, Ruby 등을 사용해 보세요.- 귀하의 프로젝트가 아니라면 개인적인 용도로 사용하십시오.그것은 할 수 있다 사고방식을 바꾸세요 단순함을 선호하고 단순함이 가능하다는 것을 확신합니다.

프로그래머라면 이런 일이 일어날 수밖에 없습니다.노력을 제대로 평가하지 못했거나 솔루션이 작동하지 않는 문제에 직면했다면 코딩을 중단하고 프로젝트 관리자에게 문의하세요.나는 항상 회의에 해결책을 가지고 가는 것을 좋아합니다. 문제는 A입니다. x를 수행하는 데 3일이 걸리거나 y를 수행하여 6일이 걸립니다.스스로 선택하지 마십시오.

  • 모든 단계에서 다른 프로그래머와 대화하십시오.디자인에 더 많은 시선이 집중할수록 지나치게 복잡한 측면이 코드베이스에서 너무 굳어지기 전에 조기에 드러날 가능성이 더 높습니다.
  • 현재 작업 중인 항목을 어떻게 사용할 것인지 끊임없이 자문해 보세요.확실하지 않다는 대답이 나오면 잠시 멈추고 지금 하고 있는 일을 다시 생각해 보세요.
  • 현재 작업 중인 작업을 잠재적으로 단순화하는 방법에 대한 생각을 적어 두는 것이 유용하다는 것을 알았습니다.이렇게 하면 일단 실제로 작동하게 되면 아직 작동하지도 않는 것을 엉망으로 만드는 대신 필요에 따라 돌아가서 리팩토링하거나 다시 실행하는 것이 더 쉽습니다.

이는 섬세한 균형 조정 작업입니다.한편으로는 설계하고 구현하는 데 너무 오랜 시간이 걸리는 것을 원하지 않고, 다른 한편으로는 다음 주의 문제를 처리할 만큼 복잡하지 않거나 심지어 적응하기 위해 다시 작성해야 하는 해킹을 원하지 않습니다. .

제가 생각하기에 도움이 되는 몇 가지 기술은 다음과 같습니다.

어떤 것이 당신이 원하는 것보다 더 복잡해 보인다면, 그것에 대해 생각하는 것을 끝내자마자 바로 그것을 구현하기 위해 자리에 앉지 마십시오.남은 하루 동안 할 다른 일을 찾아보세요.나는 문제의 초기 부분에 대해 나중에 많은 복잡성을 제거하는 다른 해결책을 생각하게 되는 경우가 많습니다.

비슷한 맥락에서 아이디어를 되돌릴 수 있는 다른 사람이 있습니다.복잡성이 정당한 이유를 그들에게 설명할 수 있는지 확인하십시오!

미래에 정당화될 것이라고 생각하여 복잡성을 추가하는 경우 다음을 설정해 보십시오. 언제 앞으로는 그것을 사용할 것입니다.1~3년 동안 복잡성이 필요하다고 (현실적으로) 상상할 수 없다면 지금 비용을 지불하는 것이 타당하지 않을 것입니다.

작업을 일련의 작은 작업으로 직렬화하여 작업 중인 데이터의 양을 줄입니다.대부분의 사람들은 코딩하는 동안 머릿속에 6개의 (플러스 또는 마이너스) 조건만 기억할 수 있으므로 이를 구현 단위로 만듭니다.달성해야 하는 모든 작업을 위해 디자인하되, 모듈을 통해 6개 이상의 경로를 가지고 놀 필요가 없도록 디자인을 무자비하게 해킹하세요.

이것은 Bendazo의 게시물에서 따온 것입니다. 쉬워질 때까지 단순화하세요.

나는 고객들에게 묻는다. 몇 가지 기능이 필요합니다.나는 그들의 요청을 자세히 파악하고 그들이 겪고 있는 문제를 파악하려고 노력합니다.이것은 나(또는 그들)가 생각하는 것보다 더 간단한 해결책이 되는 경우가 많습니다.

물론 고객의 작업 습관과 고객이 해결해야 할 문제가 무엇인지 알면 처음부터 고객의 문제를 훨씬 더 잘 이해할 수 있습니다.그리고 당신이 그들을 "안다"면, 당신은 그들의 말을 더 잘 이해하게 됩니다.따라서 사용자와 긴밀한 협력 관계를 발전시키십시오.엔지니어링의 0단계입니다.

시스템의 개념에 대해 잘 이름을 붙이는 시간을 갖고, 관련된 이름을 찾으면 시스템이 더 친숙해집니다.개념의 이름을 바꾸는 것을 주저하지 마십시오. 당신이 알고 있는 세계와의 연결이 더 좋을수록 두뇌가 더 잘 작동할 수 있습니다.

깨끗하고 간단한 솔루션을 통해 효과를 본 사람들의 의견을 물어보세요.

현재 프로젝트에 필요한 개념만 구현하십시오(미래 보장 또는 일반 시스템에 대한 요구로 인해 디자인이 부풀어오르게 됩니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top