워크스루(Walkthrough)

워크스루는 마치 박물관 가이드가 관람객들을 안내하듯이, 코드 작성자가 리뷰어들을 코드를 통해 “안내"하는 과정이다.
이 과정에서 코드의 의도, 구현 방식, 그리고 잠재적인 문제점들을 함께 발견하고 논의할 수 있다.

워크스루 세션의 실제 예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 워크스루 세션 중 코드 설명 예시
public class OrderProcessor {
    // 발표자: "주문 처리 시스템의 핵심 클래스입니다.
    // 주문의 유효성 검사부터 결제, 배송 처리까지 담당합니다."
    
    private final PaymentService paymentService;
    private final InventoryService inventoryService;
    private final ShippingService shippingService;
    
    public OrderResult processOrder(Order order) {
        // 발표자: "먼저 주문의 유효성을 검사합니다.
        // 여기서 중요한 것은 재고 확인입니다."
        if (!validateOrder(order)) {
            throw new InvalidOrderException("Invalid order");
        }
        
        // 발표자: "재고가 확인되면 결제를 진행합니다.
        // 결제는 트랜잭션으로 처리됩니다."
        PaymentResult payment = paymentService.processPayment(order);
        
        // 리뷰어 질문: "결제 실패 시 재고는 어떻게 처리되나요?"
        // 발표자: "좋은 지적입니다. 결제 실패 시 재고를 원복하는
        // 로직을 추가해야 할 것 같네요."
        
        if (payment.isSuccessful()) {
            // 발표자: "결제가 성공하면 배송 처리를 시작합니다."
            return createShippingOrder(order, payment);
        }
        
        return OrderResult.failure("Payment failed");
    }
}

워크스루의 주요 특징과 장점

  1. 상호작용적 학습
    참가자들은 실시간으로 질문하고 토론할 수 있다:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    // 워크스루 중 발생한 토론을 반영한 코드 개선 예시
    public class PaymentProcessor {
        // 발표자: "결제 처리 로직입니다."
        public PaymentResult processPayment(Order order) {
            try {
                // 리뷰어 제안: "타임아웃 설정이 필요할 것 같아요."
                // 발표자: "네, 좋은 지적입니다. 추가하겠습니다."
                return paymentGateway
                    .withTimeout(Duration.ofSeconds(30))
                    .processPayment(order.getPaymentDetails());
            } catch (PaymentException e) {
                // 다른 리뷰어 제안: "실패 원인을 더 자세히 로깅하면 좋겠어요."
                logger.error("Payment failed: {}", e.getDetailedMessage());
                return PaymentResult.failure(e.getErrorCode());
            }
        }
    }
    
  2. 지식 공유와 이해도 향상
    복잡한 비즈니스 로직이나 아키텍처 결정사항을 효과적으로 공유할 수 있다:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    // 아키텍처 결정사항 설명 예시
    public class CacheStrategy {
        // 발표자: "캐시 전략을 설명드리겠습니다.
        // 우리는 Write-Through 캐시를 선택했는데, 그 이유는…"
    
        public void updateData(String key, Object value) {
            // 1. 캐시 업데이트
            cache.put(key, value);
    
            // 2. DB 업데이트
            database.save(key, value);
    
            // 발표자: "이렇게 하면 데이터 일관성은 보장되지만,
            // 쓰기 작업이 약간 느려질 수 있습니다."
        }
    }
    

진행 과정

  1. 작성자가 코드나 문서를 팀에게 설명
  2. 팀원들이 질문하고 피드백 제공
  3. 문제점과 개선 사항 논의
  4. 필요한 경우 수정 사항 결정

적용 분야

워크스루는 다음과 같은 경우에 특히 유용하다:

  • 복잡한 알고리즘 이해
  • 실시간 동작이나 병행 처리 기능 검토
  • 설계 다이어그램 검토
  • 테스트 케이스 검토

워크스루 진행을 위한 효과적인 방법

  1. 사전 준비
    발표자는 설명할 내용을 체계적으로 준비한다:
    1. 코드 개요 준비
    2. 주요 설명 포인트 정리
    3. 예상 질문 준비
  2. 효과적인 진행
    단계적으로 설명하며 참가자들의 이해를 확인한다:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// 단계별 설명 구조 예시
public class FeatureImplementation {
    // 1단계: 기능 개요
    // 발표자: "이 기능의 목적과 전체 구조를 설명드리겠습니다."
    
    // 2단계: 구현 세부사항
    public void processFeature() {
        // 각 단계별로 상세 설명
        validateInput();     // "입력 검증 로직입니다."
        transformData();     // "데이터 변환 과정입니다."
        saveResults();       // "결과 저장 방식입니다."
    }
    
    // 3단계: 예외 처리와 에지 케이스
    // 발표자: "발생 가능한 문제 상황들을 살펴보겠습니다."
}

참고 및 출처