우아한테크코스 : 항해의 시작
안녕하세요. 교육코스개발팀 이원미입니다.
많은 분들이 알고 계시다시피, 우아한형제들에서는 개발자 양성 교육 ‘우아한테크코스(이하, 우테코)’ 를 진행하고 있습니다. 빠르게 흘러가는 시간 덕인지, 우테코를 시작한 지 어느덧 두 달이 되어 가네요 : ) 총 46명의 크루 (우테코 교육생들을 크루라고 부릅니다.) 와 함께 저희 팀도 무럭무럭 성장하고 있음을 느끼고 있는 요즘입니다.
독특하게도 우테코는 웹 백엔드 교육뿐만 아니라, 개발자라면 모두가 어려워한다는 ‘글쓰기’ 또한 하나의 교육 주제로 다루고 있습니다. 개발자 교육을 한다던 우테코가 뜬금없이 글쓰기 교육까지 시작한 계기는 다음과 같습니다.
오늘날 자신의 생각과 감정을 글로 써 내려가는 사람은 많지 않고, 대부분의 사람들에게 글쓰기는 두려움의 대상이라 해도 과언이 아니다. 우테코 크루들에게 글을 잘 쓰는 방법을 전문적으로 가르칠 수는 없지만, 적어도 글을 쓰는 것에 자신감 만큼은 갖게 하자.
우테코는 크게 4개의 레벨로 교육을 진행합니다. 글쓰기 교육의 학습목표는 레벨 당 동일한 주제를 가지고 글 한 편을 완성하도록 하는 것입니다. 크루들에게 동일하게 주어진 첫 번째 글쓰기 주제는 우아한테크코스 한 달 생활기입니다.
46명의 크루 모두 상호 간의 피드백을 통해 글을 고쳐나가며 한 편의 글을 완성하였고, 그중 자체 투표로 선발된 세 편의 글을 공개합니다.
각각의 글 속에서, 글을 쓴 크루의 생각과 감정을 고스란히 느껴주시길 바랍니다.
러너덕(김덕수)의 글
그래서 뭘 배웠어?
“그래서 뭘 배웠어?”
얼마 전 우아한 테크코스에 대해 지인에게 이야기하던 도중 받았던 질문이다. 처음에는 신이 나서 운을 떼기 시작했다. 어떤 이야기부터 해야 할까? TDD를 소개할까? 나약한 프로그래머들에게 TDD가 주는 믿음과 용기에 대해 이야기 해줘야겠다. 객체 지향 설계도 많이 배우지 않았나? 설계에는 정답이 없고, 스스로의 답을 찾아가는 과정이라는 걸 알려줘야겠다. 그리고 자기주도 학습과 관련된 이야기도 빠질 수 없지. 프로그래밍은 끝없는 수련이고, 장인 정신이고, 철학이다····· 설명이 점점 장황해지며 산으로 가기 시작했다. 그러다 급기야는 테크코스의 아름답고 환경 친화적인 라운지에 대해 설명하기 시작했는데, 이 즈음 되어서 그 친구는 내가 잘 꾸며 놓은 신전에서 기묘한 종교철학 같은 것을 배운다고 생각하기 시작했다. 참 난감했다. ‘프로그래밍 기본에 대해 배운다’고만 이야기하기에는 뭔가 아쉬웠고, 그래서 조금 더 설명을 하자니 뭘 배우는지 간단하게 정리하기 어려웠다. 지식은 복잡한 내용들을 단순하게 재구성할 수 있어야 비로소 스스로의 것이 된다더라. 나는 이것저것 머리에 집어넣기만 했지 무엇을 배웠는지 아직 잘 모르는 것 같았다.
한 달 동안 테크코스에서 뭘 배웠을까? 지난 수업들을 되짚어가며 한참을 고민했다. 우리는 TDD를 배웠다. 페어프로그래밍을 했다. 코드리뷰를 받았다. 리펙토링을 했다. 객체지향 설계에 대해 공부했다. 이렇게 쭉 놓고 보니 그제야 정리가 조금 된다. 우리는 한 달간 품질이 좋은 코드를 작성하기 위해 무엇을 어떻게 연습해야 하는지 배웠다. 연습은 오로지 나의 몫이다. 아래에서는 코스에서 배운 연습 방법들 중에 몇 가지를 소개해보려고 한다. TDD와 코드 리뷰, 페어 프로그래밍을 연습해 보면서 생각했던 것들을 간단히 정리했다.
단위 테스트와 테스트 주도 개발 (TDD; Test Driven Development)
『클린코드』의 저자 로버트 C. 마틴은 코드 품질에 대해 이렇게 이야기한다.
“테스트 케이스가 없는 코드는 깨끗한 코드가 아니다. 아무리 코드가 우아해도, 아무리 가독성이 높아도, 테스트 케이스가 없으면 깨끗하지 않다.”
테스트 케이스는 프로덕션 코드가 제대로 동작하는지 검증하기 위한 코드인데, 코드를 깨끗하게 만드는 것과 무슨 관련이 있을까? 물론 큰 관련이 있다. 첫째, 테스트 케이스는 프로덕션 코드가 어떻게 동작해야 하는지 알려준다. 훗날 코드를 사용하거나 수정할 누군가에게 요구사항을 명시할 수 있게 된다. 둘째, 테스트 케이스는 프로그래머가 보다 안정감을 갖고 리펙토링할 수 있게 해준다. 그러면 설계를 보다 자유롭게 변경할 수도 있고, 당장은 좋지 못한 코드에 깨끗해질 수 있는 가능성이 열리기도 한다. 이런 이유에서 깨끗하고 품질 좋은 코드를 만들기 위해서는 테스트 케이스를 반드시 작성해야 한다.
TDD는 테스트 케이스를 어떻게 작성할 것인가에 대한 개발 방법론이다. 실제 코드를 짜기 전에 테스트부터 작성할 것을 요구하는 것이 특징이다. 그런데 막상 TDD를 연습하려면 어디서부터 테스트를 시작해야 할지 몰라 난감할 때가 많다. 이 때 도움이 많이 되었던 것이 ‘그냥 막 해보고 날리기’였다. 설계를 완벽하게 하고 시작하지 말고, 테스트해볼 수 있는 기능부터 아무거나 만들어본다. 그러다가 설계가 마음에 들지 않으면 다 지우고 처음부터 다시 시작한다. 처음에는 열심히 작성한 코드를 버리기 쉽지 않은데, 도메인에 대해 학습하는데 드는 기회비용이라고 생각하면 마음 편하게 지워버릴 수 있다. 지우고 만들기를 반복하며 빠르게 테스트 사이클을 줄여가는 것이 TDD 연습에 상당히 효과적인 방법일 수 있다.
코드 리뷰
코스에서는 매주 주어지는 과제가 있고, 과제를 제출하면 작성한 코드에 대한 피드백을 받는다. 현업에 계신 개발자분들이 리뷰어로 활동하며 리뷰해 주시는데, 이 피드백으로부터 배우는 것들이 굉장히 많다. 객체지향적인 설계와 좋은 코드에 대해 정말 많이 배운다. 하나하나 주옥같은 피드백이고, 텍스트에서 쉽게 배울 수 없는 것들이다. 여기에 더해서 배울 수 있는 게 하나 더 있다. 바로 리뷰어들의 코드 리뷰 방식이다.
요새 괜찮은 기업에서는 코드 리뷰를 많이 한다. 신입 개발자들도 코드리뷰를 한다. 그런데 리뷰를 해본 적도 받아본 적도 없으면 코드 리뷰를 어떻게 해야 하는지 당연히 모른다. 익숙해지기 전까지는 다른 사람의 코드를 읽고 이해하는 것만 해도 생각보다 시간이 많이 걸리는데, 거기에 더해 피드백까지 할 수 있을까? 어려운 일이다. 리뷰도 미리 연습해야 한다. 리뷰어들이 매 과제마다 전달해주는 피드백은 어떻게 코드 리뷰를 연습해야 하는지에 대한 힌트가 된다. 주로 어떤 내용을 리뷰하는지, 피드백을 어떻게 효과적으로 명시하고 전달하고 있는지, 어떤 용어와 표현들을 사용하는지 등을 살펴보면 배울 것이 참 많다. 이렇게 얻은 힌트를 바탕으로 실제로 코드리뷰를 연습해볼 수도 있다. 잘 찾아보면 주변에 코드리뷰를 받고 싶어 하는 사람들이 꽤 있다. 적당한 코드리뷰 마루타를 찾아 스터디를 제안해보는 것도 좋은 방법이다. 생각보다 서로에게 도움이 많이 된다.
페어 프로그래밍
‘러버덕 디버깅’이라는 말이 있다. 프로그래머가 코딩 중 막힐 때 누군가에게(심지어 비전문가나 고무 오리 같은 무생물일지라도) 설명을 하다 보면 스스로 해결책을 찾는 경우가 많다는 데서 유래한 말이다. 페어 프로그래밍은 러버덕 디버깅의 연장선상에 있는 프로그래밍 방식이다. 과제를 해결하기 위해 두 명이 짝을 맺고 하나의 키보드로 번갈아 코딩하며 과제를 진행한다. 이렇게 함께 코드를 작성하면서 왜 이렇게 코드를 짜야 하는지 끊임없이 의견을 교환하고 합의해 나가야 한다. 페어 프로그래밍을 하더라도 반드시 좋은 코드가 나오지는 않는다. 하지만 상대방에게 코드를 작성하는 의도를 계속 밝혀야 하기 때문에 좋은 코드를 작성하는 연습을 하는 데에 큰 도움이 된다. 로버트 C. 마틴은 『클린 코드』에서 “코드를 읽는 사람에게 프로그래머가 단호하다는 인상을 줘야 한다”고 이야기한다. 코드는 의도가 분명하고 명확해야 한다는 뜻이다. 페어 프로그래밍을 할 때 이런 부분에 초점을 두고 연습하는 것도 무척 의미 있게 시간을 보내는 방법일 것 같다.
마무리하며
코스에서 한 달간 배운 연습 방법들을 살펴봤다. 어떤 프로그래머가 이야기하기를, 좋은 품질의 코드는 하늘에서 뚝 떨어진 위대한 방법론이 아니라 사심 없이 기울이는 무수한 관심으로부터 나온다고 한다. 테크코스에서 배운 것들은 방법론이다. 결국 좋은 품질의 코드를 만들어내려면 내가 의식적으로 연습하는 수밖에 없다. 배운 것들을 잘 갈고 닦아 좋은 개발자가 될 수 있기를 바란다.
마틴(전성모)의 글
우아한테크코스 한달 생활기
단체 생활을 하다 보면 주변 사람들의 영향을 받는다.
예를 들어 건강식품을 잘 챙겨 먹는 사람이 있으면, 건강식품에 대한 정보를 쉽게 얻게 되고 관심이 생긴다. 자전거 타는 것을 좋아하는 사람이 있으면, 자전거에 대한 정보를 얻을 수 있고 관심이 생긴다.
이런 생각을 하다 보니 나는 내 동료들에게 어떤 영향을 미친 사람이었을까? 하는 게 궁금했다. 그래서 우아한테크코스 한 달 생활기는 이 질문에 대한 답을 찾는 글이다. 이 질문에 대한 답을 생각하다 보면 한 달 동안 어떤 생활을 했는지 나올 테니까.
루터회관 14층에 오기까지
평생 해야 할 일이라면 조금이라도 내가 재미있어하는 일을 해야 하지 않을까? 전 직장을 도망치듯 그만두고 우아한테크코스에 지원하며 나 자신을 설득한 말이다. 큰 동기부여가 있지는 않았지만 ‘한 번 사는 인생 마음 가는 대로 살아보자’라는 생각으로 앞으로의 진로를 바꿨다.
근거 없는 자신감이 넘쳤다. 백엔드 개발은 물론 자바로 개발해본 경험도 전혀 없었지만 자신감이 넘쳤다. 뭘 하더라도 잘 해낼 수 있을 것 같았고 새로운 도전이지만 잘 해낼 것이라는 자신감이 있었다. 우아한테크코스에 지원했고, 합격해서 처음 루터회관 14층에 왔을 때는 마냥 기뻤다. 보이는 장소도 아름다웠고 해야 하는 일들이 즐거웠다. 앞으로 벌어질 일은 예상할 수 없지만 이전과 비교해 나아질 거라는 희망이 있었다.
한달 동안의 생활
어떤 희망이 있었을까? 아주 단순하게는
전에 하던 일보다는 재밌겠지.
학습 측면에서는 주변에 50여 명의 개발자들이 있으니 자연스럽게 대화를 하다가도 기술적인 내용을 이야기할 수 있겠지.
나와 관심사가 비슷한 사람들과 대화를 나눌 수 있겠다.
라는 희망이 있었다. 그 희망은 현실이 되었고, 나의 기대보다 더 좋은 점이 많았다.
- 어려운 질문을 하면 질문을 받은 사람도 함께 생각을 해주었다.
- 혼자 끙끙 앓으며 공부할 어려운 내용을 크루들과 함께 고민한다.
- 혼자 생각했다면 도달하지 못할 단계까지 생각과 대화가 깊어지기도 한다.
이런 대화와 궁금증이 자연스럽게 이루어질 수 있게 환경을 만들어 준 우아한테크코스가 굉장히 좋았다.
한 달 조금 넘게 생활하면서 특히 좋았던 점은 나 자신이 성장하는 재미를 느낄 수 있도록 환경이 조성되어 있는 것이었다. 목표를 잡아주고 요령껏 쉽게 갈 수 있는 길을 막아놓으니 어떻게 하면 더 좋은 코드로 낼 수 있을까 하는 생각을 스스로 하게 하더라.
- 더 예쁘게 코드를 짜고 싶다.
- 기계만 이해하는 코드가 아닌 사람이 이해하는 코드를 짜고 싶다.
- 한두 번 훈련을 하고 보니 할 때마다 욕심이 더 생겼다.
이런 훈련을 거치고 우아한테크코스에서의 한 달간을 뒤돌아보면 나는 주변 크루들로부터 많은 영향을 받았다.
자바 문법, 객체 지향적인 설계, MVC Pattern, DB Connection 관리 등 미션 전반적으로도 도움을 많이 받았다. 성장하려고 항상 노력하고 궁금한 점이 생기면 그 부분만 해결하는 것이 아닌 더 깊게 파고들어 만족스러운 결과를 내려는 치열함, 끈질김도 나에게 큰 영향을 주었다. 말만 열정적이었고 열심히 하겠다, 노력하겠다는 허황된 말들로 점철된 나의 태도를 바꿔 주었다. 크루들의 열정은 반복적인 일상에 지쳐 식어있던 나의 열정도 다시 불이 붙도록 도와주었다.
그렇다면 나는 주변 크루들에게 어떤 영향을 주었을까? 답변이 빠르게 떠오르지 않았다.
다른 크루로부터 얻어 간 것은 많지만 내가 도와줄 수 있는 게 없다고 느꼈다. 처음에 느꼈던 근거 없는 자신감은 점점 떨어졌지만 그래도 앞으로 좋아질 것만 남았다는 긍정적인 생각이 있었다.
한 달 동안 생활하면서 마음 가는 대로, 하고 싶은 대로 행동했다. 이게 다른 크루들에게 어떤 영향을 주었을지는 잘 떠오르지 않지만 앞으로의 목표가 하나 생겼다.
그것은 다른 크루들에게 그들이 모르는 것을 알려주고 관심이 생기게 해주는 것이다. 맨 처음 말했듯이 나의 영향으로 그 기술에 대한 관심이 생기도록 하고 싶다. 계획이나 일정을 세운다면 이 과정이 끝날 때까지가 작은 목표가 될 것 같다.
한 달 동안의 생활과 나의 행동에 대한 결과가 만족스럽지는 않다. 매주 미션을 제출하고 마무리하는 시간제한이 있었고, 그 압박감에 성장을 미뤄버렸던 적이 많았던 것 같다. 지금은 성장을 미룰 때가 아니라고 생각하면서도 생각과 행동이 달랐다. 하지만 아직 지금까지 지낸 시간보다 훨씬 더 많은 시간이 남아있다.
이 시간이 모두 지나고 다시 한번 이 질문을 던지고 싶다. ‘나는 내 동료들에게 어떤 영향을 미친 사람일까?’ 그때는 자신 있게 내가 하고 싶었던 대답을 할 수 있기를 바란다.
슬로스(노수진)의 글
우아한테크코스 한 달 생활기
‘우아한테크코스에서의 한 달 생활기’를 주제로 글을 쓰라는 미션을 받고는 무엇을 써야 할지, 누구를 대상으로 글을 써야 할지 정하기 어려웠다. 매일, 같이 공부하는 크루들과 공유할 글을 써야 할지, 우아한테크코스 밖에 있는 사람에게 우아한테크코스에서의 생활을 소개하는 글을 써야 할지. 우아한테크코스의 크루들을 독자로 상정하고 글을 쓰자니 이미 매일 아침 서로의 생각과 감정을 공유하고 있고 서로가 무엇을 하고 있는지 알고 있다. 우아한테크코스의 밖에 있는 사람들에게 이곳에서 무엇을 하고 어떤 것을 배우는지 소개하는 것에는 딱히 관심이 생기지 않았다.
결국 나밖에 남지 않았다. 내가 읽을 글을 쓰기로 했다. 우아한테크코스에서 3달을 지낸 뒤의 내가 읽을 글을, 취업해서 일하다가 문득 공부할 때는 무슨 생각을 했는지 궁금해할 내가 읽을 글을 쓰자고 생각했다. 내가 아무리 열심히 글을 쓴다 한들 남들은 나 자신보다 열심히 읽어주지 않을 것이고, 내가 쓴 글이 아무리 못났다 한들 나는 누구보다 재미있게 읽을 것이기 때문에. 일기를 쓰기로 했다.
모두가 달려가는 무리에서 의문을 가진 사람은 같은 속도로 달릴 수 없다. 낙오되지 않을 수는 있으나 힘들지 않을 수는 없다. 지는 것을 참지 못하는 사람은 낙오되지 않고 중간 정도에서 달릴 수는 있을 것이다. 중간은 한다는 생각에, 지지 않았다는 생각에 만족스러울 수도 있겠다. 그러나 끝까지 갈 수는 없을 것이다. 그 끝이 8개월 후인지 18년 후인지는 모르겠으나 끝을 낼 수는 없다. 제대로 시작하지 않았으니 끝을 낼 수가 없다.
우아한테크코스에서 공부할 수 있다는 감사함과 옆에 있는 이 사람들과 함께 할 수 있다는 즐거움만큼 자주 느끼는 감정은 의문과 좌절이다. 의문과 좌절은 함께 찾아오기보다는 좌절이 먼저 오고 이어서 의문이 생긴다.
프로그래밍 분야에서는 저 사람보다 내가 실력이 부족해서, 내가 더 열심히 하지 못해서 좌절을 느끼기보다는 저 사람처럼 프로그래밍을 좋아하지 않아서 좌절을 느끼곤 한다. 지금 당장 잘하고 못하고는 큰 문제가 되지 않는다. 하루 이틀 하고 말 것이라면 저 사람은 이것을 아는데 나는 그것을 모른다는 점에 낙담하겠지만, 평생을 할 것이라면 지금 당장의 차이는 단순히 메워야 할 목표이지 넘지 못할 벽 같은 게 아니다.
같이 문제를 풀다가 새로운 것을 알게 되면 정말 어린 아이처럼 좋아하는 크루가 있다. 10년 동안 한 주제를 추적하다가 드디어 깨달았다며 보물을 찾은듯 기뻐하는 크루가 있다. 그 옆에서 머리를 쥐어 싸매고 로또 프로그램의 테스트 코드를 작성하면서 괴로워하는 내가 있다. 같은 문제를 대하는 마음의 차이를 체감하는 순간 좌절하지 않기란 쉽지 않다. 그렇게 몇 번 좌절하다 보면 의문이 생긴다.
“나는 프로그래밍을 좋아하는가?”
이런 질문, 이제는 하지 말자고 생각했는데.
무언가에 온전히 몰입하지 못하고 자꾸 의미를 찾고 좋아하는지 묻는다. 그럼에도 불구하고 진정 의미 있다고 생각하는 건 한 번도 찾지 못했다. 좋아하려고 노력하지 않음에도 저절로 좋아하는 것 역시 쉽지 않았다. 의미를 추궁당하면서도 끝까지 빛을 바래지 않는 것은 없음에도 계속 의미를 묻는다. 좋아해야만 시작할 수 있는 건 아닌데 시작한 이상 좋아해야만 한다는듯이 자꾸 마음을 의심한다.
좋아하지 않는 것은 아니다. 재미없는 것도 아니고 하고 싶지 않은 것도 아니다. 그냥 ‘저 사람처럼 저 정도로 좋아하지는 않는데….’ 하는 씁쓸함이다. 그리고는 ‘저렇게 좋아해야 개발을 잘할 수 있지 않을까’, ‘개발자는 평생 공부해야 한다는데 노력해야지만 공부할 수 있는 사람이라면 오랫동안 즐기면서 개발할 수 없지 않을까’. 그런 생각을 하다가 문제가 잘 풀리지 않기라도 하면 ‘역시 개발을 그렇게 좋아하지 않으니 이렇게 잘 못 하는 거지, 개발자로 성공하지 못할 거야’라는 생각에 바로 빠지게 된다. 성공은 고사하고 자그마한 성취라도 이룰 수 있을까 하는 의심이 들기 시작한다.
알고 있다. 무언가를 좋아한다고 성공하는 것도 아니고 좋아하지 않는다고 성공하지 않는 것도 아니란 것은. 좋아해서 잘하는 것일 수도 있지만 잘해서 재미있고 재미있으니 좋아지고, 좋아해서 자꾸 하다 보니 잘해지는 것이란 것을.
그래서 앞으로 남은 6개월 하고 2주 동안은 프로그래밍을 좋아하는지 자꾸 묻거나 좋아하려고 노력하기보다는 그냥 잘하려고 한다. 잘하면 재미있을 것이고 재미있으면 좋아할 것임으로, 그러면 다시 잘해질테니까. 그렇게 남은 2019년의 목표를 ‘프로그래밍을 좋아할 수 있을 정도로 잘해지는 것’으로 삼았다.
열심히 해보고 아님, 뭐, 말고.