입사한 지 2~3년 차쯤 되었을 때의 이야기다. 이슈가 있어 한참을 살피던 문제가 있었다. 아리까리한 상태로 테스트를 위해 어떤 로직을 임시로 수정했는데, 어라, 잘 동작한다. 문제가 해결되어 버렸다.
아... 이게 이렇게 동작하는구나. 그래서 해결이 되어버렸구나. 나는 그제야 내가 보던 로직의 전체적인 동작 방식이 이해가 되었다. 결과가 예상대로 나왔으니, 내 이해도 정확할 거라 생각했다.
1년 정도 지난 후 이 부분을 수정할 일이 생겼다. 자신 있게 수정했다. 잘 동작하는 것 같았다. 하지만 QA에 입고되자마자 문제가 발생했다. QA는 Fail 되었다.
한참을 분석하다가 깨달았다. 이 로직은 내가 생각했던 것과는 좀 다르게 동작했다. 지난번 수정이 문제를 해결한 것은 맞지만, 내가 생각한 방향과는 다른 방식으로 문제를 해결해 버렸다. 어설픈 이해를 통해 동작은 되게 만들었지만, QA의 강력한 스트레스 테스트가 들어가자 바로 문제가 발생한 것이다.
내가 '이해했다'라고 생각했던 순간은 사실 착각이었다. 결과만 맞았을 뿐, 그 과정에 대한 이해는 완전히 잘못되어 있었다.
에드먼드 게티어가 1963년에 제기한 '게티어 문제'는 정확히 이런 상황을 설명한다. 전통적으로 분석철학에서 지식은 '정당화된 참인 믿음(Justified True Belief)'으로 정의되어 왔다. 무언가를 안다는 것은 그것이 참이고, 그것을 믿으며, 그 믿음이 정당화되어야 한다는 것이다.
게티어는 이 세 조건이 모두 충족되더라도 여전히 지식이라고 할 수 없는 경우가 있음을 보여준다. 그 핵심 중 하나는 우연성인데, 내 상황이 그랬다.
로직의 동작 방식에 대한 믿음을 가지고 있었고(믿음), 그 믿음은 제대로 작동한다는 사실로 뒷받침되었으며(정당화), 실제로 수정된 로직은 원하는 결과를 만들어냈다(참). 그럼에도 나는 그것을 진정으로 '알고 있었다'라고 말할 수 없다.
내 믿음이 참인 것은 순전히 우연의 일치였기 때문이다. 내가 이해했다고 생각한 메커니즘은 실제 동작 원리와 달랐다. 결과적으로 맞았을 뿐, 그 과정에 대한 진정한 이해는 없었던 것이다.
이런 '착각했던 지식'의 경험은 개발 과정에서 자주 발생하지만, 일상에서도 끊임없이 발생한다.
아이의 울음을 그치게 하는 특별한 방법을 알았다고 자신했는데, 사실은 아이가 그저 피곤해서 잠이 들었던 경우. 재료를 특정 비율로 섞어 맛있는 요리를 만들었다고 생각했는데, 나중에 알고 보니 전혀 다른 요소가 맛을 결정했던 경우. 게임의 필승 요소를 알아냈다고 생각했는데, 그저 행운으로 잘 맞아 들어갔을 뿐인 경우.
이 모든 상황에서 나는 '안다'라고 생각했지만, 우연히 결과만 맞았을 뿐이다.
결과가 맞고 어느 정도 확신이 섰다고 해서 이해가 있는 것은 아니다. 때로는 내가 확신한 지식이 사실은 착각일 수 있다. 지식은 그 결과뿐만 아니라 과정에 대한 깊은 이해를 요구한다.
이제는 로직을 들여다보며 최대한 문제의 본질을 파악하려고 노력한다. 그 과정을 완전히 이해하려고 하는 편이다. 그럼에도 불구하고 QA에 들어가면 문제가 안 나오지는 않는다. 나 스스로를 끊임없이 의심하며 내 이해의 취약함을 인정할 때 진정한 배움이 시작된다.
...어제 저녁 퇴근길, 문제없다고 생각한 기능 때문에 QA의 연락을 받았다. 나 자신에게 "좀 잘하자"라고 되뇌기 위한 글이다.