어떻게 그 판단을 할 수 있었을까?
최근 팀 동료분이 겪은 문제를 페어 디버깅할 일이 있었다.
동료분은 '목록 페이지에서 여러 아이템에 대해 특정 액션을 한 결과물이, 개별 아이템 페이지에서는 반영이 안 될 때가 있는 문제'라고 설명하셨다. 아직 문제가 발생하는 재현 경로를 파악하지 못하셨다고 덧붙이셨다.
나는 듣자마자 '개별 아이템 페이지에 먼저 간 상태에서 목록 페이지로 돌아간 다음 해당 액션을 수행'했을 때를 확인해보자고 제안했다. 그리고 그게 재현 경로가 맞았다. react-query
의 캐시 키가 잘못되었든지 등의 이유로 인메모리 캐시 갱신이 안 된 것이었으리라. 재현 경로를 찾았으니 해결은 직접 하시겠다고 해서, 그렇게 페어 디버깅 세션이 5분도 안 되어 끝났다.
그리고 나는 고민이 생겼다. 나는 어떻게 이걸 알아챌 수 있었고, 왜 이 동료분은 그러지 못했을까? 어떻게 이분의 역량을 효과적으로 더 끌어올릴 수 있을까?
사실 시니어로서 코드리뷰나 짝 작업을 하다 보면 이런 일이 은근히 자주 일어난다.
- 시니어가 뭔가 쎄한 부분을 빠르게 알아채고, 그럴듯한 개선 제안을 한다.
- 주니어는 오오 하면서 받아들인다.
- 다음에, 완전히 같지는 않지만 비슷한 문제가 또 생긴다.
- 시니어는 다시 알아채고, 다시 개선 제안을 한다.
- 주니어는 조금 더 이해하고, 실수가 줄어들지만 내가 원하는 수준으로 빠르게 올라오지는 않는다.
이렇게 되는 이유 중 하나는 시니어의 솔루션만 전달되고 그 안의 인지 과정, 즉 ‘그 판단과 의사결정을 어떻게 할 수 있었는지’가 전달되지 않았기 때문이다. 팀에 일정 압박이 심할수록 이런 경향은 더욱 강해진다. 이번 사례에서도, 나의 직관으로 해결책에 바로 도달하는 것보다 훨씬 더 나은 방법이 있었는데 당시에는 그러지 못해 아쉬웠다.
‘어떻게 그 판단을 할 수 있었을까?’를 비교적 빠르게, 셀프로도 분석할 수 있는 좋은 방법이 있다. 개리 클라인이 개발한 CDM(Critical Decision Method)이라는 기법이며, 인지작업 분석(Cognitive Task Analysis)의 일종이다.
Critical Decision Method by Gary Klein
- Cues : What were you seeing, hearing, smelling ...?
- Knowledge, Source : What information did you use in making this decision, and how was it obtained?
- Analogues : Were you reminded of any previous experience?
- Goals : What were your specific goals at this time?
- Options : What other courses of action were considered by or available to you?
- Basis : How was this option selected/other options rejected? What rule was being followed?
- Experience : What specific training or experience was necessary or helpful in making this decision?
- Aiding : If the decision was not the best, what training, knowledge, or information could have helped?
- Tools : When making this decision, were there any tools that helped that specific decision?
- Time Pressure : How much time pressure was involved in making this decision?
- Situation Assessment : Imagine that you were asked to describe the situation to someone superior to(in terms of expertise, for example) you at this point, how would you summarize the situation?
- Hypothesis : If a key feature of the situation had been different, what difference would it have made in your decision?
출처: Critical Decision Method for Eliciting Knowledge, Gary Klein et al., 1989
아래는 내 페어 디버깅 사례에 CDM을 적용해본 것이다.
- Cues: 문제가 발생할 때가 있고 아닐 때가 있다고?
- Cues: 특정 액션 이후에 정보 갱신이 안 되는 문제라고?
- Analogues: 특정 액션 이후에 정보 갱신이 안되는 문제는 대부분 인메모리 캐시가 갱신되지 않은 게 원인이던데.
- Basis: 캐시 갱신이 안 되려면, 먼저 캐시가 메모리에 들어가야 한다. 캐시가 메모리에 들어가려면 그 쿼리를 호출해야 한다.
- Knowledge: 목록 페이지와 개별 아이템 페이지에서 호출하는 쿼리가 다르다는 걸 알고 있었다.
- Analogues: 과거에도 어떤 페이지에 먼저 들어갔느냐에 따라 문제의 재현 여부가 달라지는 경험을 한 적이 있다.
→ 개별 아이템 페이지에 먼저 들어가서 특정 쿼리에 대한 캐싱이 된 상태에서, 목록 페이지의 액션을 수행했는데 개별 아이템 페이지의 쿼리 캐시가 갱신되지 않은 것 아닐까?
대개 비동기로 이루어지는 깃헙 PR 리뷰 같은 데서는 리뷰어의 암묵지가 훨씬 덜 드러난다. 이 때 의식적으로 CDM 질문을 셀프로 물어보면서 ‘내가 이 코멘트를 어떻게 생각해낼 수 있었는지’가 함께 들어간다면 리뷰어와 PR 작성자의 역량 모두 훨씬 빠르게 올라갈 거라고 본다.
당연히 개발 외의 영역에서도, 인지적 과업이 필요한 어느 영역이라도 CDM을 아주 잘 써먹을 수 있다. 내가 어떻게 그걸 할 수 있는지 교육할 때에도, 남이 그걸 어떻게 할 수 있는지 배울 때에도.
Member discussion