처음 편의점 미션을 봤을 때 들었던 생각은 요구사항이 끝이 없네? 였다. 이틀 동안은 구조를 설계하는 데 시간을 썼고 미션 제출 당일까지도 나는 기본적인 테스트도 통과하지 못했다. 치열했던 내 일주일 간의 여정을 공유해보고자 한다.
나는 개발 동아리 회장을 하면서 프리코스를 병행했다. 3주차까지는 문제없이 잘 했었는데 4주차는 시간이 너무 촉박했다. 일주일 종일 해도 부족한데 토요일에 행사도 있었던 터라 심리적으로 압박감이 더 들었다.
금요일 새벽 5시까지 나는 우테코를 하고 다음 날 행사를 진행했다. 잠은 7시간정도 잤는데 아직 몽롱한 상태로 행사를 시작했다. 행사는 동아리 출신 졸업자 분들이 와서 현 동아리원들과 네트워킹을 하는 홈커밍데이였다. 원래는 긴장이 되어야 하는데 피곤함이 몰려와 정신없이 했던 것 같다.
당일은 미션 진행이 힘들다고 생각해 남은 일요일과 월요일에 완벽하게 끝내겠다 다짐을 했다. 하지만 완벽한 계획에는 항상 흠집이 있을 뿐이다.
프로모션은 내가 카페 알바를 했을 때 많이 보던 익숙한 이름이었다. 근데 여기서 나올 줄은 ㅎㅎ.. 알바를 했던 터라 이해하는 데 시간이 많이 걸리지 않았다. 프로모션은 위 사진을 보면 알 수 있듯 제일 요구사항이 많은 부분이었다. 설계의 80퍼센트를 여기에 쏟아부었다고 해도 과언이 아니었다.
하지만 내가 구현한 것과 결과 출력 예시와는 달랐다.
나는 2+1 프로모션 상품에 대해 3개를 구매할 시 2개에 대해서는 1개의 증정품이 제공되고, 나머지 1개에 대해서 하나를 더 사면 2+1로 인해 하나가 제공된다로 구현한 것이다. [콜라-3]을 3개가 필요하다
로 해석해야 함을 토요일에서 일요일로 넘어가는 12시에 알게되었고 나는 모든 것을 갈아 엎어야 했다.
하지만 그때 알아차리지 못했다면 나는 미션 구현에도 실패했을 것이다. 하루가 남았지만 할 수 있다고 믿고 새벽 5시까지 코드를 짰다.
다음 날 일어나서 바로 로컬 테스트를 돌렸다. 근데 오류가 발생했다. jest에서 import.meta.url
을 지원하지 않는다는 것이었다. 돌아가게 할 수는 있었으나 외부 라이브러리를 설치해야 했고, 그것은 package.json을 수정하는 행위였기에 요구사항을 위반하는 것이었다.
내가 쓴 import.meta.url
는 ESM 환경에서만 돌아가는 거였고 jest는 기본적으로 CommonJS 환경이라 오류가 발생한 것이었다.
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
그래서 기존의 코드를 바꿔야 했다.
class ProductParser {
constructor(filePath = 'public/products.md') {
this.filePath = path.join(process.cwd(), filePath);
}
async #loadProductData() {
const data = await fs.readFile(this.filePath, 'utf-8');
return data;
}
}
생성자에 filePath
를 상품 md파일이 있는 경로로 지정했다. process.cwd
로 실행 중인 디렉토리를 반환하고, path.join
로 경로를 생성했다. 이로써 오류가 나지 않는 선에서 md 파일을 읽어오는 것에 성공했다.
다시 테스트를 돌렸으나 한 번 돌리는데 24초가 걸렸다. 추가로 콜스택 오류도 났는데 난생 처음 본 오류였다. 분명 뭔가 잘못되었다는 생각이 들어서 어디서 잘못된지 찾기 시작했다. await 을 쓴 부분에 문제가 생긴 것 같았다. 여러 파일을 건드려 보다가products.md
를 가져오는 과정에서 시간초과가 나는 것을 깨달았다.
async #loadProductData() {
const data = await fs.readFile(this.filePath, 'utf-8');
return data;
}
md 파일을 read할 때 await을 쓰지 않아 콜스택오류가 발생한 거였다. await 하나만 추가하면 되는 것이었어서 순조롭게 오류를 해결했다.
모든 구현을 완료하고 오후 3시쯤 테스트를 돌렸다. 3/4 가 나왔고 나머지 하나는 구현하지 않은 부분이었기에, 내 예상과 같았다. 마지막 구현을 완료했을 때는 오후 6시였다. 저녁 먹기 전에 통과되었으면 좋겠다는 마음으로 다시 제출을 했고 드디어 4/4를 성공하였다.
저녁을 먹은 다음 바로 리팩토링을 시작했다. 프로그래밍 요구사항에 메서드당 10줄과 indent 2이하가 있었는데, 미션 구현에 워낙 시간을 많이 써서 요구사항을 신경 쓸 겨를도 없었다. 결국엔 100줄이 되는 코드를 만들어내고야 말았다. 5시간이 남았기에 리팩토링을 할 시간이 조금 있었다.
나는 100줄의 코드를 이리저리 나누기 시작했고 로컬에서 모든 테스트가 통과하고 있었기에 수정 후 다시 제출했다. 근데 갑자기 예기치 못한 오류가 발생했다는 메세지가 떴다.
로컬 테스트가 다 통과되는데도 예기치 못한 오류가 발생하니 미칠 노릇이었다. 게다가 3시간을 남겨 놓고 회고글을 써야 하는 상황이었기에 등골에 소름이 돋았다. 리팩토링의 꿈은 이루지 못한 채 모조리 revert를 했다. 다행히 revert하고 돌리니 통과는 했다.
4주차 과제를 클릭하니 제일 보이는 건 회고였다. 회고글을 야무지게 쓰고 싶었는데 구현한다고 많이 신경쓰지 못한 것 같다. 그래도 있는 그대로 쓰려고 했고 내 진심이 닿았으면 좋겠다는 마음 뿐이다.
💡목표
코드 리뷰는 의도가 없던 내 코드에 의도를 만들어 주었다. 코드 리뷰를 하면서 어떤 의도로 짰는지에 대해 스스로 생각하고 답변을 할 수 있었고, 코드를 작성할 때 자연스럽게 의도를 생각하면서 짤 수 있었다. 코드 리뷰는 고칠 점을 이야기하는 활동이 아니라, 온전히 각자의 생각으로 토론하는 장이었다. 내 코드에서 유지할 점과 개선해야 할 점을 알게 되었고, 더 좋은 코드가 무엇인지 생각할 수 있었다.
💡미션 구현에 대한 목표
각 미션의 목표를 달성하기 위해 테스트 통과를 1순위로 잡았고, 그것을 잘 이행했다고 생각한다. 미션을 제출해야 다음 미션을 받는 구조였기에, 테스트 통과를 해보자라는 목표로 미션이 나오는 날부터 하루 또는 이틀동안 구현에만 매달렸다. 내가 세운 전략은 돌아가는 쓰레기를 만들자는 것이었다. 프로그램 구조보다 테스트 통과를 목적으로 두었던 나에게는 이 전략은 테스트 통과에 매우 효과적이었다.
💡변화
남에게 코드를 보여주는 게 부끄러웠던 사람이었다. 코딩을 한지 얼마 되지 않았고, 많이 부족하다는 것을 스스로 알고 있었다. 하지만 혼자 공부해도 프로그래밍을 매우 잘하는 개발자가 될 수 있다고 믿고 있었다. 한 달간의 프리코스 과정은 그 생각을 무참히 깨 부수어 주었다.
프리코스는 나로 하여금 소극적인 프로그래머에서 적극적인 프로그래머로 변화하게 해 주었다. '무조건 고쳐야 돼'가 아니라 '이렇게 한 의도가 뭐야'가 코드 리뷰라는 것을 알게 된 후부터는 코드 리뷰를 하면서 다른 사람들에게 내 코드를 보여주는 것을 꺼리지 않게 되었다. 프로그래밍 실력을 키우기 위해선 혼자 공부하는 것보다, 나보다 잘하는 사람의 도움이 중요하다는 것을 깊이 깨달았다.
프리코스를 하기 전의 나는 뭐든 하면 되겠지하는 마인드를 가졌었다. 지금까지는 내가 하고 싶은대로 살아왔고, 컴퓨터공학으로 전과한 다음 동아리 활동을 하며 나름대로 열심히 살았다고 생각했다.
프리코스에서 만난 다양한 사람들을 보며 나보다 실력이 뛰어난 사람들이 이렇게나 많은데 내가 합격할 수 있을까하는 마음이 들었다. 보다 확실한 답이 필요했다. 내가 개발을 시작한 이유가 뭐였지?
처음엔 코딩을 하는게 멋있어보였다. 동시에 무언갈 만들고 싶은 마음이 들었고 그때부터 코딩을 시작했다. 빨리 배워서 나만의 무언가를 만들어야겠다는 생각으로 시작한 코딩을 어느새 6개월 간 매일매일 하고 있었다.
맞다. 내가 시작한 이유가 이거였구나. 긴 시간동안 내가 지속할 수 있는 일이야말로 내가 하고 싶은 일 아닐까하는 생각이 들었다. 시작한 이유가 명확해지니 다시 미션에 집중할 수 있었고 끝까지 잘 마무리할 수 있었다.
프리코스를 끝나고 나서 나만의 장점을 생각해봤다. 주어진 일을 끊임없이 붙잡는 능력이 나에게는 있다고 생각했다. 미션 제출 당일까지 몇 번이고 만감이 교차하는 순간이 있었지만 포기하지 않고 계속 했다. 그 끝에는 해결이라는 결과가 있었지만, 해결하지 못했다 해도 23시 59분 59초까지 그것에 매달리고 있었을 것이다.
무언가를 지속할 수 있고 결과보다 과정을 즐길 줄 아는 그런 사람이 되고 싶다. 결과를 정해두는 게 얼마나 고통스러운 일인지 다들 알 것이다. 지속할 수만 있다면 결과는 따라오는 것 아닐까?
프리코스는 한 달 동안 프로그래밍 왜 하니?
라는 질문을 계속 하는 것 같았다. 그에 대한 내 답은 재밌어서요!
였다. 매주 미션이 나올 때마다 설렜고 오류가 뜰 때 이유를 찾아 해결하는 과정이 너무 재밌었다.
매너리즘에 빠질 듯한 시기에 프리코스는 큰 동기부여가 되었다. 좋은 미션과 피드백을 준 프리코스에 감사하며 끈질긴 개발자가 되겠다 다짐하는 계기가 되었다. 마지막으로 4주차 미션 링크를 남기며 이상 한 달 간의 프리코스에 대한 회고를 마친다.