[회고] 우아한테크코스를 마무리하며 🍃
수료식을 앞두고, 우아한테크코스와 함께한 10개월을 되돌아보고자 회고록을 작성합니다. 🍃
이 글은 개인적인 회고록이 될 수도 있고 우아한테크코스라는 교육 기관을 찬양(?)하는 글이 될 수 있을 것 같아요. 우아한테크코스 교육은 단순한 기술 교육의 의미를 넘어 삶의 가치관과 태도의 변화를 가져왔습니다.
우아한테크코스 교육을 통해 성장한 과정을 정리해보겠습니다.
🚀 기술적인 성장과 소프트 스킬
우아한테크코스는 실력 있는 개발자를 양성하는 교육 기관이라고 흔히 정의됩니다.
우아한테크코스는 기술적으로도 소프트 스킬적으로도 성장할 수 밖에 없는 환경이라고 생각해요. 매주 미션이 주어지고 상호 간 코드 리뷰를 하기 때문에 주도적으로 공부하고 토론하며 더 깊게 공부하는 방법을 배웁니다. 배울 것이 많아 심리적 압박을 느끼기도 하고, 그 와중에 자신이 더 관심 가고 공부하고 싶은 것에 집중하기도 해요.
새로운 기술을 학습하고 공부하는 관점에서 일년 전의 저와 지금의 저는 비교도 할 수 없을 정도로 많이 성장하였어요. 교육을 받고 프로젝트를 진행하며 Java 언어와 Spring Boot 프레임워크를 중심으로 네트워크와 인프라 등 전반적인 서비스 운영에 필요한 기술의 이해도를 높일 수 있었습니다. 또한 수많은 사람들과 토론하고 협업하며 소프트 스킬을 기를 수 있었어요.
🐣 레벨 1 - Java, OOP, CleanCode, UnitTest, TDD
레벨 1에서 Java 언어를 사용해 요구사항에 맞추어 콘솔 기반 어플리케이션을 구현하는 미션을 진행하였습니다.
테스트 코드와 TDD (Test-Driven Developement) 를 경험하고 객체 지향 관점에서 유지보수성 좋은 코드를 작성하기 위해 노력하였습니다.
페어 프로그래밍을 진행하며 메서드 분리와 같은 작은 코드 컨벤션부터 객체의 책임과 같은 객체 설계 등을 논의하였습니다. 실제 현업에 계신 우아한테크코스 선배님들께 코드 리뷰를 받으며 나의 사고 과정을 점검하고 관념이 깨지는 과정에서 작은 성장을 쌓았습니다.
레벨 1 에서 배운 것을 정리하자면 다음과 같습니다.
- 테스트 코드가 중요한 이유
- 객체지향적인 코드로 리팩토링하기 (e.g. 객체에게 메시지를 보내라)
- 함수형 인터페이스, VO, 디자인 패턴, 상속, 일급 컬렉션, 다형성, 스트림 등등 더 나은 설계를 위한 프로그래밍 기법
- 요구사항을 프로그래밍으로 구현하기 위해 문제를 정의하고 유지보수성을 고려해 객체를 설계하는 방법
- 페어 프로그래밍 시 페어와 원활하게 협업하는 방법
- 현업자와의 코드 리뷰를 주고 받으며 코드를 개선하는 방법
이 시기에 읽었던 책은 테스트 주도 개발, 이펙티브 자바, 객체지향의 사실과 오해 등이 있습니다.
개인적으로는 이 시기에 좋은 코드에 대한 욕심이 컸습니다. 설계를 갈아엎는 바람에 며칠 씩 리뷰를 미루었던 기억이 나네요. 이 때를 되돌아보면 함께 성장하는 문화가 어색해서 거의 혼자 해결해나가려고 했던 것 같습니다. 레벨1 마지막 쯤에 질문하고 공유하는 학습 방식이 효율적임을 느꼈어요. 혼자 하려하기보다 서로 질문하는 방식으로 공부했다면 더 넓은 시야를 가질 수 있지 않았을까 아쉬움이 듭니다.
🐥 레벨 2 - SpringBoot, JDBC, JPA, DB, HTTP, Authorization, Third-Party API
레벨 2에서는 콘솔 기반이 아닌 실제 서비스처럼 웹 UI가 주어지고 클라이언트와 상호작용하는 API를 만드는 것이 주요 과제였습니다. 방탈출 웹 서비스 기반으로 단계적으로 여러 요구사항이 주어지고 이에 맞추어 테이블을 설계하고 비즈니스 흐름을 코드로 구현하였습니다.
마찬가지로 현업자 선배님들과 코드 리뷰를 주고 받았으며 페어 프로그래밍으로 진행하였습니다. 콘솔 기반 어플리케이션이었던 레벨1 미션과 다르게 HTTP, 프레임워크, ORM, 데이터베이스, 인증 인가, 서드 파티 연동 등의 개념이 추가되어 갑자기 학습할 내용이 방대해짐을 느꼈습니다. 그래서 대부분의 크루들이 심리적 압박을 느끼고 학습 방법과 집중할 부분에 대해 고민을 나누게 되었습니다.
이 시기에는 모든 걸 학습하기보다 각자 중요하다고 생각하는 것이나 관심 가는 것을 깊게 학습하는 식으로 공부했다고 생각합니다. 저는 Spring이 내부적으로 웹 요청 응답을 처리하는 방식과 JPA와 트랜잭션의 관계를 깊게 학습했습니다. 코드 리뷰에서 파생된 의문을 해결하려고 꼬리를 물다 보니 자연스레 깊은 학습을 하게 되었습니다.
이 시기에는 좁고 깊은 학습과 넓고 얕은 학습 중 어떤 것이 더 효과적인지 한창 토론했었는데, 지금 생각해보면 깊은 학습을 통해 넓게 지식을 확장할 수 있다는 생각이 듭니다. 특정 주제에 대해 파고들다 보면 얽혀있는 개념이 딸려오고 러닝 커브를 겪다보면 어느 순간 전반적인 지식의 수준이 높아지는 경험을 할 수 있었습니다.
레벨 2에서 배운 것을 정리하자면 다음과 같습니다.
- 쏟아지는 학습 목록에서 우선순위를 정해 학습하는 방법
- 공식 문서를 참고해 새로운 기술을 학습하는 방법
- Spring Security 없이 인증 인가 구현하기 (나는 왜 Spring Security를 써왔는가 .. 🙄)
- JPA를 활용한 엔티티 설계와 의존관계 설정
- 올바른 예외 처리와 에러 응답 전달 방식
- Spring 프레임워크에 대한 이해 (Spring MVC, Spring Bean, IoC와 DI, Servlet ..)
- RestClient를 사용해 외부 API를 연동하고 에러 핸들링과 테스트
- 트랜잭션에 대한 이해와 JPA와 관련성 (OSIV, 영속성 컨텍스트, 트랜잭션 전파 .. )
이 시기에 읽은 책은 토비의 스프링, 자바 ORM 표준 JPA 프로그래밍 등이 있습니다.
레벨2 중간에는 Spring MVC와 DispatcherServlet을 주제로 테코톡도 진행하였습니다. 미션이든 테코톡이든 일정에 치여가면서 정신이 하나도 없었지만 그 와중에서 우선순위를 정하고 나만의 효과적인 학습 방식을 찾으려는 노력 덕분에 지속 가능하게 공부하는 힘을 기를 수 있었습니다.
🐤 레벨 3 - 팀 프로젝트, 서비스 개발
팀 빌딩을 시작으로 서비스를 기획하고 개발하는 것이 주요 과제였습니다.
2주 간격의 스프린트를 반복하며 빠르게 MVP를 개발하고 데모하는 과정을 거쳤습니다. 매 스프린트마다 요구사항이 주어졌고 이를 반영하며 서비스를 운영하기 위해 필요한 지식을 학습할 수 있었습니다.
이 기간에는 기술을 깊게 학습하기란 사실상 불가능했고 팀과 논의하여 도출한 요구사항을 빠르게 개발하고 피드백하는 과정을 경험하였습니다.
레벨 3에서 배운 것을 정리하면 다음과 같습니다.
- 새로운 팀에 적응하고 프론트엔드 개발자와 협업하여 기능 구현
- 사용자 인터뷰를 기반으로 사용자 경험을 고려해 서비스 설계하기
- 로깅 프레임워크를 사용해 로깅 시스템 구축하기
- 채팅•알림과 같은 실시간성 서비스 구현하기
- 멀티 스레드 환경에서 동시성을 고려한 프로그래밍
- 일정을 고려해 요구사항을 빠르게 구현하는 것
개인적으로 아쉬웠던 점은 수시로 기술적인 고민에 대해 회고를 작성하지 않은 점입니다. 빠르게 구현하고 다음 기능으로 착수하였기 때문에 퀄리티보다는 돌아가는 쓰레기를 만들었고 기술 부채는 쌓여갔습니다. 레벨 1, 2에 배운 내용을 충분히 써먹었다는 생각은 들지 않아서 아쉬웠습니다.
🐓 레벨 4 - 가용성을 고려한 인프라 설계, 성능 최적화, 서비스 고도화
우아한테크코스의 꽃이라고 할 수 있는 레벨 4입니다. 개발한 서비스를 사용자 피드백을 받으며 고도화하는 것이 중요한 과제입니다. 레벨 4에는 팀 프로젝트 뿐만 아니라 팀 미션과 개인 미션이 따로 주어집니다.
팀 미션은 운영 환경의 가용성을 고려해 인프라 아키텍처를 설계하고, 대규모 트래픽을 고려해 성능을 최적화합니다. 개인 미션은 JDBC, WAS, MVC 프레임워크 등을 직접 구현해볼 수 있습니다.
서비스 고도화와 팀 미션, 개인 미션이 함께 주어지는 상황이기 때문에 우아한테크코스 통틀어 가장 바쁘고 힘든 시기였습니다. 역시 우선순위를 정해서 중요하다고 생각하는 부분에 시간을 쏟을 수 밖에 없었고, 저의 경우 사용자 경험을 고려해 서비스를 개선하는 것에 초점을 두었습니다. 그 외에도 팀 미션으로 주어진 미션을 수행하며, 현업의 운영 환경에서 해볼 수 있는 고민을 하고 서비스에 적용하였습니다.
레벨 4에서 배운 것을 정리하면 다음과 같습니다.
- 서비스 상용화를 목표로 서비스를 고도화하는 경험
- 외부 인증 서버를 연동하여 서비스 인증 기능 구현
- 사용자 경험을 고려해 서비스 재가입 유도 로직 개발
- 데이터베이스 인덱스를 사용한 쿼리 최적화
- 에플리케이션 매트릭 수집과 모니터링 대시보드 구축
- 성능 향상과 고가용성을 목표로 인프라 아키텍쳐 설계 (데이터베이스 다중화, 서버 다중화, 로드밸런서, 데이터베이스 복제, AZ, 캐시 ..)
- 서비스 개선 활성화를 위한 애자일 프로세스의 필수 조건
이 기간에 읽었던 책은 Real MySQL 1, 2권 입니다.
이 시기에도 마찬가지로 기술적으로 깊게 학습하지 못했던 것이 아쉬웠습니다. 우선 빠르게 적용하고 이후에 학습했던 탓에 기록이 많이 남아있지 않았습니다. 다시 레벨 4를 한다면 매일 TIL을 작성하며 간단한 트러블 슈팅이라도 기록할 것 같습니다.
레벨 4에서는 우리 서비스를 우아한테크코스 내에서 상용화하는 것을 목표로 하였어요. 그러나 모임이라는 도메인 특성 상, 사용자들이 모임을 만들고 참여하고 오프라인으로 만나는 사이클을 경험하도록 하는 것이 쉽지 않았습니다. 슬랙이라는 우아한테크코스 내에 이미 잘 구축되어있는 커뮤니티 서비스가 있던 것도 실패 요인 중 하나라고 생각합니다.
하지만 ’어떻게 하면 사람들이 우리 서비스를 더 쉽게, 재미있게 사용할 수 있을까‘ 라는 고민을 끝없이 하고 다양하게 시도했던 경험이 개발자로서의 역량을 키워주었어요. 이전까지는 기술 학습이나 취업을 목적으로 프로젝트를 했더라면 이번 프로젝트에서는 정말 사용자에게 유의미한 서비스를 제공하기 위해 노력했기 때문입니다.
이 과정에서 개발자로서의 가치관과 동기를 발견할 수 있었어요. 이 부분에 대해서는 나중에 자세히 이야기해보겠습니다.
🕊️레벨 5 - 취업 준비
레벨 5는 취업 준비를 위해 면접 스터디를 하고 프로젝트 기간동안 깊게 학습하지 못했던 개념들을 돌아보는 시간을 가졌습니다. 모우다 서비스는 각자의 사정으로 더 이상의 운영은 중단되었습니다. 🥺 처음에는 속상하고 아쉬웠지만 이제는 회사에서 일하면서 실제 서비스를 운영하자는 생각으로 열심히 공부하였습니다.
우아한테크코스와 관련된 내용은 아니기 때문에 자세한 내용은 생략하겠습니다.
🍀 가치관과 태도의 변화
우아한테크코스에서 얻은 가장 큰 변화는 타인과의 비교보다 내가 원하는 것을 쫓는 마음가짐입니다.
대부분의 한국인은 경쟁과 비교에 익숙해져 있습니다. 저도 우아한테크코스에 오기 전에 다른 사람들의 성과와 저를 비교하며 부족한 저를 채찍질했습니다. 우아한테크코스에서 유연성 강화를 키워드로 올바른 마인드셋에 대해 공부하고 크루들과 토론하며 점점 변화하는 제 자신을 발견할 수 있었습니다.
💘 성과 증명 마인드셋에서 학습 마인드셋으로
2월 28일, 왼손이 유연성 강화 체험활동이라는 키워드로 소프트 스킬 강의를 시작하였습니다. 내가 가장 고통을 느끼는 순간을 떠올리고 이를 개선하기 위한 목표를 세우고 크루들과 스터디를 하는 활동이었습니다.
저는 (딱히 큰 문제라고 생각하지 않았지만) 조바심이 저의 가장 유연하지 않은 부분이라고 생각하고 이를 개선하는 것을 목표로 스터디를 시작하였습니다.
처음에는 스터디가 큰 도움이 된다고 생각하지 않았습니다. 저는 스스로 채찍질하는 것이 빠르게 성장할 수 있는 방법이라고 생각했기 때문에 과정이 괴로울지라도 견뎌야한다고 생각했기 때문입니다. 타인의 비교로 저를 깎아내리는 것은 스스로에게 자극이 된다고 생각했기에 고통을 제거할 필요성을 느끼지 못했습니다.
꽤나 오랜 기간 옳다고 생각해서 고수해온 사고 방식이 틀렸다고 인정하는 것은 쉽지 않았습니다. 그러나 환경의 힘은 강력했습니다. 마인드셋 토론회, 포비와의 수다타임, 유연성 강화 스터디, 코치와의 면담 등의 소프트 스킬 교육을 수강하고 크루들과 대화에서 의문을 제기하며 기존의 관념이 깨지는 과정을 반복하였습니다. 이 경험으로 논리적으로도 마인드셋을 바꿔야할 이유에 대해 납득할 수 있었습니다.
💘 유연함을 실천하기
매주 회고를 작성하고 유연성 강화 스터디를 통해 얻은 인사이트를 글쓰기로 풀어내며 마인드셋을 변화시키고자 많은 노력을 하였습니다. 하지만 한 번에 올바른 마인드셋을 가진 사람이 되는 것은 아니었습니다. 프로젝트가 시작하고 여러 번 유연하지 못한 스스로의 모습을 마주했습니다. 여전히 다른 사람들과의 비교로 불안해했고 겉치레에 신경을 썼습니다.
이러한 저의 모습은 팀 프로젝트 과정에서 팀원 간의 협업에서 미묘하게 어긋나는 요인이 되었습니다. 혼자 성과를 쌓으려는 태도는 협업에 큰 도움이 되지 못하였습니다. 유연하지 못한 저의 모습이 부끄러웠고 팀원들에게 편안하고 따뜻한 사람이 되고 싶었습니다. 그리고 개인적인 성과보다는 우리 팀이 정말 중요하다고 생각하는 것에 집중하고 기여하고 싶었습니다.
팀원들의 피드백과 자아성찰을 토대로 스스로를 개선하기를 반복하였습니다. 매일 크루들과 얼굴을 마주보고 소통할 수 있는 환경은 피드백을 반영하고 스스로를 객관화하는 것에 많은 도움이 되었습니다. 어려움을 겪고 방황할 때 코치님들이 주신 조언 덕분에 길을 찾기도 하였습니다.
두서 없이 적었지만 여러 시행착오를 겪은 후 저를 오래 봐왔던 브라운과 팀원들에게 유연해졌다는 피드백을 받을 수 있었습니다. 저도 스스로 많이 유연해짐을 느꼈는데, 그 이유는 다음과 같습니다.
- '나'가 아닌 '우리'의 대화를 할 수 있다. 개인적인 사고에서 팀적인 사고를 하게 되었고 협업하고 싶은 팀원이 되기 위해 노력한다.
- 다른 사람들과 비교하여 기술적인 성장만을 갈망하는 것이 아닌, 정말 중요하다고 생각하는 가치와 공감하는 목표를 위해 최선을 다한다.
아직도 스스로가 올바른 마인드셋을 장착했다고 확언할 수는 없을 것 같습니다. 하지만 적어도 우아한테크코스에서 그 시작을 할 수 있었고 앞으로도 이러한 방향으로 지속 가능하게 성장할 수 있음을 알게 되었습니다.
스스로를 갉아먹는 방법으로 성장하던 저에게 이러한 방향성의 변화는 정말 가치 있다고 느꼈습니다. 또한 이 과정에서 개발자로서의 목표와 중요한 가치, 원동력을 발견할 수 있었어요.
💘 개발자로서의 목표와 중요한 가치
원래 꾸준히 공부할 수 있는 저의 원동력은 다른 사람들의 비교로 느껴지는 결핍이었습니다. 물론 그게 다는 아니고 ..🙄 트러블 슈팅을 해결하는 그런 성취감도 있긴 했지만 전반적인 개발의 목적은 취업과 불안감 해소였습니다.
레벨 1, 2 동안 마인드셋 공부를 하며 이전의 관념을 개선할 필요가 있음을 깨달았습니다. 이를 글쓰기로도 작성하였지만 이후 텅 비어버린 원동력을 무엇으로 채울 지를 고민하는 것이 다음 과제였습니다.
팀 프로젝트 과정을 거치며 개발자로서 이런 요소들보다 더 중요시할 가치가 무엇인지 고민하고 나만의 정답을 찾게 되었습니다. 개발자로서 중요한 가치는 사용자이며 저는 미래에 사회적으로 도움이 필요한 사람들의 문제를 해결하는 개발자가 되는 것이 목표가 되었습니다.
이는 팀 프로젝트에서 사용자를 끌어모으기 위해 고민하고 적용한 과정에서 비롯되었습니다. 사용자 입장에서 우리 서비스가 유용하기 위해서 어떻게 헤야할까, 라는 고민은 자연스레 사용자를 가장 중요한 가치로 자리잡게 하였습니다. 결국에 서비스가 제공하는 가치는 사용자의 삶을 더 편리하게 혹은 행복하게 만드는 것이라고 생각했습니다. 최종 목적지인 사용자를 만족시키고 최상의 경험을 제공하는 것이 개발자로서의 의무라고 생각했고, 이를 위해 학습하고 성장할 필요가 있음을 느꼈습니다.
중요한 가치가 뚜렷해지고 목표가 생기니 개발의 원동력은 명확해졌습니다.
밤새 공부하고 개발하는 것이 힘들긴 했어도 고통스럽지 않고 오히려 재밌었던 이유는 이루고 싶은 더 큰 가치가 있었기 때문입니다. 만약 다른 사람과의 비교와 취업에 대한 불안감에 했던 공부라면 그 과정이 아주 고통스러웠을 것 같습니다.
사용자의 입장을 고민하고 주도적으로 의견을 내어 서비스를 개선하는 과정에서 언제 즐거움을 느끼는 지, 학습의 원동력은 무엇인지, 어떤 삶을 살아야할 지에 대해 깨달을 수 있었습니다.
저는 공감되는 목표를 가지고, 주도성을 발휘할 수 있고, 사용자의 관점에서 사고하여 문제를 개선할 수 있는 환경에서 재미를 느끼고 기꺼이 모든 것을 쏟을 수 있다는 것을 알게 되었습니다. 이는 회사를 선택하는 기준이 되기도 하였습니다. 공감되는 목표 없이, 사용자 피드백 없이, 그냥 주어진 것만을 하는 회사는 행복할 것이라고 생각하지 않습니다.
아마 이러한 명확성을 가지고 꾸준히 성장하다보면 미래에는 정말 가치있는 것을 제공하는 서비스를 만들게 될지도 모릅니다. 뭐가 되었든 중요한 것은 제가 진정으로 원하는 것을 쫓으며 원하는 삶을 사는 것입니다. 이러한 깨달음은 이전과 비교할 수 없을 정도로 큰 시너지를 주고 지속 가능하게 성장하는 원동력이 되었습니다.
우아한테크코스는 캡틴 포비의 교육 철학을 기반으로 설립되었습니다. 코치님들도 이러한 교육 철학과 얼라인 되어있고 전반적으로 진행되는 교육도 마찬가지입니다. 선발된 교육생도 모두가 그럴 순 없겠지만 전반적으로 경쟁과 비교보다는 주도적 학습과 공유에 열려 있는 크루들이 많았습니다.
제가 가치관의 변화를 겪을 수 있었던 것은 이러한 환경에서 좋은 영향을 지속적으로 받아왔기 때문이라고 생각합니다. 단기간 부트캠프였다면 저는 금방 이전과 같은 모습으로 돌아갔을 것입니다. 끝없이 저를 깎아내리며 성과를 갈망하는 삶은 정말 끔찍했을 것 같아요. 그래서 개발자로서 혹은 한 명의 사람으로서 더욱 행복한 삶을 살도록 교육해준 우아한테크코스에게 무한 감사하게 되는 것 같습니다.
기술은 거들 뿐, 제가 우아한테크코스에서 겪은 가장 중요한 것은 가치관과 삶의 태도의 변화라고 생각합니다. 이러한 배움을 잊지 않고 사회에 나가 지속적으로 제가 원하는 것을 쫓으며 성장하길 바라는 마음입니다.