에지 케이스와 코너 케이스
코딩하는 사람들이 자주 하는 웃픈 농담 중에 '날 코딩을 했는데, 버그 없이 잘 돌아가서 더 불안하고 찝찝하다' 같은 농담이 있다. 실제로 대부분의 코드들은 애초에 유닛 단계부터 에러 범벅이고, 그래서 코드리뷰와 디버깅은 꼭 필요하다. 프로그래밍 과정에서 생기는 에러의 원인은 여러 종류가 있지만, 자주 보이는 에러의 원인으로서 에지 케이스 (edge case)와 코너 케이스 (corner case)가 있다.
이들 케이스는 꼭 프로그래밍에만 해당하는 것은 아니다. 그냥 공학 전반적으로 자주 언급되는 개념이다. 프로그래밍에서 말하는 에지 케이스는 이를테면 이런 것이다. 인풋 변수의 범위를 정하기 위해 최솟값과 최댓값을 설정했는데, 어떤 인풋값이 그 범위를 넘어 버리는 경우에 원했던 아웃풋이 안 나오거나, 왜곡된 값이 나오거나, 아예 안 나오는 경우다. 인풋이 스칼라값이 아니라 예를 들어 벡터일 경우, 유닛은 인풋 벡터가 선형이라고 상정하여 코딩된 상황이라면, 선형이 아닌 인풋 벡터가 들어오면 인풋의 값이 왜곡된다. 왜냐하면 강제로 선형에 맞춰지기 때문이다. 차라리 아웃풋이 안 나오면 버그로 인식되어 디버깅할 때 잡아낼 수 있다. 그러나 아웃풋이 왜곡되어 나오고, 그 왜곡의 정도가 잘 잡아내기 어려운 수준이라면, 나중에 왜곡의 정도가 엄청 커지고 나서야 문제를 발견하게 된다. 보통 그때쯤 되면 대형 사고가 터진다. 잘 돌아가던 시스템의 아웃풋이 의당 행해야 할 기능으로 이어지지 않아 시스템이 망가지거나 통제 불능이 될 수도 있다. 사소한 경우처럼 보이지만 실제로 위협적인 혹은 큰 문제가 되는 경우들도 생길 수 있는데, 예를 들어 전산물리는 물론 금융공학이나 사이버보안, 암호학, 수치해석 등의 광범한 영역에서 다양한 형태로 활용되는 몬테카를로 시뮬레이션의 경우, 핵심 기능의 보장은 다름 아닌 난수 (random number) 생성이다. 그렇지만 true random number generator (TRNG)는 소프트웨어 상에서 구현할 수 없으며, 하드웨어에서 물리적으로 구현되어야 겨우겨우 비슷해질 뿐이다. 경우의 수가 충분히 많은 경우를 다루는 몬테카를로 시뮬레이션이라고 하더라도 TRNG가 없이 pseudo random number에 의존하게 되면 randomness가 뚫릴 수 있고, 이는 통계물리에서 이야기하는 ergodicity를 위협할 수 있다. 보안이 뚫릴 수 있으며, 암호체계가 먹통이 될 수도 있다.
코너 케이스는 에지 케이스와는 좀 결이 다르다. 코너 케이스의 유닛 자체는 특정 기능에 대해 오류가 생기는 것이 아리나, 그 유닛이 아예 다른 종류의 연산을 할 수 없는 상황에 놓여서 오작동 나는 경우다. 예를 들면 이런 것이다. 1차원 신호를 받아 복잡도를 계산하는 코드에 2차원 신호를 넣으면 어떻게 될까? 2차원을 강제로 1차원으로 변환하여 계산할 수도 있겠지만, 이미 그 과정에서 dimension reduction으로 인해 2차원이었을 경우에만 보이는 고유의 hidden pattern 정보가 사라진다. 1차원으로 reduction이 아예 안 되면 당연히 failure 가 생긴다. 조금 더 쉬운 사례를 들어보자. 예를 들어 어떤 플라스틱 회사가 가시광 대역에서 평균 95%의 투명도, 밀도 X 이하, 단위 부피 당 원가 Y원 이하의 제품을 만들었다고 가정하자. 이 회사의 목표는 투명도와 밀도와 원가에 초점을 맞췄고, 그 목표가 다 달성되었다면 그 프로젝트는 성공했다고 할 수 있을 것이다. 그런데 갑자기 시장에서는 투명하고 가벼우면서 저렴한 것은 당연하고, 충격을 받았을 때 부서지지 않아야 하며, 유해물질을 3종류 이상 활용하면 안 되는 조건까지 요구된다면 어떻게 될까? 이 회사의 잘못은 아니지만, 그 회사의 플라스틱은 추가로 요구되는 특성을 만족하지 못할 경우, 시장에서 발을 붙이게 될 수 없다.
불운하게도 코너 케이스는 정보가 비대칭적이다. 프로그래머든 엔지니어든 아키텍트든, 주어진 문제에 대해 최대한 다양한 상황을 고려하여 시스템을 설계하려 노력한다. 그렇지만 그 시스템이 맞닥뜨리는 환경은 설계자의 지식과 계획은 물론 상상력과 직관을 자주 뛰어넘는다. 사실 그렇게 설계자들의 경계를 넘는 코너 케이스가 추가되면 그것에 대한 해결책이 제시됨으로써 설계자들의 영역은 더 넓어지긴 한다. 거칠게 말하면 공학의 발전은 비대칭적인 환경의 공격에 대해 시스템의 영역을 확장하고자 하는 노력이 축적되면서 비로소 가능하게 된 것일 뿐이다.
위에서 불운하다고 이야기한 것은 단순히 설계자들에 대해서만 해당하는 것은 아니다. 그 시스템이 망가지고 예상치 못한 변화에 노출되면서 사고가 생기면 그 피해는 시스템 설계자가 아닌 시스템 사용자로 급격하게 확장된다. 불과 한 세대 전만 해도 한국의 많은 공장들, 공공건물, 심지어 학교에서도 난연재로 석면을 꽤 많이 사용했다. 난연 특성은 물론, 전기 절연체이기도 하며, 섬유로도 가공성이 높은 재료였기 때문에 석면은 실로 아주 바람직한 건축자재로 여겨졌고, 그래서 상당히 많이 건축 현장에서 활용되었다. 그렇지만 석면의 발암 특성이 그렇게 위험하다는 것은 당시에 충분히 알려져 있지 않았고, 수많은 불운한 피해자들이 나오고 나서야 그 위험성이 제대로 분석되었다. 물론 덕분에 지금은 석면은 거의 모든 산업에서 퇴출된 소재가 되었지만, 석면에 많이 노출된 불운한 사람들의 인명피해는 고스란히 남았다.
공학이 지금보다 더 충분히 발전하면 그 비대칭성으로 인해 생길 수 있는 코너 케이스, 그리고 그 케이스로 인한 불운을 막을 수 있을까? 그것은 장담할 수 없다. 인간이 아무리 똑똑해지고, AI의 도움을 받고, 데이터가 누적된다고 해도, 늘 블랙스완은 생길 수 있게 마련이고, 그 블랙스완이 얼마나 위험할지는 겪어보기 전에는 알 수 없다. 다만 공학에서의 축적, 즉 경계를 확장하여 새로 이해의 영역으로 영입된 케이스들에 대해서는 반복된 실패를 막을 수 있다. 그렇지만 '알려진' 코너 케이스라고 해서, 그 케이스 발생으로 인한 실패를 항상 예방할 수 있는 것은 아니다. 사실 여기서부터는 공학의 문제가 아니다.
예를 들어 앞서 언급한 플라스틱으로 되돌아가보자. 방음터널을 만들기 위해 투명하고 원가가 저렴하며 기계적 강도가 우수한 플라스틱 소재를 만들었다고 가정해 보자. 공학자들이 테스트하던 도중, 이 소재가 다른 성능은 다 괜찮은데 고온에 약하고, 쉽게 불이 붙는 약점이 있었다고 생각해 보자. 방음터널에서 불이 날 경우가 얼마나 있을까? 연간 1-2건 수준이라면 이에 대한 고려를 해야 할까 하지 말아야 할까? 이 의사결정은 공학자들만 할 수 있는 것이 아니다. 예를 들어 정부에서 발주한 방음터널 프로젝트에 입찰한 플라스틱 방음터널소재 공급회사들 중에 정부가 정한 최소한의 요구 특성만 만족되면 원가가 제일 낮은 회사가 낙찰된다. 그런데 정부가 요구한 모든 특성을 만족하면서 입찰한 회사가 없다면 정부는 고민에 빠진다. 무엇을 제외해야 하는지를 따진다. 그중 화재의 빈도가 가장 낮게 나타났다면 난연성이라는 조건을 제외할 것이다. 그러면 입찰하는 회사가 생길 수 있고, 난연성이 취약한 플라스틱 소재를 가장 싼 가격에 공급하는 회사가 낙찰된다.
불운하게도 '화재의 빈도가 제일 낮다'는 특성 속에는 많은 정보들이 뭉개진다. 화재의 규모나, 화재의 지속 시간, 인명 피해의 위험이나, 교통사고의 위험 등에 대한, 보다 면밀한 데이터가 충분히 정리되어있지 않다면, '그 플라스틱은 화재의 위험에 취약한 특성이 있더라'라는 소중한 코너 케이스 정보의 가치는 제대로 사회의 지혜 영역으로 편입되지 못한다. 그냥 화재의 빈도라는 정보 속에 뭉개지게 될 뿐이다. 겉으로 멀쩡해 보이던 방음터널에 아주 이상한 방식으로 교통사고가 생겼는데, 하필 그 사고로 화재가 발생했고, 그로 인해 플라스틱 방음터널 소재가 다 타버리게 되었다면, 사회는 겪지 않아도 되었어야 했던 피해를 겪어야만 하게 되었고, 누군가는 가족을, 친구를, 지인을, 소중한 사람을 잃어야만 하게 된다.
아주 드라이하게 모든 의사결정을 지금까지 알려진 가능한 모든 위험을 방지할 수 있는 시스템 개발에만 초점을 맞추어 진행하는 것은 사실 불가능한 일이다. 모든 위험을 방지한다는 것도 어불성설이지만, 설사 이론적으로 그렇게 할 수 있다고 해도, 그런 시스템을 실제로 만들 수 있는지는 별개의 문제, 설사 만든다고 해도 그 비용과 시간이 감당할 수 있는 영역인지는 별개의 문제이기 때문이다. 그래서 사회에서 모두가 같이 활용해야 하는 시스템을 만드는 의사결정에는 공학자들만 들어가는 것이 아니라, 정책을 만들고 다듬는 사람들, 실제 사용자들, 법을 검토하는 사람들, 경제성을 검토하는 사람들 같이 다양한 배경과 시각을 가진 사람들이 들어간다. 거칠게 말하자면 그 사회가 활용할 시스템의 코너 케이스 대비, 그리고 그 케이스가 발생했을 경우 감당해야 하는 영향력의 규모와 비용은 그 사회가 결정한다. 문제는 그 사회가 의당 감당할 수 있는 규모와 비용이 있음에도 불구하고 그렇게 하지 못하여, 코너 케이스가 발생했을 때 받게 되는 피해가 훨씬 더 커질 수 있다는 것이다.
적어도 내가 생각하는 좋은, 그리고 합리적인 사회라면, 소를 잃을 수는 있어도, 어쨌든 외양간은 고칠 수 있는 사회여야 한다고 생각한다. 적어도 한 번 겪었던 코너 케이스에 대한 정보를 체계적으로 관리하여 그 케이스가 재발했을 경우 피해 규모를 최소의 수준으로 통제할 수 있어야 하고, 그 정보의 관리는 정권이 바뀌는 것과 상관없이, 국가의 레거시로 온존 하여 세대를 이어서 사회적 자산으로 만들 수 있어야 한다. 한국이 비교적 짧은 시간 동안 압축 성장을 하면서 여러 사회적 문제를 겪고 있지만, 겉보기로 보이는 '선진국 있어빌리티'에 비해서 여전히 속으로 불완전한 부분 중 하나가 바로 이러한 사회적 자산의 축적과 관리, 그리고 활용에 있다고 생각한다. 방음터널에 요구되는 플라스틱 소재의 난연성 요구 항목을 (아마도 경제성을 근거로) 제외했다면, 한국의 사회적 안전 시스템은 사실상 후퇴한 셈이다. 난연성 요구 항목을 포함시키는 과정에서 겪었던 과오 (화재와 2차 교통사고, 그리고 인명피해)를 다시 반복하겠다는 뜻이나 다름없기 때문이다. 소를 한 번 잃은 것도 모자라서 두 번 이상 잃게 되는 사회는 외양간을 제대로 고치지 않은 사회라는 뜻이며, 소를 두 번 잃고 난 이후에도 여전히 외양간을 계속 안 고치고 있다면 이제 그 외양간에는 소를 키우기 어렵게 된다. 소를 키우는 사람들이 생기지 않게 된다. 깨진 유리창을 제때 교체하지 않으면 그 건물의 유리창은 더 깨져도 상관없다는 인식이 생긴다. 그래서 건물 자체의 안정성은 그 유리창 하나로부터 무너지기 시작한다.
한국 사회가 한국 전쟁 직후의 최빈국의 신세에서 불과 60-70년 정도만에 세계 10위권을 논하는 부국으로 발전한 것은 놀랄만한 성취다. 그렇지만 어느새인가 한국 사회 시스템 곳곳에서는 그 성취 과정에서 축적된 시스템의 지혜와 관리가 조금씩 삐걱거리는 모양새가 연출된다. 적어도 안전과 시스템 관리 측면에서는 그렇게 보인다. 확실히 KTX는 예전보다 연착되는 빈도가 높아졌으며, 지하철에도 자잘한 사고의 빈도가 높아지는 것 같다. 어이없는 사고가 생기고, 인명피해도 끊이지 않는다. 이것이 한국 사회가 이제는 정점을 찍고 하락세로 돌아섰다는 증거가 아니기만을 바랄 뿐이다. 한국 사회가 하나의 공동체로서 축적된 지혜를 관리하지 못하고 활용도 하지 못하는 것뿐만 아니라, 정치적 이념과 감정으로 인해 과거로의 퇴행을 시도한다면 그것은 사회가 쇠락하기 시작한 증거일 것이다. 부디 사회 곳곳에서 들려오는 코너 케이스들을 지나치지 말고 그것이 더 큰 재난이 되기 전에 사회의 지혜와 자산으로 잘 관리할 수 있게 되기를 바란다. 피와 눈물을 흘려가며, 잠도 못 자고 밥도 제대로 못 먹는 고생을 해가며, 그리고 수많은 소중한 목숨들이 희생되어 가며 겨우 여기까지 왔는데 퇴행하게 되는 것은 그 희생을 헛되이, 그 고생을 소모품으로 만드는 어리석은 일이다.