내가 코딩을 해온 이야기
이따금씩 제가 어떻게 코딩을 시작했는지? 아니면 어떤 사람인지 궁금해하시는 분들이 있습니다. 그런 분들을 위해 TMI 솔직한 이야기를 적어봤습니다. 저도 특이하고 이상한 사람이지만, 동시에 평범하게 삽질하고 좌절하는 사람이라는 걸 알아주시면 좋겠습니다.
부모님은 프로그래머셨고, 컴퓨터 학원에서 자랐다.
이런 이야기는 어린 시절부터 시작하죠.
제 부모님은 프로그래머이셨습니다. 그게 영향을 미치긴 했을 겁니다.
어머니는 컴퓨터 학원을 하셨고, 저는 초등학교에 들어가기도 전부터 컴퓨터 학원에서 게임을 했습니다. 전화선으로 모뎀을 하던 시절도 기억나고요. 처음 광랜을 깔고 나서 아버지가 설명하시던 것도 기억이 납니다.
집에는 아버지가 쓰신 두꺼운 프로그래밍 책이 있었지만, "웹 마스터"나 "클리퍼 윈도우 프로그래밍" 같은 주제였죠. 2008년에 아버지가 다니던 회사가 망해서 집에서 웹 사이트만 만들고 계시는 것도 보았습니다. 아버지는 그때도 지금도 JSP와 나모 웹 에디터를 쓰십니다.
친구들이 신기해하는 로봇을 만들고 싶었다.
제가 초등학생일 시절에 학교 방과후 활동으로 '로봇 제작'을 했습니다. "하늘아이"라는 회사였는데요. 라인트레이서라던가 이것저것 만들어 봤습니다. 특이한 블록코딩 시스템을 사용했는데, UI가 너무 비직관적이고 추상적이라 전혀 이해하질 못했습니다. 학년이 올라가면서 단계가 올라가고, 더 복잡한 로봇 키트를 만들었고요. 대회도 나갔습니다. 납땜하다가 부품이 타버려서 실패하고 돌아왔던 걸로 기억합니다.
로봇을 만들면서 여러모로 즐거웠습니다. 내가 만든 게 돌아가고, 적외선 리모컨으로 조종도 하고요. 로봇을 가져오는 날이면 애들이 신기해하면서 자기도 해보겠다고 난리였습니다. 그 관심이 기쁘기도 하면서도, 저는 왕따였기 때문에 로봇이 부서지기도 하고 그랬죠.
중학생이 되고 로봇 방과후도 사라졌습니다. 저는 좀 더 제대로 된 로봇을 만들고 싶었습니다. 도서관에 가서 책을 찾아보려는데, 너무 키가 작아서 어떤 누나가 꺼내줬던 게 기억이 납니다. 그 책은 [AVR 바이블]이었습니다.
AVR과 C는 너무 어려웠다...
그때는 아두이노 같은 게 없었습니다. AVR은 대학생들이 졸작용으로 많이 쓰는 저렴한 칩인데, 아두이노도 AVR 기반입니다. 그래서 C로 직접 어떤 핀에 어떻게 신호가 들어오고 어떻게 나가는지... 저수준에서 직접 코딩해야했습니다. 기판도 부품을 사서 직접 납땜을 했습니다.
어떻게 코드를 짰는지 기억은 잘 나지 않습니다. 이리저리 시도해봤지만 로봇은 돌아가지 않았습니다. 그게 납땜을 잘못했는지, 에러가 나면서 부품이 타버린 건지는 모르겠습니다. 아버지도 제 코드를 보고 고쳐보려 하셨지만, 결국 원인은 찾지 못하고 실패로 끝났습니다.
자바랑 SQL만 할 줄 알면 된다!
저희 아버지가 늘 하시는 이야기 중에 하나입니다. 아버지는 제가 프로그래머가 되시길 바랬습니다. [자바의 정석]을 사서 공부했습니다. 책 내용은 그리 나쁘지 않았는데, 이게 실제로 뭘 만들어보지 않으니 재미가 없었습니다. Swing으로 이것저것 해보려던 기억 정도입니다.
하지만 아버지의 바람과 달리, 저는 프로그래머가 될 생각이 없었습니다. 대신 저는 우연한 계기로 물리학에 빠지게 되었죠. -이건 또 이야기할 기회가 있을 겁니다.-
고등학생 때 저는 물리학이 너무 좋았습니다. 진로를 고민하면서 복잡계 쪽이나, 물리 교사, 아니면 2014년 당시에 신생 학문이었던 "데이터 과학"은 어떨지 고민했습니다. 복잡계는 참 신기하고 미래가 있는 분야처럼 보였습니다. 이른바 통섭! 열풍과 함께 "새로운 물리학은 사회 과학도 설명할 수 있지 않을까?"하는 기대가 커졌으니까요. [카오스], [과학 콘서트], [복잡계 개론], [사회적 원자], [구글 신은 모든 것을 알고 있다], [넥서스], [사회적 원자], [링크] 같은 책을 열심히 읽었던 기억이 납니다.
빅데이터와 파이썬
대학에 들어가고 갑자기 "빅데이터" 광풍이 몰아쳤습니다. 당시의 빅데이터는 지금처럼 "딥러닝" "인공지능"과는 좀 달랐습니다. 제가 좋아하는 물리학, 특히 복잡계랑 이런저런 관련이 있었습니다. 삼성 경제 연구소 SERI에서 [빅데이터 경영을 바꾸다]를 쓴 채승병 연구원은 원래 복잡계 물리학을 하시던 분입니다. 복잡계 물리학 연구자들은 하나 둘 씩 빅데이터 열풍에 탑승하기 시작했습니다.
저도 데이터 과학을 좀 해봐야겠다고 생각해서 여러 책을 사서 읽고 공부했습니다. 그때는 통계 진영의 R과 전통 프로그래밍에 가까운 파이썬이 양강 구도를 이루고 있었는데요. 그래서 통계학도 공부했고 R도 어느 정도 다루게 되었습니다. 한편으로는 파이썬으로 Pandas나 Numpy, Scikit-Learn, NLTK, Matplot 등을 다루는 건 예나 지금이나 비슷했습니다.
하지만 흐름은 점차 "인공 신경망", 즉 "딥러닝" 쪽으로 기울기 시작했습니다. 저는 딥러닝에 여러모로 관심이 있긴 했지만. 잘 모르기도 했고, 좀 공부한 뒤에는 불만을 느끼기 시작했습니다. 일단 피드백이 너무 느렸거든요. 어떤 모델의 원리를 머릿 속으로 생각하고 고민하고 기법을 적용해도. 모델이 학습하는 데에는 너무 오랜 시간이 걸렸습니다.
생활코딩으로 웹 개발을 시작하다.
하루는 동생이 생활코딩이라는 사이트를 알려줬습니다. 취미삼아 HTML, CSS 기초부터 시작해서 웹 개발을 해보기 시작했습니다. 생각보다 재미있었습니다. 간단하게 Node도 써보고, 파이썬 Django와 Flask를 배워서 해봤습니다. 간단하고 이것저것 해보기 좋은 프레임워크였죠.
이고잉님은 지금 생각해도 좀 독보적인 분입니다. 학습자의 마음을 헤아리는 말 한 마디 한 마디 하며, "이걸 10억 번 해야한다고 생각해보세요!"라는 명대사로 "중복의 제거" 같은 개념들을 제 마음에 심어주셨죠.
하지만 저는 여전히 웹 개발자가 될 생각은 없었습니다.
군대에서 엑셀 개발자가 되다.
저는 군대 갔고 통신병 보직을 받았습니다. 저희 부대에서 통신병은 행정병 일도 같이 했었는데요. 선임들은 간단한 엑셀 수식을 걸어서 이런저런 일을 편하게 하고 있었습니다. 저도 매일 엑셀 도움말을 보면서 이런저런 함수와 단축키를 익혔죠
그 모습을 보던 행정 보급관님께서 하루는 저에게 "경작서를 엑셀로 짤 수 있겠느냐?"고 물어보셨습니다. 이게 제 첫 임무의 시작이었습니다.
상황을 설명하면 이렇습니다.
경작서는 몇 시부터 몇 시까지 누가 불침번을 설지, 당번을 정하는 계획표입니다. 모든 병사들이 골고루 돌아가면서 근무를 서야 불만이 없습니다. 문제는 당시에는 이 모든 걸 사람 머리로 해야했고, 경작서 양식에 손으로 기입했습니다. 실수로 누가 휴가를 가는데 근무를 편성하거나... 근무표를 짜놨는데 누가 휴가를 가서 근무표를 수정해야하면... 지옥이었죠. 상사이신 행정보급관님이 겨우 이런 업무 때문에 매일 야근을 하셨습니다. 아직 유치원생이신 아드님에게 전화가 걸려와 "아빠 언제와. ㅠㅠ 나 혼자야. 무서워. 엄마도 아직 안 왔어." 같은 대화를 옆에서 듣고 있으면, 슬플 따름이었습니다.
제 선임들도 이걸 시도해봤지만, 모두 실패했습니다. 군대에서는 파이썬은 물론이고, 엑셀의 VBA도 보안 때문에 금지되어 있습니다. 남은 건 오직 기본 함수들 뿐이죠. 이걸로 복잡한 프로그램을 작성할 수 있을까요? 저도 마찬가지로 실패했습니다.
체념하고 재활용 쓰레기를 버리러 가는 중이었습니다. 그러다 머리 속에 유레카가 떠올랐습니다. 기능이 없으면 만들면 되죠. 기본 함수들을 조합해서 제가 원하는 기능을 만들 방법이 떠오른 것이었습니다!
엑셀은 react처럼 반응형으로 동작합니다. 그때는 잘 몰랐지만, 저는 근무를 짜는 달력(상태)과 이를 경작서 문서 양식에 맞게 변환하는 시트를 분리했습니다. 그래서 달력에서 편하게 근무를 짤 수 있었고요. 누가 언제부터 언제까지 휴가를 가고, 근무를 몇 번 섰는지도 통계 대시보드를 만들어 넣었습니다.
제가 만든 첫 엑셀 앱은 성공을 거뒀습니다. 점점 기능을 추가하면서 발전했고, 버그도 고쳤습니다. 예를들면 초기 버전에서는 30일이냐 31일이냐, 사람이 몇 명인지 등을 하드 코딩했습니다. 부대에 신입이 들어오고, 말년은 전역할 때마다 관련된 값을 바꿔줘야했죠. 이걸 derived하게 계산한 값으로 고쳤습니다.
이 경작서 양식은 근처에 다른 부대로도 수출되고, 저는 출장AS를 다니기도 했습니다. 무엇보다 기쁜 일은 뭐였냐면, 나중에 저희 행보관님의 가족 분들이 부대를 방문하셨을 때였습니다. 행보관님이 저를 "내 야근을 없애준 그 친구"로 소개해주셨거든요.
코딩이 사용자에게 가치를 전할 수 있다는 걸, 몸소 느끼고 체험했던 경험이었습니다.
사무 자동화 운동을 벌이다.
한 번 성공을 맛본 저는 더 많은 걸 자동화하고 싶어졌습니다. 예를들어 휴가나 진급 같은 인사 관련 서류를 만들 때, 인사 행정병들은 병사들의 이름, 군번, 계급 같은 인적사항을 찾아서 하나하나 옮겨 적었습니다. 그래서 담당 병사들은 보통 이런 연명부를 통째로 외워야 했습니다. 역시 야근을 하지 않는 날이 없었죠.
VLOOKUP과 여러 기능을 동원해서 자동으로 인사 명령지를 채워주는 친구를 만들었습니다. 여기서도 문제는 있었는데요. 군번은 유일키지만, 이름은 동명이인이 있을 수 있습니다. 문제는 군번을 외우기 힘들어서 이 프로그램을 만들었다는 것이죠. 동명이인을 따로 빼서 사람이 처리할 수 있도록 만들었습니다.
이런 식으로 군수, 병기, 교육, 각종 현황 관리 등등... 다양한 업무를 자동화해나가던 중. 문제가 생겼습니다.
사람들의 말을 들어야한다.
한 간부님이 저를 부르셨습니다. 제가 만든 양식이 편리하지만, 상부에서 내려준 공식 양식과 달라서 쓸 수 없다는 것이었죠. 처음에는 당황스러웠지만, 금세 해결책을 찾았습니다. 이 편리한 양식으로 관리하면, 알아서 '보고용' 양식으로 변환해주도록 만들었습니다.
그 다음에는 새 양식이 불편하다, 사용법을 잘 모르겠다는 사람들이 나왔습니다. 사실 자동화는 편리하지만, 낯설기도 합니다. 지나치게 추상화를 하면 뭔가 간결하고 돌아가긴 하는데, 마치 이해하기 어려운 함수형 코드처럼 되죠. 이때도 이런 트레이드 오프를 고민한 끝에, 핵심이 아닌 기능들을 버렸습니다. 익숙한 핵심 기능만 남겨놓으니 직관적이고 편리한 친구가 되었습니다.
하지만 여전히 새 양식은 잘 퍼지지 않았습니다. 이 양식은 저희 중대 뿐만 아니라 저희 대대 전체에서 쓰는 양식이었습니다. 대대에서 공식적으로 새 양식을 쓰기로 결정했지만, 옛날 양식을 써서 제출하는 사람들이 많았습니다.
저는 각 중대를 돌면서 담당자(당직 근무자)를 만났습니다. 새 양식을 보여주고, 지금까지 우리가 삽질했던 걸 얼마나 쉽고 편리하게 할 수 있는지 보여줬습니다. 사실 모두 호의적인 반응을 보였습니다. 이런 양식이 있는 줄 몰랐다던가. 저번에 양식을 받았는데 어디에 뒀는지 모르겠다는 식의 답을 받았죠. 그래서 양식이 정착될 때까지 매번 파일을 전파해주고, 같이 사용법도 적어놓았습니다.
어느새 새 양식은 널리 퍼졌고, 당연하게 여겨졌습니다.
저는 전문하사로 7개월을 더 있었습니다. 후임들을 교육하고 단축키와 엑셀 함수를 알려줬습니다. 제가 없어도 사람들이 제 양식을 고치고 수정하는 모습을 보며. 저는 사회로 돌아왔습니다.
첫 팀 프로젝트에서 고통을 맛보다.
사회로 돌아오고, 이제 졸업이 얼마남지 않게 되었습니다. 저는 교내에 데이터 분석 스터디를 만들어 공부를 했습니다. 그러다 한 스터디원님이 같이 프로젝트를 해보자고 권유를 하셨죠. 급히 회의를 해서 기획서를 만들었고요. 제 첫 프로젝트인 [TRAS 한국 여행자 후기 분석 시스템]을 시작했습니다.
결말부터 말하자면 프로젝트는 혼돈 그 자체였습니다. 팀장은 소프트웨어 학과 4학년인 분이었는데. 프런트도 백엔드도 할 줄 몰랐습니다. 딥러닝 모델을 만들겠다고 했는데, 깃허브에 커밋이 올라오질 않았습니다.
그나마 손톱만한 지식을 가지고 있는 건 저 밖에 없었습니다. 성실하고 열정이 있으신 다른 팀원 분과 둘이서 크롤링하고, 전처리하고, 모델을 만들고, 백엔드 서버를 만들고, 프런트 React도 만들게 되었습니다.
이때 얻은 교훈은 한 두 가지가 아닙니다. 프로젝트를 만들어보는 건 학습의 밀도가 달랐습니다. 1주일에 책을 2권씩 봤습니다. 하지만 책에 없는 게 더 많았죠. 공식 문서를 찾아보면서 삽질하고 삽질했습니다.
한편으로는 웹 개발에 자신감이 생겼고, 데이터 분석 말고 웹 개발 쪽으로 가보는 건 어떨지 고민하기 시작했습니다.
프로젝트를 끝날 때 즈음에 저는 절박함을 느꼈습니다. 제가 군대에서 한 막코딩으로는 한계가 있었습니다. 타입 변환을 까먹거나, 오타 하나로 몇 시간을 허비하는 삶은 싫었습니다. 팀원의 부족함을 탓하며 혼자서 모든 걸 떠앉기도 싫었습니다.
테스트 주도 개발과 설계
막연히 테스트가 이 문제들을 해결해주지 않을까 싶었습니다. 그때 읽은 [테스트 주도 개발], [리팩토링]이 참 많은 걸 줬습니다. 코드를 단순하게 리팩토링하고 테스트를 만들면서, 몇 시간 씩 고민하는 일이 급격히 줄었습니다. 확신을 가지고 더 많은 책을 사서 읽고, 문서도 읽어보면서 이것저것 해봤습니다. [클린 소프트웨어], [그림으로 배우는 HTTP 네트워크], [객체지향의 사실과 오해], [오브젝트], [이펙티브 자바], [스프링 부트와 AWS로 직접 만드는 웹 서비스] 등등... 읽기만 하고 실습은 나중으로 미뤄둔 [자바 웹 넥스트 스텝], [토비의 스프링], [스프링 인 액션] 같은 친구들도 있네요.
삶을 풍요롭게 하는 코칭
이때 쯤에 코칭도 시작했습니다. 처음에는 영어 과외를 했는데요. 그러다 데이터 과학 코칭을 시작했고, 결국 프로그래밍 코칭까지 갔습니다. 중,고등학생, 대학생, 대학원생, 회사원, 주니어 프로그래머 참 많은 분들을 만나서, 같이 고민하고 코딩했습니다. 그 중에는 국비를 다니시거나, 멋쟁이 사자처럼, 노마드 코더 같은 기존에 다른 강의나 부트캠프를 하고 계신 분도 많았습니다. 통계, 머신러닝, 딥러닝, 사무자동화, 백엔드, 프런트, 앱까지 참 이것저것 잡다하게 했습니다.
제가 벤치마크하고 싶은 건 김창준님의 AC2인데요. 제 코칭은 피코치의 참여를 유도하거나, 생성적으로 진행하는 등... 여러 측면에서 부족한 게 더 많다고 느낍니다.
첫 회사에서 인턴, 스타트업의 현실에 좌절하다.
이런저런 사정으로 아버지의 집에서 쫒겨나, 어머니와 함께 살게 되었습니다. 학교를 휴학하고, 취직하려 데브매칭을 보거나 이력서를 넣기 시작했는데요. 결과는 썩 만족스럽지 않았습니다. 프로그래머스 레벨3까지 문제를 모두 풀었더니, 코테는 만점이었지만... 데이터 분석가로 지원한 회사 중에 단 한 곳도 면접조차 가지 못했습니다.
그러다 장고 Rest 프레임워크, 리액트, 딥러닝 스택을 가진 한 스타트업 인턴 모집 공고를 보게 됐습니다. 신입 정규직은 어려워도 인턴은 되지 않을까? 그 회사가 제 첫 회사인 S사였는데요. 면접을 보러간 자리에서 바로 합격하고, 다음 날 바로 출근하게 됐습니다. "이 정도 능력이면 신입으로 가도 될 것 같은데, 왜 인턴으로 지원하셨냐?"는 말이 기억에 남네요. (아무도 저 같은 신입은 받아주지 않아서요!)
S사에 있는 1달 동안 정말 많은 걸 했습니다. 배우고 시도했던 걸 적어보겠습니다.
처음 한 일이 WSL에 Cython 딥러닝 모델을 서빙하는 장고 + 리액트 개발환경을 구축하는 거였습니다. Docker를 쓰고 있는데도, 그냥 도커 run으로 돌아가질 않았습니다. DB는 실 DB에 연결되어 있어서 테스트 DB로 바꿨고, requirements.txt 버전은 안 맞았고, Cython은 특이한 커스텀 툴체인을 쓰는데 문서가 없어서... 여튼 에러 메세지 보면서 2시간 정도 만에 개발환경을 구축했습니다.
제가 처음 고친 기능이 줌인 줌 아웃이었습니다. 수동으로 사이트에 접속해서, 로그인하고, 사진을 업로드하고, 줌인 줌아웃을 하는 식으로 테스트를 했습니다. 상태 관리는 redux를 쓰는데, 너무 번잡해서 한 번 실험을 해보고 싶으시다며 prop 내리기가 되어 있었습니다. 뷰에서 상태를 바꾸는 로직이 이런저런 컴포넌트에 흩어져 있었습니다.
처음에 시연하면서 보여주시는데 에러가 났습니다. 눈 앞에서 에러 메세지를 보고, 코드를 수정하고, 다시 서버가 갱신되면, 다시 접속해서, 로그인하고... 뭐 그래도 원인을 찾지 못했죠. 며칠 후에 투자자 분이 사이트에서 직접 해보시는데 안 된다고 하시니, "아직 프로토타입이고 상관 없다."고 말씀하셨던 게 기억이 납니다.
저는 뷰에서 상태를 끌어내고 싶었습니다. Redux가 싫으시다니, MobX라는 게 있다고 알려드리고 원리를 설명했습니다. MobX 괜찮은 것 같다. 한 번 이사를 가보자. 사실 레거시가 대학생 프로젝트처럼 조그만해서 전환에 부담도 없었습니다.
Cypress로 앞서 말한 End to End 테스트를 자동화했습니다. 이미지 파일 업로드, 마우스 스크롤을 어떻게 하는지 몰라서 헤맸던 기억이 납니다.
그 다음에는 create-react-app에 내장된 jest로 상태 함수만 모아놓고 유닛 테스트를 했습니다. 상태 로직을 정확하게 구현했다는 확신을 얻고, 이제 기존 코드를 리팩토링 했습니다.
이때 Mobile과 Desktop 뷰 컴포넌트가 따로 있었는데요. 설정 메뉴 모양만 다른데, 똑같은 상태 로직이 복사 붙여넣기 되어 있더군요. 이 공통 부분을 들어내고 통합했습니다. 그러니 복잡해서 전혀 다르게 보였던 Zoomable Image 컴포넌트가 사실은 동일하다는 걸 알게 됐습니다. 생각해보면 모바일이라고 PC와 다른 기능을 하지 않으니 당연했습니다. 공통 부분을 추출해서 Zoomable Image로 만들고, 프롭 내리기도 없애버렸습니다.
이걸 가져갔더니 반응이 좋지 않았습니다. 모바일이랑 데스크탑의 기능이 달라질 수도 있는데, 지금 이렇게 추상화해놓으면 나중에 쓰기 불편해질 수도 있다는 것이었죠. 그렇게 생각할 수도 있죠.
그 후로 계속 뭔가 잘못됐다는 느낌을 받았습니다. GitHub Issue조차 없어서 매번 구두로 전달 받아야했고요. 백엔드 API 문서가 있는지 물었는데, 역시 없었습니다. 장고 REST에서 자동으로 swagger open API를 만들어주는 툴 정도라도 있었으면 좋았을텐데요.
하루는 "지금 하고 있는 건 언제 끝나냐?"는 질문을 받고, "어디까지 해서 보여드리면 되겠습니까?"하고 물었는데요. 그때 지시사항은 "전에 말할대로 한 번 고쳐봐라."였습니다. 지시가 모호해서 질문을 한 건데 "그런 건 스스로 생각해야한다."던가 "책임감이 없다."는 식의 답변을 들었습니다. 그래서 "제가 적어둔 작업 목록을 보여드릴테니, 그 중에 뭘 할지 골라주시면 시간을 추정하기 쉬울 것 같다."고 말씀을 드렸는데요. "아까 전에는 그렇게 말 안 하지 않았냐?"는 답이 돌아왔죠.
물론 이런 업무 절차가 미비할 수 있습니다. 하지만 개선에 대한 의견을 받아들이지 않는 건 다른 문제죠. 이 이야기를 드리니 "나는 대표인데 왜 신입인 너에게 맞춰야 하냐."는 답을 들었습니다. 그 외에 명대사로 "왜 나에게 설명하듯이 말하느냐." "내가 얼마나 많은 프로젝트를 만들었는지 아느냐?" "내가 풀스택 6년차인데" 등이 있습니다.
결국 1달만에 그만두기로 했습니다. 나오면서 제가 했던 작업들과, 프로젝트 구조와 방향, 환경 설정 방법을 정리한 문서를 만들어 남겼습니다.
"1년은 버텨봐야하는 거 아니냐" "요즘 애들은 근성이 없다."고 생각하시는 분이 있다면, 별로 드릴 말씀은 없네요. 환경을 무시하고 사람의 성격을 판단할 수 있다는 심리학적 통찰력에 박수를 보내드립니다. ;)
프메 백업 뷰어를 만들다.
첫 회사를 그만두고 고민이 많았습니다. 때로는 먼저 연락이 오기도 하고, 제가 지원서를 넣기도 했는데. 1차에서 떨어진 경우도 많았고, 면접에서 떨어지기도 했습니다.
면접에서 떨어져도 보통 정중하게 복사 붙여넣기한 인사만 받기 때문에, 왜 떨어졌는지는 알 수 없었습니다. 내가 비전공자라서 그럴까? Python Django는 역시 너무 마이너한 게 아닐까? 저에 대한 의심만 커졌죠. 임상 심리사님과 상담을 하면서 이런 불확실성을 어떻게 받아들여야할지?... 고민했고, 지금도 고민하고 있습니다.
그러다 연습이 아닌 새로운 프로젝트 [프메 백업 뷰어]를 시작하게 되었습니다.
저는 아이돌 그룹 아이즈원의 팬인데요. 3월 10일 아이즈원이 해체하면서, 아이즈원 팬덤은 충격과 슬픔에 빠졌습니다. 할 수 있는 건 없고 무력감만 남았죠.
요즘 아이돌은 프라이빗 메일, 혹은 버블이라는 서비스가 있습니다. 아이돌 멤버들이 팬들과 메세지를 공유하는 팬 전용 SNS 같은 느낌인데요. 아이즈원이 활동을 종료하면서 아이즈원 프라이빗 메일도 서비스를 종료하게 되었습니다. 앱 이용약관은 "자기 책임 하에 백업할 것"을 요구했는데요. 팬들은 8천 장이 넘는 메일을 스크린샷을 찍어서 하나하나 백업하고 있었습니다.
이때 한 개발자가 프라이빗 메일의 REST API 서버에 요청을 보내서 1시간에 걸쳐 8천 장의 메일을 불러와 저장하는, 이른바 프메 백업 툴을 만들었습니다. 저도 이 툴로 백업을 했는데. 받고 보니 문제가 있었습니다.
메일 백업은 HTML과 이미지, 그리고 메일 목록과 정보가 담긴 json 파일로 이루어져 있습니다. JQuery로 만든 간단한 뷰어가 있긴 했지만, 볼 수 있는 걸 제외하면 아무 기능도 없었습니다.
저는 마침 관심을 두고 있던 FastAPI, Svelte와 tailwind를 가지고 다양한 기능을 갖춘 뷰어를 만들면 어떨까 싶었습니다.
그렇게 프메 백업 뷰어 프로젝트를 시작해서, 팬들과 지속적으로 공유했습니다. 처음에는 설치조차 불편했지만 스크립트를 만들어 자동화했고요. 다양한 기능을 추가해나갔습니다
- 날짜 달력
- 파파고 번역
- 검색
- 태그
- 서버를 이용한 데이터 동기화
- 좋아요
- 다크모드
- 프로필 사진 바꾸기, 직접 업로드하기
- 영상 스트리밍
- N 년전 오늘
- 앨범
- 사진 크게 보기
- 비동기 메일 백업
팬들의 반응과 의견은 큰 힘이 되었습니다.
한편으로는 에러가 두려웠습니다. ;) 사용자는 정말 다양한 방법으로 실수를 할 수 있습니다. 사용자의 실수를 예측하고, 에러가 나더라도 적절하게 대처할 수 있게 만들어야 했습니다. 윈도우와 안드로이드만 사용해온 저에게, 맥과 사파리에서 일어나는 크로스 플랫폼, 크로스 브라우징 이슈를 해결해나가는 것도 새로웠습니다.
백엔드에서는 당연하게 생각했던 여러 설계 원칙을, 프런트 엔드에도 적용하게 됐습니다. End to End 테스트는 확실하지만 너무 느립니다. 테스트를 피하게 되고 코드가 꼬이게 됩니다. 하지만 테스트 없이 View와 State가 뒤섞인 코드는 재사용하기 어렵고, 리팩토링하기 고통스럽죠. 도메인-상태의 로직으로 더 끌어내서, 의존성 없이 Jest만으로 테스트할 수 있게 만드니... 많은 문제가 저절로 풀렸습니다.
이 외에도 배운 건 많지만 다음 이야기로 넘어가죠.
내가 가치 있게 생각하는 일을 해나가자.
마지막은 감성적인 이야기입니다. 저는 최근에 삶의 방향을 잡았습니다.
최근에 삶의 방향을 정했는데. 생계도 안정적이니 소수자이지만 유망한 기술을 더 쉽고 정확하게 배울 수 있게 하는 일에 헌신해볼 생각이다.
FastAPI, Svelte, Scala, Clojure, Elixir, 그래프 데이터베이스 등을 진흥시키기 위해서. 자료를 정리하고, 깊이 있는 튜토리얼을 열심히 만들 겁니다.
제 삶에 즐거움, 가치는 크게 2가지가 있다고 생각합니다. 하나는 문제를 풀고 해결하고 알아가는 즐거움이고, 다른 하나는 사람들과 함께 하면서 도움이 되고 있다는 느낌입니다.
첫 번째 즐거움을 느끼는 분이 얼마나 되실지 모르겠습니다. 수학이나 물리, 프로그래밍이 재미있다고 느끼는 사람은 괴짜가 아닐까요. ;) 일이나 공부, 성공 같은 '기준'에 맞춰서 힘들고 '해야하는 것'으로 여겨지기 쉽습니다. 저도 그런 압박감을 느끼곤 합니다.
두 번째는 좀 특별합니다. 이건 단순히 나 혼자 방에 틀어박혀서 공부만 해서는 얻기 힘드니까요. 잘못 흐르면 관심에 집착하거나, 공허해질 수 있지만. 사람은 원래 사회적인 동물입니다. 행복에 대한 연구들은 인간 관계가 행복에 가장 중요한 요소 중에 하나라고 이야기하고 있죠. 당장 가족, 친구, 직장, 취미, 사랑까지 넘쳐나는 관계들을 생각해보세요! 서로 도움을 주고 받고 감사하는 관계가 많다면 더욱 즐거울 수 밖에 없을 겁니다.
저는 여러모로 운이 좋았다고 생각합니다. 중학교 때 저의 친구가 되어주셨던 사서 안미주 선생님과, 고등학교 때 마찬가지로 도와주셨던 정윤지예 선생님. 역시 은인이신 장영두 선생님... 여러 은인 분들 덕분에 죽고 싶을 때 죽지 않았고요. 책을 좋아하게 되었고, 영어를 포기하지 않았습니다.
저는 학습과학과 전문성에 관심을 가지고 많은 걸 배웠습니다. 학습원리들을 프로그래밍에 적용하면서, 빠르게 배우고 성장할 수 있었다고 생각합니다. 물리학과인 제가 컴퓨터 공학과 학부생 분들을 코칭하고 있으니까요.
프로그래밍 코칭을 하면서 생계에도 큰 걱정 없이 살고 있습니다. 제가 생계가 곤란하고 힘들었다면, 취업에 더 집착하고 두려워할 수 밖에 없었을 겁니다. 전에 배민 커넥트 배달을 했었는데, 시간 당 1만원 정도 꽤 벌었지만 정말 힘들었습니다. 프로그래밍 코칭은 돈도 더 많이 벌고, 제가 더 좋아하고 즐기는 일이기도 합니다. 제가 하루 8시간씩 코칭을 하진 않아서, 수익이 많진 않지만. 저는 원래 검소하고, 밥도 직접 해먹기 때문에 괜찮은 것 같네요.
저 역시 제가 아직 모르는 게 많고, 부족하다는 걸 압니다. 하지만 지금까지 그래왔듯이, 앞으로도 성장해나갈 것임을 믿습니다. 생태계를 위해 기여하고, 가치를 전해보고 싶습니다.
프메 백업 뷰어에서 그랬던 것처럼, 제가 관심을 가지고 공부 중인 기술과, 함수형, TDD, 애자일 같은 방법론을 더 퍼트리고 싶습니다.