>  기사  >  Java  >  하드코어: 핵심 시스템에서 30,000줄 이상의 코드를 재구성하는 여정

하드코어: 핵심 시스템에서 30,000줄 이상의 코드를 재구성하는 여정

Java学习指南
Java学习指南앞으로
2023-07-26 15:48:111397검색
고전적인 책 "리팩토링"에는 다음 구절이 있습니다.
처음에 제가 했던 리팩토링은 모두 세부 사항에 관한 것이었습니다. 코드가 간결해지면서 이전에는 이해할 수 없었던 디자인 수준의 내용을 볼 수 있게 되었습니다. 리팩토링을 하지 않았다면 이 수준에 도달할 수 없었을 것입니다.
리팩토링은 프로그래머에게 정말 흥미로운 일입니다.
올해 초, 우리 팀은 약 300개의 파일과 30,000줄 이상의 코드를 포함하는 광고 시스템의 핵심 엔진 부분인 복잡한 프로젝트의 재구성을 완료했습니다.
기술 솔루션 설계부터 최종 정식 출시까지 약 1개월밖에 소요되지 않았으며, 사고는 발생하지 않았습니다.
이것은 제가 8년의 프로그래밍 경력 동안 경험한 것 중 가장 크고 성공적인 리팩토링 프로젝트여야 합니다. 속도는 충분히 빠르고, 계획은 포괄적이며, 품질은 만족스럽습니다.

01 먼저 이 시스템의 역사적 수하물에 대해 이야기합시다

우리의 광고 엔진은 이 재구성 전에 약 1년 반 동안 반복을 거쳤습니다. 초기 단계에서는 검색 시나리오를 대상으로 했습니다. 단일 비즈니스와 명확한 프로세스.

2019년부터 회사의 광고 사업은 매출이 거의 기하급수적으로 증가하면서 빠르게 확장되기 시작했습니다. 이 과정에서 우리의 광고 엔진은 두 가지 과제에 직면했습니다.

1. 비즈니스 시나리오가 복잡해지기 시작했으며 검색 광고 외에도 정보 흐름 추천 및 유사한 추천 시나리오도 지원해야 했습니다.

2. 광고 트래픽이 급격히 증가하기 시작하면 기능적 요구 사항을 충족하는 것 외에도 성능도 고려해야 합니다.

정리한 후에는 전체 엔진의 로직 대부분을 공유할 수 있으므로 메인 프레임워크를 정의하고 확장 가능한 부분을 추상화했습니다. 이러한 방식으로 각 시나리오는 해당 비즈니스의 특수성에 따라 특정 공용 인터페이스를 구현할 수 있습니다. 또한 성능 관점에서 일부 코드 가독성을 희생하고 일부 논리를 병렬화했습니다.

비즈니스가 발전함에 따라 검색 시나리오는 점점 더 많은 새로운 전략이 추가되면서 빠른 반복 기간에 들어가기 시작했으며 이때 우리의 기본 프레임워크는 점차 유연하지 않게 되었습니다.

메인 프레임을 변경하면 검색 외의 장면도 이에 맞게 재구성되어야 합니다. 빠른 사업 개발 기간에는 공사 일정이 전혀 허용되지 않아 기존 프레임워크에 대한 패치 개발만 진행할 수 있습니다. 이것은 두 가지 명백한 문제를 가져옵니다:

1. 검색의 특수 논리와 호환되기 위해서는 이러한 논리를 우회하기 위해 다른 시나리오에서 다양한 if 판단을 추가해야 합니다.

2. 프레임워크가 명확한 구조를 잃으면 일부 전략의 구현이 계층적 구분과 연결 가능한 추상 디자인이 부족하여 점점 더 많은 광고 전략이 있습니다.

이러한 맥락에서 변경 사항이 누적되면서 코드가 원래 디자인 의도에서 벗어나기 시작했고 기술적 부채가 점점 더 무거워졌습니다. 그러나 우리는 리팩터링할 적절한 시기를 찾지 못했습니다.
하드코어: 핵심 시스템에서 30,000줄 이상의 코드를 재구성하는 여정

2019년 말에 전환점이 찾아왔습니다. 광고 사업의 특수성으로 인해 자연스럽게 트래픽이 감소하기 시작했습니다. 또한, 상품 운영팀은 2년차 업무 계획에 집중했습니다. , 이는 우리에게 이 재구성을 시작하기에 좋은 기간이었습니다.

공사 기간을 1개월로 정하고 결국 온라인만 예상보다 하루 늦게 접속하게 되었지만, 2건의 온라인 문제가 발생했지만 그레이스케일 기간 동안 제때 발견하여 복구하였고, 오프라인 문제는 발생하지 않았습니다. 사고가 발생했습니다.

일반적으로 이것은 어렵고 비교적 성공적인 리팩토링 프로젝트입니다. 이 프로젝트를 통해 배운 귀중한 경험에 대해 자세히 이야기해 보겠습니다.

02 리팩토링 전 어떤 준비를 했나요?

이번에 리팩토링한 코드의 양은 30,000라인이 넘을 정도로 매우 크며, 광고 시스템의 핵심 엔진 부분입니다. 출시 전에는 다음과 같은 어려움이 예상됩니다.

비즈니스 측면의 저항

: 이러한 구조 조정은 장기적인 R&D 효율성을 가져올 수 있지만, 비즈니스 수입을 직접적으로 향상시킬 수 없으며 개발 주기가 너무 짧지 않을 것입니다. 어떻게 비즈니스 동료로부터 지원을 받을 수 있습니까? 2. 기술적 문제

: 리팩토링으로 인해 온라인 사고가 발생하면 회사에서는 어떻게 모든 사람을 가볍게 전투에 참여시킬 수 있습니까? 동시에 재구축 과정에 매우 많은 업무 반복이 산재해 있는 경우 배송 시간을 누구도 보장할 수 없으며 품질을 제어하기 어려울 것입니다.
이러한 양측의 우려를 고려할 때 다음과 같은 과제가 핵심적인 역할을 한다고 생각합니다.

하드코어: 핵심 시스템에서 30,000줄 이상의 코드를 재구성하는 여정

▍모두에게 문제점을 보여주세요

앞서 언급한 바와 같이: 비즈니스 반복으로 인해 광고 엔진의 주요 프레임워크가 흐려지고 수십 개의 광고 전략이 지저분한 구성으로 다양한 비즈니스 시나리오에 분산됩니다.

이 두 가지 문제점에 대응하여 우리는 한 달 전에 기존 사업을 정리하기 시작했고, 이전 코드를 읽고 이전 요구 사항 문서를 살펴보았습니다. 마지막으로 다양한 시나리오의 핵심 프로세스와 광고 전략을 하나의 A로 분류했습니다. 명확한 형태.

기술과 제품이 처음으로 우리 엔진 부분의 전체 그림을 명확하게 볼 수 있게 하고, 비즈니스의 복잡성과 현재의 기술적 병목 현상을 이해할 수 있게 해주는 것이 바로 이 테이블입니다.

▍리팩토링의 목표와 가치를 명확히 하고

모두가 문제점을 느낄 수 있도록 한 후, 우리는 이번 리팩토링의 두 가지 핵심 목표를 계획했습니다:

1. 메인 프레임워크: 메인 프로세스를 모듈화하고, 상위 및 하위 계층 프로토콜을 재정의하고, 각 레벨도 내부적으로 추상화되고 우수한 확장성을 갖도록 보장합니다.

2. 유연하고 구성 가능한 전략: 광고 전략은 비즈니스 의도에 따라 분류 및 추상화되며, 전략의 실행 조건은 동적으로 구성 가능하며, 전략을 마음대로 연결 및 해제할 수 있습니다.

또한 다음 두 가지 핵심 목표를 달성한 후 가져올 수 있는 예상 이점을 구체화했습니다.

1. 기술적 이점: 코드 구조가 더 명확해지고 이해 및 유지 관리가 쉬워지며 엔진 개발 효율성이 더욱 향상됩니다.

2. 비즈니스 이점: 전략을 통해 더욱 세분화된 구성 및 확장을 달성할 수 있고 비즈니스 지원에 더 친숙해지며 향상된 R&D 효율성으로 비즈니스 반복 속도를 더욱 높일 수 있습니다.

재건의 가치를 모두에게 동기화한 후 모두의 설렘을 더욱 높이고 모두에게 더 강한 참여 동기를 부여합니다.

▍전체 리듬의 조절

전체 리듬의 조절도 매우 중요한 부분이므로 모든 사람이 이 문제에 대해 시간적 기대를 가질 수 있습니다.

우선 공사기간을 1개월로 정했고, 한편으로는 사업적으로 허용 가능한 최대 사이클타임을 고려했고, 다른 한편으로는 기술적으로도 빠른 해결을 바랐습니다. 춘절이 다가오고, 회사 문 닫기 전에 서둘러야 하고, 예상치 못한 상황이 발생하지 않도록 1~2주 정도 여유를 두고 예약하세요.

또한 비즈니스 측과 합의했습니다. 재구성 기간 동안 엔진 부분에 대한 긴급하지 않은 요구 사항은 허용되지 않습니다. 이를 통해 병렬 개발 및 코드 충돌을 최소화하고 팀이 더 집중할 수 있습니다.

03 구현 과정에서 어떤 경험을 공유할 수 있나요?

이 리팩토링은 매우 원활하게 구현되었습니다. 여러분과 공유할 수 있는 4가지 귀중한 경험이 있습니다.

1. 고품질 기술 설계 솔루션

이는 일일 요구 사항으로 인해 개발 주기가 3일 이상인 프로젝트에 대한 기술 솔루션을 설계합니다. 이번 재건축도 물론 예외는 아닙니다.

프레임워크의 전체 아키텍처, 모듈 간 프로토콜 설계, 전략의 확장성 설계가 이 기술 솔루션의 초점입니다. 팀은 이에 대해 세 번 이상 논의했습니다.

큰 계획이 확정된 후 팀은 데이터베이스, 인터페이스 필드, 캐시 구조, 로그 매장지 등 공개 부분을 더욱 다듬었습니다. 여러 사람이 공동으로 개발해야 하기 때문에 팀은 문서를 다음과 같이 사용하기로 합의했습니다. 통신 인터페이스 및 문서는 항상 코드와 동기화됩니다.

이러한 높은 요구 사항에 따라 팀은 5,000단어 이상, 총 36페이지에 달하는 기술 솔루션 문서를 제작하여 전반적인 품질 보증을 위한 좋은 기반을 마련했습니다.

2. 프레임워크 코드 사전 리팩터링

이 PR은 매우 중요하며 기술 솔루션 구현에서 코드까지 가장 중요한 단계입니다. 우리는 구현 세부 사항을 먼저 무시하고 재구성된 패키지 구조, 모듈 분할, 각 계층 간의 API 정의, 다양한 광고 전략의 추상화를 정리했습니다.

이렇게 하면 기본적으로 우리가 이상적인 프레임워크를 명확하게 표현할 수 있는 메인 코드가 구성됩니다. 그런 다음 여러 중앙 집중식 코드 검토를 구성하고 마침내 통일된 의견을 형성했습니다.

이 단계를 통해 구현 세부 사항에 조기에 얽매이게 되어 기본 프레임워크에 대한 주의가 부족해지고 나중에 재작업하면 실제로 효율성이 저하되는 것을 피할 수 있습니다.

3. 빈번한 통신 및 페어링된 코드 검토 메커니즘

상세 구현 단계에 들어간 후 매우 중요한 점은 기존 로직을 이해하는 것입니다. 엔진 코드는 1년 반 동안 반복해서 개발됐는데, 이번에는 3명의 학생만이 재구성에 참여했다.

전체 과정에서 불분명한 코드 로직을 접했을 때 우리는 반복적으로 소통하고 검증했으며 주관적인 추측을 하지 않았습니다. 이 주의 사항은 실제로 매우 중요합니다.

또한 코드 검토를 위해 이 비즈니스에 익숙한 학생들을 각 모듈별로 담당하도록 배정했으며 메커니즘은 유연합니다.

4. 효과적인 테스트 계획

리팩토링이 완료되지 않았습니다. 먼저 테스트합니다. 이 원칙은 "리팩토링"이라는 책에서 강조되었으며 이 기술 솔루션에 대한 논의의 초점이기도 합니다. 여기서는 이에 대해 자세히 설명하겠습니다.

우선, 우리는 초기 단계에서 오래된 코드를 건드리지 않고 재구성을 위해 완전히 새로운 패키지를 구축하기로 합의했습니다. 이를 통해 재구성 전과 후의 결과를 쉽게 비교하고 동시에 온라인 그레이스케일 실험을 수행할 수 있습니다.

테스트 계획과 관련하여 다음 4가지 사항을 배울 가치가 있습니다.

1. 이 리팩토링에는 기능 조정이 포함되지 않으므로 외부의 동작이 API는 변경 사항이 있는 경우 이 엔드투엔드 테스트 방법이 가장 효과적입니다. 이는 R&D 및 QA 테스트의 가장 중요한 수단입니다.

2. 연기 테스트: QA 학생들은 연기 케이스를 제공하고, R&D 학생들은 연기 테스트를 실시하기 전에 모든 연기 케이스를 통과해야 합니다. 이것은 대부분의 인터넷 회사에서는 흔하지 않지만 대규모 프로젝트에는 절대적으로 효과적입니다.

3. 샌드박스 환경 이중 프로세스 검증: 앞에서 언급한 것처럼 재구성 전후의 코드가 유지되므로 온라인 환경의 입력 매개변수를 스크립트를 통해 케이스로 캡처한 다음 API 반환이 반환됩니다. 필드를 하나씩 비교합니다.

4. 온라인 환경 그레이스케일 실험: 그레이스케일은 재구성에 매우 중요합니다. 우리는 기존 ABTest 플랫폼을 사용하여 그레이스케일 트래픽을 5%에서 10%, 30%, 최종적으로 100%까지 릴리스합니다. 매우 조심스러운 규모의 확장 속도를 설정하고 로그 및 비즈니스 지표 모니터링을 통해 검증했습니다.

마지막에 작성


전체 재건 과정을 검토하고 다음 7가지 핵심 사항으로 요약합니다.

1. 구조조정의 기회를 포착하세요
2. 초기 정렬이 매우 중요합니다. 먼저 페인포인트를 찾으세요
3. 모두가 흥분할 수 있도록 목표와 가치를 명확히 하세요
4. 장기간 운영에는 적합하지 않습니다
5. 고품질의 기술 솔루션이 필요합니다
6 아직 리팩토링이 완료되지 않았습니다. 먼저 테스트하세요

7. 모든 코드 라인을 신중하게 책임져야 합니다

물론 가장 중요한 것은 사람입니다. 대규모 프로젝트 리팩토링은 팀의 협업 능력을 극도로 테스트합니다. 모두가 신뢰할 수 있다면 리팩토링은 절반의 성공입니다. .

위 내용은 하드코어: 핵심 시스템에서 30,000줄 이상의 코드를 재구성하는 여정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Java学习指南에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제