들어가기에 앞서 🤔
학부 연구생으로 근무하면서 여러 일들이 겹쳐 불가피하게 2주차 피드백부터 적게 되었다.
1주차 과제를 진행하면서, 나름 컴퓨터공학과 학생이지만 아직 많이 부족하다는 것을 깨달았다.
C#만을 파오다 백엔드로 전향하면서 늦게나마 자바를 공부하는 중인데
기본적인 문법 습득에는 크게 어려움이 없었지만...
다양한 라이브러리의 사용법 숙지가 제대로 되지 않아 수많은 오류와 마주해야 했었다.
(HashMap을 사용하는 문제가 제일 난감했다😥)
또한, 알고리즘을 제대로 공부한 적이 없어서 그런지 내가 생각하기엔 비효율적인 코드 투성이였다.
개선하고 싶은 부분이 있어도 어떤 키워드로 서치를 해야할 지 감이 잡히지 않을 정도였으니 말이다.
1주차에서 가장 아쉬웠던 부분은 우테코 과제에 시간을 많이 쓰지 못한 것이다.
기능 설계, 기능 구현, 기능 추가, 코드 리팩토링 등 고려해야 할 부분이 많았고 충분한 시간을 두고 생각해야 했는데,
그때 당시에는 기능 설계? 리팩토링? 그런 것들에 대한 인지가 없었다.
연구과제가 바쁘긴 했지만, 간단한 알고리즘 문제일 것이라 생각하여
마지막에 몰아쳐서 한 나의 게으름이 가장 큰 문제 요인인 것 같다.
일을 여유있게 처리하는 것은 중요하다.
모두 끝냈다고 생각해도 어떠한 변수가 등장할지는 모르는 일이기 때문이다.
여기까지 서론을 마치겠다.
1주차 피드백 📝
먼저 1주차 과제에 대한 피드백이 도착해있었다.
개인적으로 해주는 피드백은 아니고, 여러 사람들의 프로젝트를 봤을 때 공통적으로 느껴지는 문제점들을 적은 듯 하다.
1주차 피드백은 다음과 같다.
1. 요구사항을 정확히 준수
2. 커밋 메시지를 의미있게 작성
3. git을 통해 관리할 자원에 대해서도 고려
4. Pull Request를 보내기 전 브랜치 확인(요구한 브랜치를 Pull Request 했는지)
5. PR을 한 번 작성했다면 닫지 말고 추가 커밋
6. 이름을 통해 의도를 드러내(변수, 함수, 클래스)
7. 이름을 축약하지 않음(의도를 명확히 드러내기)
8. 공백도 코딩 컨벤션
9. 공백라인을 의미있게 사용
10. Space와 Tab을 혼용하지 않음
11. 의미없는 주석을 달지 않음(어떤 의도인지 드러나면 굳이 주석 작성하지 않음)
12. IntelliJ IDEA -> Ctrl + Alt + L => 코드 자동 정렬
13. Java API를 적극 활용
14. 배열 대신 Java Collection 사용
코드 컨벤션과 Git을 효율적으로 사용하는 내용에 관한 피드백이 많았다.
1주차 과제를 하면서 commit 메세지를 어떻게 써야할 지 고민했었는데, 메세지 작성 시 참고할 링크도 달아져있었다.
https://gist.github.com/stephenparish/9941e89d80e2bc58a153
AngularJS Git Commit Message Conventions
AngularJS Git Commit Message Conventions. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
나는 여기서 추가적으로 branch를 어떻게 사용해야할 지도 공부해보았다.
https://gmlwjd9405.github.io/2018/05/11/types-of-git-branch.html
[GitHub] Git 브랜치의 종류 및 사용법 (5가지) - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
2주차 과제 - 숫자 야구 ⚾
2주차는 숫자 야구 게임을 구현하는 과제였다.
1주차에는 없었던 docs/README.md 파일이 하나 추가되었고, 이곳에 기능 구현 목록을 작성해야 했다.
*.md 파일은 마크다운 문법으로 작성된 파일을 의미한다.
좀 더 가독성있는 목록을 작성하기 위해 마크다운에 대하여 조금 알아보았다.
https://gist.github.com/ihoneymon/652be052a0727ad59601
마크다운(Markdown) 사용법
마크다운(Markdown) 사용법. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
숫자 야구 게임의 기능 요구 사항은 다음과 같다.
기능 요구 사항 🚀
기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.
- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
- 예) 상대방(컴퓨터)의 수가 425일 때
- 123을 제시한 경우 : 1스트라이크
- 456을 제시한 경우 : 1볼 1스트라이크
- 789를 제시한 경우 : 낫싱
- 예) 상대방(컴퓨터)의 수가 425일 때
- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.
기능 구현 면에서는 크게 어려운 부분이 없었다.
그러나 프로그래밍 요구 사항이 새로 추가되어 있었다.
프로그래밍 요구 사항 🖥️
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
- 3항 연산자를 쓰지 않는다.
- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
for문과 if문을 남용하던 나에겐 당황스러운 조건이었다.
그러나 기능 구현을 하면서, 오히려 이런 조건이 걸려있었기 때문에 더 깔끔한 코드를 작성할 수 있었다.
자동적으로 메소드를 분리하게 되었고, 어떻게 하면 반복문이나 분기문을 줄일 수 있을 지 생각할 시간도 가질 수 있었다.
처음 기능 구현을 할 때에는 Application안에 게임 진행 관련 여러 static 메소드들을 만들었었는데, 나중에는 이를 모아 따로 패키지를 만들어 Application에서 패키지를 import 해주는 형식으로 변경하였다.
추가적으로, 우테코 측에서 직접 만든 것으로 보이는 API를 사용하라고 되어있었다.
- camp.nextstep.edu.missionutils에서 제공하는 Randoms 및 Console API를 사용하여 구현해야 한다.
- Random 값 추출은 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange()를 활용한다.
- 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용한다.
이 메소드들의 원형을 뜯어보면서 어떻게 동작하는지 파악해보았다.
pickNumberInRange()는 Random.nextInt()를 변형하여 정수 범위 안에서 랜덤 숫자를 뽑는 메소드였고
readLine()은 Scanner.nextLine()을 그대로 가져다가 쓰는 메소드였다.
나는 readLine()을 쓸 때, nextLine() 호출 시 발생할 수 있는 예외들을 처리해주는 catch문을 작성해주었다.
프로그래밍 요구사항 외에도 깊게 봐야할 부분이 있었다.
바로 예외처리이다.
사용자가 잘못된 입력을 한다면 IllegalArgumentException을 throw 한다.
나는 여기서 큰 실수를 했다.
2주차 과제 역시 몰아서 급하게 하느라 처리하려던 예외 중 하나를 빼먹었다.
기능 구현 문서 안에 작성을 해두었다면 자주 들여다보면서 봤을텐데, 아이패드에 작은 글씨로 적어둔 것이 화근이었다.
이미 제출기한이 지난 후에 떠올라서 너무 마음이 아팠지만...
일은 여유있게 끝내놓아야 완벽하게 완성할 수 있다는 사실
내가 그 반면교사가 된 것 같아서...
오래 기억에 남아 잊지 못할 것 같다.
2주차 과제를 요약하자면,
기능 구현에는 큰 어려움이 없었고 코드 컨벤션이나 Git commit 메세지, 예외처리에 주의를 기울어야 했었다.
3주차 과제는 꼭 여유있게 끝내고 빠진 부분이 없도록 수정하는 기간을 가져야겠다.
https://github.com/soun997/java-baseball
GitHub - soun997/java-baseball: 숫자 야구 게임 미션을 진행하는 저장소
숫자 야구 게임 미션을 진행하는 저장소. Contribute to soun997/java-baseball development by creating an account on GitHub.
github.com
'도전' 카테고리의 다른 글
[SSAFY/싸피] 9기 전공자 합격 후기 (6) | 2022.12.23 |
---|---|
[우아한 테크코스] 웹 백엔드 2주차 피드백 및 3주차 회고 (0) | 2022.11.23 |