품질 향상에 가장 큰 영향을 줄 레거시 코드베이스에 무엇을 할 수 있습니까?

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

  •  02-07-2019
  •  | 
  •  

문제

레거시 코드베이스에서 일할 때 코드베이스의 품질을 향상시킬 시간이 지남에 따라 가장 큰 영향을 미치는 것은 무엇입니까?

  • 사용하지 않은 코드를 제거하십시오
  • 복제 된 코드를 제거하십시오
  • 적용 범위가 낮은 곳에서 테스트 범위를 개선하기 위해 단위 테스트 추가
  • 파일에서 일관된 형식을 만듭니다
  • 제 3 자 소프트웨어를 업데이트하십시오
  • 정적 분석 도구 (IEFINDBUGS)에 의해 생성 된 경고 감소

코드베이스는 수년에 걸쳐 다양한 수준의 전문 지식을 가진 많은 개발자들에 의해 작성되었으며, 많은 영역이 테스트에 중대한 시간을 보내지 않고 테스트를 거치지 않고 테스트를 거치지 않고 테스트 할 수 없습니다.

도움이 되었습니까?

해결책

이것은 훌륭한 책입니다.

당신이 그 대답이 마음에 들지 않으면, 내가 줄 수있는 최선의 조언은 다음과 같습니다.

  • 먼저 새로운 레거시 코드 만들기를 중지 [1

1] : 레거시 코드 = 단위 테스트가없는 코드와 알 수없는

자동화 된 테스트 스위트가없는 레거시 코드 변경은 위험하고 무책임합니다. 좋은 단위 테스트 범위가 없으면 이러한 변경 사항에 어떤 영향을 미칠지 알 수 없습니다. 깃털은 변경 해야하는 코드 영역을 분리하고 기본적인 가정을 확인하기 위해 몇 가지 기본 테스트를 작성하고 단위 테스트로 뒷받침 된 작은 변경을 수행하고 거기서 해결하는 "교살"접근 방식을 권장합니다.

참고 : 나는 당신이 모든 것을 중지하고 몇 주 동안 모든 것을 테스트하는 것을 쓰는 것이 필요하다고 말하는 것은 아닙니다. 반대로 테스트하고 운동하는 데 필요한 영역을 테스트하십시오.

Jimmy Bogard와 Ray Houston은 이것과 매우 유사한 주제에 대해 흥미로운 화면을 캐스팅했습니다.http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/05/06/pablotv-eliminating-static-dependencies-screencast.aspx

다른 팁

나는 약 50 명의 프로그래머가 작성하고 수정 한 레거시 1M LOC 응용 프로그램으로 작업합니다.

* Remove unused code

거의 쓸모가 없습니다 ... 그냥 무시하십시오. 당신은 그로부터 큰 수익 투자 (ROI)를 얻지 못할 것입니다.

* Remove duplicated code

사실, 무언가를 고치면 항상 복제를 검색합니다. 일부를 발견 한 경우 일반 기능을하거나 복제를 위해 모든 코드 발생을 주석에 넣습니다 (때때로 일반적인 기능을하는 노력은 그만한 가치가 없습니다). 주요 아이디어는 내가 같은 행동을 두 번 이상 싫어하는 것을 싫어한다는 것입니다. 또 다른 이유는 다른 사건을 확인하는 것을 잊어 버린 사람이 항상 있기 때문입니다 ...

* Add unit tests to improve test coverage where coverage is low

자동화 된 단위 테스트는 훌륭합니다. 그러나 큰 백 로그가있는 경우 안정성 문제가 없다면 작업 자체를 홍보하기가 어렵습니다. 작업중 인 부분과 함께 가서 몇 년 안에 괜찮은 보험이 있기를 바랍니다.

* Create consistent formatting across files

IMO 형식의 차이는 레거시의 일부입니다. 코드가 누구 또는 언제 작성되었는지에 대한 힌트를 제공합니다. 이것은 코드의 해당 부분에서 행동하는 방법에 대한 단서를 줄 수 있습니다. 재구성 작업을 수행하는 것은 재미 있지 않으며 고객에게는 가치가 없습니다.

* Update 3rd party software

새로운 운영 체제에서 새로운 기능이 있거나 보유한 버전이있는 경우에만 수행하십시오.

* Reduce warnings generated by static analysis tools

그것은 그만한 가치가 있습니다. 언젠가 경고는 잠재적 인 버그를 숨길 수 있습니다.

테스트 범위를 개선하기 위해 단위 테스트를 추가하십시오. 테스트 범위가 양호하면 두려움없이 재검사하고 기능을 향상시킬 수 있습니다.

CPPUNIT의 저자가 작성한이 책에 대한 좋은 책이 있습니다. 레거시 코드로 효과적으로 작동합니다.

레거시 코드에 테스트를 추가하는 것은 처음부터 테스트를 작성하는 것보다 더 어려운 일입니다. 내가이 책에서 빼낸 가장 유용한 개념은 깃털이 다음과 같이 정의하는 "Seams"라는 개념입니다.

"그 장소에서 편집하지 않고 프로그램에서 행동을 바꿀 수있는 곳."

때로는 미래의 테스트가 더 쉽게 (또는 처음에는 가능) 할 수있는 이음새를 만들기 위해 리팩토링 할 가치가 있습니다. Google 테스트 블로그 주제에 대한 몇 가지 흥미로운 게시물이 있으며 대부분의 과정을 중심으로 회전합니다. 의존성 주입.

'복제 된 코드 제거'라고 말하고 싶습니다. , 많은 코드와는 반대로, 버그를 수정하기 위해.

나는 현재 무릎에 '그'구식 코드베이스 중 하나에있는 것처럼이 질문과 관련 될 수 있습니다. 그것은 실제로 유산이 아니지만 확실히 몇 년의 추세를 따르지 않았습니다.

그들이 매일 나를 버그 할 때 내가 고치고 싶은 것들을 말해 줄게.

  • 입력 및 출력 변수를 문서화하십시오
  • 변수 이름을 리팩터링하여 실제로 다른 것을 의미하고 일부 헝가리 표기법 접두사와 모호한 의미를 가진 세 글자의 약어가 이어집니다. Cammelcase는 갈 길입니다.
  • 소프트웨어를 사용하는 수백 명의 고객에게 영향을 미치며 누군가가 가장 모호한 부작용을 발견 할 수 있으므로 코드를 변경하는 것이 무서워합니다. 반복 가능한 회귀 테스트는 현재 0이 있기 때문에 축복이 될 것입니다.

나머지는 정말 땅콩입니다. 이것들은 레거시 코드베이스의 주요 문제이며, 실제로 많은 시간을 먹습니다.

레거시 코드로 무엇을하고 싶은지에 달려 있다고 말하고 싶습니다.

그것이 무기한 유지 보수 모드에 남아 있고 잘 작동한다면 전혀 아무것도하지 않는 것이 가장 좋은 방법입니다. "부러지지 않았다면 고치지 마십시오."

잘 작동하지 않으면 사용되지 않은 코드를 제거하고 중복 코드를 리팩토링하면 디버깅이 훨씬 쉬워집니다. 그러나 오류 코드에서만 이러한 변경 사항을 수행 할 것입니다.

버전 2.0을 계획하면 단위 테스트를 추가하고 코드를 정리하십시오.

좋은 문서. 레거시 코드를 유지하고 확장 해야하는 사람으로서, 이것이 가장 큰 문제입니다. 이해하지 못하는 코드를 변경하는 것은 완전히 위험하지 않더라도 어렵습니다. 문서화 된 코드를 건설하기에 운이 좋더라도, 문서가 옳다는 것이 얼마나 확실합니까? 원래 저자의 암시 적 지식을 모두 다루고 있습니까? 그것이 모든 "트릭"과 엣지 케이스에 대해 말하는가?

좋은 문서화는 원래 저자 이외의 사람들이 나쁜 코드를 이해, 수정 및 확장 할 수있게 해줍니다. 나는 매주 완벽하지만 불가능한 코드에 대해 이해할 수있는 해킹되지만 잘 문서화 된 코드를 가져갈 것입니다.

내가 작업 해야하는 레거시 코드에 대해 내가 한 가장 큰 일은 그 주위에 실제 API를 구축하는 것입니다. 제가 .NET 객체 모델을 구축 한 것은 1970 년대 스타일의 COBOL API로, 모든 안전하지 않은 코드가 한 곳에 있도록 API의 기본 데이터 유형과 .NET 데이터 유형 사이의 모든 번역이 한 곳에 있습니다. 기본 메소드는 데이터 세트를 반환하고 수락합니다.

이것은 제대로하기가 엄청나게 어려웠으며, 여전히 내가 알고있는 약간의 결함이 있습니다. 모든 마샬링이 계속되는 것은 매우 효율적이지 않습니다. 그러나 반면에, 나는 약 30 분 안에 btrieve (!)에서 데이터를 지속하는 15 살짜리 응용 프로그램에 대한 라운드 트립 데이터를 구축 할 수 있습니다. 고객이 프로젝트를 통해 나에게 오면 내 추정치는 몇 달과 몇 년이 아닌 며칠과 몇 주입니다.

Josh Segall이 말한 것과 유사하게, 나는 그것의 지옥에 대해 언급을 말할 것입니다. 나는 무릎에 버려진 몇 가지 대형 레거시 시스템에서 작업했으며 가장 큰 문제는 이미 특정 코드 섹션에 대해 배운 내용을 추적하는 것입니다. "Do Do"노트를 포함하여 내가 가면서 메모를하기 시작하면 이미 알아 낸 것을 다시 제기하는 것을 중단했습니다. 그런 다음 해당 코드 세그먼트가 흐르는 방식에 중점을 둘 수 있습니다.

나는 그냥 그것을 대부분 내버려두고 있다고 말할 것입니다. 깨지지 않으면 고치지 마십시오. 고장이 발생하면 계속 진행하여 고장난 코드 부분과 즉시 주변 코드를 수정하고 개선하십시오. 버그의 고통이나 누락 된 기능을 사용하여 해당 부분을 개선하는 노력과 비용을 정당화 할 수 있습니다.

실제 비즈니스 또는 최종 사용자 요구에 의해 안내되지 않는 단위 테스트를 재 작성, 리팩터, 개혁 또는 단위 테스트를 추천하지 않습니다.

당신이 무언가를 고칠 수있는 기회를 얻는다면, 올바르게 수행 할 수 있다면 (처음으로 올바르게 할 수있는 기회는 이미 통과되었을 수도 있지만, 그 부분을 다시 만지기 때문에 주변에 적절한 시간을 할 수도 있습니다). 당신이 언급 한 항목.

따라서 요약하면, 당신이해야 할 일이나 몇 가지 일이 없습니다. 당신은 작은 부분과 기회 주의적 방식으로 모든 것을해야합니다.

파티에 늦었지만 다음은 함수/방법이 사용되거나 자주 참조되는 경우에 다음과 같은 가치가있을 수 있습니다.

  • 로컬 변수는 종종 레거시 코드에서 잘못 명명되는 경향이 있습니다 (메소드가 수정 될 때 범위가 확장되어이를 반영하도록 업데이트되지 않기 때문에 종종 범위가 확장되어야합니다). 실제 목적에 따라이를 바꾸면 레거시 코드를 명확히하는 데 도움이 될 수 있습니다.
  • 방법을 약간 다르게 배치하더라도 놀라운 일이 될 수 있습니다. 예를 들어 if 한 줄에.
  • 이미 부실/혼란스러운 코드 댓글이있을 수 있습니다. 필요하지 않은 경우 제거하거나 절대적으로 필요한 경우 수정하십시오. (물론, 나는 유용한 의견을 제거하는 것을 옹호하는 것이 아니라 방해가되는 의견입니다.)

이것들은 당신이 찾고있는 대규모 헤드 라인에 영향을 미치지 않을 수도 있지만, 특히 코드를 단위 테스트 할 수없는 경우 위험이 낮습니다.

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