요구 사항을 기다리는 동안 조잡한 코드에 대한 영향이 적은 리팩토링 및 코드 정리


17

나는 엄청나게 느슨한 제품의 기존 코드베이스를 물려 받았습니다. 근본적인 디자인은 불행히도 완전한 리 팩터 (HIGH 커플 링, LOW 응집력, 코드 중복, 기술 설계 문서 없음, 단위 테스트 대신 통합 테스트) 없이는 거의 할 수없는 일입니다. 이 제품은 역사, 위험에 대한 내성이 거의없는 중요한 "현금 소"고객에 대한 높은 노출, 그리스인을 홍당무하게 만드는 기술적 부채, 매우 큰 코드베이스 및 복잡성, 팀에 의한 전투에 대한 패배자 접근 방식을 갖습니다. 나를.

이전 팀은 다른 부서로 배를 뛰어 넘어 다른 프로젝트를 망칠 기회를 가졌습니다. 프로젝트 관리 실패와 반대로 기술적 무능력 프로젝트 실패를 경험하는 경우는 매우 드물지만 실제로는 그러한 경우 중 하나입니다.

지금은 혼자이지만 시간과 결정의 자유와 미래의 방향이 자유롭고 처음부터 팀을 구성 할 수있는 능력이 있습니다.

제 질문은 기능적 요구 사항 수집 단계에서 자유 시간이있을 때 이와 같은 프로젝트에서 영향이 적은 리팩토링에 대한 의견을 수집하는 것입니다. 수천 개의 컴파일러 경고가 있으며, 거의 모두 사용되지 않은 가져 오기, 읽지 않은 로컬 변수, 유형 검사 및 안전하지 않은 캐스트가 없습니다. 코드 형식은 읽을 수없고 조잡 해 파킨슨 병을 앓고있는 것처럼 보이며 주어진 줄에서 스페이스 바를 누르는 횟수를 제어 할 수 없었습니다. 추가 데이터베이스 및 파일 리소스는 일반적으로 열리 며 안전하게 닫히지 않습니다. 무의미한 메소드 인수, 같은 일을하는 중복 메소드 등

다음 기능에 대한 요구 사항을 기다리는 동안 갈 때 영향이 적은 저 위험 요소를 정리하고 시간을 낭비하거나 올바른 일을하는지 궁금했습니다. 새로운 기능이 이전에 시간을 보냈던 코드를 제거하는 것을 의미하는 경우 어떻게합니까? 나는 민첩한 접근 방식을 시작할 것이며 이것이 민첩한 개발 과정에서 끊임없이 리팩터링하는 것이 수용 가능하고 정상적이라는 것을 이해합니다.

내가 추가하고 싶은 긍정적 인 영향이나 부정적인 영향을 생각할 수 있습니까?


1
구조 할 가치가있는 것을 구하고 나머지는 다시 쓰십시오.
SF.

"프로젝트 관리 실패와 반대로 기술적 무능력 프로젝트 실패를 경험하는 것은 매우 드문 일입니다 ...] 이것이 사실 인 것은 +1입니다.
Gregory Higley

답변:


22

먼저 단위 테스트가 통합 테스트를 대체하지 않는다는 것을 지적하고 싶습니다. 두 사람은 나란히 존재할 필요가 있습니다. 통합 테스트에 감사하십시오. 그렇지 않으면 작은 리팩토링 중 하나가 공차가 적은 공차 중 하나를 만들 수 있습니다.

컴파일러 경고와 사용하지 않는 변수 및 가져 오기 작업을 시작했습니다. 먼저 깨끗하게 빌드하십시오. 그런 다음 현재 동작을 문서화하기 위해 단위 테스트 작성을 시작한 다음 실제 리팩토링을 시작하십시오.

나는 실제로 부정적인 영향을 볼 수 없습니다. 더 큰 리팩토링에 도움이되는 코드 기반에 대해 많은 것을 이해하게됩니다. 리팩토링하는 동안 여전히 작동하는 제품이있는 반면, 재 작성하는 동안에는 리팩토링하는 동안 리팩토링하는 것이 거의 항상 바람직합니다. 그리고 결국 제품의 판매는 급여를 지불해야합니다.

요구 사항이 나오기 시작하면 스포트라이트 접근 방식을 사용합니다. 일반적인 민첩한 작업을 수행하고 (우선 순위를 정한 후 반복을 위해 작은 슬래브를 잘라 내고이를 통해 작업) 코드를 개선 할 시간을 조금 남겨 둡니다. 그런 다음 어쨌든 작업중 인 곳을 리 팩터하십시오. 시간이 지남에 따라 코드의 해당 부분을 작업하는 이유를 경영진이 정당화하기 어려운 영역으로 모험하지 않고도 코드 기반의 광범위한 영역을 다룰 수 있습니다.


이 답변이 정말 마음에 듭니다. 코드베이스에 대한 더 깊은 이해가 필요하고 현금 소는 급여를 지불하고 처음부터 시작하여 바로 시작할 수있는 다른 고객을 위해 더 나은 새 프로젝트를 진행할 수 있습니다.
maple_shaft

10

단위 테스트 작성은 시간의 가치를 높이는 데 유용 할 수 있습니다. 코드베이스의 현재 작업에 대한 통찰력을 제공하며 모든 것을 처음부터 다시 작성하지 않고 가지고있는 것부터 시작하기로 결정하면 견고한 기반을 갖게됩니다. 너무 많은 위험을 감수하지 않고 변경합니다. 단위 테스트를 작성할 때 테스트 가능한 형태로 코드베이스를 변경하기 만하면됩니다. 단위 테스트 가능은 일반적으로 모듈 식, 캡슐화 및 대부분 외부 상태와 무관하기 때문에 좋습니다. 또한, 잘 작성된 단위 테스트는 대부분 귀중한 기술 문서입니다. 단위 테스트를 수행하면 경우에 대비하여 사소한 추측이나 재 작성하는 대신 현재 코드베이스가 수행 할 수있는 것과 할 수없는 것을 판단 할 수 있습니다.


2
쉬운 것부터 시작해서 당신의 길을 개척 하시겠습니까?
tdammers

2
이것은 항상 내 경험에서 문제입니다. 이와 같은 코드는 테스트를 허용하도록 작성되지 않았 으며 처음부터 단위 테스트를 허용 하기 위해 코드를 완전히 다시 작성하지 않으면 거대한 리팩토링을해야 합니다.
웨인 몰리나

2
코드가 테스트 용으로 설계되지 않은 경우 코드를 테스트해야하는 더 많은 이유가 있지만 안전합니다. Michael Feathers의 저서 "레거시 코드로 효과적으로 작업하기"를 읽으십시오. 테스트 할 수없는 코드를 테스트 할 수있는 레시피가 있습니다.
Joe White

1
나는 동의한다; 테스트가 없을 때 내 경험에 따르면, 처음에 테스트를 준비하려면 거대한 리팩토링을 시작해야합니다. 이로 인해 "소비"리팩토링에 더 많은 시간이 걸리므로 테스트 작성이 더 어려워집니다. 실제로 실제로 리팩토링하기가 훨씬 더 어려워집니다.
웨인 몰리나

1
약간의 경험과 좋은 판단력이 필요합니다. 모든 것이 단위 테스트 가능하지는 않습니다.
tdammers

1

혼합 답변-내 생각은 테스트와 정리를 혼합하는 것입니다-아마도 50/50? TDD 종류의 접근 방식을 수행하는 영역에서 작업하는 경우-테스트를 ​​설정하고 단위 및 통합 테스트가 원하는지 확인한 다음 수정을 시작해야합니다. 시간이 허락하는대로 진행하십시오.

아마도 많은 진전을 이루지 못할 수도 있지만 적어도 일부 영역에서는 코드 기반이 안정적으로 유지되고 시작 기반이 양호하다는 것을 의미합니다.

내 직감은 처음에 "깨진 코드를 정리하는 것이 정말 아파요?" (일명 컴파일러 오류) 그러나 스레드를 죽이지 않고 메모리를 나쁜 장소에 남겨두기 때문에 문제를 해결하는 것이 실제로 이상한 경우에 실제로 기능을 깨뜨린 시간을 기억했습니다. 말 그대로 판도라의 불쾌한 놀라움의 상자 일 수 있습니다.

더 많은 요구 사항을 기다리는 동안이 작업을 수행한다고 가정하면 혼란을 진단하기 위해 할 수있는 모든 것이 장기 정신력에 크게 도움이 될 것이라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.