Unknown Unknown의 개념
소프트웨어 개발 세계에서 "unknown unknown"이란 우리가 모른다는 사실조차 인식하지 못하는 지식의 영역을 의미합니다. 이 개념은 전 미국 국방장관 도널드 럼스펠드의 유명한 말에서 유래했습니다: "우리가 아는 것들이 있고(known knowns), 우리가 모른다는 것을 아는 것들이 있으며(known unknowns), 우리가 모른다는 사실조차 모르는 것들(unknown unknowns)이 있다."
프로그래밍 맥락에서 이 세 가지 지식 상태를 생각해 봅시다:
Known knowns: 개발자가 확실히 알고 있는 지식입니다. 예를 들어, 자신이 능숙한 프로그래밍 언어의 문법, 자신이 만든 코드의 기능, 또는 자주 사용하는 라이브러리의 API 등이 여기에 해당합니다.
Known unknowns: 개발자가 모른다는 사실을 인식하고 있는 지식입니다. 예를 들어, "이 새로운 프레임워크를 배워야 한다"거나 "이 알고리즘의 시간 복잡도를 아직 모르겠다"와 같은 경우입니다. 이런 지식 격차는 인식되어 있기 때문에 학습 계획을 세우거나 전문가의 도움을 구하는 등의 대응이 가능합니다.
Unknown unknowns: 가장 위험한 영역으로, 개발자가 자신의 무지를 인식하지 못하는 부분입니다. 예를 들어, 보안 취약점을 인식하지 못하거나, 특정 코드가 예상치 못한 상황에서 어떻게 동작할지 고려하지 못하는 경우입니다. 이러한 "blind spots"는 심각한 버그, 보안 침해, 또는 시스템 실패로 이어질 수 있습니다.
개발자로서 우리의 도전 과제는 이 "unknown unknowns"의 영역을 지속적으로 축소하는 것입니다. 이는 새로운 지식을 습득하는 것뿐만 아니라, 자신의 지식 한계를 인식하고 이를 "known unknowns"로 전환하는 능력을 키우는 것을 의미합니다.
Unknown Unknown이 중요한 이유
소프트웨어 개발에서 "unknown unknown" 개념이 특별히 중요한 이유는 이것이 가장 치명적인 위험의 원천이 되기 때문입니다. 이 중요성은 지식 상태에 따른 대응 가능성의 차이에서 비롯됩니다.
"Known unknowns"는 우리가 모른다는 사실을 인식하고 있기 때문에 질문을 통해 해결할 수 있습니다. 예를 들어, 개발자가 새로운 데이터베이스 기술에 익숙하지 않다면 "이 데이터베이스의 트랜잭션 처리 방식은 어떻게 되나요?"라고 물을 수 있습니다. 이러한 질문은 명확하고 구체적이며, 팀원이나 문서, 온라인 커뮤니티를 통해 답을 얻을 수 있습니다.
반면, "unknown unknowns"는 그 존재 자체를 인식하지 못하기 때문에 질문조차 할 수 없습니다. 개발자가 분산 시스템의 네트워크 파티션 문제를 전혀 모른다면, "네트워크 파티션이 발생했을 때 우리 시스템은 어떻게 동작하나요?"라는 질문 자체를 생각해내지 못합니다. 이런 상황에서는 문제가 실제로 발생해야만 그 존재를 깨닫게 되며, 그때는 이미 심각한 장애나 보안 사고로 이어질 수 있습니다.
프로젝트 실패의 많은 원인이 바로 이 "unknown unknowns"에서 비롯됩니다. 팀이 예상치 못한 기술적 도전, 고려하지 못한 사용자 시나리오, 간과한 외부 의존성의 변화 등이 프로젝트를 좌초시킬 수 있습니다.
더욱 심각한 것은, "unknown unknowns"는 계획 단계에서 고려되지 않기 때문에 일정과 자원 할당에 반영되지 않습니다. 이로 인해 프로젝트는 예측 불가능한 지연과 추가 비용에 직면하게 됩니다.
또한, "unknown unknowns"는 학습의 방향성도 제한합니다. 개발자는 자신이 알고 있는 것과 모른다고 인식하는 것을 중심으로 학습 계획을 세우지만, 자신이 모른다는 사실조차 모르는 영역에 대해서는 학습 기회를 놓치게 됩니다.
이러한 이유로, 개발자와 팀은 "unknown unknowns"의 영역을 적극적으로 줄이기 위한 체계적인 접근이 필요합니다. 이것이 개발 프로세스와 팀 문화의 핵심 목표가 되어야 합니다.
어떻게 Unknown Unknown을 줄이는가
소프트웨어 개발에서 "unknown unknown"의 영역을 줄이는 것은 지속적인 성장과 안정적인 시스템 구축을 위한 핵심 과제입니다. 이 과제를 해결하기 위한 가장 효과적인 방법은 다양한 지식 원천, 특히 책과 사람을 통한 학습에 있습니다.
책을 통한 unknown unknown 줄이기
책은 다른 개발자들의 경험과 지식을 체계적으로 접할 수 있는 가장 좋은 방법입니다. 특히 다음과 같은 접근이 효과적입니다:
- 자신의 전문 분야 외의 책 읽기: 백엔드 개발자라면 프론트엔드나 UX 디자인 관련 책을, 애플리케이션 개발자라면 인프라나 보안 관련 책을 읽는 것이 새로운 관점을 제공합니다.
- 고전 읽기: "Clean Code", "Design Patterns", "The Pragmatic Programmer"와 같은 고전적인 프로그래밍 서적은 많은 개발자들이 간과하는 기본 원칙을 다시 상기시켜 줍니다.
- 사후 분석 사례집: 다른 프로젝트나 회사의 실패 사례를 분석한 책은 자신이 미처 생각하지 못한 위험 요소를 발견하는 데 도움이 됩니다.
사람을 통한 unknown unknown 줄이기
다양한 배경과 경험을 가진 사람들과의 교류는 자신의 지식 경계를 확장하는 가장 효과적인 방법입니다:
- 멘토링: 경험 많은 개발자의 멘토링은 자신이 모르는 영역에 대한 통찰력을 제공합니다. 멘토는 "이런 상황에서는 이런 점도 고려해 봐야 해"라고 조언하며 당신이 미처 생각하지 못한 부분을 짚어줄 수 있습니다.
- 코드 리뷰: 다른 개발자의 코드 리뷰를 받거나 다른 사람의 코드를 리뷰하는 과정에서 새로운 패턴, 도구, 접근 방식을 발견할 수 있습니다.
- 다양한 커뮤니티 참여: 컨퍼런스, 밋업, 온라인 포럼 등에 참여하면 다양한 배경의 개발자들이 어떤 문제에 관심을 갖고 어떻게 해결하는지 볼 수 있습니다.
이런 방법들을 통해 우리는 "모른다는 것도 모르는" 영역을 점차 "모른다는 것을 아는" 영역으로 전환할 수 있습니다. 이는 단순히 더 많은 지식을 습득하는 것이 아니라, 자신의 지식 한계를 인식하고 계속해서 질문할 수 있는 능력을 키우는 과정입니다.