수년에 걸쳐 스파게티 코드를 피할 수있는 방법이 있습니까? [닫은

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

  •  21-08-2019
  •  | 
  •  

문제

나는 몇 가지 프로그래밍 작업이있었습니다. 각각 20-50 명의 개발자, 3-5 년 동안 프로젝트가 진행됩니다.

마다 동일 할 때마다. 일부 프로그래머는 밝고 일부는 평균입니다. 모든 사람은 CS 학위를 가지고 있으며 모두는 디자인 패턴을 읽습니다. 의도는 좋고, 사람들은 좋은 코드를 작성하려고 노력하고 있지만 여전히 몇 년이 지난 후에도 코드는 스파게티로 변합니다. 모듈의 변경 A 갑자기 브레이크 모듈 B B를 작성한 사람을 제외하고 아무도 이해할 수없는 코드의 부분이 항상 있습니다. 인프라를 변경하는 것은 불가능하고 거꾸로 호환성 문제로 인해 좋은 기능이 들어 오는 것을 방지합니다. 절반의 시간은 모든 것을 처음부터 다시 작성하려는 시간입니다.

그리고 나보다 경험이 많은 사람들은 이것을 정상적인 것으로 취급합니다. 그게? 해야합니까? 이것을 피하기 위해 무엇을 할 수 있습니까? 아니면 그것을 삶의 사실로 받아 들여야합니까?

편집 : 여러분, 나는 여기에서 응답의 양과 질에 깊은 인상을 받았습니다. 이 사이트와 커뮤니티 록!

도움이 되었습니까?

해결책

일정한 단위 테스트와 결합 된 무자비한 근면은 스파게티 코드를 방지하는 유일한 방법입니다. 그럼에도 불구하고 그것은 단지 반창고 솔루션 일뿐입니다. 주의를 기울이지 자마자 파스타가 온다.

매우 종종 나는 스파게티 코드가 소개된다는 것을 알게됩니다. 그들은 더 좋은 방법이 있다는 것을 알고 있으며 시간이 없다는 것을 알고 있습니다. 그런 일이 발생하면 한 가지만 할 수 있습니다.

그것들을 불러서 변경 해달라고 요청하십시오.

코드 검토 중에 더 나은 방법을 지적하는 것은 일반적으로 사람들이 갈 수있을 정도로 충분하다는 것을 알았습니다. 그들이 그것을 확인하고 내가 강하게 느끼면, 나는 그것을 직접 재현 할 것이다.

나는 때때로 약간 편심으로 벗어나나요? 나는 내가 할 것이라고 확신한다. 솔직히 나는 신경 쓰지 않습니다. 나는 그것에 대해 바보가 아니며 가능한 최고의 사회적 방식으로 이것에 접근합니다. 그러나 잘못된 코드를 확인하게하면 나중에 어느 시점에서 디버깅해야 할 것입니다. 차라리 지금 조금 벗어나 올바른 코드를 가져오고 싶습니다.

또한 단위 테스트 문화가 스파게티 코드를 예방하는 데 도움이된다고 생각합니다. 잘 알려진 코드를 테스트하는 스파게티 코드를 단위하기가 훨씬 어렵습니다. 시간이 지남에 따라 이것은 사람들이 코드를 다소 고려하지 않도록합니다.

다른 팁

코드 썩음을 피하는 열쇠는 Sound Bottom Up Design 및 구현 방법론에 있다고 생각합니다 (나는 그것이 내 사업을 명명 한 것이 너무 강력하게 생각합니다. 여기서 선택한 도구는 다음과 같습니다.

  • 계약 별 프로그래밍
  • 레이어 디자인
  • 디커플링에 중점을 둡니다
  • 일반 솔루션을 찾고 항상 재사용을 염두에두고 구축하십시오.
  • 프레임 워크를 가볍고 단순하며 집중적으로 유지하십시오

다른 응답자가 제안한 바와 같이, 당신은 일찍 문제를 해결해야합니다. 녹색 개발자의 경우 멘토링 (쌍 프로그래밍이 훌륭함)과 리뷰 (코드 및 디자인 리뷰)를 의미합니다. 더 많은 선임 개발자와 함께 이것은 경계를 의미합니다.

무엇보다도 리팩토링을 두려워하지 마십시오. 리팩토링이 당신을 두려워한다면, 당신은 이미 가라 앉았습니다. 리팩토링이 "나쁜"것으로 보이면 비즈니스에 문제가 있습니다.

무언가를 고치면 올바르게 수정하십시오. 나는 "fux"라는 용어를 사용하여 잘못된 방식으로 수행 된 수정 사항을 설명합니다. 단지 코드 기반을 "fux"합니다.

건배,

20 ~ 50 명의 개발자가 아마도 문제 일 것입니다. 그것은 매우 높으며 모든 것을 점검하기 위해서는 많은 관리와 리소스가 필요합니다.

프로젝트를 더 작은 재사용 가능한 세그먼트로 나누는 것을 고려할 것입니다. 핵심 시스템에서 특정 레이어를 추상화하십시오.

코드의 다른 영역 사이에 "방화벽"을 만듭니다. 다른 영역 또는 코드 계층을 정의하고 각 레이어가 응답하는 단일 API (Java에서는 일반적으로 인터페이스로 수행)를 정의하여이를 수행합니다. API가 사용하는 베어 본수 또는 클래스가 있어야하지만 해당 레이어의 내부에 대해서는 아무것도 알지 못합니다. 예를 들어, GUI는 데이터를 저장하는 방법을 알거나 신경 쓰지 않아야하며 데이터베이스는 데이터가 최종 사용자에게 어떻게 표시되는지 알거나 신경 쓰지 않아야합니다.

이 API는 방화벽을 오염시키지 않는 한 필요에 따라 물건을 추가 할 수 있어야합니다.

요점은 당신이 말할 때라고 생각합니다

당신은 단지 모든 것을 처음부터 다시 작성하고 싶습니다

그냥 받아들이십시오.
가능한 한 많은 단위 테스트를 사용한 다음 리팩토링을 일반적인 관행으로.
자동화 및 단위 테스트는 변경 사항이 회귀를 도입하지 않도록합니다. 오래된 코드를 리팩토링하는 데 시간의 일정 비율을 바꾸는 것 (이를 의미합니다. 덜 새로운 기능!) 기존 코드베이스가 오래되지 않거나 적어도 빠르지 않도록하십시오.

코드 검토, 코딩 표준 및 회사 정책.

다음은 우리 상점에 적용됩니다. 당신이 어떤 종류의 상점을 가지고 있는지 모르기 때문에 마일리지는 다를 수 있습니다. Team Foundation Server로 이동하는 동안 우리의 중점은 코드 품질을 유지하거나 최소한 품질을 가능한 방식으로 유지하는 데 도움이되었습니다. 우리가 추가하는 것의 몇 가지 예 :

  • 코드 검토 워크 플로 - 프로세스의 일부로 코드 검토를 시행합니다. 코드가 검토되지 않은 경우 체크인이 발생하는 것을 방지하는 정책이 포함되어 있습니다.
  • TeamReview- 완전한 "IDE 내부"경험을 제공함으로써 코드 검토를 덜 고통스럽게 만듭니다.
  • 체크인 정책 (일반적으로) - 코드 흐름을 제어 할 수있는 많은 멋진 케이크. 체크인 전에 공개 및 보호 된 방법을 문서화하여 해당 작업 항목없이 작업을 체크인 할 수 없는지 확인하는 것과 같은 것입니다.

내가 말했듯이, 다른 플랫폼을 사용하는 경우 사용 가능한 툴링과 할 수있는 일은 다릅니다. 그러나 가능한 어떤 식 으로든 도움이되는 툴링을 배제하지 마십시오. 워크 플로와 그 안에 이동하는 항목을 개선, 제어 및 감사하는 데 사용하는 경우 최소한 고려해야 할 가치가 있어야합니다.

프로세스의 변경 사항에는 푸시 백이 포함됩니다. 이를 완화하는 데 도움이되는 방법은 구식 버전 제어 / 결함 추적 시스템의 전환을위한 교육에 정책을 구축하는 것입니다.

많은 사람들이 캡슐화와 좋은 디자인의 기본 신조를 따르지 않는 것처럼 들립니다.

다른 부분에 대해 고립되고 끊임없는 것을 유지하는 것은 설명하는 문제를 피하기 위해 필수적입니다. 더 높은 수준의 디자이너 또는 건축가가 필요할 수 있습니다. 이것은 사람들이 일부 드라코 니안 프로세스와 변화 관리를 정당화 한 전형적인 시나리오입니다. (나는 그것을 옹호하지 않는다)

의존성과 상호 관계를 피하고 공개 인터페이스 만 정의하고 사용해야합니다. 물론 이것은 지나치게 단순화되지만 코드의 복잡성, 공개 방법, 코드 엔지니어링 코드 등으로 구축 된 UML 다이어그램 등 코드의 일부 메트릭으로 많은 것을 배울 것입니다.

의존성 주입을 완전히 사용하여 얻을 수있는 느슨한 커플 링은 많은 도움이 될 수있는 기술적 인 기능이라고 생각합니다. 응용 프로그램 조각을 분해하면 "흥미로운"재사용으로 인한 스파게티를 얻을 가능성이 적습니다.

대신 과도한 조각화로 향할 수 있지만, 또 다른 문제이며 글로벌 구조적 문제가 적습니다.

적어도 두 쌍의 눈이 그것을 볼 때까지 코드를 커밋하지 마십시오.

리팩토링

노력하십시오. 디자인을 가능한 한 깨끗하게 유지하십시오. 이것은 쉽지는 않지만 노력할 가치가 있습니다.

나는 그것이 정상이라고 생각하지 않습니다. 몇 년 동안 거기에 있었을 때이 일을 싸우는 것은 정말 어렵습니다.

그것을 피하는 유일한 방법은 태도를 바꾸는 것입니다.

“민첩한 개발자가 소프트웨어 설계에 대한 태도는 외과 의사가 멸균 절차에 대한 것과 같은 태도입니다. 멸균 절차는 수술을 만드는 것입니다 가능한. 그것 없이는 감염의 위험이 너무 높아서 견딜 수 없을 것입니다. 민첩한 개발자는 디자인에 대해 같은 방식으로 느낍니다. 가장 작은 부패를 시작하게 할 위험이 너무 높아서 견딜 수 없을 정도로 높습니다.” Martin C. Robert“C#의 민첩한 원리, 패턴 및 관행”

조언을 위해이 책을 살펴 보는 것이 좋습니다. 그것은 모든 "디자인 냄새", 존재의 이유와 그것들을 떠나는 결과를 지명합니다. 이것이 현재 상황이 적절하지 않다는 경영진을 설득하는 데 도움이되기를 바랍니다.

행운을 빕니다!

소프트웨어 산업에서 가장 큰 문제는 프로그래밍 코드의 품질이 주관적인 문제로 간주된다는 것입니다. 잘 정의 된 메트릭이 없으면 단지 깔끔하고 깔끔하며 컨벤션을 따르는 것만으로도 품질이 허용되도록 충분하지 않습니다.

변경하려는 시도가 있습니다 이것, 그러나 오랫동안 확립 된 프로그래머 문화는 엔지니어링과 유사한 것과 비슷한 점을 멀리하기 위해 노력하고 있기 때문에 주로 충분한 관심이나 수용을 얻지 못할 것입니다. 프로그래밍의 "순수한 예술"철학은 20-50 명의 개발자가 모두 자신의 고유 한 방식으로 코드에 쏟아 질 것이라는 것을 의미합니다. "진흙의 큰 공"이 되십시오.

이를 피하기 위해 모든 코더를 동일한 '페이지'에 가져 오거나, 컨벤션의 정규화 된 코드 일부를 만들거나, 일자리가 개발 팀이 더 작고 (1-3 명), 당신은 큰 카 후나입니다. 언젠가 큰 팀은 더 나은 물건을 구축 할 수있는 방법을 찾을 수 있지만, 그때까지 최선을 다하면 10 명 중 6 명에 가까워 질 수 있다면 최고의 운이 좋다. 우리 산업은 ...

폴.

소프트웨어 개발 관행을 면밀히 따라야합니다. 코드 검토와 단위 테스트가 지속적으로 업데이트가 시스템의 다른 것들에 영향을 미치는지 확인해야합니다. 20-50 개발자는 많지만 수행 할 수 있습니다. 좋은 프로세스를 구현하는 것이이 환경에서 당신을 절약 할 수있는 유일한 것입니다. 시행 코딩 표준도 핵심입니다.

시스템의 다양한 부분의 결함 및 성능을 추적하면 문제를 식별 할 수 있습니다. 시스템이 제대로 설계되지 않았거나 서면 기능이 변경되면 모듈은 더 높은 결함이 있습니다. "문제"모듈이 식별되면 모듈을 다시 작성하기로 결정할 수 있습니다 (응용 프로그램이 아님).

지속적인 리팩토링. 너 가지다 특히 디자인 수준에서 가면서 리팩터를 리팩터링합니다. 깨진 코드 나 디자인이 보이면 고칠 준비를하십시오. 이것은 종종 깨지지 않은 것을 고치는 경우입니다. 그것이 ...라는 것을 제외하고는 ... 그것은 단지 깨진 것입니다 ... 아직.

아니

:)

쇼어와 소장 민첩한 발전의 기술 "기존 프로젝트에 XP 적용"(4 장)에 관한 섹션이있는 훌륭한 책입니다. 열심히 싸우지 않으면 시간이 지남에 따라 프로젝트가 악화됩니다. 그러한 기술 부채를 극복하는 것은 어렵고 허용 가능한 릴리스를 배송하기가 점점 어려워 질 것입니다. 유일한 해결책은 새로운 기능을 제공하는 속도를 줄이고 테스트 범위를 개선하고 리팩토링하는 데 시간을 절약하는 데 시간을 소비하는 것입니다.

일반적으로 프로젝트에는 테스트 범위가 많지 않으며 코드를 매우 철저히 구축하고 운동 할 10 분 자동 스크립트를 실행할 수있는 옵션이 없습니다. 대신, 대부분의 코드는 테스트하기 어렵도록 구성되어 있습니다. 그런 다음 가장 좋은 옵션은 테스트하기가 더 쉬워서 코드를 추상화하기 위해 리팩터를 리팩터링하기 시작하면서 간단한 테스트 범위를 추가하는 것입니다.

팀은 청소를 깨끗하고 테스트하기 위해 코드를 개선하는 데 시간을 소비해야하지만 정리를 "마무리"하는 데 걸리는 시간 동안 배달을 중단 할 수 없을 것입니다. 따라서 새로운 기능을 추가하면서 단계별로 수행해야합니다. 괜찮습니다. 최악의 영역을 먼저 선택하고 즉시 명백한 이점을 기대하지 마십시오. 결국 당신은 거기에 도착하기 때문에 계속하십시오. 모든 큰 프로젝트가 나쁘다고 말하는 목소리를 듣지 마십시오.

요컨대, 매주 약간의 시간을 보내고, 이번 주보다 다음 주에 코드가 더 좋는지 확인하십시오.

더 많은 코드 검토 및 아마도 코드 소유권.

임의의 코드를 해킹하면 "소유 한"코드만큼 신경 쓰지 않습니다. 프로젝트의 하나의 모듈을 유지하는 것이 귀하의 책임이라면, 당신은 빛나고 싶습니다.

코드 리뷰는 코드를 보여주는 시간입니다.

단위 테스트 생성을 시작하면 코드를 분리하고 버그 수정의 후속 오류를 피할 수 있습니다. 적절한 커버리지가있어 사용되지 않은 코드도 쉽게 제거 할 수 있습니다.

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