티스토리 뷰

글을 쓰기 위해서 에디터를 열면 처음 보이는 것은 하얀색의 광활한 여백입니다. 그 여백을 빽빽한 이야기로 채우는 것은 언제나 쉽지 않은 일이고, 특히나 적절한 첫 번째 문장으로 운을 떼는 것은 그 글의 운명을 좌우할 만큼 중요하기에 언제나 고민이 많은 일이기도 합니다. 저는 보통 적절한 첫 문장이 생각나지 않으면 그냥 습관적으로 '언제'라든지 '어디에서'로 시작을 하는 것을 좋아하고 보통은 그 두 가지를 섞어서 시공간을 담고 있는 문장으로 시작하는 것을 가장 좋아합니다. 예를 들어서 '제가 LA에 있었을 때의 일이었는데'로 시작하면 자연스럽게 LA 국제공항에서 순두부때문에 마약 단속에 걸린 이야기로 이어갈 수 있고, 이렇게 일단 시작하면 처음 3~4 문단을 아주 쉽게 써 내려가면서 생긴 가속으로 마무리 부분 이전까지는 쭉 관성항법을 이용해서 쉽게 글을 쓸 수 있기 때문입니다. 그래서 다시 한번 관습적인 시작 문구를 사용해서, 하지만 한 번도 써본 적이 없던 시점을 지칭하며 글을 시작해보도록 하겠습니다. 오늘 있었던 일입니다.

오늘도 출근을 해서 일을 했습니다. 저는 요즘에는 주로 텍스트 에디터의 개발을 담당하고 있었고, 오늘은 어제 미처 완성하지 못한 '사이트 링크' 기능을 마무리할 생각이었습니다. 사이트 링크 기능이라는 것은 그러니까 글을 쓰다가 다른 사이트 주소를 입력하면 링크가 걸리기도 하고, 사용자가 직접 특정 단어나 문장에다가 링크를 추가하기도 하는 그런 기능을 말합니다. HTML의 기초 중의 기초이기 때문에 상당히 중요한 일이었고, 생각보다 개발하면서 고려해야 할 상황이 너무 많아서 다소 고생하고 있었습니다. 저는 이 기능에 대충 하루 정도가 걸릴 것이라고 생각했으나 실제로는 2일 정도를 사용하였고, 어느정도 진전은 있었지만 완전히 마무리하지 못했습니다. 그래서 저는 오늘 초과근무를 살짝 감행하면서 해당 기능에 막타를 넣을 생각이었고, 마무리가 되지 않으면 퇴근하지 말아야겠다는 생각을 했습니다. 요새 일을 하는 속도가 마음에 들지 않아서 여기에서 더 이상 지연되면 자존심이 많이 상하겠구나라는 생각을 했거든요.

중간중간 살짝 위기가 있기는 했지만 개발 자체는 무난하게 진행되었고, 저는 2시간 만에 모든 기능을 완성시킬 수 있었습니다. 사실 '끝내지 않으면 퇴근하지 않겠다'라는 말은 끝낼 자신이 있을 때만 할 수 있는 말이고, 저는 생각보다 빠르게 일을 마무리하여 자존심을 지키고 자신감을 충전할 수 있었습니다. 남은 시간 동안에는 이제 리포트된 버그를 하나씩 잡아볼까라는 생각이 든 저는, 일단 새로운 일을 시작하기 전에 현재 작성하고 있는 코드를 정리해야겠다는 생각을 했습니다. 그래서 코드의 지저분한 부분들을 정리하고, 테스트를 충분히 해본 뒤, 커밋을 날리고 , 개발 서버에서 빌드를 돌린 뒤, 작업 브랜치를 변경하였습니다.

생각보다 오래 걸렸던 일을 잘 끝냈다는 사실외에도 제 기분을 좋게 한 사실이 하나 더 있었는데, 출근하자마자 새 컴퓨터를 받았던 것입니다. 이전에 쓰던 컴퓨터는 5년 전에 출시되었던 모델이었고, 새로 받은 컴퓨터는 작년에 출시된 모델로 겉모습은 똑같았지만 내부는 완전히 개선된, 5년 전 외관에 최고의 성능을 가진, 힘을 숨긴 듯한 느낌이 가득한 머신이었습니다. 물론 하던 일이 마무리되지 않았는데 새 컴퓨터를 세팅하는 것은 개발자의 7대 죄악 중 탐욕에 해당하는 일이었고, 저는 절제심을 발휘하여 새 컴퓨터를 옆에 두고선, 5년 전 컴퓨터로 하던 일을 잘 마무리하였습니다. 그리고는 바로 소코반을 하듯이 두 대의 컴퓨터를 이리저리 옮기면서 오래된 컴퓨터와 새 컴퓨터의 자리를 바꾸었습니다. 새로 받은 컴퓨터를 다시 포맷하고, OS를 재설치하고, 개발 툴과 폰트를 설치하고, 기타 몇 가지 필수적인 유틸리티들을 설치한 뒤, 소스 코드를 내려받아서 실행해보고, 개발 중인 프로그램이 문제없이 잘 실행되는 것을 확인한 뒤 이제 새로운 일을 시작해도 되겠다는 판단을 했습니다.

잠시 지저분해진 자리를 정리하고 정돈된 마음으로 이슈 관리 시스템에서 새로운 업무를 할당받았습니다. 어떻게 하면 이 결함을 고칠 수 있을까 고민하면서 소스를 열어보려고 했는데 소스 이름이 검색이 되지 않았습니다. 이게 무슨 일이지 인덱싱이 덜 됐나 싶어서 잠시 고민하다가 아, 내가 작업하던 브랜치로 이동을 안했구나 라는 생각에 브랜치를 이동하고서는 다시 소스 코드를 검색해서 열었습니다. 분명히 아까 마무리할 때 고친 부분과 관련이 있을 것 같다는 생각에 자세히 살펴봤는데 생각처럼 코드가 눈에 잘 들어오지 않았습니다. 정확히 말하면 뭔가 위화감이 들었습니다. 그래서 가만히 보니까 조금 전에 작업했던 내용이 사라져 있었던 겁니다. 그래서 브랜치를 다시 한번 확인하고, 별 문제가 없어서 원격 저장소에 들어가서 소스 코드의 로그를 확인하였습니다. 로그의 가장 윗부분, 그러니까 가장 최신의 로그는 이렇게 쓰여 있었습니다. '메뉴바의 위치를 조정하고 위치의 상한과 하한 제한을 추가함 - 2일 전'

저는 최소한 개발과 관련해서는 상황 파악이 비교적 빠른 편이고 계산을 잘 하는 편입니다. 그래서 메시지를 보고 불과 몇 초만에 이 사건의 모든 인과 관계를 머릿속에 그려낼 수 있었고, 그 부작용으로 과호흡과 호흡 곤란이 동시에 오는 듯한 기분을 느낄 수 있었습니다. 아, 내가 이전 컴퓨터에서 소스 코드를 로컬 저장소에 커밋만 하고 원격 저장소에 올리지를 않았구나. 분명히 Commit and Push 버튼을 눌렀는데 그때 뭔가 물어보던 게 이 문제였구나. '소스 코드가 조금 꼬인 것 같은데 해결할래?'라는 다이얼로그가 '해결한 뒤 올릴래?'라는 뜻이 아니라 말 그대로 '해결할래?'였구나. 어쩐지 빌드 서버가 자동으로 안 돌아가서 수동으로 돌렸는데 그게 빌드 서버가 이상한 게 아니라 내가 이상한 거였구나. 심지어 2일 동안 내내 그랬는데 난 확인도 안 하고 도대체 뭘한걸까.

가혹한 현실을 부정하고 싶은 마음에 혹시나 기적이 일어날까 싶어 고개를 17도 정도 왼쪽으로 돌려서 이전에 쓰던 컴퓨터, 그러니까 2.5일간 작업한 소스코드들을 담고 있던 컴퓨터를 바라보았습니다. 그리고 그 컴퓨터에는 아주 명료한, 현실적이고 긍정적인 메시지가 표시되고 있었습니다. 'macOS Big Sur가 설치중입니다. 약 33분 남음.' 컴퓨터를 바꿀 때 저는 이전 컴퓨터에 공인인증서 같은 개인적인 정보들이 남아있을 수 있으니 미리 초기화 작업을 한 뒤 운영체제를 새로 설치한 뒤 반납해야겠다는 마음을 먹었고, 시간을 아낄 생각으로 새 컴퓨터에 개발환경이 잘 구성되었다는 사실을 확인하고는 바로 이전 컴퓨터에 초기화 명령을 내렸습니다. 디스크를 완전히 지우는 초기화 명령을 말입니다. 그 명령이 이틀 넘게 작업하던 소스코드의 존재를 이 세상에서 완전히 지워버리라는 명령인 줄 알았다면, 그렇게 컴퓨터가 '정말 지우실거에요? 이건 되돌릴 수 없어요'라고 몇 번씩 확인할 때 한 번이라도 멈칫했다면 참 좋았겠지만, 정신이 잠시 나갔었는지 저는 인식도 못하면서 저를 파멸 시킬 명령어에 좋다고 확인을 열심히 누르고 있었던 겁니다.

상황을 되돌릴 수 없다는 사실을 인식했을 때 저는 멍하니 화면을 바라보면서 차라리 오늘의 비극이 컴퓨터 옮기다가 발등에 떨어뜨려서 설상골이 부러지는 것이었다면 지금보다 낫지 않았을까 생각했습니다. 어쨌든 뼈는 시간이 지나면 다시 붙겠지만 지워진 소스는 시간이 지나도 다시 돌아오지 않거든요. 초기화된 파티션의 파일 복구를 시도할 수 있을까 고민해봤지만 제가 아는 상식에서는 이렇게 지워진 파일은 거의 복구가 불가능했습니다. 복구가 가능하다고 - 그러니까 결제하라고 - 사기를 치는 업체들은 많았지만요. 별도로 파일을 복구할만한 백업이 있었던 것도 아니었습니다. 무언가 희망을 찾아보고자 열심히 고민하던 저는 결국 인정할 수밖에 없었습니다. 28년의 장대한 개발 인생에서 처음으로 소스코드를 날려먹었다는 사실을요.

사실 작업했던 소스 코드가 남아있는 곳이 있기는 있었습니다. 바로 제 머릿속이었습니다. 사실 실제로 작성한 코드는 결과적으로 100줄이 조금 넘는 분량이었기에 물리적으로도 많은 양은 아니었습니다. 그렇기 때문에 저는 딱 100줄만 다시 기억해낸다면 이 절망적인 상황에서 벗어날 수 있었습니다.  하지만 2일 동안 100줄의 코드를 작성했다는 말은 바꿔 말하면 그 100줄로 마무리하기 위해서 쓰고 지우고 시도해보고 지우고 한참 다른 방향으로 갔다가 실행 취소 눌러서 되돌아오고 아 이건 왜 안 되지 하면서 검색해보고 했던 코드가 최소 1,000줄은 넘는 다는 말이고, 제가 아무리 최종 코드의 모습을 기억하려고 해도 도통 기억이 나질 않았습니다. 아, 여기에 이 코드가 있었던 거 같은데, 그런데 그 코드가 마지막까지 살아남은 코드가 맞나? 여기에서 뭔가 미묘한 문제가 있어서 한참 고민하다가 기발한 발상으로 문제를 해결했던 거 같은데, 그 기발한 발상이 뭐였지? 내가 이 코드를 바꿨었나? 안 바꿨었나? 바꿨다가 다시 돌렸던가? 돌렸다가 다시 바꿨었나?

바둑을 복기하거나 악보를 외우는 것 처럼, 보통 사람은 무언가를 기억할 때 온전히 그 최종 형상을 기억하기보다는 순서와 흐름, 그 사이의 연관 관계를 기억하게 됩니다. 그래서 저도 가장 처음 작업했던 소스 코드에서부터 다시 시작하면서 흐름을 찾아보려고 애를 썼는데, 바둑이나 음악과는 다르게 코딩은 테넷의 줄거리만큼이나 선형적이지 않아서 10줄도 미처 복원하지 못하고 포기할 수밖에 없었습니다. 유일하게 남아있던 기록인 인터넷 검색기록을 2일 전부터 계속 돌려보면서 내가 무엇을 고민했고 무슨 답을 찾았는가를 기억하려고 애를 썼는데, 어느 정도 도움은 되었지만 검색 기록조차도 자꾸 객체 구조 분해 할당 문법을 검색하다가 맥북 프로를 검색한다든지, CSS의 Transform Origin 스펙을 검색하다가 코나미 커맨드를 검색한다든지, 정규식을 검색하다가 반물질을 검색한다든지 하는 식으로 중구난방이었습니다. 결국 이 시간들은 구글 검색기록을 통한 소스코드 복구의 시간보다는 저의 주의력 결핍 과다 검색 장애와 이것이 개발자들의 직업병이라고 할 수 있는가에 대해서 심각하게 고민해보는 시간이 되어버렸습니다.

저는 이미 하루에 끝냈어야 적당할 일에 2.5일을 사용하는 죄를 지었고, 사실 지금까지 일을 하면서 지은 죄가 너무 많았기에 결과적으로 제가 생각했던 것에 비해 일정이 많이 밀려있는 상태였습니다. 심지어 그 2.5일은 멍청한 실수로 완전히 날려버린 상태였기에 결과적으로 일정은 정말 많이 밀려버렸습니다. 저는 언제나 천재적인 재능으로 모든 일을 쉽게 쉽게 해결하고 여유있게 다른 것들도 챙기면서 살고 싶은 이상이 있지만, 그러지 못해서 이리저리 시도하고 고쳐보고 이렇게도 해보고 저렇게도 해보면서 시간을 다 잡아먹고 다른 것들은 신경도 못 쓰는 현실이 가져오는 괴리감에 괴로워한 적이 훨씬 많았습니다. 그렇지 않아도 요즘엔 잘 하고 싶은 마음과 다르게 실제로는 잘하지도 못하고 일이 생각보다 자꾸 느리게 진행되어서 그 괴로움이 더 커진 상태였는데, 천재적인 능력으로 모두에게 도움이 되는 건 고사하고 완전 바보같이 실수나 하고 진짜 최악이라는 생각이 들었습니다. 언제나 그렇듯이 내가 생각하는 내 모습과 실제의 내 모습의 차이를 인식하는 것은 우울감과 멀미 증상을 유발하게 됩니다. 결국 내 한계가 여기 까지라면 그냥 빨리 은퇴하고 판교에서 커피나 파는 게 한국 IT에 도움이 되는 일이 아닐까라는 생각이 들었지만, 그 와중에 '커피 스크립트'로 카페 상표 등록이 가능할까 검색하다가 이미 등록되어있다는 결과를 보고는 이내 정신을 차렸습니다.

결국 실수를 회복할만한 기가막힌 해결책은 없거나, 있더라도 제가 생각해낼 수 있는 수준의 것은 아니라는 현실을 받아들인 제가 선택했던 방법은 그나마 기억이 쉽게 나는 부분, 그러니까 오늘 수정한 부분부터 하나씩 고쳐나가면서, '그런데 이 부분을 고친 것은 뭐를 고치면서 문제가 생겨서였더라?'라는 식으로 거꾸로 흐름을 타면서 수정한 부분을 찾아나가는 방법이었는데, 어느 정도 효과는 있었지만 결국 중간에 실수 한 번이라도 하면 흐름이 엉망이 되어버렸기에 나중에는 겸허하고 새로운 마음으로 코드를 작성해야 했습니다. 좌절과 절망과 망함속에서 허우적거리며 3시간 정도가 지나자 어느 정도 유실된 소스코드를 다시 작성하여 아무것도 모르고 컴퓨터를 교체하던 시점으로 돌아갈 수 있었고, 반자존 상태에 있던 마음을 간신히 바닥상태 정도로 돌려놓을 수 있었습니다.

다시 한 번 소스코드를 정리하고, 빠진 부분들을 채워 넣고, 테스트를 하고, 다시 커밋을 하면서 로그에 남길 커밋 메시지를 작성했습니다. 커밋 메시지의 작성에는 어느 정도 관습적인 규칙이 있는데, 동사 원형으로 시작하는 것이 좋다든지, 첫 번째 줄에 이 코드 수정이 의미하는 바를 명확하게 작성하고 기타 하고 싶은 이야기는 한 줄 띄고 쭉 쓰면 된다든지, 첫 번째 줄에는 마침표를 찍지 말고 그 다음 줄부터는 평서문 형태로 마침표를 찍으면서 작성한다든지 뭐 그런 것들입니다. 강제성은 없지만 보통 좋은 커뮤니케이션을 위해서 지켜야 하는 것들이고, 저도 가끔 정신이 나간 경우를 제외하면 보통은 지키는 편입니다.

이러한 관습적인 작성 규칙에는 가급적이면 첫 줄은 50자 이내로, 그 다음 줄은 한 줄에 72자 이내로 작성하라는 관습도 있었습니다. 사실 이 한 줄에 72자, 혹은 80자의 규칙은 아주 오래전 한 줄에 80글자밖에 안 들어가던 초록색 글자의 CRT 모니터, 그리고 그 제한을 그대로 이어받은 터미널 프로그램들의 변함없는 디자인 덕분에 생겨나고 지켜지고 있는 관습이기에 꼭 커밋 메시지가 아니더라도 우리가 작성하는 코드라든지 명령어라든지 이런 것들은 대부분 이 규칙을 따르는 걸 기본으로 하고 있습니다. 그래서 저는 오랜 시간 익숙해진 관습에 따라서 첫 줄을 다음과 같이 작성하였습니다. '텍스트 에디터에 링크 기능을 추가함' 그리고 마찬가지로 컨벤션을 지키기 위해 한 줄을 띄우고 다음 줄에 이어서 메시지를 작성했습니다. '이 커밋은 놀라운 이야기를 가지고 있음. 하지만 여백이 부족하여 적지 않겠다.'

'에세이' 카테고리의 다른 글

False Positive  (0) 2020.12.10
True Negative  (0) 2020.12.03
나의 소중한 은퇴계획  (0) 2020.11.10
Golden Hour  (0) 2020.11.04
Functional Reactive  (0) 2020.09.11
댓글