본문 바로가기
Log/우아한테크코스

[우아한테크코스 5기] 프리코스 1주차 소감문

by 재영(ReO) 2022. 11. 1.

1주차 미션 소감문


배움의 즐거움 속에 푹 빠져있기도 했고, 너무나도 안타까운 사고에 많이 슬프기도 하면서 어느새 쏜살같이 일주일이 지났습니다. 일주일이란 기간에는 넘칠만큼 정말 많은 것을 배웠고, 많은 것을 느꼈습니다. 그래서 가독성의 확보와 유지보수의 용이라는 대원칙 하에서 배운 것들의 의미를 정립하며, 배움을 위한 배움이 아닌, 목적을 향한 배움이 될 수 있도록 했습니다. 또 홀로 개발 공부를 해왔던 제게도, 함께하는 3300명의 동료들이 생겨서 감격하고 황홀해하면서도 흘려보내지 말아야 할 느낌들을 잘 담아두었습니다.



1주차 미션에서 배운 것


Git

'커밋을 기능 단위로 하라’는 요구사항을 처음 접해봐서, 이를 제대로 이해하려고 노력했습니다. 그래서 첫날은 온전히 Git과 GitHub에 대해서 구글링을 하며 보냈습니다. Git의 공식문서(reference manual)을 천천히 읽어보며 명령어를 정리하고 블로그에 올렸습니다. GitHub 커밋 메세지 컨벤션이 존재한다는 것을 찾아냈고, 이 내용도 블로그에 정리해서 올렸습니다. 또, 박재성님이 브런치에 올리신 글을 읽으며 README 문서의 중요성을 알았고, 살아있는 문서를 만들어보려고 노력했습니다. 이러한 과정을 통해서 위의 요구사항을 Version Control System들의 목적은 다수가 협업시에 문자 그대로 ‘버전 관리’를 용이하게 하려고 하는 것임을 배웠습니다. 그 동안은 그저 원격 저장소처럼 GitHub을 사용해왔지만, 이번 미션을 통해서 간접적으로나마 협업 시에 Git이 얼마나 중요한지를 알 수 있었습니다.

  1. Git 명령어
    협업을 해본 경험이 없었고, PS를 한 것을 원격 repository에 저장하는 개념으로만 GitHub을 써왔기 때문에, 그동안 써왔던 Git 명령어는 “git add.” 와 “git commit -am $날짜” “git push” 이 세개밖에 없었습니다. 그러나 이번 미션의 제일 처음부터 다른 GitHub 계정의 repository를 fork하고 이를 local에 clone해야했습니다. 또, 제출 가이드에 terminal에서 git 명령어를 사용하여 이 과정을 알려주었습니다. 그래서 첫날은 Git의 공식문서를 천천히 읽으며 명령어를 정리하고 블로그에 올렸습니다. 이를 활용하니, 이 후에 커밋 메시지를 수정해야 할 일이 있을 때도 수월하게 문제를 해결할 수 있었습니다.

  2. GitHub 커밋 메시지 컨벤션
    커밋을 기능 단위로 하라는 생소한 요구 사항을 제대로 지키기 위해서 커밋에 대하여 구글링을 했습니다. 그러다가 이전 기수의 프리코스에서 요구사항으로 주어진 AngularJS GitHub 커밋 메시지 컨벤션을 확인했습니다. 그래서 이 내용을 블로그에 정리해서 올렸고, 이번 미션을 하는 동안 컨벤션을 지키는 것에 최대한 노력하며 신경써서 커밋을 했습니다.
    이를 통해서 정말 ‘유지보수의 용이성’이라는 말을 정말 오롯이 체험할 수 있는 경험을 했습니다. 이전에도 계속 PS를 한 것을 GitHub에 올려놨습니다. 더 효율적인 알고리즘을 배우고나서, 이전에 짰던 비효율적인 로직을 변경하려고 해당 파일을 열면 “내가 뭘 하려고 했던거지?”라는 물음과 함께 항상 다시 처음부터 코드를 읽었어야 했습니다. 그러나 이번 미션에서 커밋을 기능 단위로 해놓으니, 수정해야할 로직의 기능에 해당하는 커밋 내용을 보며, 코드의 어느 부분이 해당 기능을 구현하는 곳인지를 바로 알 수 있을 뿐더러 왜 그런 로직으로 구현을 했었는지도 바로 알 수 있었습니다. 그래서 수정할 부분도 정말 빠르게 찾아낼 수 있었습니다. 협업을 해본 적은 없지만, 모든 사람들이 이 컨벤션을 지키며 협업을 하면 자기 뿐만 아니라 다른 사람의 코드를 수정해야할 때에도 오랜 시간을 들이지 않고 할 수 있을 것이라는 것을 정말 온몸으로 깨달을 수 있었던 아주 소중한 배움이었습니다.

  3. 살아있는 문서
    Git과 관련하여 구글링을 보다가 README 문서의 중요성을 강조하는 몇몇 블로그 글들을 봤습니다. 이에 대해서도 찾아보다가 박재성님이 브런치에 올리신 목적의식 있는 연습을 통한 효과적인 학습이라는 글을 우연히 접할 수 있었습니다. 우테코 첫 기수의 프리코스를 진행하며 정리해두신 피드백 등을 접할 수 있었고, 여기에서 README를 '살아있는 문서'가 되도록 하라는 내용도 확인했습니다. README를 처음 repository를 생성할 때와 같은 상태로 둔다거나, 변경된 기능들을 기록하지 않은 채로 README 파일을 두는 것은, 해당 프로젝트를 처음 보는 외부 사람들이 모든 코드를 전부 살펴봐야 해당 코드들이 어떤 역할을 할 수 있는지를 분석할 수 있게 되므로 비효율적이라고 유추해봤습니다. README를 살아있는 문서가 되도록 하여 기능을 추가/변경할 때마다 이를 적용하면 외부 사람이 보기에도 문제없이 이해할 수 있을 것이고, 더 나아가서는 커밋 내용을 보며 어떤 식으로 문제점을 개선해나갔는지 또한 알 수 있게 되기 때문에, 이를 리소스로 활용하여 더 효율적인 프로세스와 팀을 구축할 수 있을 것이라고 예상했습니다. 그래서 이번 미션을 진행하며, 기능 구현 목록을 각 문제의 docs에 정리를 했습니다. 또 로직을 변경하거나 예외를 추가/삭제할 때도 docs를 함께 변경하며 커밋해서 각 docs를 살아있는 문서가 될 수 있도록 연습해봤습니다.

Java

Java로 Hello World를 찍어본지 이제 갓 두달이 됐습니다. 기본서를 한번 읽었다고 해도 실제로 개발을 할 때는 턱 막히는 느낌이 든 적이 있어서 지금은 개발을 진행하며 부족했던 부분들을 채워나가는 식으로 공부하고 있습니다. 하지만 혼자서 개발을 해오는 바람에 매번 같은 자료구조만 이용하고 익숙한 로직만 사용하는 느낌이 없지 않아 있었습니다. 또한, 일정한 규칙 없이 코드를 작성하다보니 제가 짠 코드임에도 다시 보면 잘 안 읽히는 경우도 많았습니다. 이번 미션을 진행하며 가독성을 확보하는 방법들에 대하여 많이 고민할 수 있었고, 새로운 자료구조와 로직, 그리고 유용한 도구들을 새로 알게됐고 체화할 수 있는 기회를 가질 수 있었습니다. 그리고 유지보수의 용이를 위한 방법들을 확인했고 이를 지키면서 코드를 작성하려 했습니다.

  1. 자바 컨벤션 정리
    재성님의 글을 통해서 이전 기수에게 주셨던 피드백을 확인할 수 있었고 여기서 자바 자체에도 지켜야할 컨벤션이 있음을 확인했습니다. 그래서 이를 나름대로 정리해서 블로그에 올렸습니다. 스티커 어플리케이션에 요약한 내용을 적어놓고 컨벤션을 수시로 확인하며 코드를 올바르게 적었는지 체크했습니다. 그러다보니 문제 6번쯤부터는 어느정도는 자연스레 컨벤션을 지키면서 코드를 작성하게 됐던 것 같습니다. 그렇지만 몇몇 컨벤션은 아직 익숙하지 않은 것도 있고, 아직 적용해보지 못한 항목들도 있기 때문에 계속해서 컨벤션을 정독할 예정입니다.

  2. 메소드랑 변수명 정하는 방법
    원래 주석을 많이 다는 편이 아니기도 했지만, 주석이 많아지면 가독성이 떨어진다는 글을 읽었습니다. 그래서 가독성을 확보하기 위해서는 메소드와 변수명을 적절하게 정하는 것이 중요하다는 것을 알게 됐습니다. 이번 미션을 해결하는 시간 중 반 이상의 시간을 적절한 메소드와 변수 이름을 짓기 위해서 사용한 것 같습니다. Collection들 간의 타입 변경 유연성을 보장하고자 복수형을 사용하고 (실제로 List에서 Set으로 자료구조를 바꿀 때 변수명도 하나하나 바꿔주어야 했습니다.) 의미 없는 변수명을 지양하며 올바른 단어를 사전에서 계속해서 찾아보고 적용하는 등의 노력을 하며 나름 잘 읽히는 코드를 적어보려고 했습니다. 변경 전과 비교해보면 확실히 메소드나 변수의 의미가 잘 와닿고 흐름이 잘 읽히게 된 것 같아서 뿌듯했습니다. 또한 가독성의 중요함을 몸소 느꼈습니다.

  3. 새로운 자료구조와 로직 체화
    그 동안은 리스트를 주로 써왔지만 이번 미션을 진행하며 효율성을 어떻게 하면 더 늘릴 수 있을까를 고민해봤습니다. 그래서 HashMap이나 HashSet을 사용하면 더욱 효율적일 부분들을 찾아서 이를 의도적으로 사용해보려고 노력했습니다. Map.Entry 자료구조에 대해서도 알아볼 수 있는 기회가 되었고, 구글링을 통해 다른 메소드들도 살펴보았습니다. 이 과정에서 우테코 선배님들의 블로그가 정말 도움이 많이 됐습니다. 또한 Techoble 에서도 유용한 자료들을 정말 많이 찾아서 이것들을 살펴보느라 행복한 비명을 질렀습니다. 다들 글을 정말 잘 쓰셔서 이해하기가 수월했습니다. 이후에는 배운 것을 체득하기 위하여 백준 사이트에서 기본 문제들을 풀어봤습니다. 게임 내에서 새로운 무기를 얻었을 때와 비슷한 행복감을 얻었던 경험이었습니다.

  4. 메소드 분리, 람다, Stream API
    for문이나 while문 같은 반복문이 많아지고, 또 if를 남발하다보니 제가 짠 코드를 스스로도 보기 힘들어지는 것 같았습니다. 인덴트를 최소로 하라는 예전 피드백도 확인했어서, 이에 대해서 많이 고민을 해봤습니다. 우선, 메소드가 하나의 역할만 할 수 있도록 정말 메소드를 열심히 분리해봤습니다. 그랬더니 확실히 인덴트가 깊어지는 문제는 해결을 할 수 있었습니다. 그러나 몇몇 반복문의 경우 메소드를 분리해도 로직상으로 생략할 수 없어서 여전히 남아있게 되는 경우가 있었습니다. 이 부분이 가독성을 많이 저해시킨다고 생각해서 여러 방법을 구글링하던 중 Stream API와 람다식을 찾아냈습니다. 그래서 최대한 많은 반복문들을 Stream API로 변경해보려고 노력했습니다. 어떤 부분에서는 for문을 쓰는 것이 더욱 가독성을 확보해주는 경우도 있었고, 이렇게 여러 경우에 대해서 Stream API와 람다식을 사용해보니 언제 이를 사용할지에 대한 감도 조금 생기는 것 같은 경험을 했습니다.

  5. 매직넘버 쓰지 않기
    가장 충격을 받은 배움이었습니다. 상수 선언을 static final로 한다는 것은 알고 있었지만 언제 쓰는지에 대해서는 잘 몰랐었습니다. 문제에 적혀 있던 Integer.MAX_VALUE가 무엇인지 궁금증을 가지고 구글링을 하다가, ‘매직넘버’라고 불리는, 코드 내에서 특정한 역할을 하지만 값을 가지고 있는 숫자들을 상수로 선언을 해줘야 한다는 내용을 봤습니다. 예를 들어 게임의 규칙이 바뀌어서 3,6,9가 아닌 2,4,6에 박수를 쳐야하는 상황이 된다거나, 화폐의 단위에 10만원권이 추가가 되거나 하는 상황들이 생기면 이 값들을 사용한 코드들을 하나하나 찾아서 수정을 해야하는데, 이것을 상수로 선언해두면 코드의 상단에서 값을 변경하고 아래의 모든 값들이 이를 참조하게 할 수 있다는 것에 큰 충격을 받았습니다. 실제로 계산기를 만들 때 버튼에 들어갈 문자를 따로 적고, 버튼 액션을 받는 문자도 따로 적어서 구현을 했는데 이 버튼의 이름을 변경해야할 일이 있었습니다. 그 때 3개의 소스코드에서 해당하는 것을 죄다 뒤져가며 바꿨던 경험이 있는데 상수를 사용하면 이러한 일을 방지할 수 있다는 것을 이번 기회로 알았습니다. 정말 속이 뻥 뚫리는 기분을 느꼈습니다.

  6. 자바 11
    원래 자바 8을 사용하다가 자바 11을 사용하게 돼서 새롭게 알게된 기능들이 있었습니다. .of 메소드를 사용하여 간편하게 불변 collection을 만들 수도 있었고 Stream API에도 메소드가 추가되어 효율적인 것을 선택할 수도 있게 되었습니다. 테코톡 채널에 올라와있는 호호님의 정리 영상이 많이 도움이 되었습니다. 소개된 기능들이 신기했고 이것들 또한 체득하기 위해서 간단히 연습해봤습니다.

1주차 미션에서 느낀 것


첫날, 슬랙에 있는 3300이라는 숫자를 마주하고 정말 행복했습니다. 그동안 제게 개발은 외로운 여정이었습니다. 함께할 팀을 지속적으로 구해보고 면접을 봤지만, 비전공자이고 협업해본 경험이 없어서 기회를 얻지 못했습니다. 그래서 소형 개인 프로젝트와 PS를 하며 외로이 개발 공부를 해왔습니다. 그런데, 같은 문제를 함께 고민할 3300명의 동료들이라는 이른 크리스마스 선물을 받았습니다. 영화 반지의 제왕과 어벤져스에서 고전을 하던 영웅에게 지원군이 나타났을 때 같은 기분을 주체하지 못하고 슬랙에 주책을 부리기도 했습니다.

슬랙에 부린 주책😅

슬랙에 올라온 거의 대부분의 글을 읽었습니다. 코치님 중 한 분이 올려주신 질문하는 방법에 대한 조언도 감명깊게 읽고, 동료분들이 올려주신 테스트케이스들을 돌려보면서 디버깅에도 도움을 받았습니다. 자바 버전을 변경하는 데에 어려움을 겪는 동료분이 계셔서 아는 한에서 최대한 도움을 주기도 하고, 서로 감사인사를 주고 받으며 가슴이 따뜻해지는 경험도 했습니다. 이를 겪으며 함께하는 것의 중요성을 절실하게 느낄 수 있었습니다.

아는 한에서 최대한 도움을 드렸습니다😆

미션을 진행하면서 또 다른 느낀 점들이 있었습니다. 같은 미션이고 요구사항인데도 사람들마다 해석이 달랐습니다. 가령 첫면과 마지막면을 제외한다는 요구사항도 1-400페이지를 유효 범위로 하신 분들도 있고 저처럼 3-398페이지를 유효 범위로 한 분들도 계셨습니다. 또, 세 글자 이상의 중복을 처리하는 방법이라던지, 이메일의 정렬이 이메일 전체에 대해서인지 아이디만인지 등 코드 자체에서 따로 처리하지는 못하지만 생각해 볼 사항들이 좀 있었습니다. 그래서 정말 다양한 사람들의 이야기를 듣는 것이 중요하다는 점과 요구사항을 명확히 하는 것이 중요하다는 것을 느낄 수 있었습니다.
가독성을 확보하고 유지보수를 용이하게 하기 위해 여러 유용한 도구나 지켜야할 규칙들을 배울 수 있었고, 혼자 해오던 것을 함께 해결하는 경험을 할 수 있어서 정말 꿈 같은 일주일이었습니다. 일주일 동안 미션을 하며 겪은 모든 일이 진심으로 즐거웠습니다. 벌써 1/4가 지났다는 것이 아쉽습니다. 남은 3주도 후회를 남기지 않도록 전력으로 몰입하겠습니다. 훌륭한 미션을 주셔서 진심으로 감사드립니다.