C.W.K.
Stream
Lesson 01 of 05 · published

의도와 효과 사이의 간격

~12 min · async-gap, intent-vs-effect, boundary, core-problem

Level 0차가운 부싯돌
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"타깃을 완벽하게 잡았어. 그다음 기다렸어. 그 기다림이 모든 게 틀어질 수 있는 데야."

캡처는 우아했어 — 여기가 그 가장자리야

Track 3 은 타깃 캡처를 해결된 것처럼 느끼게 했어: 포커스된 요소, 선택된 텍스트, 범위를 읽고, 끝. 깨끗했어. 근데 그 캡처 전체가 내려침 에 일어나 — 그다음 Flint 은 브레인이 생각하기를 기다려야 해. 추론은 진짜 시간, 흔히 초를 걸려. 네가 찍은 우아한 스냅샷은 삽입할 답이 생길 즈음이면 이미 과거인 순간의 사진이야. 캡처의 가장자리는 정확히 여기야: 의도-시점의 진실을 말해줬고, 효과-시점에 대해선 아무 말도 안 해.

기다리는 동안 뭐가 일어나

기다림은 죽은 시간이 아냐; 사용자의 세상이 계속 움직이는 창이야. 다른 창을 흘긋 보고 포커스가 흘러가. 클릭하고, 선택이 무너져. 알림이 포커스를 훔쳐. 탭을 닫거나, 앱을 아예 전환해. 선택된 텍스트가 딴것에 편집돼. 이 중 뭐든 네 스냅샷을 낡게 만들어 — 잡아둔 앱, 요소, 선택이 더는 커서 앞에 있는 게 아냐. 그리고 Flint 은 텍스트를 교체 하려는 참이라, 낡은 스냅샷으로 행동하는 건 엉뚱한 데 삽입하는 것만이 아니라; 엉뚱한 내용을 덮어쓸 수 있어, 되돌릴 수 없게.

t0  내려침   캡처 { app, pid, element, selection, range }
        |
        |   <-- 간격: 추론 실행 (초).
        |       포커스 흘러갈 수 / 선택 바뀔 수 /
        |       창 닫힐 수 / 앱 전환될 수.
        |
 t1  답     변환된 텍스트 준비됨
        |
        v   삽입 전에: 스냅샷이 아직 참인가?
            예   -> 정확히 캡처한 선택을 교체
            아니오 -> 증명 못 하는 타깃을 덮어쓰지 마; 클립보드

스냅샷은 사실이 아니라 주장이야

그래서 정신적 전환은 이거야: Flint 이 찍은 스냅샷은 행동할 수 있는 사실이 아냐 — 한때 참이었고 다시 믿기 전에 재확인해야 하는 세상에 대한 주장 이야. 잡아둔 타깃을 '사용자가 의도한 것' 으로 다루고, 삽입 시점의 세상을 여전히 동의할 수도 안 할 수도 있는 별개의 것으로 다뤄. 삽입의 일 전부는 둘을 비교하고 맞을 때만 행동하는 거야. 그래서 캡처가 아니라 삽입이 제일 위험한 계층이야: 캡처는 읽고; 삽입은 써, 진실이 만료될 수 있는 간격을 건너.

의도와 효과 사이에 지연이 있는 연산은 효과-시점에 타깃을 재검증해야 해. 이게 트랙 전체 뒤의 일반 법칙이야. 예약 전송, 지연된 쓰기, async 교체 — 전부 의도를 잡고 나중에 행동하고, 그 사이 세상이 바뀔 수 있어. 액션을 효과-시점에 찾은 타깃에 묶는 게 버그고; 의도-시점에 잡은 타깃에 묶고 그 타깃이 여전히 성립하는지 재증명하는 게 고침이야. 의도를 캡처하고, 효과에서 검증해.
Flint 의 위험은 평범한 삽입보다 높고, 그게 트랙 나머지를 빚어. 받아쓰기 앱은 커서에 텍스트를 삽입해; Flint 은 선택을 교체 해. 스냅샷이 낡으면, 평범한 삽입은 엉뚱한 데 떨어지지만(짜증나고, 되찾을 수 있음), 교체는 지금 선택된 뭐든을 덮어쓸 수 있어(잠재적으로 파괴적). 그 추가 위험이 다음 레슨들이 어느 앱이 최전면인지 확인하는 것보다 강한 증명 — 범위 맞추기, 재복사해 비교 — 을 요구하는 이유야.

Code

가드된 삽입, 한 모양으로·swift
func place(_ result: String, into snapshot: TargetSnapshot) {
    // 스냅샷은 내려침에 참이었어. 지금도 아직 참인가?
    switch prove(snapshot) {
    case .stillValid(let target):
        replaceSelection(with: result, in: target)   // 정확히 잡은 자리
    case .changed, .unprovable:
        copyToClipboardAndNotify(result)             // 추측을 절대 안 덮어씀
    }
}

// 'prove' 가 세상을 다시 읽고 스냅샷과 비교해. 이 트랙에서 흥미로운
// 전부는 네이티브 vs 불투명 타깃에 'prove' 가 어떻게 구현되는지, 그리고
// 확신 못 할 때 뭘 안 하기를 거부하는지야.

External links

Exercise

추론 대기 동안 타깃에 대해 바뀔 수 있는 모든 걸 나열하고, 각각에 대해 평범한 커서-삽입 도구와 Flint 같은 선택-교체 도구가 같은 식으로 해 입을지 다르게 입을지 말해. 그다음 '효과-시점에 찾은 타깃' 이 왜 '의도-시점에 잡은 타깃' 의 안전한 대체가 절대 아닌지 한 문장으로 진술해.
Hint
포커스 흘러감, 선택 무너짐, 창 닫힘, 앱 전환, 외부 편집이 다 일어날 수 있어. 커서-삽입 도구는 주로 엉뚱한 데 떨어질 위험(되찾을 수 있음); 교체 도구는 더해 지금 선택된 뭐든을 덮어쓸 위험(어쩌면 되돌릴 수 없음). 한 문장 법칙: 효과-시점 타깃은 사용자가 의도한 게 아니라 세상이 흘러간 데를 반영해서, 그걸로 행동하면 의도를 우연으로 대체하는 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.