우테코 5기 프리코스 1주차 회고
우테코 프리코스 1주차 회고
프리코스 시작
오랫동안 기다리던 우테코 프리코스가 드디어 시작되었다!
이번 5기에서는 모든 참가자에게 배움의 기회를 제공하기 위해 이전과 달리 1차 코딩테스트를 없애고 모든 참가자들이 프리코스에 참가할 수 있는 기회를 주었는데 이번에 프론트, 백엔드, 모바일 합쳐 총 3300명 정도가 지원한것 같다.
이런 기회를 제공해 준 우테코에게 감사하고 4주간 많은 걸 배우고 성장해 개발 생태계에 좋은 영향을 줄 수 있도록 성장하여 기여하는 게 보답하는 길이지 않을까 싶다.
프리코스 1주차
이번 1주 차 미션은 이전과는 달리 코딩 테스트 7문제 였는데 아마 2주 차부터 숫자 야구, 자동차 경주 같은 미션을 줄 거라 예상이 된다.
이번 미션은 그냥 풀기에 미션 난이도는 어렵지 않았지만 일주일 동안 이 7문제를 미션으로 내준 것이기 때문에 단순하게 푸는 것만이 중요한 게 아닌 것 같아 바로 시작하지 않았다. 시작하기 전 자바 컨벤션, 클린 코드, 깃 컨벤션 등 미리 사전 공부를 하였고 어떻게 설계를 해야 될지 많은 고민을 했던 것 같다.
하지만 역시 설계는 쉽지 않았고 오히려 처음부터 설계 전체를 생각하니 머리에 과부하가 왔다. 그리고 컨벤션에 익숙하지 않았기 때문에 더 어려움을 겪었던 것 같다.
이번에 사전 공부한 것을 최대한 지키면서 짜려고 노력했지만 아직 부족함을 많이 느꼈다. 하지만 어떻게 코드를 짜야 할지 많은 생각을 해보게 되었고 아직 첫 주 차지만 생각보다 많은 걸 얻어 두 번째 미션에서 더 잘해내어 성장할 수 있을 것 같다.
진행 과정
- 자바 컨벤션, 클린 코드, 깃 컨벤션 등 사전 공부
- 문제 이해, 로직 구상
- 구현 기능 목록 작성
- 코드 구현
- 리뷰 및 과제 제출
1. 컨벤션, 클린 코드 등 사전 공부
참고한 자료:
- 자바 컨벤션: https://naver.github.io/hackday-conventions-java/
- 깃허브 컨벤션: https://gist.github.com/stephenparish/9941e89d80e2bc58a153
- 우테코 cleancode docs: https://github.com/woowacourse/woowacourse-docs/blob/main/cleancode/pr_checklist.md
자바 컨벤션(Java Convention)
공통(Common)
패키지(Package)
인터페이스(Interface)
클래스(Class)
메서드(Method)
변수(Variable)
클린 코드(Clean code)
추가 체크리스트
커밋 메시지의 기본형식은 위와 같고 100자를 넘을 수 없습니다. 커밋 변경 위치를 지정 코드 변경 사항에 대한 짧은 요약 변화에 대한 동기와 이전 행동과의 대조를 포함 모든 주요 변경 사항에 대한 설명, 정당성 및 마이그레이션 참고사항
깃 컨벤션(Git Convention)
커밋 메시지 형식
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
type
scope
subject
body
footer
참고 예제
feat($browser): onUrlChange event (popstate/hashchange/polling)
Added new event to $browser:
- forward popstate event if available
- forward hashchange event if popstate not available
- do polling when neither popstate nor hashchange available
Breaks $browser.onHashChange, which was removed (use onUrlChange instead)
docs(guide): updated fixed docs from Google Docs
Couple of typos fixed:
- indentation
- batchLogbatchLog -> batchLog
- start periodic checking
- missing brace
style($location): add couple of missing semi colons
2. 문제 이해, 로직 구상
각 문제를 이해하고 코드를 구현하기 전 어떤 로직으로 풀어야 될지 어떻게 설계해야 될지 많은 고민을 했는데 위에서 말했듯이 한 번에 설계하기엔 아직 나에게 무리였다… 그래서 구현 기능 목록을 작성해 하나하나 풀어나가려고 계획했다.
3. 구현 기능 목록 작성
페이지 오류 검사 해당 페이지의 가장 큰 숫자 계산 점수 비교 연속된 중복 문자 제거 각 자리수로 분할 해당 숫자가 3, 6, 9인지 검사 number까지 손뼉 수 계산 반대 문자로 변경 높은 금액 순으로 바꿀 수 있는 화폐로 교환 닉네임마다 나올 수 있는 연속적인 문자 저장 저장된 연속적인 문자 중 중복이 있는 유저 확인 문제(연속적인 문자가 겹치는 유저) 있는 이메일 리스트 반환 친구 추가 기능 구현 사용자와 함께 아는 친구를 가진 유저 확인 타임 라인 유저 확인 높은 점수 순으로 최대 5명 반환
구현 기능 목록
🚀 구현할 기능 목록
PROBLEM1
PROBLEM2
PROBLEM3
PROBLEM4
PROBLEM5
PROBLEM6
PROBLEM7
4. 코드 구현
https://github.com/parkmuhyeun/java-onboarding
5. 리뷰 및 과제 제출
문제들을 리뷰 하던 도중 6번 문제에서 더 개선 할 수 있는 방법을 떠올리게 되었고 개선하여 최종적으로 제출하였다.
6번 문제의 기능 중 닉네임마다 나올 수 있는 연속적인 문자를 가져오는 부분에서 나는 기존에 모든 가능성을 다 가져와 연산했었다. 그렇게 되면 예를 들어 “카타리나”같은 경우 “카타”, “카타리”, “카타리나”, “타리”, “타리나”, “리나”로 시간 복잡도가 n * (n-1) / 2 즉 O(n^2)이 걸려 총 시간 복잡도가 10000(최대 크루 수) * 19(max 닉네임 길이) * 19으로 3610000이 걸렸다.
이렇게 하여도 문제없으나 다음과 같이 줄이면 더 개선할 수 있다. 어차피 세 글자부터는 이미 두 글자에서 중복으로 처리되기 때문에 연산할 필요가 없어서 두 글자의 조합만 추가하여 계산해도 된다. 즉, “카타리나”에서 “카타”, “타리”, “리나”만으로만 검사해도 “카타리”, “카타리나”, “타리나” 같은 세 글자 이상 포함된 다른 크루들도 처리할 수 있다.
개선하게 되면 n-1이 걸려 O(n)으로 총 시간 복잡도는 10000 * 19 = 190000으로 단축되게 된다. 그렇게 개선하고 나서 Github에 Pull Request하고 우테코 플랫폼에도 제출하여 1주 차는 이렇게 마무리하게 되었다.
정리 및 후기
이번에 상당히 많이 고민하며 설계하고 구현해 보았는데 부족한 점을 많이 느꼈다. 물론 컨벤션도 익숙하지 않지만 특히 설계 부분에서 많이 당황했다. 그동안 객체 지향에 대해 어느 정도 알고 있다고 생각했었는데 그 생각이 완전히 깨졌으며 아직 한참 멀었구나 느꼈다.
그래서 다음 미션까지 두 가지의 목표를 세웠다.
- 컨벤션, 클린코드에 대해 더 공부하고 익숙해지기
- 객체 지향에 대한 공부
이번에 5기 프리코스에서 새로 우테코 커뮤니티라는 시스템을 도입한다고 했다. 현재는 Slack으로 하고 있는데 2주 차부터는 추가적으로 Github에 커뮤니티를 열어준다고 해서 기대 중이다!
Slack에서 다들 유용한 정보 공유, 에러 해결 방법, QnA 등을 이용해 서로 함께 도와가며 힘내고 있다. 이번 주에 Slack 없이 혼자 코딩했으면 너무 쓸쓸했을 것 같다.. 다 같이 파이팅 해가며 함께 진행하는 이 분위기가 너무 좋았는데 이것이 우테코에서 의도했던 바가 아닐까.
우테코 Slack
개발에서는 끝없이 배울 것이 나오고 변화가 빠르기 때문에 공유 문화가 더욱 중요하다고 생각되고 그만큼 협력, 커뮤니케이션 같은 함께 자라기의 중요성이 커졌다. 그렇기 때문에 나도 Slack에서 유용한 정보를 최대한 공유하려고 하고, 많은 분들에게 도움드리려고 노력하고 있다. 그리고 그만큼 다른 분들에게서도 많은 것을 배우고 얻어 가고 있다.
*틀린 부분이 있으면 언제든지 말씀해 주시면 공부해서 수정하겠습니다.