[코드 냄새 #5] 산탄총 수술 vs 발산적 변경
산탄총 수술은 변경 하나가 여러 파일로 흩어지는 냄새이고, 발산적 변경은 한 파일이 여러 이유로 바뀌는 거울상입니다. 처방이 정반대인 두 냄새를 커밋 기록으로 실측하고 구분하는 법을 정리했습니다.
읽어보기SEARCH THE GROUND
제목과 설명, 카테고리, 태그를 한 번에 검색합니다.
최근 글 15개를 보여드려요.
산탄총 수술은 변경 하나가 여러 파일로 흩어지는 냄새이고, 발산적 변경은 한 파일이 여러 이유로 바뀌는 거울상입니다. 처방이 정반대인 두 냄새를 커밋 기록으로 실측하고 구분하는 법을 정리했습니다.
읽어보기갓 오브젝트는 주변의 책임과 데이터를 계속 흡수하며 커지는 클래스로, 팀에서 가장 자주 바뀌고 가장 자주 충돌합니다. 커지는 것을 알아채는 신호와 해체 순서, 쪼개다 실패하는 두 가지 방식을 정리했습니다.
읽어보기함수는 전부 다섯 줄이고 책임도 하나씩인데 버튼을 누르면 무슨 일이 벌어지는지 아무도 답하지 못하는 코드가 라비올리 코드입니다. 쪼개기가 과해지는 이유와 점프 횟수로 드러나는 비용, 흐름을 되찾는 법을 정리했습니다.
읽어보기2019년 Swift 5와 iOS 12.2 배포 후 앱 용량이 줄어든 것은 ABI 안정성 덕분입니다. 앱마다 품고 다니던 Swift 런타임이 OS로 옮겨간 과정과 모듈 안정성, @frozen의 트레이드오프를 정리했습니다.
읽어보기동기·비동기는 작업 완료를 누가 챙기느냐의 축이고, 블로킹·논블로킹은 제어권을 바로 돌려주느냐의 축입니다. 두 축이 독립이라 2×2 네 조합이 모두 존재하는 이유를 Swift 예시와 함께 정리했습니다.
읽어보기파일 핸들이나 락처럼 하나여야 의미 있는 자원은 복사되면 안 됩니다. Swift 5.9의 ~Copyable로 복사 금지를 타입에 새기는 법과 borrowing·consuming·inout 세 전달 방식, 쓸 자리와 안 쓸 자리를 정리했습니다.
읽어보기Swift 5.9의 매크로는 컴파일러에 꽂는 코드 생성 플러그인입니다. 구문 트리를 받아 코드를 돌려주는 동작 원리와 freestanding(#)·attached(@) 두 갈래, 직접 만들 때 치르는 비용을 정리했습니다.
읽어보기계층을 반듯하게 나눴는데도 필드 하나 추가에 파일 일곱 개를 고쳐야 하는 코드가 라자냐 코드입니다. 층이 늘어나는 이유와 비용이 발생하는 지점, 층이 필요한 경우와 걷어내는 법을 정리했습니다.
읽어보기struct 크기는 프로퍼티 크기의 단순 합이 아닙니다. size·stride·alignment와 패딩, extra inhabitant를 활용하는 Optional, 64비트 existential container의 실측을 정리했습니다.
읽어보기Claude Code 권한은 allow·ask·deny 규칙과 deny 우선 평가 순서로 움직입니다. /permissions 사용법, Bash 와일드카드 문법, Shift+Tab 모드 순환, 설정 파일 우선순위까지 정리했습니다.
읽어보기메서드 호출은 직접 호출·vtable·objc_msgSend 세 방식으로 컴파일됩니다. final과 private이 성능 키워드가 되는 메커니즘과 프로토콜 extension의 함정, 프로파일러로 확인하는 법을 정리했습니다.
읽어보기KVO는 옵저버를 붙이는 순간 런타임이 객체의 클래스를 동적 서브클래스로 바꿔치기합니다. isa-swizzling의 동작과 class가 거짓말을 하는 이유, setter를 거치지 않으면 알림이 오지 않는 조건을 정리했습니다.
읽어보기Claude Code 계획 모드(plan mode)는 코드를 고치기 전에 계획을 먼저 승인받는 기능입니다. Shift+Tab·/plan으로 켜는 법, 승인 선택지 3종과 Ctrl+G 계획 편집, 기본값 설정까지 정리했습니다.
읽어보기자료구조 힙은 메모리 힙과 이름만 같습니다. 전체를 정렬하지 않고 최솟값만 빠르게 꺼내는 힙의 규칙과 배열로 트리를 표현하는 인덱스 계산, 우선순위 큐가 실무에서 서 있는 자리를 정리했습니다.
읽어보기스파게티 코드가 가리키는 것은 길이나 지저분함이 아니라 제어 흐름입니다. 1968년 다익스트라의 goto 반대 편지에서 출발해 goto가 사라진 뒤에도 스파게티가 남은 이유와 순환 복잡도로 재는 법을 정리했습니다.
읽어보기