문제

소프트웨어 설계를 담당하는 사람은 과도하게 복잡한 건축물을 제시합니다.

모든 잡지 기사가 당신에게 말하는 무언가를 할 때 사용자가 알지 못하고 성취감을 얻지 못하는 모든 난해한 기능을 갖는 것은 괜찮습니다. 이 기념비에서 우리의 영리함에 대한 엔지니어링 시간의 절반은 사용자가 필요로하는 실제 제품과 상위 경영진이 합리적이거나 적어도 경계 시간 내에 완료 될 것으로 기대하지 않습니다.

그리고 당신은 아마도 당신이 시간이 부족하기 시작할 때, 즉 그 기회를 얻는다면 어쨌든 더 간단한 솔루션으로 되돌아 가야 할 것입니다.

우리는 모두 자제를 들었습니다. 간단하고 바보 같은 ™.

팀의 압도적으로 어떻게 싸우나요?


최근에 반복적으로 작업 해야하는 한 가지 예는 RDBM이 아닌 완전히 비정규 화 된 데이터베이스 설계로 이동하기로 결정한시기입니다. "더 빠르기 때문에!" 완전 피식 데이터베이스는 실제로 올바르게 얻기가 어렵고 Flickr 또는 Ebay와 같은 실제 전문 데이터 문제에만 적합하며 개발자 시간에 비해 개발자 시간에 따라 매우 비쌀 수 있습니다.

도움이 되었습니까?

해결책

이빨과 손톱, 때로는 잃어 버립니다. 문제는 항상 무언가를 만들고 싶은 유혹을 받기가 쉽다는 것입니다. 시원한.

복잡하고 훌륭 할 수있을 때 간단하고 효율적인 것을 구축하는 이유는 무엇입니까?

사람들에게 XP 규칙을 상기시켜주십시오.

다른 팁

다른 사람에게서 벗어난 아이디어를 튕기십시오. 종종, 우리는 당신을 올바르게하기 위해 다른 눈을 필요로하는 특정한 방식으로 일을하는 데 너무나 마무리됩니다. 다른 사람이 "우리는"우리는 "우리는" 진짜 필요합니까? "이것은 내 코드를 더 간단하게 만드는 데 도움이됩니다.

당신이 동의하지 않는 사람들을 다루는 시점에서 Ward Cunningham은 좋은 지적을 가지고 있습니다.

모든 논쟁에서 이길 필요가 없다는 것을 깨달았을 때 프로그래밍 경력의 전환점이었습니다. 나는 누군가와 코드에 대해 이야기하고 있으며, "나는 가장 좋은 방법은 A라고 생각합니다." 그리고 그들은 "내가하는 가장 좋은 방법은 B라고 생각합니다."글쎄요, 정말 A입니다. " 내가 말할 수있을 때 나에게 전환점. B. 내가 틀렸다면 그렇게 많이 아프지 않을 것입니다. 내가 옳고 당신이 B를 할 경우 우리는 실수를 바로 잡을 수 있기 때문에 우리를 그다지 아프게하지 않을 것입니다. 실수인지 알아 보겠습니다. ... 보통 그것은 C로 밝혀졌습니다. 그것은 우리 모두에게 학습 경험입니다. 우리가 경험없이 결정한다면, 우리 중 누구도 실제로 배우지 않습니다. 와드는 이겼고 다른 사람은 그렇지 않았습니다. 혹은 그 반대로도. 너무 많은 전투입니다. "글쎄, 그냥 코딩하고 어떤 일이 일어나는지 보자. 작동하지 않으면 변경할 것입니다."

나의 충고? 더 나은 일을하고 싶다면 더 나은 것을 보여주는 간단한 프로토 타입을 생각해보십시오. 의견은 훌륭하지만 코드 대화.

나는이 공식을 어딘가에서 보았다.

Skill = 솔루션의 복잡성/복잡성 http://img39.imageshack.us/img39/1586/whatisskill.png

다시 말해, 복잡한 문제에 대한 간단한 솔루션을 만드는 기술이 필요합니다. 누군가가 의도적으로 복잡한 과도하게 설계된 솔루션을 설계하고 자부심을 가지고 있다면, 그는 무의식적으로 무능합니다.

개인적으로 디자인을 단순하게 유지하는 데 도움이되는 것은 TDD주기입니다. 먼저 도달하려는 내용을 지정 한 다음 생성하는 테스트를 작성하십시오. "작동 할 수있는 가장 단순한 것". 그리고 때때로, 당신이 생산 한 것에 대해 생각하고, 더 간단하게 만드는 방법에 대해 생각하십시오.

현재 가지고있는 것이 필요할 때까지 시스템에 추가 유연성과 추상화 계층을 구축하지 마십시오. 코드 변경은 쉽습니다. 좋은 단위 테스트 스위트가 있으면 나중에 필요할 때 추상화 레이어를 추가 할 수 있습니다. 만약에 그것은 결코 발생합니다. 그렇지 않으면, "당신은 그것을 필요로하지 않을 것입니다".

너무 복잡한 설계의 일부 증상은 테스트를 작성하는 것이 복잡 할 때입니다. 테스트에 긴 설정 코드가 필요한 경우 종속성이 너무 많거나 다른 방법으로 너무 복잡 할 수 있습니다. 동시성 버그가 발생하면 동시성이 절대 최소 클래스 수로 제한되도록 시스템을 설계하는 방법에 대해 생각해야 할 수도 있습니다. 액터 모델과 같은 메시지 통과 아키텍처를 사용하고 시스템 전체가 멀티 스레드이더라도 실제로 모든 구성 요소를 단일 스레드로 만들 수 있습니다.

적어도 나에게 더 큰 문제는 유행어 친화적 인 잡지 엔터프라이즈의 장점으로 인해 어떤 기능이 있는지 말하기가 종종 어렵다는 것입니다. 그리고 미래에 유용 할 수있는 수준의 유연성을 추가하기 때문에 거기에 무엇이 있는지.

사람들은 일반적으로 미래의 복잡성과 현재 결정의 부작용을 예상하는 데 끔찍한 것으로 나타났습니다. 불행히도 이것은 항상 가장 단순하다는 것을 의미하는 것은 아닙니다. 제 경우에는 처음에는 너무 복잡하다고 생각했던 것들이 많았고 나중에 훨씬 나중에 가치를 보지 못했습니다 (Er ... Spring). 또한 내가 생각한 것들은 매우 복잡한 것으로 판명되었습니다 (EJB1). 그래서 나는 이런 것들에 대한 나의 직관이 잘못되었다는 것을 알고 있습니다.

최선의 방법 - 모든 종류의 간접 계층은 추가 된 유연성의 값을 뒷받침하는 인수와 함께 추가적인 개발자 복잡성을 지원해야합니다.

그러나 추상적 인 근거에서 특정 DB 설정을 교정 적으로 유지하는 사람들은 아마도 "내가 옳은 일임을 읽었 기 때문에 그것을 만들기"에있을 것입니다. 비현실적 일 수 있지만, 테스트 버전과 벤치 마크를 구축하면 일부 사람들은 특히 결과가 더 많은 노력을 보여 주면 미미한 성능이 증가하는 경우 확신을 가질 수 있습니다.

사용자가 알지 못하는 모든 난해한 기능을 갖는 것은 모두 훌륭하고 멍청합니다.

이것은 될 것입니다 기능 크리프, 불필요하게 복잡한 디자인이 아닙니다. 데이터베이스의 예제와 다릅니다.

최근에 반복적으로 작업 해야하는 한 가지 예는 RDBM이 아닌 완전히 비정규 화 된 데이터베이스 설계로 이동하기로 결정한시기입니다. "더 빠르기 때문에!"

이 경우 몇 가지 일이 진행될 수 있습니다. 그들 중 하나는, 당신이 틀렸을 수도 있고,이 사람들은 그들이 매우 유사한 예를 가지고 일했기 때문에 그들이 말하는 것을 실제로 알 수 있습니다. 다른 하나는 그들이 틀렸다는 것입니다. 즉, 디자인은 그들이 주장하는 속도 이점을 제공하지 않습니다. 이 경우 두 가지 다른 상황이있을 수 있습니다. (1) 설계에서 너무 많은 무게를 주거나 (2) 속도가 실제로 중요합니다. 속도가 실제로 매우 관련이 있다면 팀은 가정에만 의존해서는 안됩니다. 다른 프로토 타입을 시도하고 중요한 경로에서 속도를 평가해야합니다. 당신은 "더 빠르기 때문에"한 가지 방법으로 F1 자동차를 구축하지 않고 대신 몇 가지 대체 디자인 솔루션을 계속 시도하고 유지 보수 비용을 너무 많이 증가시키지 않는 가장 빠른 디자인 솔루션을 선택합니다.

때때로 당신은 그것을 논쟁하고 합의에 도달 할 수 있습니다. 때로는 당신은 할 수 없습니다. 그것은 인생이다.

그러나 마지막 단어. 당신은 그렇지 않습니다 싸움 복잡성. 당신은 그것을 취급합니다. 당신은 정말로 중요한 것을 식별하고 그에 따라 행동합니다.

관계형 모델은 정규화 된 방법에 관계없이 RDBM에 의해 관리되기 때문에 "정규화 된 (예 : 세 번째 또는 네 번째 정상 형태) 모델이 아닌 완전 탈상화 된 데이터베이스 설계를 의미한다고 가정합니다.

귀하의 요구 사항, 능력 및 팀원의 요구 사항에 대해 더 많이 알지 못하고 판단 할 수 없습니다.

나는 당신의 키스 훈계 가이 경우에 효과가 없을 것이라고 두려워합니다. 하나의 크고 거절 된 테이블 하나가 가장 간단한 것으로 방어 될 수 있기 때문입니다.

이런 종류의 문제를 어떻게 해결합니까? 커뮤니케이션, 설득, 더 나은 데이터, 대체 기술 및 기술의 프로토 타입. 이것이 소프트웨어 개발을 어렵게 만드는 이유입니다. 이런 일을하는 방법이 한 가지 밖에없고 모든 사람들이 동의했다면, 우리는 진정으로 그것을 스크립트하거나 다른 사람이 시스템을 개발하고이를 완료 할 수있었습니다.

데이터를 얻으십시오. 당신의 말로는 충분하지 않을 수 있습니다. 빠른 프로토 타입이 요점을 시연 할 수 있다면 만들 수 있습니다.

"강한 의견, 가볍게 개최된다"는 당신의 모토가되어야합니다.

때로는 기술적 지점이 팀 전체를 소외시키는 가치가 없습니다. 때로는 그렇습니다. 당신의 전화.

당신은 싸우고 있습니다 다른 사람 과다 디자인/기능 여러 가지 방법으로 :

  1. 실제 사용자 요구 사항에 따라 기능 우선 순위를 요청합니다. 알파 및 베타 테스터의 기능을 모킹하고 N 개월의 지연을 거래 할 것인지 묻습니다.

  2. 특별한 케이스를 피하기 위해 적극적으로 리팩터. 적절할 때마다 코드를 레이어 또는 모듈 식 구성 요소로 나눕니다. "지금은 잘 작동합니다"와 "나중에 쉽게 확장 할 수 있습니다"사이의 균형을 찾으십시오.

  3. 디자인 결정에 동의하지 않을 때 경영진에게 알리고, 기각 할 준비를하고, 결정을 수락하십시오. 다른 사람의 머리 나 방해 코드를 넘지 마십시오.

내가 찾은 가장 좋은 방법은 '우리가 해결하려는 비즈니스 문제는 무엇입니까?'와 '이 결정이 그 문제를 해결하는 데 어떻게 도움이됩니까' '라고 끊임없이 묻는 것입니다.

나는 너무 자주 사람들이 문제가 무엇인지 분명하게 결정하는 대신 솔루션으로 점프한다는 것을 알았습니다.

따라서 데이터베이스를 구성하는 방법에 대한 예에서 제 질문은 '다음 달, 내년, 지금부터 5 년 동안이 프로젝트의 거래 요구 사항은 무엇이라고 생각 하는가'입니다. 데이터 모델을 올바르게 얻는 데 많은 시간을 소비하는 것이 합리적 일 수 있습니다. 시간 낭비 일 수 있습니다. 문제 정의가 명확해질 때까지 매개 변수가 무엇인지 모릅니다.

"팀의 너무 많은 건축가"증후군으로 고통받을 수 있습니다. 최대 한두 사람은 5 ~ 10 명으로 구성된 팀이 코딩 할 시스템을 설계/건축해야합니다. 입력은 모든 사람의 환영을 환영하지만 건축 의사 결정자는 거의 경험이 없어야합니다.

(숫자는 반 랜덤이며 다른 요인에 따라 다를 수 있습니다)

문제를 논의 할 때 열려 노력합니다. 그러나 단순 해 보이는 것과 다른 사람 사이에서 다른 사람과 논의 할 때, 나는 최대한 완고하게됩니다. 한 결정에서 다른 결정으로 매우 일관된 한 꽤 많은 도움이됩니다.

귀하의 예는 실제로 복잡한 디자인이 아니며 동의하지 않는 디자인 선택입니다. 코드 작업을하고 있기 때문에 기사에서 기사를 읽고 좋은 목표처럼 들리거나 결정을 내린 사람이 결정을 내릴 수 있다고 생각하기 때문에 이러한 결정 중 다수가 쉽게 옳을 수 있습니다. 이전에 문제가 있었고 다시 발생하지 않도록 노력했습니다.

개인적으로 나는 쉬운 방법으로 많은 일을하고 어려운 방법으로 많은 일을했으며, 어려운 방법으로 쉬운 방법으로 무언가를 선택할 때 결코 행복하지 않습니다. 이제 나는 "벌거 벗은 컬렉션을 전달하지 말고 항상 비즈니스 클래스에 싸서"와 같은 트릭을 배웠습니다.

내가 같은 경험을 겪지 않은 사람에게 그 추론을 설명한다면, 그들은 "쉬운 방법"을 "어려운 길"과 몇 번 비교할 때까지 그것을 이해하지 못할 것입니다.

솔루션은 문제보다 더 복잡하지 않아야합니다.

이 질문은 필수 복잡성에 대한 생각과 얽혀 있습니다. 분류 ~ 해야 하다 본질적으로 각 요소를 만지십시오. 존재하는 기술적 제약을 감안할 때 문제를 해결하기 위해 얼마나 복잡해야합니까?

관련된 사람들은 간단한 해결책을 찾기에 충분한 시간과 인센티브가 있습니까? 주의없이 복잡성이 증가합니다. 가장 빠른 버그 수정 또는 기능 추가를 시도하는 데 대부분의 시간을 보내면 "간단한 상태로 유지"하는 것만으로는 충분하지 않습니다.

대형 프로그램을 유지함으로써 전쟁 상처를 입은 팀에 일부 사람들이 있는지, 리팩토링 경험이있는 사람들이 있는지 확인한 다음 소프트웨어를 분류 할 시간을 제공하십시오. 특정 기능과 기회가 범위를 벗어나지 않으면 사람들이 불필요한 코드를 제거하는 데 도움이됩니다. 메트릭을 원한다면 코드 줄을 줄이는 것을 목표로하십시오. 그러나 그것에 집착하지 마십시오. 테스트 범위를 개선합니다. 테스트하기 어려운 코드 비트를 제거하는 것을 고려하십시오.

스트레칭 할 때 모든 일을하려고하지 마십시오. 모든 문제/작업을 관리 가능한 청크로 나눕니다. 그런 다음 우선 순위를 정하고 키스와 yagni를 염두에 두십시오. 이것은 당신이 당신의 것을 구축하는 데 집중하는 데 도움이 될 것입니다 필요. 당신이 그것을 제대로 한 경우, 시간, 돈, 자원 및 영감을 주어 주어지면 나중에 추가 할 수있는 좋은 핵심을 가질 것입니다.

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