[우아한테크코스 2기 - 성장] 일단 돌아가면 되는거 아니야?

Sony·2020년 9월 6일

회고

목록 보기
4/5

우아한기술블로그-우테코에서 찾은 나만의 효과적인 공부법

일단 돌아가면 되는거 아니야?

우테코에서 공부하면서 이전과 가장 많이 달라진 건 개발에 대한 나의 태도이다.

개발을 처음 시작할 때는 그냥 되는 게 신기했다. 내가 짠 코드가 돌아가는 게 신기했고, 책과 강의를 보고 따라친 코드가 그대로 동작하는 게 신기했다. 그 당시 나에겐 코드가 돌아가는 게 중요했다. 어떻게 돌아가는지는 중요치 않았다. 그렇게 신나게 토이 프로젝트 몇 개를 만들고 스스로 뿌듯해했다. 이런 공부 방법이 잘못되었다는 걸 알게 된 건 한 스타트업 면접을 보고 난 후였다. 운 좋게 서류 합격이 된 후 면접을 보게 되었고 거기서 내 민낯이 드러났다.

  • "방금 작성한 코드의 시간복잡도는 얼마나 될까요?"
  • "오버로딩과 오버라이딩의 차이는 무엇인가요? 코드로 설명해주세요"
  • "Call by valueCall by reference 의 차이는 무엇이죠? 메모리에는 어떻게 할당되나요?"
  • "문자열 비교equals를 사용하고 숫자 비교== 을 사용하는데 차이가 뭔가요?"

개발을 하면서 깊이 생각해보지 않고 지나친 것들이었다. 그냥 책에서 하라는 대로 했고, 문제가 생기면 스택오버플로우 답변을 참고해 해결했다. 그렇게 되는가 보다 하고 넘어갔던 것들에 대해 질문을 받은 나는 제대로 답변할 수 없었다. 면접이 끝나고서야 알았다. 화면에 보이는 화려한 기능보다 그 기능이 어떻게 돌아가는지 아는 게 더 중요하다는 것을.

근데 왜 돌아가는거지?

우테코에 들어와서는 개발 공부를 하는 태도가 달라졌다. 코드가 돌아가는 것보다 왜 돌아가는지가 더 궁금하다. 이전에는 '왜 안 되지?'라는 말을 많이 했다면, 이제는 '왜 되지?'라는 말을 많이 한다. 이전에는 일단 되면 되나 보다 하고 넘어갔다. 원하는 기능이 있으면 검색한 코드를 복사 붙여넣기 했고, 코드가 돌아가면 좋아했다. 왜 되는지보단 일단 되는 게 중요했다. 그런데 이제는 해당 기능이 어떻게 동작하는지가 더 궁금하다. 책이나 블로그에서 하라는 대로 하면 되는 건 알겠는데, 왜 되는지가 궁금하다.

이를테면 아래와 같은 것들이다.

  • SpringBoot의 수많은 어노테이션이 자동으로 무언가를 해준다는데, 어떤걸 자동으로 해주는 건지 어노테이션 별 차이점은 무엇인지가 궁금하다. 테스트 코드에서 @WebMvcTest에서는 안 되던 게 @SpringBootTest로 바꾸니까 되네? 왜..?
  • VO(Value Object) 값을 비교하는 테스트코드를 돌렸는데 실패한다. equals()hashcode()를 오버라이딩 해주니 테스트가 통과한다. 왜..? 이상한 건 equals()만 오버라이딩 해도 테스트가 통과한다. 그럼 hashcode()는 왜 같이 정의해주지? 이전 같았으면 그냥 같이해주라니까 그런가보다 하고 넘어갔을 텐데, 이제는 그렇게 넘어가려니 너무 찜찜하다.
  • git reset -—hard 는 위험하니 조심해서 써야 한다고 한다. 왜? 복구할 수 없다고? 아 그렇구나.. 응? 검색해보니 복구 할 수 있다는데? 그게 어떻게 가능한 거지? git이 데이터를 저장하는 방식이 궁금하다.

공부를 하다 보면 하루에도 몇 번씩 위와 같은 의문, 찜찜함, 궁금증이 생긴다. 예전 같았으면 그냥 넘어갔겠지만 지금은 직접 찾아보고, 이해하고, 정리한다. 이후 내가 이해한 내용을 크루와 코치에게 다시 질문하고 토론하는 과정을 통해 제대로 이해했는지 확인한다.

우테코 교육도 당장 돌아가는 코드를 짜기보단, 시간이 좀 더 걸리더라도 읽기 쉽고, 유지 보수가 용이한 코드를 짜도록 유도한다. 그래서인지 크루들 간 대화 주제도 특정 기술에 대한 이야기보다 도메인 구조나 기능의 원리 (ex. DB 테이블의 구조, 스프링 인터셉터의 원리 등)에 대한 토론이 더 많다.

이런 환경에서 공부하다 보니 개발을 대하는 태도가 많이 달라졌다. 이전에는 기능을 구현해도 스스로 자신이 없었다. 코드가 조금만 달라져도 이해하기 힘들었고, 동작 원리를 제대로 모르니 설명할 수 없었다. 예전에 실수로 git reset —hard를 친 후 다시 되돌리지 못해 처음부터 코드를 다시 짠 적이 있다. 이제는 필요할 땐 자신 있게 git reset -—hard를 치고, 되돌리고 싶을 땐 git reflog를 이용해 되돌린다.

기술 사용자를 넘어 개발자로

자동차를 운전하는 사람은 운전을 위한 작동법만 익히면 된다. 엔진이 돌아가는 원리에 대해서는 몰라도 된다. 하지만 자동차를 만드는 엔지니어라면 엔진이 돌아가는 원리와 타이어의 종류별 차이와 장단점에 대해 알고 사용해야 한다. 개발도 비슷하다고 생각한다. 서비스를 이용하는 사람은 사용법만 아는 걸로 충분하다. 하지만 서비스를 만드는 개발자는 단순히 기술의 사용법을 넘어 동작 원리를 이해해야 한다. 그렇지 않으면 자신이 짠 코드에 대해 자신이 없고 불안하다.

무작정 돌아가는 코드를 만들 때는 무언가 배우는 것 같으면서도 항상 불안했다. 기능의 사용법을 공부해서 쓰긴 했는데 동작하는 원리에 대해서는 모르고 사용했기 때문이다. 이제는 기능의 사용법을 익히는 동시에 그 뒤에서 일어나는 동작 방식에 대해 공부하려고 노력한다. 시간은 두 배 이상 걸리지만 그만큼 기능에 대한 이해도 더 깊어지는 것 같다. 우테코에서 기술보다 기술을 학습하는 태도를 배우고 있다. 하루하루 궁금했던 점을 알아가는 재미가 있다. 그래서 이전보다 개발이 훨씬 재미있다. 이런 재미를 알게 해준 캡틴과 코치, 크루들에게 감사하다. :)

profile
개발하며 배운점과 회고를 남기는 공간입니다.

2개의 댓글

comment-user-thumbnail
2020년 12월 27일

안녕하세요! 비전공자로 현재 개발자를 준비하고 있는 학생입니다. 지금 제 수준이 코드가 돌아가기만 하면 된다!! 수준인데 뭔지 뭐를 찝찝함이 항상 남아 있었습니다. 그리고 이 글을 읽고 제가 평소 느끼던 찝찝함이 뭔지 알게되었습니다. 이제부터라도 동작 원리에 대해 공부하려고 하는데 아는 게 없습니다... 혹시 작성자님은 처음에 어떤 방식으로 공부하셨는지 혹은 동작 원리를 공부하는 특정 과목이 있는건지 알려주실 수 있으신가요? 답변 남겨주시면 정말 감사하겠습니다ㅠㅠ

1개의 답글