“너무 많은 지식”으로 인해 막힘 [닫힘] 더 신중합니다. 저는

http://news.ycombinator.com/item?id=4037794 에서 자세한 내용을 확인 하십시오.

비교적 간단한 개발 작업이 있지만 공격을 시도 할 때마다 미래를 확장 할 수있는 방법, 2 세대 고객이 필요로하는 것, “비 기능적”에 어떤 영향을 미치는지에 대해 깊이 생각하게됩니다. 측면 (예 : 성능, 인증 …), 변경을 허용하도록 설계하는 것이 가장 좋은 방법 …

나는 한참 전에 더 젊고 어쩌면 더 열심을 기억합니다. “나”는 그때 그 모든 것에 대해 생각하지 않았을 것입니다. 그는 앞서 가서 뭔가를 썼다가 다시 썼다가 다시 썼을 것입니다. 오늘의 “나”는 더 주저하고 더 신중합니다.

저는 오늘날 다른 사람들이 실제로 진행하고 직접 수행하는 것보다 일을하는 방법에 대해 앉아서 계획하고 지시하는 것이 훨씬 쉽다는 것을 알고 있습니다. 하지만 키보드에 앉을 때마다 같은 성가신 장소에있게됩니다.

이것이 잘못 되었습니까? 이것이 자연스런 진화인가, 아니면 내가 틀에 박힌 행동으로 이끌 었는가?

공정한 공개 – 과거에 나는 개발자 였지만, 오늘 제 직책은 “시스템 아키텍트”입니다. 그것이 의미하는 바를 알아내는 행운을 빕니다-그러나 그것이 제목입니다.


와. 나는 솔직히이 질문이 그렇게 많은 반응을 낳을 것으로 기대하지는 않았다. 요약하자.

원인:

  1. 분석 마비 / 공학 / 금도금 / (다른 많은 “사전 생각은 당신을 해칠 수 있습니다”).
  2. 주어진 작업에 대한 경험이 너무 많습니다.
  3. 중요한 것에 집중하지 않습니다.
  4. 경험이 충분하지 않습니다.

솔루션 (이유와 일치하지 않음) :

  1. 먼저 테스트하십시오.
  2. 코딩 시작 (+ 재미)
  3. 하나는 버릴 것입니다 (+ 하나는 버릴 것입니다).
  4. 시간 제약 조건을 설정하십시오.
  5. 보풀을 벗기고 물건과 함께있어.
  6. 융통성있는 코드를 만드십시오 ( “일부 폐기”와 반대의 반대).

모두에게 감사합니다-여기에서 가장 큰 이점은 내가이 경험에서 혼자가 아님을 깨닫는 것이 었습니다. 나는 실제로 이미 코딩을 시작했으며 너무 큰 것들 중 일부는 자연스럽게 떨어졌습니다.

이 질문은 마감되었으므로 오늘 현재 대부분의 투표로 답변을 수락하겠습니다. 언제 / 변경되면-따라하려고합니다.



답변

이러한 것들에 대해 생각하는 것은 확실히 좋지만 진행 상황을 막지 마십시오.

실제로 (특히 반복 개발에서) 효과적으로 작동하는 한 가지 방법은 간단한 솔루션을 구현 한 다음 나중에 필요에 따라 리팩터링하는 것입니다. 이를 통해 코드를 최대한 간단하게 유지하고 과도한 엔지니어링을 피할 수 있습니다. 고려중인 성능 또는 아키텍처 변경 사항은 대부분 필요하지 않을 것이므로 공식적으로 필요할 때까지 작성하지 않아도됩니다. 예를 들어, 프로파일 러가 성능을 향상시킬 시간이라고 말할 때까지 성능에 대해 걱정하지 마십시오.

조정하는 데 도움이되는 한 가지 방법은 코드를 작성하기 전에 무언가에 대해 생각하는 시간에 대해 어려운 시간 제한을 설정하는 것입니다. 대부분의 경우 코드를 약간 생각하고 작성하고 실수를 인식 한 다음 리팩토링을 통해 수정하면 코드가 더 잘 나타납니다.

여기에 맞아야 할 균형이 있습니다. 머리를 숙이고 결과에 대해 생각하지 말고 코드를 과도하게 엔지니어링하려고 시도해서는 안됩니다.


답변

Wikipedia 는 소프트웨어에서 “분석 마비”라고 명명합니다 . 레시피는 민첩한 방법론을 고수하는 것입니다. 모든 활동이나 개별 행동은 관행이나 정책을 수립하려는 시도보다 훨씬 가치가 있음을 의미합니다. 팀의 모든 기고자는 개인의 능력이 건축 적 이상에 얼마나 적합하거나 나쁜지에 관계없이 가치가 있습니다. 민첩하고 개인, 자아가 우선이며 정책은 마지막입니다.

가장 좋아하는 답변은 “Architecture is verb”입니다. 귀하와 팀이 아무리 불완전하고 비효율적이라고 생각하더라도 생각을 멈추고 행동을 시작하십시오. 아마도 첫 번째 조치는 부적절한 정책을 해체 할 수 있습니다.


답변

40 년 전 프레드 브룩스는이 글에 대해 썼다. 아무것도 변하지 않았다……..


답변

이것이 잘못 되었습니까? 이것이 자연스런 진화인가, 아니면 내가 틀에 박힌 행동으로 이끌 었는가?

따라 다릅니다. 이것은 개발자의 길을 따라 일반적인 단계 인 경향이 있습니다.

  1. 쓰레기를 같이 던지기 시작해 엉덩이에 물리지
  2. 모든 것에서 살아있는 지옥을 과도하게 엔지니어링하고, 야 그니가
  3. 쉬운 물건을 함께 때리고 실제 / 변경 될 수있는 물건에 충분한 공학이 주어지면서 작업 / 변경이 용이 한 실용적인 중간 지점에 정착하십시오.

당신이 2 번에 머물면 그것은 틀에 박힌 것입니다.


답변

내가 항상 명심하고 싶은 것 중 하나는 “미래는 예전과 같지 않다”는 것입니다.

어느 정도의 경험이 있으면 미래를 예측할 수 있다고 믿기 힘들지만, 그럴 수는 없습니다. 미래의 클라이언트 / 사용자 / 원하는 것이 무엇이든 원하는 기능을 쉽게 구상 할 수 있지만 이것이 바로 고객이 원하는 것을 의미하지는 않습니다. 또한 다른 상충되는 기능을 원한다는 의미는 아닙니다. 따라서 미래를 계획하기 위해 오늘 보내는 시간을 제한해야합니다. 특히 미래에만 사용될 예정인 오늘날 물건을 만드는 데 소비하는 시간을 제한해야합니다.

내가 똑바로 좁히도록 요구하는 질문은 “지금이 기능에 대한 지원을 구축하는 것보다이 기능을 나중에 빌드하는 것이 얼마나 더 어려울 것입니까?” 일반적으로, 미래의 노력은 지금하는 것과 거의 같거나 아마도 두 배의 노력이라는 것입니다. 이 경우 미래를 예측할 수 없기 때문에 지금 구축하지 않는 데 아무런 문제가 없습니다. 답이 10 배 이상이되면, 내년이나 2 년 안에 사람들이 이것을 필요로 할 것이라고 생각하는 사람들에 대해 물어볼 것입니다. 그럼에도 불구하고, 광범위한 동의가 없다면, 나는 미래에 그 목표를 달성하기 위해 오늘날 우리가하고있는 일을 취소 할 필요가 없도록 스스로를 제한 할 것입니다.

예를 들어, 나중에 Hibernate를 데이터 액세스로 사용하고 있다는 사실을 추상화하는 데 많은 시간을 소비 한 몇 가지 프로젝트를 수행했습니다. (내가 Hibernate 기반으로 구축 된 프로젝트가 그것을 사용하는 것을 본 적이 없어서 시작하는 데 시간이 낭비되었지만 그것을 따로 설정해 보자.) 나중에 변경하고 싶을만한 합리적인 가능성이 있었음에도 불구하고 우리는 또한 데이터 액세스 객체 패턴을 사용하고 있었기 때문에, 처음부터 유연성을 구축하는 것보다 최대 절전 모드를 변경하고 필요할 때 동시에 변경하는 것이 어렵지 않았습니다. 지금과 같은 상황에 직면했을 때, 나는 우리가 실제로 필요할 때까지 유연성을 갖기를 원했습니다.

대기업을위한 전략적 계획을 세우지 않는 한, 기술이 빠르게 변화하고 있기 때문에 2 ~ 3 년 이상 건축 문제에 대해 생각할 가치가 없습니다. 오늘날 구축에 대해 생각하고있는 기능은 2-3 년 안에 오픈 소스로 자유롭게 제공 될 수 있습니다. 거의 확실하게 비용-이익 분석이 변경 될 것입니다.

오늘날 필요한 것을 수행하고, 자랑스럽게 생각하며, 다음 번 변경으로 인해 몇 달 안에 작업 할 수있는 시스템을 구축하도록 제한하십시오. 정말 당신이 할 수있는 최선입니다.


답변

다음은 (첫 번째 버전에서) 실용적이지 않고 비즈니스 관점에서 프로젝트를 손상시킬 수있는 굉장한 디자인에 대한 개인적인 제거 프로세스입니다.

  1. 진원지 확인 : 프로젝트를 핫도그 스탠드로 생각하면 진원지는 핫도그가됩니다. 스탠드에서 다른 향신료 / 드레싱 / 식물을 꺼내서 핫도그를 판매 할 수 있습니다. 소프트웨어의 주요 목적은 무엇입니까? 다른 모든 추가 및 / 또는 추가 된 가치를 격리하고 진원지에 먼저 집중하십시오.
  2. “나중에하는 것이 더 나은 것을 의미한다”라는 말을 계속 반복한다 : 그것이 의미가있는 곳을보고 그것에 대해 “나중에”메모를한다. 잘하고 실제 사용에 대해 생각하면 동일한 디자인으로 끝나지 만 로드맵에서 우선 순위가 결정됩니다.
  3. Deminish-Decouple-Discard : 어떤 모듈 디자인을 사용하든 단순 / 필수 / 순수 / 범용으로 만들 수 있습니다 (때로는 기능을 제거하지 않고도 달성 할 수 있음). 더 단순화 할 수 없으면 스스로 살면서 목적을 가질 수있는 요소 분리를 시작하십시오. 결국 거기에 약간의 지방이 있으면 그냥 잘라낼 수 있습니다.
  4. “프로덕션 코드”와 “라이브러리 코드”분리 : 재사용 할 수없는 코드가 항상 있지만 항상 디자인에 노이즈를 추가합니다. 이 코드는 비즈니스 규칙이 포함 된 코드입니다. 때로는 일부 비즈니스 규칙 이 견고한 디자인보다 쉽고 빠르게 변경 ( 매우 중요 ) 하다는 것을 알게 될 것입니다 . 신뢰할 수있는 코드와 향후 고객이 변경하거나 다시 구현해야하는 코드를 찾을 수 있습니다. 당신은 그것들이 가능한 한 분리되어 유지되기를 원할 것입니다.

BTW의 0 단계는 “디자인에 열중합니다”입니다. 이를 통해 시스템에서 시스템을 꺼내고 새로운 의미, 숨겨진 요구 사항 및 응급 기능을 찾을 수 있습니다.

나는 Rework 에서 1 & 2를 가져 갔다 .


답변

테스트를 작성하십시오. 오버 엔지니어링의 서사시 단계 이전에, 그리고 확실히 오래지 않아 테스트가 모두 통과되면 완료됩니다. 작성하는 코드에 대해 일련의 테스트를 수행하면 중지 할 수있는시기를 알려주는 독립적이고 편견없는 관찰자가 제공됩니다.