지난 주 금요일, 우테코 레벨1이 끝났다.
생각과 감정을 기록해두지 않으면 증발할 것 같아서 글을 남기려 한다.
연극
레벨1에서 가장 큰 이벤트는 연극이라고 생각한다. 주변 친구들에게 연극 하기 싫다고 징징거렸는데, 친구들 반응이 하나같이 똑같았다.
왜 연극을 해..?
왜 연극을 했을까.. 바로 생각나는 이유는 아래와 같다.
- 온보딩 조끼리 동고동락하게 하여 금방 친해지게 하기
- 앞으로 맞이할 시련들에 대한 예방 접종
- 연대책임..?(내가 했으니 너희도 해야 해)
일단 연극 조 크루들과 같이 연극 준비하면서 빠르게 친해질 수 있었다. 그리고 '내가 80명 앞에서 연극도 했는데 뭘 못해' 라는 생각을 실제로 많이 했다. 그리고 한동안은 모르는 크루와 통성명 할 때, 닉네임이랑 무슨 연극 했는지를 물었다. 이런 얘기를 하면서 서로 친해지게 한 것일수도..
레벨1 미션 회고
각 미션별로 회고를 적고 싶었으나, 한 미션이 끝나면 바로 다음 미션을 준비하느라 회고를 적을 시간이 없었다.(핑계 맞다🤙🏽)
그래서 이 게시물에 퉁쳐서 전부 적으려 한다.
🎱 미션1 - 로또
우테코에서의 첫 미션이었던 로또에서는 우가와 페어였다.
최종 코테가 끝난 이후 자바를 아예 쓰지 않았기 때문에 페어 프로그래밍에 대한 걱정이 많았었다. 그런데 다행히 우가도 비슷한 상황이었고, 같이 로또를 구현하면서 차근차근 기억을 되찾을 수 있었다.
로또 미션을 통해 배운 것은 아래와 같다.
- 자바 다시 떠올리기
- JUnit, AssertJ 사용법 익히기
- 의존성 주입을 통해 랜덤값 테스트하기
- domain이 view에 의존하지 않아야 하는 이유
- view는 변경이 잦은 계층이다. domain은 중요한 비즈니스 로직이 담긴 모델이다. domain에 view 관련 로직이 있으면, view의 변경에 따라 domain의 코드도 변경해야 한다. 이는 바람직하지 않다.
- getter를 무조건 사용하지 않아야 하는 것은 아니다.
- domain이 view에 의존하지 않게 하기 위해, view에서 getter로 domain의 값을 사용하는 것은 괜찮다. 다만 다른 domain에서 getter를 사용하여 연산하려는 경우는 지양해야 한다. 객체에 질문을 던져야 한다.
📗 미션2 - 출석
최종 코테 문제와 같았고, 리버와 페어로 진행했다.
TDD가 미션의 큰 주제였는데, 솔직히 출석 미션 할 때는 TDD가 혼란스럽기만 했다. 작은 단위로 구현하고 바로 단위테스트 작성하는 것과 뭐가 다른지 모르겠다는 생각이 들었다.
출석 미션을 통해 배운 것은 아래와 같다.
- TDD 사이클(red - green - refactor)로 비즈니스 로직 구현하는 방법
- 객체의 책임이 정말 잘 나눠졌는지 고민, 객체를 나누는 기준에 대해 고민
- AttendanceDate, AttendanteTime은 각각 LocalDate, LocalTime을 감쌀 뿐이지만, 스스로 검증하는 기능이 있어서 객체로 보았다
- else 지양에 대한 이유
- 분기를 최소화하자. 분기가 있다는 것은 그 메서드가 많은 역할을 하고 있는 것일 수 있다.
🃏 미션3 - 블랙잭
로또, 출석과 다르게 처음 보는 문제였고, 같은 데일리 조인 돔푸와 페어가 됐다.
블랙잭 미션을 하면서 추상화(추상클래스, 인터페이스)에 대해 많이 공부할 수 있었다. 돔푸는 내가 드라이버일 때 막히는 부분에서 바로 해결책을 알려주기보다는, 내가 스스로 생각할 수 있도록 도와줬다. 그리고 소프트 스킬 측면에서도 돔푸에게 많이 배웠다. 내가 느려서 답답함을 느꼈을 수도 있는데, 절대 부정적인 감정을 내비치지 않았다.
블랙잭 미션을 통해 배운 것은 아래와 같다.
- 추상화를 통해 다형성을 얻는 방법
- 다중 구현(implements)은 유연하지 않을 수 있다.
- IO 테스트하는 법
- 상태 패턴
추가적으로 객체의 책임 분리에 대해 더 깊게 고민할 수 있었던 미션이었다. 너무 현실세계에 집착하기보다는, 관심사에 따라 올바른 역할을 부여하면 된다는 것을 깨달았다. (그래도 어렵긴 하다)
솔직히 블랙잭 미션은 방학 기간동안 꼭 다시 구현해보고 싶다. 돔푸는 너무 자바 고수였고, 나는 항상 설득당했기 때문에, 결과물로 얻은 코드가 내 코드라는 생각이 들지 않는다. 내가 혼자 고민해보고 레벨1동안 배운 내용을 다시 떠올리며 적용해보고 싶다.
이전 미션들에서 리뷰를 무조건적으로 받아들이는 경향이 있다는 리뷰어 피드백을 받은 후, 블랙잭에서는 좀 더 내 의견을 고집해봤다. 이렇게 해보니 내 생각을 더 잘 정리하게될 뿐만 아니라, 자신감이 붙는 것 같았다.
♟️ 미션4 - 장기
다음 미션이 체스일거라고 믿어 의심치 않았기에, 크루들과 짬날때마다 항상 체스를 했었다. 그런데 수업 직전에 갑자기 장기로 바뀌어버려 적잖이 당황했지만, 같은 데일리 조 포라와 함께 페어를 하게 돼서 위안이 됐다.
포라와의 페어 프로그래밍은 차분하지만 웃기게 진행됐다. 매일매일 배꼽 빠지는 이벤트가 생겼었다. 그런데 돔푸와의 페어 프로그래밍 이후 나의 의견을 더 주장해보자! 라는 다짐을 했어서, 내 의견을 좀 고집했던 것 같다.
장기 미션을 통해 배운 것은 아래와 같다.
- 객체지향 5원칙(더 공부해야한다)
- 전략 패턴
- service, DAO의 역할
- JDBC 연결하는 방법
장기 미션에서는 장기 타입을 어떤식으로 관리할건지에 대해 많이 고민했다. 수많은 리팩터링을 했고, 아직 리팩터링중이기 때문에... 만족할만한 결과를 얻지는 못했다.
(리팩터링하고 나서 보충하자)
유강스
유연함의 힘이라는 책을 읽고, 유연성 강화 목표와 실험 계획을 세워서, 연극조끼리 매주 스터디를 했다. 내 유연성 강화 목표는 "도전을 즐기면서 실패를 두려워하지 않는 사람 되기"였다. 실험 계획은 아래와 같다.
1. 7일에 한 번 새로운 것 도전하기(예: 새로운 음식 먹기, 다른 길로 출근하기, 낯선 사람에게 말 걸기)
2. 매주 한 번 주변 사람들과 자신의 실패 경험을 공유 (실패에 대한 두려움을 줄이고, 실패를 학습 도구로 활용하기)
3. 도전 하나를 마치고 나면, 후기 작성하기(걱정에 비해 어땠는지)
결론부터 말하면, 실험계획과 유연성 강화 목표는 달성하지 못했다.
테코톡, 마라톤 등.. 유강스에서 공유할만한 새로운 도전을 하기는 했다. 그런데 유강스를 위해서 한 것이 아니라, 유강스 전부터 계획했던 거라서, 새로운 도전이라고 하기는 어려웠다. 그리고 나에게 도전은 여전히 두렵고 무섭다. 그래서 유강스 목표는 달성하지 못했다.
그래도 유의미한 변화가 생겼다는 것을 레벨 인터뷰에서 느낄 수 있었다. 도전을 돌아보고 개선점을 찾아 성장하려 한다는 점이 달라졌다. 레벨 인터뷰에서 "생각하는 능력이 부족하다"고 느꼈고, 이를 개선하기 위한 방법을 고민하고, 원온원을 신청하기도 했다.
레벨 인터뷰
레벨1 기간동안 배운 것을 정리하고, 이를 기반으로 담당 코치와 크루들에게 질문을 받는, 인터뷰하는 시간을 가졌다. 캘린더에 레벨 인터뷰라고 적혀있는 것을 보고, 레벨1을 회고하나보다~ 라고 생각했는데, 이렇게 본격적인 모의 면접일줄을 몰랐다.
우리 인터뷰 조는 객체지향 5원칙을 공통 주제로 작성하기로 합의했다. 내가 다른 크루들에게 질문을 하기 위해서라도 5원칙에 대해 공부해야 했는데, 질문을 준비하는 과정에서 가장 많이 공부가 된 것 같다.
기록을 해두지 않아서 기억이 가물가물한데, 아래와 같은 질문을 받았다. (다음 인터뷰때는 꼭 녹화나 녹음을 하자..)
- 추상클래스와 인터페이스는 둘다 추상화하는 방법인데, 각각 어떤 경우 사용하는 것이 좋을까?
- 상속과 조합을 각각 어떤 경우 사용하는 것이 좋을까?
- 인터페이스를 작은 단위로 나누는 것이 ISP가 맞을까?
- TDD할 때 커버리지 어느정도가 바람직하다고 보는지?
- 상속에서는 extends, 구현에서는 implements라는 키워드를 사용하는 이유가 무엇일까?
- LSP가 뭔지. 레벨로그에 적은 "하위 클래스가 상위 클래스를 벗어나지 않게 구현한다"에 대한 보충 설명
- (예제 코드) PECS 관련
- (예제 코드) 메이라면 언제 언체크 / 체크 예외를 사용할지?
그런데, 솔직히 여기서 모든 질문에 대해 내 생각을 정확히 말하지 못했다고 생각한다. 책에서 읽었던 내용, 어디서 주워들은 말을 기반으로 내 생각인 것처럼 답변했다. 내가 생각을 안 하면서 공부한다는 것을 깨달았다.
그리고 받았던 피드백은 아래와 같다. (좋은 피드백 남겨주신 조원들 고맙습니다🙇♀️)
📖 기술적 측면 피드백
- 제네릭, PECS 공부하기
- TDD에서 하위 테스트를 완벽히 해도 상위에서 버그가 날 수 있다. 단위 테스트에 대해 더 고민해보기
- 상속과 조합에 대한 확실한 주관이 부족하다. 차이를 조금 더 고민해보고 적용해보기
- 추상 클래스와 인터페이스의 활용에 대하여 잘 이해하고 있다.
- 자바 컬렉션에서 unmodified 의 경우 LSP를 위반했다고 했는데, 왜 LSP를 준수하지 않는지 고민해보기
- 다양한 학습을 하면서 장점을 잘 느끼고 정리한 것 같다.
- 상속을 사용해야 하는 상황에 대해서 본인의 철학이 아직 부족할 때, 학습한 내용을 대신해서 이야기해준 점이 좋았다.
- 가끔 본인의 경험이나 철학이 아닌 책에서 비롯된 학습을 근거로 들 때가 있었는데, 그런 부분에서도 실제적인 경험에서 학습한 것을 덧붙이면 더욱 메타인지를 도와줄 수 있을 것 같다.
💬 말하기 측면 피드백
- 말을 길게 하면 안 좋을수도 있다. 작은 것에 대해 설명하는데도 말을 길게 하는 경향이 있다. (개발쪽에서 관례적으로 사용하는 단어를 잘 알아두자.)
- 질문을 받았을 때 자신이 제대로 이해한것이 맞는지 확인하는 것이 좋았다.
- 자신의 경험을 곁들여 설명하는 부분이 좋았다.
- 상대방의 눈을 마주치고 대답을 하는 점이 좋았다.
- 예시를 들어서 설명하는 기법을 매우 자주 사용해서 전달이 잘 되고, 천천히 조리있게 말하는 편이다.
- 답변에 대해서 최대한 본인의 느낀점을 구체적으로 전달하고자 노력한다.
- 말하면서 계속해서 새로운 예시나 아이디어를 덧붙인다는 생각이 들기도 했다. 더 천천히 혹은 잠시 멈춰서 본인의 의견을 다 정리하고, 두괄식으로 먼저 핵심을 전달하면 더욱 간결해질 수 있을 것 같다.
- 조금 더 본인의 의견에 대해 확신을 주어도 좋을 것 같다. 보통 ‘~같습니다’, ‘지금 제 생각으로 말해보자면’ 와 같이 조금은 확신이 부족해보일 수 있는 표현을 많이 쓰곤 했다.
항상 책을 읽거나 공부하고자 하는 내용과 관련된 블로그 글을 읽으면, 읽고 정리하고 땡이었다. 내 생각으로 정리하려 하지 않았다. 내 생각으로 정리하려면 시간이 오래 걸려서 그랬던 것 같다. 하지만 이렇게 얻은 지식은 불확실한 상태로 머릿속을 둥둥 떠다니기만 한다는 것을 레벨 인터뷰를 통해 알게 되었다.
다른 크루들은 답변에 자신의 생각이 녹아들어 있는데, 나는 그렇지 않다고 느꼈다. 그동안 겉핥기식 공부만 해온 것에 반성했고, 더 깊게 공부하고 생각하는 방법을 찾기 위해 네오에게 원온원을 신청했다.
원온원
레벨1 담당 코치였던 리사에게 원온원을 일찍 신청했던 것이 조금 후회된다. 초반에는 정말 고민도, 생각도 딱히 없었는데, 레벨1 기간 내에 한 번은 해야 한다고 해서 신청했다.
그 당시 가장 큰 고민이 테코톡이었고, 리사로부터 많은 용기를 얻었다. 리사가 조언해준대로 데일리 조원들에게 도움을 요청해 리허설을 했고, 조원들의 피드백으로 좀 더 나은 발표를 할 수 있었다.
그리고 그 외에는 딱히 고민이 없었다. 생각 없이 흘러가는 대로 살다 보니 딱히 큰 고민이 없었고, 리사는 그게 좋은 것일 수 있다고 말해주셨다. 그래서 주변과는 달리 딱히 고민이 없는 나를 이상하게 생각하지 않도록 하며 레벨 1 끝무렵까지 잘 지냈다.
그러다가 레벨 인터뷰 이후 새로운 고민이 생겼고, 레벨 인터뷰 담당 코치였던 네오에게 원온원을 신청했다. 신청 내용은 깊은 공부 하는 방법, 생각하는 능력 기르는 방법 이었다.
네오는 정답을 알려주기보다, 내가 스스로 답을 찾을 수 있게 유도해주셨다.
내가 깊은 공부를 하지 못하는 이유는 흥미를 느끼지 못해서고, 내가 개발에서 흥미를 느끼는 경우는 인정욕구를 충족할 때라는 것을 알게 되었다. 프로젝트를 할 때 기능을 완성시키는 것처럼 뭔가 해냈을 때 만족감을 느끼기 때문이다. 그래서 내가 깊은 학습을 하기 위해 인정 욕구를 충족시키는 학습 방법을 찾아야 했고, 스터디를 하면 좋겠다는 결론이 나왔다.
그런데 원온원 끝나고 정리하는 과정에서 의문이 생겼다. 나는 타인의 평가가 중요한 사람이고, 성과를 내서 인정받고자 하는 사람이다. 그런데 이를 이용해서 학습하려하기보다는, 마인드셋을 뜯어고치는 것이 중요한 것 같다.
그래서 결론은! 레벨2부터는, 다른 사람에게 의존하지 말고 스스로 생각하는 능력을 기르고, 나 자신에게 집중하기 위해 노력하는 것을 목표로 잡을 것이다.
마무리
벌써 레벨1 방학도 끝나간다. 휴식을 정말 많이 취했다. 스프링을 제대로 공부해본 적이 없기 때문에, 스프링에 대한 약간의 불안함도 생긴다.
그래도 어떻게든 되겠지.. 라는 생각으로 열심히 쉬고 있다.
레벨1에서 느낀점을 정리하며 마무리해야겠다 🙂
- 알고리즘, CS는 내년으로 미뤄두고, 우테코 기간동안에는 우테코에서 할 수 있는 것을 하자.
- 인정욕구에 대한 마인드셋을 바꾸자. 내가 성장하는 것에 집중하자.
- 생각이나 감정을 잘 정리해두자. 벌써 기억 안 난다.
- 수료 뒤에 후회 남지 않도록 하자.
'우아한테크코스 7기' 카테고리의 다른 글
[블랙잭 미션] 상태 패턴(State Pattern) 적용하기 (0) | 2025.03.24 |
---|