코드가 돌아가면 안심하고 싶어집니다.
하지만 The Pragmatic Programmer 6장은 그 순간을 조심하라고 말합니다.
코드가 돌아간다는 사실과 내가 그 이유를 이해한다는 사실은 다릅니다.
이 차이가 사라질 때 우리는 우연에 의한 프로그래밍을 하게 됩니다.
이 장의 핵심은 코딩 중의 태도입니다.
Programming by Coincidence는 생각보다
흔합니다.
샘플 코드를 조금 고쳤더니
돌아갑니다.
AI가 만들어 준 코드를 붙였더니
테스트 몇 개가 통과합니다.
그런데 왜 맞는지 설명하지 못합니다.
그러면 다음
변경에서 그 우연은 빚이 됩니다.
AI 시대에는 이 문제가 더 커집니다.
LLM이 만든 코드는 그럴듯합니다.
변수 이름도 자연스럽고 구조도 있어 보입니다.
그래서 더 위험합니다.
직접 쓴 코드보다
더 쉽게 믿게 됩니다.
하지만 실용주의 개발자는 질문해야 합니다.
이 코드는 어떤 가정 위에 서 있는가.
실패하면 어디서 드러나는가.
테스트가 그 가정을 잡고 있는가.
리팩터링도 이 장의 중요한 축입니다.
리팩터링은 기능 개발을 멈추는 일이 아닙니다.
오히려 기능 개발을 계속 가능하게 만드는 비용입니다.
구조를 방치하면 다음
기능은 점점 비싸집니다.
결국 기능 개발 시간이 아니라 구조 부채를 갚는 시간으로 바뀝니다.
테스트하기 쉬운 코드라는 말도 오래 남습니다.
테스트가 어렵다는 것은 보통 설계가 흐릿하다는 신호입니다.
의존성이 숨어 있고, 책임이 섞여 있고, 입력과 출력이 명확하지 않습니다.
테스트는 품질 검사이면서 동시에 설계 피드백입니다.
오늘의 적용은 간단합니다.
AI가 만든 코드에는 왜 맞는지 검증 메모를 남깁니다.
성능 문제는 느낌이 아니라 측정으로 봅니다.
리팩터링 전에는 행동을 보존하는 테스트를 먼저 둡니다.
코딩 중 가장 위험한 순간은 코드가 돌아가지만 내가 아직 이해하지 못했을 때입니다.