이 글은 Today I Learn 시리즈의 94번째 기록입니다. (총 125개)

시킨 문장에는 늘 빈칸이 있다

큐브 100개를 나선으로 놓아 달라고 했다

언리얼 에디터의 MCP 서버(Model Context Protocol — AI가 프로그램을 직접 조작할 수 있게 이어 주는 연결 규격)를 Claude Code에 붙여 두고 말로 시켰다.

“큐브 100개를 나선으로, 위로 갈수록 작아지게.” 이 한 문장으로 배치가 나왔다. 그런데 나온 결과를 보니 내가 정하지 않은 값이 알아서 들어가 있었다.

나선 반지름 600
네 바퀴
높이 50에서 1250까지
크기 1.0에서 0.2로

내가 말한 건 개수와 “위로 갈수록 작아진다”뿐이었다. 나머지는 전부 채워진 것이다. 심지어 “나선”이 기둥처럼 곧은 나선인지 위로 좁아지는 원뿔인지도 안 정해져 있었다.

빈칸을 못 보면 결과가 취향 차이로 보인다

다른 판에서는 “격자 중 짝수 번째만 빨갛게”라고 했더니 체커보드가 아니라 세로 줄무늬가 나왔다. 처음엔 잘못 만든 줄 알았다.

아니었다. 격자가 열 칸이라 “짝수 번째”를 앞에서부터 세면 모든 줄이 같은 무늬가 된다. 열한 칸이었으면 같은 규칙으로 체커보드가 나왔다. 내 말이 틀린 것도 아니고 구현이 틀린 것도 아닌데, 격자 폭에 따라 결과가 갈린 것이다.

같은 판에서 “절반만 빨갛게” 했더니 나머지 절반이 흰색이 아니라 검정이었다. 내가 “나머지는 흰색”이라고 말한 적이 없다는 걸 그제야 알았다. 안 칠하는 것과 흰색을 칠하는 것은 다른 작업이다.

그래서 무엇을 바꿨나

결과가 예상과 다를 때 “왜 이렇게 했냐”를 묻기 전에 “내가 그걸 말했나”를 먼저 보게 됐다. 열에 예닐곱은 내가 안 말한 것이었다.

반대로 지시할 때도 달라졌다. 애매한 말을 전부 지우는 건 불가능하니, 어디가 애매한지를 같이 듣는 쪽이 낫다. 무엇을 정했는지 결과와 함께 말해 주면 그 자리에서 뒤집을 수 있다. 다 만들고 나서 “그게 아닌데”보다 훨씬 싸다.


대량으로 만든 것은 되돌리는 단위가 다르다

한 번에 만들었는데 한 번에 안 지워졌다

스크립트 한 번으로 큐브 100개를 깔았다. 마음에 안 들어 되돌리기를 눌렀더니 하나만 사라졌다. 100번을 눌러야 원래대로 돌아가는 구조였다.

만드는 쪽은 한 번인데 취소는 100번이다. 이 비대칭을 모르고 대량 작업을 하면 물릴 방법이 없다.

그래서 생긴 습관

대량 작업 전에 되돌릴 방법을 먼저 정한다. 되돌리기에 기대지 않고, 만든 것을 한 묶음으로 지울 수 있게 해 두거나 작업 전 상태를 저장해 둔다.

나중에 궁 담장을 통째로 다른 모양으로 바꿔볼 때 이게 값을 했다. 바꾸기 전에 저장해 두고, 원래 것을 지우는 대신 숨겨만 뒀다. 결과가 마음에 안 들었는데 원상복구가 몇 초였다.

되돌릴 수 있게 만들어 두면 과감하게 시도할 수 있다. 되돌릴 방법이 없으면 시도 자체를 안 하게 된다.


확인할 수 없는 형태로 만들면 맞았는지 모른다

원기둥으로 만들 뻔했다

“기둥 24개를 원형으로, 전부 중심을 바라보게” 놓기로 했다. 기둥이니 원기둥이 자연스럽다.

그런데 원기둥은 축이 대칭이라 어느 방향을 봐도 똑같이 생겼다. 중심을 바라보게 돌렸는지 아닌지를 눈으로도 스크린샷으로도 확인할 수 없다. 그래서 사각기둥으로 바꿨다. 단면이 네모라 방향이 보인다.

판단에 쓰는 방식

결과를 확인할 수 있는 형태를 고르는 것도 설계다. 확인이 안 되는 형태로 만들면 맞았는지 틀렸는지 영영 모른 채로 다음 단계로 간다.

같은 이유로 담장 높이를 정할 때도 애매한 값을 피했다. 사람 눈높이에 딱 맞추면 넘겨다볼 듯 말 듯 해서 미로도 아니고 트인 것도 아니다. 확실히 위나 확실히 아래로 두는 게 낫다. 애매한 값은 결과도 애매하게 만든다.


Series: Today I Learn

1 C++ 자료형(Data Type) 2 MD5 vs pHash 3 C++에서 함수의 선언과 정의 4 Tkinter padx, pady 5 메모리와 포인터 변수 6 Call by Value, Call by Reference, Call by Pointer 비교 7 const 8 Gemfile — Jekyll 프로젝트의 의존성 파일 9 kramdown-parser-gfm — Jekyll의 GFM 파서 10 파서(Parser) 11 AHU vs OHU 12 I might try it vs I'll try it 뉘앙스 차이 13 SESSION_EXPIRE_AT_BROWSER_CLOSE=True 14 configuration key 15 Git stash vs discard 16 subprocess.Popen으로 Windows 탐색기에 명령어를 전달 17 Post 잔디 분석하기 18 Google Sheets Sync 최적화 19 DSL (Domain Specific Language)과 GPL (General Purpose Language) 20 마크다운 표 그리는 방법 21 쿼리 파라미터(Query Parameter). 기존 QR코드 재활용 22 Django 보안 취약점 점검 및 수정 23 OOP Object-Oriented Programming 객체 지향 프로그래밍 24 Fernet 대칭 암호화 25 Jekyll 코드블록 안의 Liquid 태그 26 insertOnConflictUpdate vs DoUpdate(target) 27 세션 필터 28 아코디언(Accordiaon) UI를 펼친상태로 만들기 29 input의 step 30 Word Cloud 31 Google Sheets를 데이터 버스로(with AppSheet) 32 Django 모델 텍스트 필드 자동 수집 패턴 33 localStorage로 섹션 토글 상태 유지 34 순차 ID 생성(`select_for_update()` + `max()` 조합) 35 역참조 검색과 distinct() 36 xlsx 다운로드와 로딩 오버레이 충돌 37 Android 파일 공유 MIME 타입 38 AssetManifest — Flutter 빌드 타임 asset 목록 런타임 조회 39 UTF-8 BOM과 PowerShell 파일 쓰기 40 소리꽃 KeyBloom TIL 1 41 소리꽃 KeyBloom TIL 2 42 소리꽃 KeyBloom TIL 3 43 메트로놈 Simple Metronome TIL 1 44 소리꽃 KeyBloom TIL 4 45 메트로놈 Simple Metronome TIL 2 46 소리꽃 KeyBloom TIL 5 47 메트로놈 Simple Metronome TIL 3 48 정적 블로그 SEO 정비와 Pagefind 검색 도입 49 메트로놈 Simple Metronome TIL 4 50 안드로이드 AudioTrack 연속 재생, 실측 피커 정렬, 카메라 토치 플래시 51 메트로놈 Simple Metronome TIL 5 52 모래게임 Sandrop TIL 1 53 메트로놈 Simple Metronome TIL 6 54 모래게임 Sandrop TIL 2 55 모래게임 Sandrop TIL 3 56 메트로놈 Simple Metronome TIL 7 57 모래게임 Sandrop TIL 4 58 모래게임 Sandrop TIL 5 59 모래게임 Sandrop TIL 6 60 소리꽃 KeyBloom TIL 6 61 모래게임 Sandrop TIL 7 62 모래게임 Sandrop TIL 8 63 소리꽃 KeyBloom TIL 7 64 모래게임 Sandrop TIL 9 65 소리꽃 KeyBloom TIL 8 66 모래게임 Sandrop TIL 10 67 소리꽃 KeyBloom TIL 9 68 소리꽃 KeyBloom TIL 10 69 소리꽃 KeyBloom TIL 11 70 소리꽃 KeyBloom TIL 12 71 소리꽃 KeyBloom TIL 13 72 온실 GreenHouse TIL 1 73 소리꽃 KeyBloom TIL 14 74 온실 GreenHouse TIL 2 75 소리꽃 KeyBloom TIL 15 76 소리꽃 KeyBloom TIL 16 77 소리꽃 KeyBloom TIL 17 78 소리꽃 KeyBloom TIL 18 79 소리꽃 KeyBloom TIL 19 80 소리꽃 KeyBloom TIL 20 81 로그스톤 상표 셀프 출원 TIL 1 82 소리꽃 KeyBloom TIL 21 83 소리꽃 KeyBloom TIL 22 84 소리꽃 KeyBloom TIL 23 85 소리꽃 KeyBloom TIL 24 86 MiniMacro TIL 1 87 Astro가 무엇인지, 왜 옮기는지 88 MiniMacro TIL 2 89 메트로놈 Simple Metronome TIL 8 90 메트로놈 Simple Metronome TIL 9 91 블로그 Astro 이관 TIL 92 오픈데이 Openday TIL 1 93 오픈데이 Openday TIL 2 94 Unreal Engine MCP TIL 1 읽는 중 95 콘티온 Conti On TIL 11 96 오픈데이 Openday TIL 3 97 오픈데이 Openday TIL 4 98 오픈데이 Openday TIL 5 99 ScorePlayer TIL 1 100 BuildingHub TIL 1 101 ScorePlayer TIL 2 102 BuildingHub TIL 2 103 ScorePlayer TIL 3 104 Unreal Engine MCP TIL 2 105 궁 미로 PalaceMaze TIL 1 106 메트로놈 Simple Metronome TIL 10 107 메트로놈 Simple Metronome TIL 11 108 오픈데이 Openday TIL 6 109 BuildingHub TIL 3 110 Obsidian vault에서 코드만 빼기 — directory junction 111 ScorePlayer TIL 4 112 오픈데이 Openday TIL 7 113 URL은 바뀔 수 있는 것에 묶지 않는다 114 도구는 기능이 아니라 내 일에 맞는지로 고른다 115 돌이키기 힘든 변경은 작게 먼저 확인한다 116 궁 미로 PalaceMaze TIL 3 117 궁 미로 PalaceMaze TIL 2 118 소리꽃 KeyBloom TIL 29 119 오픈데이 Openday TIL 8 120 BuildingHub TIL 4 121 ScorePlayer TIL 5 122 BuildingHub TIL 5 123 MiniMacro TIL 3 124 소리꽃 KeyBloom TIL 30 125 궁 미로 PalaceMaze TIL 4