English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

게스트
1 / ?
수업 목록으로

성장률을 위해 코드 읽기

정확성을 위한 코드 리뷰 vs 복잡도를 위한 코드 리뷰

정확성을 위한 코드 리뷰는 논리 오류를 찾습니다: 잘못된 조건, off-by-one 인덱스, 누락된 null 체크. 복잡도 인식 코드 리뷰는 다른 클래스의 결함을 찾습니다: N = 100에서 정확하게 작동하지만 N = 100,000에서 급격하게 증가하는 코드.

MOAD-0001 패턴: list seen O(N²) vs set seen O(N) — 한 줄 수정


이 수업은 unhamming 과정의 더 깊은 조사와 연결됩니다: 빠진 장: 알고리즘 복잡도는 프로덕션 결함의 맥락에서 Big O를 다루고, & MOAD-0001: 퇴적질 결함은 60개 이상의 소프트웨어 생태계에 걸쳐 패턴을 매핑합니다.


두 가지 리뷰 휴리스틱


중첩 루프는 복잡도를 곱합니다. N개 항목에 대한 두 개의 중첩 루프는 O(N²)를 생성합니다. 세 개는 O(N³)를 생성합니다. 리뷰할 때: 루프 중첩 깊이를 먼저 세십시오.


핫 루프 내의 순차 컨테이너. 루프 내의 .contains(), .includes(), .find(), 또는 in list 체크는 확인당 O(N) 비용이 듭니다. N번의 반복에 걸쳐: O(N²) 총계. 이 패턴은 GHC Haskell 컴파일러, Python pip, Apache Maven, Rust Cargo, TypeScript, Godot에 걸쳐 프로덕션 코드에 나타납니다. 같은 실수, 다른 코드베이스.

리뷰: find_duplicates

복잡도를 위해 다음 Python 함수를 리뷰하십시오:


def find_duplicates(items):
    seen = []
    duplicates = []
    for item in items:
        if item in seen:
            duplicates.append(item)
        else:
            seen.append(item)
    return duplicates
복잡도 인식 코드 리뷰를 수행하십시오: (a) 이 함수의 시간 복잡도는 무엇입니까? (b) 왜입니까? 책임 있는 정확한 줄을 식별하십시오. (c) O(N)으로 다시 작성하십시오.

MOAD-0001: 퇴적질 결함

같은 결함, 60개 생태계

if x not in list: list.append(x) 패턴은 루프 내부에서 나타납니다 — 수십 개의 소프트웨어 생태계 전반의 프로덕션 코드에 나타났습니다:


- GHC (Haskell 컴파일러): 의존성 리졸버, N = 50,000 패키지에서 O(N²), 17분 빌드

- Python pip: 의존성 충돌 해결

- Apache Maven: 클래스패스 중복 제거

- Rust Cargo: 기능 통합

- TypeScript 컴파일러: 모듈 해결

- Godot / Redot 게임 엔진: 노드 그래프 탐색


이 팀들 중 어느 것도 실수를 하지 않았습니다. 그들은 작은 N에서 정확한 코드를 작성했습니다. N이 증가했습니다. 코드가 경화되었습니다. 패턴의 이름이 있습니다: MOAD-0001, 퇴적질 결함. 퇴적물: 얇은 층에서는 정확하고 무해합니다. 시간이 지남에 따라 층이 축적되고 경화됩니다.


수정

모든 경우에: 순차 컨테이너를 해시 컨테이너로 바꾸십시오. 한 줄. 정확한 입력에서 0 동작 변경. 실제 N에서 100–1,000× 속도 증가.


수정이 작동하는 이유는 두 가지 작업이 빠르게 유지되어야 하기 때문입니다:

1. 멤버십 확인: 이 요소를 이전에 본 적이 있습니까?

2. 정렬된 출력: 요소를 나타난 순서대로 반환 (때로는 필요, 때로는 필요 없음).


세트는 (1)을 O(1)에서 처리합니다. (2)도 중요한 경우 정렬된 출력을 위해 별도의 리스트와 멤버십 확인을 위해 세트를 유지하십시오. 각각 한 가지 작업을 수행하는 두 개의 데이터 구조.

리뷰어에게 응답하기

풀 요청이 프로젝트의 그래프 탐색 함수에서 MOAD-0001을 수정합니다. 리뷰어가 댓글을 달았습니다:


> "세트는 삽입 순서를 보존하지 않습니다 — 이것은 동작을 변경합니다."

어떻게 대응합니까? 리뷰어의 우려가 언제 적용되는지, 언제 적용되지 않는지 설명하십시오. 둘 다 충돌할 때 두 가지 우려를 모두 만족하는 솔루션을 제시하십시오.

인터뷰 분석 패턴

예상되는 형식

알고리즘 복잡도 분석은 소프트웨어 엔지니어링 인터뷰에 나타납니다. 강한 답변은 네 부분 패턴을 따릅니다:


1. 현재 복잡도 명시 — 시간 O(?), 공간 O(?).

2. 왜인지 설명 — 책임 있는 특정 구성 식별 (중첩 루프, 루프 내 선형 스캔, 재귀 분기).

3. 최적화 제안 — 변경 이름 및 도입하는 데이터 구조 또는 알고리즘.

4. 새로운 복잡도 명시 — 수정 후 시간 & 공간 복잡도는 무엇입니까?


예:

코드: [루프 내 리스트에서 멤버십을 확인하는 함수]
현재: O(N²) — `item in seen_list`는 N번의 반복당 O(N) 체크
최적화: seen_list를 seen_set (해시 세트)로 바꾸십시오
후: O(N) — 세트 멤버십 확인은 O(1)

이 스킬은 인터뷰를 넘어 전달됩니다: 복잡도 인식 코드 리뷰, 아키텍처 설계, 성능 디버깅, 보안 감사. 가변 크기 입력을 처리하는 모든 시스템이 이득을 봅니다.


이 수업은 unhamming 과정을 앞으로 연결하며, 60개 이상의 오픈소스 프로젝트 전반의 프로덕션 결함 조사에 정확히 이 패턴을 적용합니다.

인터뷰: has_common_element 분석

네 부분 인터뷰 형식을 이 함수에 적용하십시오:


def has_common_element(list_a, list_b):
    for item in list_a:
        for other in list_b:
            if item == other:
                return True
    return False
현재 복잡도를 명시하고, 왜인지 설명하고, 최적화를 제안하고, 새로운 복잡도를 명시하십시오.