Search

3장_일상에서_연습하기

3장. 일상에서 연습하기

2장에서 추상화의 두 가지 활동을 배웠어요. 쪼개기비교하기.
이 장에서는 이걸 훈련해요. 역도 비유로 설명할게요.
역도에 “클린앤저크”라는 종목이 있어요. 바닥에 있는 바벨을 머리 위로 들어올리는 거예요. 이 동작은 두 단계로 나뉘어요.
클린(Clean): 바닥에서 어깨까지 들어올려요. 바벨을 “끌어올리는” 동작이에요.
저크(Jerk): 어깨에서 머리 위로 밀어올려요. 끌어올린 것을 “뻗는” 동작이에요.
처음부터 한 번에 하려면 어려워요. 그래서 따로 연습해요. 클린만 수십 번, 저크만 수십 번. 각 동작이 몸에 익으면 합쳐요.
추상화도 마찬가지예요. 두 동작으로 나눠서 연습해요.
클린: 복잡한 것에서 본질을 끌어올려요. 쪼개기의 훈련 버전이에요. (환원 → 재구성 → 검증)
저크: 끌어올린 구조를 다른 분야로 뻗어요. 비교하기의 확장이에요. (구조 전이)

왜 코드 없이 먼저?

코드에서 추상화를 연습하면 두 가지를 동시에 해야 해요.
1.
추상화 자체: 본질을 찾고, What과 How를 분리하는 거예요.
2.
코드 문법: 함수를 추출하고, 인터페이스를 설계하고, 타입을 정의하는 거예요.
처음 배우는 사람에게 둘을 동시에 요구하면, 둘 다 잘 안 돼요. 문법에 신경 쓰느라 추상화에 집중하기 어려워요.
일상에서 먼저 연습하면 달라져요. 문법 부담 없이 추상화 자체에만 집중할 수 있어요. 그리고 일상에서 익숙해지면, 코드에서도 자연스러워져요. 결국 같은 인지 능력이니까요.

의도적 수련

그냥 반복하면 될까요? 아니에요. 의도적으로 해야 해요.
첫 이사를 떠올려보세요. 뭘 해야 할지 막막해요. 세 번째 이사는 달라요. “아, 이건 이렇게 하면 되지.” 패턴이 보여요.
그런데 세 번 하면 누구나 이렇게 될까요? 아니에요. 열 번을 해도 매번 처음처럼 헤매는 사람이 있어요.
인지과학 박스: 의도적 수련 (Deliberate Practice)
심리학자 Anders Ericsson이 이 차이를 연구했어요. 단순히 오래 한다고 전문가가 되는 게 아니에요. 의식적으로 패턴을 찾으려고 노력해야 실력이 늘어요.
수동적 반복: “이번에도 힘들었네” → 10번 해도 매번 혼란
의도적 수련: “이번에 뭐가 반복됐지?” → 3번이면 패턴이 보임
차이는 질문을 던지느냐예요.
클린과 저크도 마찬가지예요. 그냥 해보는 게 아니라, “이번에 뭐가 본질이었지?”라고 물어야 해요.

클린: 환원 → 재구성 → 검증

클린은 복잡한 것에서 본질을 끌어올리는 동작이에요. 세 단계로 진행해요.

1단계: 환원

대상을 구성하는 요소들을 나열해요. 판단하지 않아요. 보이는 대로 적어요.
예시: 메신저 단체 채팅방
참여자 목록이 있다
메시지를 보낼 수 있다
보낸 메시지가 모두에게 보인다
읽음 표시가 숫자로 나온다
사진/동영상을 보낼 수 있다
이모티콘을 보낼 수 있다
답장 기능이 있다
나가기를 할 수 있다
초대를 할 수 있다
방장이 있다
공지를 등록할 수 있다
10개 이상 적는 게 좋아요. 충분히 환원해야 본질이 보여요.

2단계: 재구성

환원한 요소들 중에서 “이게 없으면 대상이 성립하지 않는 것”을 찾아요.
읽음 표시 없어도 단체 채팅방이 아닌가? → 네, 슬랙에는 읽음 표시 없어요.
이모티콘 없어도 단체 채팅방이 아닌가? → 네, 터미널 IRC에도 없어요.
여러 참여자 없으면 단체 채팅방이 아닌가? → 아니요, 1:1 채팅이 돼요.
메시지 브로드캐스트 없으면 단체 채팅방이 아닌가? → 아니요, DM이 돼요.
그러면 본질은 뭘까요?
여러 참여자가 있어요.
한 사람이 보낸 메시지를 모두가 봐요.
이걸 What/How로 정리하면:
What: 다대다 브로드캐스트 채널이에요.
How: 읽음 표시, 이모티콘, 공지 같은 것들이에요.

3단계: 검증

추출한 본질이 맞는지 두 질문으로 확인해요.
질문 1: 본질만 있어도 성립하나?
여러 참여자 + 메시지 브로드캐스트만 있으면 단체 채팅방인가요? 네. 슬랙 채널도, 디스코드 서버도, 줌 채팅도 이 본질을 공유해요.
질문 2: 본질 없이도 성립하나?
브로드캐스트 없으면 단체 채팅방이 아닌가? → 1:1 채팅이에요. 단체 채팅방 아니에요.
여러 참여자가 없으면 단체 채팅방이 아닌가? → 역시 1:1이에요.
두 질문 모두 통과하면 본질을 잘 찾은 거예요.

저크: 분야 간 구조 전이

클린으로 발견한 구조를 완전히 다른 분야에서 찾는 거예요. 이게 되면 진짜 본질을 이해한 거예요.

1단계: 구조 명시

클린에서 찾은 본질을 분야 독립적 언어로 적어요.
“메신저 단체 채팅방”이 아니라:
브로드캐스트: 하나의 소스가 여러 수신자에게 같은 것을 전달한다

2단계: 분야 이동

완전히 다른 분야를 골라요. 표면적으로 관련 없을수록 좋아요.
이번에는 채팅앱에서 교통 시스템으로 이동해볼게요.

3단계: 탐색 & 검증

교통 시스템에서 브로드캐스트 구조를 찾아보면 어떤 게 있을까요?
신호등: 하나의 신호등이 여러 차량에게 같은 신호를 보내요
교통 방송: 한 방송이 모든 청취자에게 같은 정보를 전달해요
전광판: 하나의 전광판이 여러 운전자에게 같은 메시지를 보여요
대응 확인: | 메신저 단체 채팅방 | 신호등 | |—————|——–| | 참여자 | 차량 | | 메시지 | 신호(빨강/초록) | | 브로드캐스트 | 모든 차량이 같은 신호를 봄 | | 방장 | 신호 제어 시스템 | | 나가기 | 다른 경로로 이탈 |
저크가 성공하면 새로운 통찰이 나와요:
채팅방의 “읽음 표시”에 해당하는 게 신호등에는 없어요 → 피드백 채널의 유무라는 차이점이 보여요.

연습 사례 3개

사례 1: 알람 시계 (클린)

먼저 환원이에요. 알람 시계의 요소들을 나열해요.
시간을 설정한다
설정한 시간이 되면 소리가 난다
스누즈 버튼이 있다
반복 설정이 있다
라벨을 붙일 수 있다
진동이 울린다
화면이 켜진다
다음은 재구성이에요. “이것 없으면 알람이 아닌가?” 물어봐요.
“소리 없어도 알람?” → 진동만 있어도 알람이에요.
“진동 없어도?” → 화면만 켜져도 알람이에요.
“시간 설정 없으면?” → 알람이 아니에요.
“알림 없으면?” → 알람이 아니에요.
What: 특정 시간에 알려주는 것이에요.
How: 소리, 진동, 화면, 스누즈 같은 것들이에요.
마지막으로 검증이에요.
본질만 있어도 성립하나? → 네, 구글 캘린더 알림도 알람이에요.
본질 없이도 성립하나? → 아니요, 그냥 시계예요.

사례 2: 커피 주문 (저크)

알람 시계의 구조를 커피 주문에서 찾아볼게요.
알람의 본질을 분야 독립적으로 표현하면 트리거 → 응답 구조예요.
트리거: 설정한 시간이 되면
응답: 알림이 발생해요
커피 주문에서 같은 구조가 있을까요?
트리거: “아메리카노 주세요”라고 주문하면
응답: 커피가 나와요
더 정확하게 대응시켜 보면: | 알람 | 커피 주문 | |——|———-| | 시간 설정 | 주문 | | 시간 도달 | 주문 접수 확인 | | 알림 발생 | 커피 제공 | | 스누즈 | “잠시만요” (지연 응답) |
새로운 통찰:
알람의 “반복 설정”은 커피의 “구독 서비스”와 같아요.
알람의 “라벨”은 커피의 “컵에 이름 쓰기”와 같아요.

사례 3: 엘리베이터 (클린 + 저크)

클린과 저크를 둘 다 해볼게요.
클린부터 시작해요.
먼저 환원이에요. 엘리베이터의 요소들을 나열해요.
버튼을 누르면 온다
층을 선택한다
문이 열리고 닫힌다
올라가거나 내려간다
여러 사람이 탄다
층 표시가 있다
과적 경고가 있다
다음은 재구성이에요. “이것 없으면 엘리베이터가 아닌가?” 물어봐요.
“층 표시 없어도?” → 네, 엘리베이터예요.
“과적 경고 없어도?” → 네, 여전히 엘리베이터예요.
“이동 없으면?” → 아니요, 그냥 방이에요.
“여러 층 접근 없으면?” → 아니요, 층 이동이 안 되면 엘리베이터가 아니에요.
What: 수직 이동 수단이에요. How: 버튼, 문, 층 표시, 과적 경고 같은 것들이에요.
이제 저크를 해볼게요.
엘리베이터에서 소프트웨어로 분야를 이동해요. 엘리베이터 구조가 소프트웨어에서도 보일까요?
API 요청: 버튼 누름 = 요청 전송, 도착 = 응답 수신
메시지 큐: 여러 층 요청 = 큐에 쌓인 메시지, 순서대로 처리
엘리베이터
메시지 큐
층 버튼
메시지 발행
대기
큐에 적재
이동
메시지 처리
도착
처리 완료
여러 사람
여러 발행자

타이밍: “세 번째 보이면”

추상화에는 적절한 타이밍이 있어요.
너무 이른 추상화: 첫 이사에서 “앞으로 모든 이사에 쓸 수 있는 범용 체크리스트”를 만들려고 해요. 아직 패턴이 안 보여요. 이번 이사의 특수한 상황(반려동물 있음, 5층 엘리베이터 없음)을 범용으로 착각해요.
너무 늦은 추상화: 세 번째 이사를 하는데, 매번 처음부터 다시 생각해요. “전입신고 또 깜빡했네.” 패턴이 있는데 인식하지 않았어요. 같은 실수를 반복해요.
적절한 타이밍: Rule of Three라고 불러요.
한 번: 그냥 해요
두 번: “어, 비슷한데?” 메모해요
세 번: 패턴이 보여요. 이제 추상화해요
두 번까지는 우연일 수 있어요. 세 번이면 패턴이에요.

연습 후 점검

클린 점검

핵심 질문: 이 대상의 본질을 자신있게 말할 수 있나요?
자신있다면 클린이 된 거예요.
자신없다면 어디서 막혔는지 봐요.
“뭔가 빠뜨린 것 같아” → 환원을 더 해보세요. “또 뭐가 있지?”
“이게 본질인지 확신이 안 서” → “이게 없어도 되나?” 더 물어보세요.
“맞는 것 같은데 찜찜해” → 다른 예시로 검증해보세요. 반례가 있나요?

저크 점검

핵심 질문: 이 구조를 세 번째 분야에서도 찾을 수 있나요?
찾을 수 있다면 저크가 된 거예요.
못 찾겠다면 어디서 막혔는지 봐요.
“구조가 뭔지 말로 표현이 안 돼” → 분야 독립적 언어로 다시 적어보세요.
“다른 분야에서 안 보여” → 첫 번째 분야와 너무 비슷한 데서 찾은 건 아닌지 봐요.
“대응이 억지 같아” → 구조가 아니라 표면만 매칭한 건 아닌지 봐요.
성공 신호: “아, 이것도 같은 구조네!” 순간이 오면 됐어요.

구조 사전 시작하기

클린과 저크로 발견한 구조들을 기록해두세요. 안 그러면 휘발돼요.
형식은 간단해요:
**이름**: 브로드캐스트 **구조**: 하나의 소스가 여러 수신자에게 같은 것을 전달 **예시**: - 단체 채팅방 → 메시지가 모든 참여자에게 - 신호등 → 신호가 모든 차량에게 - 뉴스레터 → 이메일이 모든 구독자에게 - TV 방송 → 프로그램이 모든 시청자에게 **힌트**: "모두에게 같은 것"이라는 표현이 나오면
Plain Text
복사
이게 쌓이면 당신만의 패턴 라이브러리가 돼요.
처음 보는 문제를 만났을 때:
1.
문제를 환원해요
2.
구조 사전을 뒤져요 — 비슷한 구조가 있나?
3.
있으면 → 해당 구조의 예시에서 힌트를 가져와요
4.
없으면 → 풀고 나서 사전에 등록해요
사전이 두꺼워질수록, “처음 보는 문제”가 줄어들어요. 그게 전문가가 되는 과정이에요.

정리

2장의 쪼개기/비교하기를 일상에서 훈련했어요.
2장
3장 훈련 버전
쪼개기
클린: 환원 → 재구성 → 검증
비교하기
저크: 구조를 다른 분야에서 찾기
의도적 수련: 그냥 반복 , 의식적으로 질문 ✓
“지난번이랑 뭐가 같았지?”
타이밍: 세 번째 보이면 추상화
한 번은 그냥, 두 번은 메모, 세 번이면 패턴
구조 사전: 발견한 패턴을 기록해요
시간이 지나면 당신만의 패턴 라이브러리가 돼요
하루에 하나씩 클린을 해보세요. 일주일에 한 번 저크를 시도해보세요. 뇌에 땀이 나게, 의도적으로. 한 달이면 사전에 항목이 쌓이기 시작해요.
다음 장에서는 드디어 코드에서 추상화를 다뤄요.