시작하며
요즘 밥 먹으면서도, 누워서 쉬면서도 프리코스 미션에 대해 고민할 정도로 프리코스에 몰입하고 있다. 1주의 적응 기간을 마치고 이제 완전히 프리코스에 중독된 거 같다. 중독이란 말을 쓴 이유는 일상생활에서도 게임의 잔상이 남아있듯 프리코스 미션의 잔상이 남아있기 때문이다.
그렇게 수많은 고민을 거치며 이번 주차엔 스스로 큰 전환점 하나를 맞이했다. 바로 책과 가까워지기로 한 것이다. 돌이켜보면 어린 시절엔 책을 정말 좋아했었는데, 커가며 교과서와 전공 서적에 밀려 독서는 점점 뒷전이 되었었다. 개발을 처음 할 땐 사실 이가 크게 문제되진 않았다. 하지만 점점 공부를 하면 할 수록 스스로 확장적인 사고가 막힌단 느낌을 받았다.
그러다 이번 주차 프리코스를 진행하며 우연찮게 책을 몇 권 읽게 되었는데 1주차에 비해 설계 결과가 크게 나아졌단 느낌을 받았고, 블로그에 작성해 오던 til 역시 줄글로 쓰기 수월해졌음을 느꼈다. 그동안 리스트 형태로 글을 작성한 적도 많았는데 이보다 줄글로 블로그글을 작성하는 게 훨씬 사고의 깊이감이 달라진 단 걸 느꼈다. 비록 문학소녀까진 되지 못하겠지만 독서와 글쓰기에 친밀한 개발자가 되고자 방향을 잡으니 전보다 더 성장할 수 있으리란 확신이 들었다.
되고 싶은 개발자의 모습이 확고해졌다
10년 뒤 내 모습을 상상했을 때, 나는 후배 개발자들한테 존경 받는 개발 잘하는 선배 개발자가 되고 싶다. 그게 내 꿈이다. 그렇게 되기 위해 주변에 잘하는 사람들의 특징을 오랫동안 생각해 왔다.
(1) 단순 노가다를 싫어한다.
개발을 하다보면 가끔 단순 반복 작업이 필요한 부분들을 분명 마주한다. 이를 얼마나 체계적으로 효과적으로 자동화할 수 있을지 생각하려 하는 자세가 개발 잘하는 사람의 큰 특징인 거 같다.
예를 들면 csv 파일의 데이터를 db에 넣어야 할 때 이를 어떻게든 자동화하려는 사람이 있고 직접 집어넣으려는 사람이 있다. 전자가 되려 노력하자. 더 일상적인 예론 ide를 사용할 때 똑같은 오타들을 수정할 때 어떤 이는 어떻게든 한 번에 고치는 단축키를 찾아 사용하고, 어떤 이는 일일이 찾아가 수정한다. 이 역시 전자가 되려 노력하자.
누군가는 그건 그냥 귀차니즘을 느끼는 사람이 아니냐고 되물을 수도 있는데, 반은 맞고 반은 틀리다. 저런 단축키를 찾으려는 노력과 자동화 툴을 찾으려는 노력이야 말로 만사 귀차니스트들은 할 수 없는 영역이기 때문이다. 귀찮아서 한다기보단 거시적인 관점에서 불필요한 작업을 줄이려는 노력이고 이 생각을 할 수 있는 사람과 할 수 없는 사람의 차이가 개발을 잘하느냐 못하느냐의 지표로도 충분히 쓰일 수 있다 생각한다.
(2) 책을 많이 읽는다.
여담이지만, 우리 동네 미용사 아주머니의 아들은 유망한 개발자시다. 그분의 가장 인상 깊었던 특징은 “책을 많이 읽는다”라는 점이었다. 미용사 아주머니 말씀으론 일주일에 평균 2권정도의 책을 계속해서 읽어오셨다 한다. 내 동료 중에도 분명 나보다 개발적인 사고를 훨씬 확장적으로 분석적으로 잘하는 친구들이 존재한다. 그 친구들의 공통점도 개발 관련 서적을 적어도 나보단 많이 읽었단 점이었다.
그렇다면 나도 그들처럼 확장적, 분석적인 사고를 하기 위해선 ‘책이 필요하다’라는 결론을 내렸다. 책은 일용한 양식이다. 개발자에게도 마찬가지다. 책과 친해져보자. 그런 의미에서 이번주에 책을 두 권 더 샀다. 특히 이번 주차 프리코스에서 책의 도움을 많이 받아 성장해나가며 평생 책을 읽어 나가는 개발자가 되고 싶단 꿈이 생겼다.
”객체지향의 사실과 오해” 책을 읽고 지난 주차 과제를 돌아보며 미션에 응용해보았다
지난 주에 mvc 설계에 대해 고민했다면 이번주엔 객체지향적인 설계에 대해 끊임없이 고민했다. 객체지향은 사실 컴퓨터공학과 학생이라면 누구나 배워봤을 지식이긴 하다. 하지만 지난 1주차 과제를 마치고 그동안 내가 얼마나 객체지향에 무지했는지 깨달았다. mvc를 넣을 때가 아니라 객체지향부터 고민해봐야겠다 절실히 느꼈다.
이번 주차에 특히 도움이 된 책은 “객체 지향의 사실과 오해”라는 책이었다. 이 책을 읽고 감명 받아 저자의 유튜브 강연 “의존성을 이용해 설계 진화시키기”까지 찾아봤다. 사실 강연은 전체 내용을 이해하진 못했다. 아무래도 이벤트 드리븐 방식을 통한 ddd 개념이 등장하는데 이에 대해 아직 무지하기 때문인 거 같다. 그래도 어느 정도 흡입한 건 의존성 관련한 부분이었다. 1주차에 의존성을 잘 알지 못한채 모델간 결합을 무조건 피하려 했었는데 의존성이 무조건 나쁜 게 아니란 걸 알게 되었다. 설계를 통해 제어할 수 있기 때문이다.
다시 책 이야기로 돌아와서 해당 책은 1주차 과제를 하며 느꼈던 의문점들을 명쾌히 해결해주었다. 1주차 과제가 끝나고 코드리뷰로 내 코드가 절차지향적이란 이야길 들었었다. 절차지향이 무조건 나쁜 건 아니지만 mvc를 억지로 넣다가 처음 계획과 달리 객체지향과 멀어져버린 내 코드가 부끄러웠다. 2주차가 시작되고 이틀 간 해당 책을 읽으며 객체지향적인 설계가 무엇인지 깊이 고민했다.
데이터 중심의 structure를 만들었던 1주차의 코드를 반성했고, 2주차엔 행동 중심의 class를 만들기 위해 책 내용을 적극 활용했다. 책의 예시 중 인상 깊었던 부분을 이번 과제에 비슷하게 적용해보았다. 해당 내용은 readme의 부록에 자세히 적어놓았다. 설계를 마치고 스스로 이런 구조를 생각할 수 있게 됐다는 점에서 놀랐다.
프리코스를 통해 내 성장 가능성을 기대하며 즐거움을 얻을 수 있었다. 순수 자바로 코딩해보며 그동안 간과하고 넘어갔던 부분들을 짚고 넘어갈 수 있어 너무 좋았다. 이렇게 객체지향에 대해 깊이 있게 고민해볼 수 있는 기회를 얻게 된 점이 감사하다. 프리코스가 끝나고도 우테코의 다른 과제들도 계속해 풀어보고 싶다. 내가 얼마나 성장할지 기대되고 궁금해졌기 때문이다.
”자바와 Junit을 활용한 실용주의 단위 테스트” 책을 읽고 미션에 적용하며 테스트 코드의 중요성을 실감했다
부끄럽지만 지금껏 나는 테스트 코드와 정말 안 친한 사람이었다. 그리고 포스트맨과 친한. 항상 마음 한 켠엔 테스트 코드를 잘 사용하고 싶단 욕심은 있었지만 그러기엔 포스트맨이 너무 편했다. 아마 지금까지 해온 프로젝트들이 매번 단발성의 기능 쳐내기식 토이 프로젝트들이었어서 더 테스트 코드의 중요성을 간과해왔던 거 같다. 또 순수 자바로 코딩을 해본 적은 이번이 사실상 처음이었는데 이제는 포스트맨이 없기에 더이상 물러설 곳이 없다. 실무에 가서도 포스트맨을 돌리고 있을 순 없기에 이번 프리코스 4주의 폐관 수련 기간을 틈타 테스트 코드를 제대로 공부해보기로 했다.
요즘 개발 서적 읽는 재미에 빠져서, 테스트 코드도 책을 구매해 학습했다. 정확하겐 학습보단, 읽고 그동안을 돌아보며 생각을 확장시켰다. 졸프 수업이 끝나고 돌아오는 길에 잡담 겸 친구한테 내가 물었던 부끄러운 질문이 있다. “단위 테스트가 함수마다 짜는 거야? 나 테스트 하나도 몰라”. 동료의 답은 “어..설명하기 어려운 데 함수마다 짜는 건 아니야..”라고 답했고 단위 테스트가 무엇인지에 대한 궁금증이 더 커졌었다. 그리고 그 궁금증에 기반해 집에 돌아오자마자 감기 기운을 무시한채 이 책을 폭풍처럼 읽어나갔다. 이렇게 몰입해 빠르게 책을 읽은 것도 정말 오랜만인 거 같다. 거의 초등학생 때 재밌는 소설책을 만나 새벽까지 읽다 부모님한테 혼났던 때처럼 이 책에 빠져들었었다.
책에선 단위 테스트의 중요성을 계속해서 강조했다. 그리고 내가 느낀 단위 테스트의 말도 안되는 장점은 “각각의 테스트들이 독립적”이란 점이었다. 그동안 무지성으로 개발해올 때 매번 클래스들끼리 분명 의존성이 생기고 그 의존성으로 인해 어느 부분이 문제인지 트래킹해간 적이 많았었다. 예를 들면 어떤 api를 개발했는데 원하는 결과가 나오지 않아 컨트롤러부터 서비스, 레포지토리까지 타고 타며 들어가는 것이다. 이게 얼마나 비효율적인 방식이었는지 이 책을 보고 깨달을 수 있었다. 코드끼리 의존성을 없애는 건 사실상 불가능한데 단위 테스트는 이를 가능하게 하기에 말도 안되는 효율성이라 표현하고 싶다.
이 책을 읽고서 프리코스 2주차 구현을 시작하였는데 1주차와 확연히 달라진 내 태도를 느낄 수 있었다. 1주차엔 테스트코드의 필요성을 일말의 피조차 느끼지 못했었는데, 이번엔 미션 공지와 상관 없이 스스로 테스트 코드의 필요성을 느낄 수 있었고 나의 사고가 한 차례 더 확장됐음을 느꼈다. 특히 이번 미션은 기능 별로 커밋하라는 요구 사항이 추가되어 이를 지키기 위해선 꼭 기능 별로 구현을 차례차례 해나가야 했는데 기능을 구현하고서 테스트 코드 없이 다음 기능을 구현하려니 불안한, 처음 느껴보는 사고를 경험했다.
이번주를 정리해보자면
이번주에 스스로 칭찬하고 싶은 점은 두 권의 책을 읽고 그 내용을 직접 과제에서 체감하려 노력했단 점이다. 책 예제를 활용해 스토리텔링식으로 객체지향적인 설계를 해보았고, 단위테스트의 효용성을 느끼기 위해 기능 별로 구현 후 바로 바로 테스트 코드를 작성했다. 이번 미션이 기능 별로 커밋하고 기능 별로 테스트를 작성하는 거였는데 이 키워드가 단위 테스트를 실현하는데 도움이 많이 됐다. 또, 객체지향적인 설계를 이번 과제에 접목해 고민하며 자연스레 일급 컬렉션을 사용하게 되었다. 그동안 객체 지향 생활 체조 원칙에 왜 일급 컬렉션 이야기가 있는지 궁금했는데 이를 자연스럽게 유도하게 되어 좋았다.
아쉬운 점은 테스트 코드를 살면서 처음 써보다 보니 의미 있는 테스트를 썼는지에 대해 분간이 조금 어려웠단 점이다. 이 부분은 앞으로도 꾸준히 테스트 코드를 작성하며 연습해 나가야 할 거 같다.
•
1,2일차 : 코드 리뷰 통해 지난 과제의 절차지향적인 부분 캐치하기
•
3,4일차 : 객체지향 책 읽으며 이번 과제에 적용해보기
•
5일차 : 단위테스트 책 읽으며 테스트코드 연습해보기
•
6일차 : 설계한 내용대로 구현하기
•
7일차 : 리팩토링하기 (일급 컬렉션 적용, 전략 패턴 적용)
다음주를 계획하자면
다음주엔 다음주 과제를 보고 읽고 싶은 책이 또 새로 생기겠지만 일단 현재론 tdd에 대한 책도 끼워서 같이 읽고 싶다. 물론 아직 테스트코드조차 익숙하지 않아 온전한 tdd를 당장 쓰진 못하겠지만, 이번주차에 기능 하나 구현하고 바로 그 기능에 대한 테스트 코드를 작성했는데 이 순서만 살짝 바꿔봄으로써 맛보기만 해보고 싶다.
또, 디자인 패턴에 대해서도 좀 더 공부하고 싶다. 리팩토링 하면서 전략 패턴에 대해 살짝 맛보았는데 내가 고민하던 문제를 패턴이 명쾌하게 해결해주는 걸 실감했기 때문이다.