우아한 테크코스 프리코스는 총 4주 동안 매주 주어진 과제를 수행하는 것으로 진행된다. 1주차 과제는 숫자 야구 게임을 기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항을 만족하기 위해서 노력하는 것이 과제의 진행 방식이었습니다.
회고를 쓰는 게 익숙하지 않기 때문에 회고 방식 중 4L을 적용하여 작성해보았습니다.
학원 및 온라인 교육 등을 들은 이후, 현재 독학으로 공부하고 있는 중이었는데 기간이 없다는 것은 느슨해지게끔 했다. 하지만 정해진 기간 내 과제를 제출해야 된다는 것은 정해진 시간 내에 과제에 몰입을 할 수 있어야 됐기 때문에 정말 좋았다.
기능 요구 사항을 읽고 고민하여 기능명세서를 노션에 작성했다.
값을 입력받고 출력하기 위해서는 Console.readLineAsync, Console.print
1. 게임 시작 문구 출력
2. 컴퓨터가 랜덤 수를 가진다.
3. 사용자 입력값을 받기
1. 사용자가 잘못된 값을 입력한 경우 throw문을 사용해 예외를 발생시킨 후 애플리케이션 종료
1. string.length가 4보다 작아야 됨…
2. 숫자인지 확인해야 됨…
3. 다른 숫자인지 확인해야 됨.
- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.
4. 입력값과 컴퓨터 랜덤값을 인자로 받고 결과값을 반환하는 함수를 만든다.
1. 함수 안에서 3스트라이크인 경우 출력 문구 호출하고, 게임 종료
1. 게임을 새로 시작할거면 1, 종료면 2번인지 확인한다.
2. 1을 입력하면 게임 시작 문구 출력을 제외하고 게임이 시작된다
3. 2을 입력하면 process.exit()를 호출하지 않고 종료하게끔 만든다.
2. 함수 안에서 3스트라이크가 나올 때까지 재귀함수를 호출한다.
1. 같은 인덱스에 같은 값인 경우 스트라이크 개수로 표시
2. 같은 값을 포함하고 있는 경우 볼 개수로 표시
3. 같은 값이 없는 경우 낫싱
4. 3스트라이크가 아니면 다시 호출
이렇게 작성을 해놓으니 먼저 무엇을 해야 될지 알 수 있었고, 함수를 기능별로 분리하여 구현할 수 있었다. 차례대로 함수를 구현할 수 있어 그런 점이 좋았습니다.
사실 기능 명세를 작성하는 것에 익숙하지 않았다. 어떤 기능을 만들기 위해서 어떤 것이 필요하고, 어떻게 해야 되겠다는 생각은 있었으나 그걸 순차적으로 작성한 적은 많지 않았기 때문이다. 그래서 기능 명세를 작성하는 것은 익숙치 않아서 처음에는 조금 힘들었다.
또한 commit 단위를 어떻게 해야 될지 몰라서 처음에는 테스트를 통과한 후에 commit을 올리려고 하다가, 디스코드 채널에서 도움이 되는 글을 보게 되었다.
이 글을 보고, 기능명세서에 작성해놓은 기능별로 commit을 올리게 되었다.
우테코의 Javascript 스타일 가이드는 Airbnb 자바스크립트 스타일 가이드를 기준으로 하기 때문에 코드 컨벤션을 지키면서 작성하는 게 어려웠다.
처음부터 코드 컨벤션을 지키는 것은 어려웠기 때문에 처음에는 내가 할 수 있는 문법으로 작성하였고, 리팩토링 과정에서 자바스크립트 코드 컨벤션을 지킬 수 있도록 수정하였다.
그렇다고 완벽하게 코드 컨벤션을 지키는 건 어려웠고, if문 또는 for문 같은 경우는 고치지 못하였다....😭 시간이 좀만 더 있었다면 그것까지 고쳐봤을텐데...아쉽다.
이전에 코드숨에서 TDD를 학습해본적이 있기 때문에 테스트 코드를 어느정도 볼 수는 있었지만... 계속 테스트가 통과되지 않길래 정말 힘들었다. 테스트 코드가 통과하지 않은 이유는 테스트 코드를 제대로 읽지 않았었기 때문이었다. 하하하!
내가 코드를 구현했을 때, "1스트라이크 1볼" 순서로 출력이 되게끔 했었다. 하지만 테스트 코드에서 테스트 되는 메시지는 "1볼 1스트라이크"였기 때문에 계속 테스트가 실패했던 것이었다. 테스트 통과로 인해 좀 시간이 많이 소요돼서 너무 힘들었는데... 테스트 코드를 읽고, 테스트 실패시 에러메시지도 잘 읽어야 된다는 것을 다시 생각하게 됐다.
제발... 제발 요구사항을 자세히 읽어보자...
숫자 야구 게임 레포지토리에 있는 README.md를 읽긴 읽었는데... 기능요구사항, 프로그래밍 요구사항 등에 너무 중점을 두며 읽다보니 기능명세도 작성해서 올려야 되는 것을 몰랐다. (분명 코드를 구현하기 전 노션에 기능명세를 작성해놓았는데...!)
다른 분들의 PR을 구경하던 중 commit message에 docs가 있어서 다시 확인하다 보니, 기능 명세를 코드 구현 전에 올려놨어야 됐다. (이미 PR까지 올려놓은 상태였는데...ㅠ)
일단 과제 제출 전이어서 부랴부랴 뒤늦게 기능 명세 파일을 올리게 되었는데... 요구 사항을 정말 자세히 읽자... 이런 실수를 하지 않게끔 제발!!!!!
한줄평 : 클래스가 너무 어려워요. 그리고 테스트 코드 깨질 때마다 눈물이 흐르네요.