본문 바로가기

우아한 테크코스

[우아한 테크코스] 프리코스 후기

 지난 3월 우아한 테크코스 1차 코딩테스트를 치르고 2차 테스트 전까지 3주간 진행되는 프리코스에 참여하게 되었습니다. 짧은 시간이었지만 배웠던 것들을 한번 정리해보려고, 그리고 혹시 테크코스를 준비하고 싶으시거나 궁금해하시는 분들께 조금이나마 도움이 되었으면 하는 마음에 포스팅을 작성합니다. 일단 결론부터 읽고 싶으신 분들께서는 페이지 하단으로 내려가셔서 세줄 요약! 부터 보시면 될거같습니다.

 

※ 우아한 테크코스가 무엇인지 알고싶으시면 이쪽으로 : https://woowacourse.github.io/

 

프리코스 진행 과정

  프리코스는 3주 동안 project-driven으로 진행되었습니다. 메일을 통해 매 주 금요일마다 해결해야하는 과제가 하나씩 나오고, 한 주 동안 과제를 해결하면서 필요한 것들을 스스로 채워 나가는 방식이었습니다. 총 세 번의 과제가 나왔고, 모두 java로만 해결해야 했습니다. 사실 저는 java를 1도 몰라서 코딩테스트 합격 발표가 난 직후부터 미친듯이 자바를 공부하기 시작했는데, 다행히 첫 주차 과제가 그렇게 어렵지는 않아 진행하는데 큰 무리가 있지는 않았습니다과제를 진행하면서 단순히 주어진 기능을 구현하는 일 외에도 생각해야 될 점들이 참 많았습니다. 핵심은 좋은 코드를 작성하려면 어떻게 해야 하는가!’ 였습니다. 이 부분은 뒤에서 조금 더 말씀드리도록 하겠습니다.

 

과제가 어떻게 나왔는가?

  구체적으로 어떤 과제들이 나왔는지는 언급하지 않는 편이 좋을 것 같습니다. 주로 간단한 게임을 구현하는 과제였는데, 과제와 과제 수행을 위한 가이드라인이 메일을 통해 매주 하나씩 발송되었습니다. 과제는 크게 기능 요구사항, 프로그래밍 요구사항, 미션 저장 및 진행 요구사항의 세 가지 요구사항으로 구성되어 있었습니다. 기능 요구사항에서는 만들어야 하는 프로그램이 어떤 기능들을 가지고 있어야 하는지 명시되어 있고, 실행 결과에 대한 예시가 나와있습니다. 프로그래밍 요구사항에서는 코딩할 때 지켜야 할 자바 코드 컨벤션과 더불어 몇 가지 제약사항들이 명시되어 있습니다. Indent depth나 메소드 길이에 제한을 두는 등의 제약이 있었는데, 깔끔하고 읽기 좋은 코드를 짜기 위한 일종의 가이드라인이 되었습니다. 미션 저장 및 진행 요구사항에서는 git을 이용한 과제 코드 관리 및 제출, 기능 목록 작성, 기능단위 커밋 등 코드 이력 관리와 관련된 기초적인 내용들이 언급되어 있습니다. Git을 사용하는에 익숙하지 않은 참가자들을 위해 기본적인 내용부터 상세히 설명되어 있어서 커밋을 찍어가며 개발해본 경험이 드문 초보 개발자들이 git과 친해지는 데 많은 도움을 줍니다.

 

과제 코드 리뷰는 어떻게 진행되었는가?

  한 주의 과제를 끝마치면 pull request를 통해 깃허브에 과제를 제출하게 됩니다. 그러면 우아한 개발자분들께서 모든 지원자들의 코드를 체크하고 피드백을 해주셨습니다. 프리코스에 참여한 지원자들이 상당히 많아서 일일이 개인 리뷰를 해주실 수는 없었지만, 중요한 피드백들을 묶어 메일로 단체 리뷰를 보내주셨습니다. 상당히 신경써 리뷰해주시는 데다가 다른 참가자들의 코드에 대한 피드백도 담겨 있기에, 이 피드백 뭉치는 차주 과제를 진행할 때 정말 주옥같은 프로그래밍 가이드라인이 됩니다. 이렇게 피드백과 다음 과제 요구사항들을 기반으로 다시 새로운 과제를 완수하면 또 피드백과 함께 그 다음주 과제가 나오게 되고, “과제 출제 → 과제 수행 → 과제 제출 → 피드백 → 새로운 과제 출제 → 과제 수행 → ...” 의 프로세스가 반복됩니다. 적다보니 프리코스가 상당히 애자일한 방식으로 진행되었다는 생각이 듭니다. 왜 제가 3주동안 그토록 정신없이 달릴 수 있었는지 방금 이해했습니다.

  앞에서 좋은 코드를 작성하려면 어떻게 해야하는가!’가 과제 진행의 핵심이었다는 이야기를 했습니다. 프리코스에서는 전반적으로 기능이 잘 작동하도록 구현하기보다는 구현한 내용을 다른사람이 보고도 쉽게 이해할 수 있도록, 그리고 쉽게 사용할 수 있도록 코드를 잘 짜기!를 더 중요한 이슈로 다루었던 것 같습니다. 그래서 코드 리뷰에서 설계나 기능 구현을 어떻게 해야 하는지에 대해서는 많이 다루지 않았습니다(사실 프로그래밍 설계와 구현에 정답이 없기도 하고, 이정도는 스스로 생각해서 해결할 수 있다는 전제가 깔려있었던 것 같기도 합니다). 그보다는 코딩 컨벤션, 변수와 함수 이름 짓기, 기능 나누기, 객체가 스스로 일을 하는 것처럼 만들기 등 코드를 다른 사람이 읽고 사용하기 쉽게 작성하도록 하는 데에 리뷰의 초점이 맞춰져 있었습니다잘 작동하는 기능을 구현하는 것은 물론 무척 중요한 문제입니다만, 그 코드를 자기만 알아볼 수 있게 작성한다면 다른 곳에서 유용하게 재사용되기 어렵고, 가치를 지니기 힘듭니다. 코드를 읽기 쉽게 작성하지 못하면 프로그램이 100줄, 200줄만 넘어가도 코드가 상당히 복잡해지는데, 내가 짠 코드도 3년쯤 지나면 더이상 내 코드가 아니게 됩니다. (심지어 혹자는 코드를 세상에 배포한 그 순간부터 자기 코드가 아니라는 이야기를 하기도 합니다.) 그래서 나만 이해할 수 있는 코드는 결국 아무도 사용할 수 없는 코드와 같습니다. 함수와 변수의 이름을 짓는 데에 시간을 많이 쏟아야 하는 이유가 여기에 있습니다. 기능을 만들기 전에 가치를 만들어내는 법부터 배워야 합니다. 이러한 생각들을 바탕으로 코드리뷰가 이루어지지 않았을까, 조심스레 추측해봅니다.

 

프리코스 진행 방식에 대한 소감은?

  개인적으로 이렇게 프로젝트와 과제 위주의 학습방식을 선호하는지라, 저는 프리코스가 무척 좋았습니다. (사실 과제들이 정말정말정말정말 재미있었습니다) 초보 개발자가 도전하기에 과제 난이도도 적당했고, 프로그래밍 요구사항에서의 가이드라인이 있어 지저분한 코드를 조금이나마 정제하는 데에 도움이 많이 됐습니다. '과제를 통한 가이드라인 제시 + 피드백과 리뷰' 위주의 자기주도 학습이 학습하는데 있어 효과가 무척 좋기도 했습니다. 사실 코딩하는 데에 필요한 기본적인 지식들은 워낙 잘 정리된 자료들이 많아 강의를 듣는 것보다 혼자 공부하는게 훨씬 빠릅니다. 그러니 교육자가 좋은 컨텐츠를 무작정 많이 제공하는 것보다, 먹이는 조금씩 던져주면서 학습자가 올바른 방향으로 공부할 수 있도록 도와주는 데에 집중하는 것이 서로에게 훨씬 효율적인 방식이지 않은가! 하는 생각을 가지고 있었는데, 역시나 이렇게 공부하는게 훨씬 집중도가 높았습니다. 가만히 앉아 받아들이는 공부가 아니라 내가 찾아 나서서 하는 공부라 습득 속도도 빨랐고 공부한 내용이 기억에도 오래 남았던 것 같습니다.

 

  프리코스를 진행하면서 가장 좋았던 것은 코드리뷰였습니다. 정말 이런 코드리뷰를 받아볼 기회 잘 없습니다. 코드를 짜면서 찝찝했던 부분들을 귀신같이 다 잡아주셨습니다. 게다가 내가 짠 코드에 대한 리뷰만 들어있는 게 아니라, 다른 사람들이 짠 코드에 대한 리뷰도 다 들어있어서 미처 생각하지 못했던 부분을 깨닫게 되는 경우도 많았습니다. 리뷰 내용도 추상적인 언급에서 그치지 않고 구체적인 예시를 들어가며 방향을 잡아주셔서, ‘읽기 좋은 코드를 작성하려면 코드를 어떻게 짜야하는가?’를 고민하는데에 굉장히 많은 도움이 됐습니다. 이번 프리코스 과제를 하는 데에만 활용할 게 아니라 두고두고 보면서 잘 익혀두고 싶은 내용이 많았습니다. 

 

  프리코스 기간이 참 짧았지만 상당히 많은 내용들을 배우고 공부했습니다. 불과 3주 전까지는 java로 Hello world도 찍을줄 몰랐는데, 이제 java를 이용해 300줄 가량의 간단한 프로그램을 만들 수 있게 되었습니다. 추상적이고 커다란 하나의 기능을 구현하기 위해 체계적으로 기능을 나누고, 기능 단위로 구현하며 코드 이력을 보다 잘 관리할 수 있게 되었습니다. 객체지향적으로 프로그래밍 한다는 것이 어떤 뜻인지 조금 더 깊게 이해하게 되었고, 객체들끼리 서로 메시지를 보내고 데이터를 주고받도록 하려면 어떻게 해야하는지 배웠습니다. 사용자 입력에 대한 유효성 검사를 어떻게 해야할지 고민하며 예외 처리 방식에 대해 공부했습니다. java collection과 stream 기능을 익히고 사용해보았고, 사용했을 때 어떤 장점을 가지고 있는지 깨달았습니다. 배웠던 내용들을 잘 정리해두면 좋은 소양이 될 것 같습니다.

 

테크코스 지원을 미리 조금 준비하고 싶다면?

  프로그래밍 공부를 잘 하고계시다면 따로 준비해야될 부분이 있지는 않을 것 같습니다. 다음번에는 테크코스가 어떻게 진행될지 잘 모르겠지만 확실히 java를 잘 익혀두면 시간적인 부분에 있어서 유리하기는 할 것 같습니다. 하지만 어떤 언어를 주로 사용했건간에제가 느끼기에 조금 더 중요했던 것은 '좋은 코드를 작성하려고 노력해 왔는가?' 였습니다. '변수가 어떤 데이터를 가지고 있는지, 함수가 어떤 기능을 가지고 있는지 그 이름만 보고도 알 수 있는가? 함수가 하나의 기능만 담당하여 기능에 모호함이 없는가? 해결하고자 하는 상황을 코드로 어떻게 표현해야 명료하고 이해하기 쉽게 할 수 있는가? 누구든 이 코드를 다시 사용할 수 있게 하려면 어떻게 만들어야 하는가?' 등을 평소에 고민하고, 찾아보고, 연습해보시면 도움이 많이 될 것 같습니다.

 

 개인적으로는 프로그래밍과 관련된 책을 조금 더 찾아서 미리 읽어볼걸 하는 아쉬움이 많습니다. 로버트 마틴의 『클린 코드(Clean Code)』, 데이브 토마스와 앤디 헌트의 『실용주의 프로그래머(The Pragmatic Programmer)』, 켄트 백의 『Test Driven Development』 와 같은 책들이 테크코스 뿐만 아니라 프로그래밍 전반의 공부에 있어서 큰 도움이 될거라고 생각합니다. 올해 안에 이 책 세권은 읽고 넘어가야겠다는 생각을 합니다. 

 

 

마무리하며

  프리코스에서 진행한 내용들을 간략하게 정리해 봤습니다. 5월부터 시작되는 본 코스도 프리코스와 비슷한 방식으로 진행되지 않을까 싶습니다. 프리코스를 진행하는 동안 몹시도 즐거웠기에 앞으로 이렇게 8개월을 더 공부할 수 있으면 더할 나위 없이 좋겠다는 생각이 듭니다. 좋은 결과가 있기를 소망합니다.

 

세줄 요약!

1. 프리코스는 project driven, 자기주도적인 학습 방식으로 진행됩니다.

2. 좋은 코드를 짜는 것, 너무나 중요합니다.

3. 코스 정말 재미있고 배울것들 너무 많습니다. 그리고 어디 가서 이렇게 코드리뷰 받아볼 수 있는 기회 별로 없습니다. 

  시간이 허락한다면 무조건 지원하세요.

 

'우아한 테크코스' 카테고리의 다른 글

우아한 테크코스 회고  (0) 2019.09.15