chatgpt의 등장은 문제 해결 방식에 있어 혁신을 가져왔다. 불과 2~3년 전만해도 google 검색(일명 구글링) 또는 stack overflow에서 질문을 통해 답변을 얻는 것이 일반적이었다면, 이제는 ai를 통해 즉각적으로 답변을 받을 수 있는 시대가 되었다. 그러나 질문의 편의성이 크게 증가했음에도, 질문의 퀄리티는 여전히 낮은 수준에 머무르고 있다. 이로 인해 xy problem 이 자주 발생한다고 생각한다.
이러한 문제를 해결하기 위해, 더 나은 질문법과 답변을 검증할 능력이 필요하다고 생각한다.
xy problem 의미:
실제 해결하고자 하는 문제에 대해 질문하는 것이 아닌, 현재 시도하고있는 해결 방법에 대해 질문할때 발생하는 문제를 뜻한다.
유명한 예시는 다음과 같다.
A: 파일 이름에서 마지막 세 글자를 출력하려면 어떻게 해야 하나요?
B: 변수에 저장된 경우라면 이렇게 하면 됩니다: echo ${foo: -3}
B: 그런데 왜 마지막 세 글자를 출력하려는 건가요? 진짜 원하는 게 뭔가요?
B: 혹시 파일 확장자를 얻고 싶은 건가요?
A: 네, 맞아요.
B: 모든 파일 이름이 세 글자의 확장자를 가진다고 보장할 수는 없어요.
B: 그래서 그냥 마지막 세 글자를 가져오는 방식으로는 문제를 제대로 해결할 수 없어요.
B: 대신 이렇게 해보세요: echo ${foo##*.}
이와 같이, A가 궁극적으로 원했던 것은 파일의 확장자를 얻는 것이었지만, 마지막 3글자를 얻는 방법에 대해 묻는것이 문제가 되는 케이스다.
올바른 질문은 원래 의도했던 궁극적인 목표 및 문제의 맥락을 포함해야 한다. 즉, 다음과 같이 질문하면 좋을 것이다.
"파일 이름에서 확장자를 얻고 싶습니다. 이를 어떻게 추출하면 좋을까요?"
이 질문은 원하는 결과(확장자 추출)를 명확히 제시하며, 불필요하게 특정 방법(마지막 3글자)을 고집하지 않는다.
이번에는 실제로 프로젝트를 하며 겪은 질문이다.
A: 이메일 중복 검사 코드를 작성하고 싶은데, 어느 부분에 작성을 해야 할까?
B: 애플리케이션에서만 중복 검사를 하면 동시성 문제에 취약해.
B: 두 사용자가 동시에 같은 이메일을 입력하면, 둘 다 DB에 저장될 수 있어.
A: 그럼 어떻게 해야 해?
B: DB에 UNIQUE 제약 조건을 설정해. DB 자체가 중복을 막아야 안전해.
A: 애플리케이션 검사는 필요 없다는 거야?
B: 아니, 필요해. 사용자 경험을 위해 애플리케이션에서 중복 여부를 미리 확인할 수는 있어. 하지만 최종 검사는 항상 DB가 해야 해.
이제 대한 올바른 질문은 다음과 같다.
"동시성을 고려할 때, 사용자 이메일 중복을 방지하는 가장 안전한 방법은 무엇인가요?"
또 다른 직접 겪은 질문이다.
A: 특정 키를 시간 제한이 지나면 삭제하려고 해. Node.js에서 타이머로 구현하려는데, 어떻게 하면 될까?
B: 타이머로? 왜 Redis의 만료 기능을 쓰지 않아? Node.js 타이머는 메모리를 많이 쓰고, 프로세스가 종료되면 타이머 상태도 잃어버려.
A: 그럼 Redis로 하면 어떻게 해야 해?
B: Redis에서 SET key value EX seconds 명령어를 쓰면 돼. 이렇게 하면 키가 자동으로 만료되고, 동시성 문제도 걱정 없지.
이에 대한 올바른 질문은 다음과 같다.
"특정 키를 일정 시간 후 자동으로 삭제하려고 할 때, 어떤 방식으로 하는 것이 적합할까요?"
질문의 퀄리티를 높이기 위해서는 cs 지식 또한 필요하다. cs 지식이 있어야 문제의 본질을 좀 더 정확히 그리고 깊이 이해하고, 이를 바탕으로 정확한 질문을 할 수 있기 때문이다. 또한, 답변을 평가하고 추가 질문을 통해 더 나은 답변을 유도하는 데에도 큰 도움이 된다. 본질을 관통하는 질문, 답변을 검증할 수 있는 지식 그리고 비판적 사고를 갖추는 것이 중요하다.
결국, 이러한 질문의 과정을 통해 자기 자신을 재귀적으로 발전시킬 수 있다. 더욱이, 메타인지도 향상시킬 수 있다고 본다.
질문의 힘은 위대하다.
'카이스트 정글' 카테고리의 다른 글
최종 발표 및 회고 (0) | 2024.12.17 |
---|---|
정글의 팀 결성 방법 (0) | 2024.11.08 |
pintos project3: virtual memory (0) | 2024.10.23 |
pintos project2: user programs (0) | 2024.10.09 |
pintos project1: threads (0) | 2024.10.01 |