코드 검토가 너무 어려울 때 어떻게합니까? 없거나 변경된

많은 코드 검토가 상당히 일상적입니다. 그러나 때때로 기존의 복잡하고 취약한 코드에 크게 영향을 미치는 변경 사항이 있습니다. 이 경우 변경의 안전성, 회귀 부재 등을 확인하는 데 걸리는 시간이 너무 깁니다. 아마도 개발 자체를 수행하는 데 걸리는 시간을 초과했을 수도 있습니다.

이 상황에서 어떻게해야합니까? 병합하고 아무 것도 미끄러지지 않기를 바랍니다. (권장하지 않음!) 최선의 방법은 명백한 결함을 발견하려고 노력할 것입니다 (아마도 이것이 코드 검토가 목표로해야하는 가장 많은 코드일까요?) 코드 검토보다 더 나은 대안으로 완전히 병합하고 테스트합니까?

이것은 코드 검토의 일부로 테스트를 수행해야하는지에 대한 질문이 아닙니다. 이것은 설명 된 상황에서 가장 좋은 옵션이 무엇인지 묻는 질문입니다. 특히 마감 기한이 지났거나 포괄적 인 단위 테스트 세트가 없거나 변경된 조각 코드에 대해 단위 테스트를 실행할 수 없습니다.

편집 : 나는 지금까지 몇 가지 답변 / 의견이 “광범위한 영향”이라는 문구에서 선택되었다는 인상을 받았으며 변경 사항이 많은 코드 줄과 관련이 있음을 의미했습니다. 나는 이것이 해석이라는 것을 이해할 수 있지만 실제로는 내 의도가 아니었다. “광범위한 영향”이란 예를 들어 코드베이스의 상호 연결성 또는 녹온 효과의 범위 때문에 회귀 가능성이 높다는 것을 의미합니다. 반드시 변경 자체가 큰 것은 아닙니다. 예를 들어, 개발자는 기존의 높은 수준의 루틴을 호출하여 여러 개의 낮은 수준의 루틴에 대한 호출을 캐스케이드하여 단일 라인으로 버그를 수정하는 방법을 찾을 수 있습니다. 버그 수정이 효과가 있는지 테스트하고 확인하는 것은 쉽습니다. 코드 검토를 통해 수동으로 모든 노크 효과의 영향을 확인하는 것이 훨씬 더 어렵습니다.



답변

이 질문의 전제는 솔직히 놀랍습니다. 취약하고 복잡한 코드에는 큰 변화가 있으며 코드를 제대로 검토 할 시간이 충분하지 않다고 가정합니다 . 이것은 검토에 더 적은 시간을 소비해야하는 마지막 코드입니다 ! 이 질문은 코드 자체뿐만 아니라 변경 관리 방법에 구조적 문제가 있음을 나타냅니다.

이 상황을 어떻게 처리할까요? 처음에는 들어 가지 않는 것으로 시작하십시오.

  • 복잡성의 원인을 파악하고 신중하게 검토 한 정확한 리팩토링을 적용하여 추상화 수준을 높입니다. 비즈니스 영역에 대해 알고있는 신입 직원이 코드를 이해할 수 있어야합니다.

  • 취약성의 원인을 식별하십시오. 이것은 코드 자체의 검토, 코드의 버그 수정 이력 검사 등을 통해 가능합니다. 취약한 서브 시스템을 결정 하고보다 강력하게 만드십시오 . 디버깅 로직을 추가하십시오. 어설 션을 추가하십시오. 동일한 알고리즘을 느리지 만 정확하게 구현하고 디버그 빌드에서 두 가지를 모두 실행하고 동의하는지 확인하십시오. 디버그 빌드에서 드문 상황이 더 자주 발생합니다. (예를 들어, 항상 재할 당시 블록을 이동하거나 페이지 끝에서 항상 블록을 할당하는 메모리 할당자를 만드십시오 .) 컨텍스트가 변경 될 때 코드를 강력하게 만드십시오. 이제 더 이상 깨지기 쉬운 코드가 없습니다. 이제 버그를 일으키는 것이 아니라 버그를 찾는 코드가 있습니다.

  • 자동화 된 테스트 모음을 작성하십시오. 명백하게.

  • 크게 변경하지 마십시오. 일련의 작고 대상이 지정된 변경 사항을 작성하십시오. 각 변경 사항은 정확합니다.

그러나 근본적으로, 당신의 시나리오는 “우리는 기술 부채의 구멍에 파고 들었고, 각각의 복잡하고 검토되지 않은 변화는 우리를 더 깊이 파고 듭니다. 어떻게해야합니까?” 당신은 그 구멍에 자신을 찾을 때 무엇을합니까? 파고 그만 . 채무가 너무 많아서 서로의 코드를 검토하는 것과 같은 기본 작업을 수행 할 수없는 경우 더 많은 채무를 중단하고 상환하는 데 시간을 소비해야합니다.


답변

코드 검토의 기본 목표 중 하나는 품질높이고 강력한 코드를 제공하는 것 입니다. 4 개의 시선이 일반적으로 2보다 더 많은 문제를 발견하기 때문에 강력합니다. 추가 코드를 작성하지 않은 검토자는 잠재적으로 잘못된 가정에 도전 할 가능성이 높습니다.

동료 검토를 피하면 코드의 취약성이 증가하는 데 기여할 수 있습니다. 물론 견고하고 반복 가능한 테스트 스위트로 테스트를 강화하면 품질이 확실히 향상 될 수 있습니다. 그러나 대체 검토가 아닌 동료 검토를 보완해야합니다 .

복잡성을 이해하고 숙달해야한다고 생각하며 전체 동료 검토는 지식을 공유 하고이를 달성 하는 기회 입니다. 취약한 코드의 강점과 약점을 더 많은 사람들이 이해하도록하는 데 투자하면 시간이 지남에 따라 더 나은 코드를 만드는 데 도움이됩니다.

결론 :

“빨리 가고 싶다면 혼자 가십시오. 멀리 가고 싶다면 같이 가십시오”


답변

레거시 소프트웨어 개발의 세계에 오신 것을 환영합니다.

코드는 수십만, 수백만, 수천만 줄이 있습니다.

이러한 코드 라인은 가치가 있으며, 이는 수입원을 창출하고이를 대체하는 것은 불가능합니다.

귀하의 비즈니스 모델은 해당 코드 기반을 활용합니다. 따라서 팀 규모가 작고 코드 기반이 큽니다. 사람들이 새로운 버전의 코드를 구매하거나 기존 고객을 행복하게하려면 기능을 추가해야합니다.

완벽한 세계에서 거대한 코드 기반은 wazoo에서 단위 테스트되었습니다. 당신은 완벽한 세상에 살고 있지 않습니다.

덜 완벽한 세상에서는 기술 부채를 고칠 예산이 있습니다. 코드를 단위 테스트 가능한 부분으로 나누고, 광범위한 통합 테스트를 수행하고 반복하십시오.

그러나 이것은 새로운 기능을 생성하지 않고 부채를 상환하고 있습니다. “업그레이드 인센티브를 생성하기 위해 코드를 수정하면서 기존 코드의 수익을 거두는”비즈니스 사례와 일치하지 않습니다.

엄청난 양의 코드를 가져와 더 현대적인 기술을 사용하여 다시 작성할 수 있습니다. 그러나 기존 코드와 상호 작용할 때마다 가능한 브레이크 포인트가 노출됩니다. 시스템에서 해킹하면 다시 작성하지 않은 하위 시스템의 단점을 실제로 보상합니다. 항상.

있는 것은 신중하게 행동하는 것입니다. 실제로 이해하고 나머지 시스템과의 동작 및 상호 작용을 잘 이해하는 코드의 일부를 찾을 수 있습니다. 단위 테스트를 추가하고 동작을보다 명확하게 만들어 현대화 할 수 있습니다.

그런 다음 주로 앱과 상호 작용하는 나머지 앱 부분을 찾아 한 번에 하나씩 공격하십시오.

그렇게하면 고객이 지불하고자하는 기능을 추가하여 서브 시스템을 개선 할 수 있습니다.

요컨대 이것은 비즈니스 사례를 제공하는 것을 깨뜨리지 않고 변경하는 것이 가능한 기술입니다.

그러나 이것은 당신의 질문이 아닙니다. 귀하의 질문은 “거대한 일을하고 있고 물건을 부러 뜨릴 수있는 일을하고 있으며 모범 사례를 어떻게 따르나요?”입니다.

큰 일을 할 때, 안정적으로하고 싶다면 버그를 추적하고 작성하는 것보다 더 많은 노력을 기울이는 것이 사실입니다. 이것은 소프트웨어 개발의 일반적인 규칙입니다. 물건을 작성하는 것은 쉽고, 완벽하게 작동하는 것은 어렵습니다.

당신은 아마도이 거대한 변화가 진행될 것이라고 이해 관계자들에게 약속 한 비즈니스 사례를 머리에 걸었을 것입니다. 그리고 그것은 “완료”입니다. “좋아요”

권한과 예산이 있다면 실제로 변경 사항이 적용되었다는 확신을 가지도록 노력하거나 변경 사항을 거부하십시오. 이것은 친절하지 않고 정도의 문제가 될 것입니다.

그다지 힘이 없지만 여전히 약간의 힘이 있다면, 새로운 시스템 이 단위 테스트 가능 하다고 주장하십시오 . 일부 서브 시스템을 다시 작성하는 경우 새 서브 시스템은 올바르게 지정된 동작과 그에 대한 단위 테스트를 가진 작은 부품으로 구성되어야합니다.

그렇다면 최악의 경우가 있습니다. 당신은 빚에 깊이 들어가 있습니다. 현재 기능을 사용하기 위해 취약하고 더 많은 코드를 사용하여 프로그램의 미래에 대항하여 결과를 손상 시킵니다. 스윕 기반 QA를 수행하여 최악의 문제를 찾고 나머지는 무시합니다. 이것은 현재 가장 저렴하기 때문에 실제로 비즈니스 관점에서 정답입니다. 이익을 창출하기 위해 부채로 들어가는 것은 유효한 사업 전략입니다. 특히 파산을 통해 부채를 청산하는 것이 (코드 중단) 표에 있습니다.

큰 문제는 회사 소유자의 인센티브가 의사 결정자와 프로그래머와 거의 일치하지 않는다는 것입니다. ‘납품’해야하는 압력이 많이있는 경향이 있으며, 거의 보이지 않는 (상사에게) 기술 부채를 발생시킴으로써 그렇게하는 것은 단기적이고 때로는 중기적인 전략입니다. 모든 부채를 만들지 않으면 서 상사 / 이해 관계자에게 최상의 서비스를 제공 할 수 있습니다 .


답변

코드 검토가 너무 어려워지는 더 큰 문제를 해결하십시오.

내가 지금까지 발견 한 것들 :

  1. 단위 테스트 스위트 없음
  2. 보다 합리적인 코드 구조와 코딩 업무 위임으로 피할 수있는 복잡한 코드 병합
  3. 초보 아키텍처의 명백한 부족

답변

  1. 코드 검토를 다시 보내 개발자에게 더 작고 점진적인 변경 세트로 나누고 더 작은 코드 검토를 제출하도록 개발자에게 지시 할 수 있습니다.

  2. 코드의 모든 세부 사항을 거치지 않고도 코드 냄새, 패턴 및 안티 패턴, 코드 형식 표준, SOLID 원칙 등을 계속 확인할 수 있습니다.

  3. 전체 변경 집합의 전체적인 의도를 반드시 이해하지 않고도 적절한 수준의 올바른 입력 유효성 검사, 잠금 / 스레드 관리, 처리되지 않은 예외 등을 세부적으로 파악하기 위해 전술 코드 검사를 수행 할 수 있습니다.

  4. 코드에 의해 영향을받을 수있는 전반적인 위험 영역에 대한 평가를 제공하고 개발자에게 이러한 위험 영역이 단위 테스트되었는지 확인하도록 요청하거나 자동화 된 단위 테스트를 작성하도록 요청하고 검토를 위해 제출할 수도 있습니다. ).


답변

이 경우 변경의 안전성, 회귀 부재 등을 확인하는 데 걸리는 시간이 너무 깁니다.

코드 검토는 주로 정확성을 목표로하지 않아야합니다. 코드 가독성, 유지 보수성 및 팀 표준 준수를 향상시키기 위해 여기에 있습니다.

코드 검토 중 정확성 버그를 찾는 것은 버그의 부산물이지만 개발자는 검토를 위해 코드 를 제출하기 전에 코드가 완벽하게 작동하는지 (비 회귀 포함) 확인해야합니다 .

처음부터 정확성을 갖추어야합니다. 한 명의 개발자가이를 달성 할 수없는 경우 프로그램을 구성하거나 전체 팀과 계획을 세우도록하지만 나중에이를 추가 할 수있는 것으로 취급하지 마십시오.


답변

코드 검토가 너무 어렵다고 생각하면 깨지지 않고 변경하기 어려운 취성 코드를 변경했기 때문에 문제가 있습니다. 그러나 문제는 코드 검토와 관련이 없습니다. 취성 코드는 단위 테스트 할 수 없기 때문에 단위 테스트에는 문제가 없습니다! 코드가 단위 테스트 가능하다면 코드는 독립적 인 작은 단위로 나뉘어져 있고, 각각 테스트 할 수 있고, 잘 작동하며, 이것이 당신이 가지고 있지 않은 것입니다!

그래서 당신은 쓰레기 코드 (일명 “기술 부채”)가 있습니다. 당신이 할 수있는 최악의 일은 쓰레기 코드의 힙을 수정하기 시작하고 더 큰 쓰레기 코드 힙을 얻을 수 있기 때문에 작업을 끝내지 않는 것입니다. 그래서 첫 번째 것은 당신의 관리가 고정으로 구입하는 얻는 것입니다 작업을 완료 할 수 있습니다. 또는 당신은하지 않습니다. 이 경우에는 손대지 마십시오.

그것을 고치면 코드에서 하나의 단위를 추출하여 잘 정의되고 잘 문서화 된 동작으로 만들고, 해당 단위에 대한 단위 테스트를 작성하고, 코드를 검토하고, 아무것도 깨지지 않도록기도하십시오. 그런 다음 다음 장치와 동일하게 수행합니다.

까다로운 비트는 버그가 발생할 때 발생합니다. 쥐의 코드 네스트는 어떤 경우에는 잘못된 일을 할 것입니다. 일이 너무 부서지기 쉽고 복잡하기 때문에 일이 잘못 될 것입니다. 단위를 추출하면 나머지 코드가 더 명확 해집니다. (일부 리팩토링 후에 함수가 “if (condition1 && condition2 && condition3) crash ();”로 시작한 경우가 있었는데, 이는 리팩토링 전의 동작과 정확히 같았습니다. 이상하고 원치 않는 행동을 명확하게 수정하면 문제를 해결할 수 있습니다. 반면 에, 기존 코드의 동작을 변경 해야 하므로주의해서 수행해야합니다.