토비님

인프런의 한 질문에 대한 답변 (질문 링크)

토비님 답변 발췌

어려운 질문을 해주셨네요.

기술 공부에 비법은 없습니다. 각자 자신이 해야하는 일에 절박감을 가지고, 이 기술을 어떻게 써야 내가 원하는 결과를 가져올 수 있는지 열심히 찾는 수 밖에요. 당장 해야하는 일을 해결할 때는 모든 방법을 다 동원해서 코드를 만들어야죠. 다만, 이런 방식을 지속하면 생산성은 안 오르고, 응용력도 떨어지고 결정적으로 재미가 없습니다.

그래서 공부를 하는데요. 이건 사람마다 선호하는 스타일이 다른 것 같습니다. 레퍼런스 문서와 바이블 같은 책을 쭉 정독하면서 기억하고 싶은 내용을 메모해두기도 하고, 최대한 공개된 예제를 찾아서 이걸 분석해가면서 왜 이렇게 만들었는지 궁금한 부분이 있다면 거기서 더 깊이 들어가서 관련된 내용을 찾아서 이해해보려고 노력하는 방법도 있습니다. 코딩 과정을 볼 수 있는 영상 강의를 선호하는 분들도 있겠죠.

저는 스프링을 처음 공부할 때 볼 책도 없었고, 레퍼런스 문서도 50페이지 밖에 안 되었습니다. 그래서 튜토리얼 예제를 가지고 계속 분석해보면서 이해를 하려고 노력했습니다. 그리고 어느 정도 동작하는 코드를 만들게 되었을 때부터, 도대체 스프링은 왜 이런식으로 만들어졌는지 관련된 책을 찾아서 읽고, 거기에 나온 주제들을 또 찾아서 공부했죠.

저는 일단 양이 중요하더라고요. 그래서 책이나 레퍼런스 문서는 물론이고, 블로그 글, 포럼의 질문/답변, 그리고 스프링 오픈소스 프로젝트의 이슈 트래커를 보기도 하고, 요즘 같으면 유튜브 영상도 찾아보고요. 꽤 많은 양의 정보를 접하려고 노력을 합니다. 그 중에서 원리나 핵심을 이해하는데 도움이 되는 것을 발견하면 그걸 잘 정리해두고, 그걸 기준으로 또 다음 주제를 잡아서 살펴보죠. 알고 싶어지면 API 문서도 읽습니다. 자바의 클래스 라이브러리나 스프링의 주요 인터페이스의 Javadoc은 정말 설명이 잘 되어있습니다. 자주 읽으세요.

결국엔 스프링 소스코드를 분석하면서 그 안에 담긴 개발자들의 생각과 설계 방식을 살펴보고, 이걸 어떻게 내가 만드는 코드에 응용을 해볼까 생각을 많이 한 것 같습니다.

그런데 저처럼 하시면 이게 아주 오랜 시간이 걸릴 수 있습니다. 수십만 라인의 스프링 코드를 살펴보는 거, 이거 시간대비 효과가 매우 적습니다. 분석하기도 힘들죠.

일단 스프링을 포함해서 사용하는 기술의 주제의 바이블 또는 원리를 잘 설명했다는 책을 구해서 정독을 해주세요. 저 같은 경우엔 스프링은 로드 존슨이 쓴 J2EE 시리즈와 Pro Spring 1판이 큰 도움이 됐습니다. 그리고, 공식 레퍼런스 문서는 최소한 한번은 정독하세요. 읽다가 잘 모르는 주제는 넘어가도 좋지만 내가 좀 접해봤다 싶은 내용은 문서에서 설명하는 것을 빠짐없이 한번은 읽고, 이건 기억해야겠다 싶은 걸 찾아서 기록해두세요.

그리고 코드를 만들어봐야 합니다. 코드를 작성해보는 양이 매우 중요한데, 이걸 실무 프로젝트만 만들면 해당 프로젝트에서 결정한 스타일과 기술 사용방법에 제한을 받습니다. 스프링 프로젝트 10개 했는데 한번도 안 써본 게 많죠. 그럼 다음에도 못 씁니다. 그래서 개인 프로젝트를 많이 만들고, 이번엔 이 방식으로 코드를 짜 봐야겠다라고 생각하고 만드는 거죠. 그렇게 코드를 만들면서 느끼시는 게 중요합니다. 이런식으로 하니 이렇게 코드가 나오는구나, 저렇게 했을 때와는 다른 특징이 생기네 등등.

또 제가 선호하는 건, 책이나 문서에 나오는 어떤 설명을 보면, 정말 그런가라는 의문을 가지고 학습 테스트를 만듭니다. 이게 시간이 조금 더 걸리지만 한번 만들어보면 이해가 잘 됩니다. 해당 방식을 사용하는 코드를 작성하는 방법에 대한 이해도 되고, 나중에 참조할만한 자신의 참조 툴박스 같은 역할도 해주지요.

어떤 기술을 사용할지는, 일단 요즘 추세나 유행을 따라가시고요. 남들 안하는 거 괜한 호기심으로 선택하면 재미는 있을지 몰라도 실무에 도움이 안 될 수 있습니다. 많이 사용되는 기술이 더 안정적이고, 더 빠르게 발전하고, 더 참고할 자료가 많습니다. 대신 주변에 쓰는 기술에 매몰되지 말고 더 넓게 보고 기술을 찾으셔야죠. 그리고 사용하기로 결정한 기술을 다양한 예제를 만들어서 스스로 검증할 수 있어야 합니다. 너무 최신 기술은 불안하기도 하고 성능에 문제가 생기거나, 호환성이 취약하기도 합니다. 그걸 확인해볼 수 있는 예제를 만드는 훈련도 해보세요.

가장 효과적인 학습 방법은 코드와 함께 하는 것입니다. 그리고 내가 만든 코드를 계속 다듬어보세요. 예제를 책이나 강의에서 봤으면 그걸 따라해본 뒤에 다음에 또 다시 만드는데 그때는 내가 뭔가 아이디어를 더 내고, 확장해보거나 더 최적화를 해보거나 다른 방식을 시도해봅니다. 비슷한 일을 하는 코드를 이렇게 여러번 반복해서 여러가지 스타일로 만들면 도움이 됩니다. 반복해서 코드를 작성하는 거 중요합니다.

그리고 기본이라고 불리는 것들, 자바 언어, 객체지향 설계원칙, 디자인 패턴, 리팩토링, 테스트 작성, TDD 등등은 시간 나는대로 충분히 공부해두세요. 누가 옆에서 설명해달라고 하면 바로 이야기할 수 있을 정도로 핵심을 잘 기억해두시고, 그것을 표현하는 예제까지 만들 수 있으면 좋습니다.

위 답변에 대한 상세한 설명을 이 유튜브 링크에서 직접 들어볼 수 있다.

정리

  • 오픈 소스를 공부할 때, 해당 오픈 소스의 이슈 트래커(깃허브 issue 탭과 같은)에서 필요한 기술에 대해 검색하면 그 히스토리를 자세히 알 수 있다.
  • 자기가 관심있는 주제에 대해서 적어놓고, 그 주제에 대해 깊게 파보자.
    • 토비님은 구글 독스에 주제를 나눠서, 소스/어떤 내요인지/자신이 어디서 인상깊었는지/이를 어디서 활용할 수 있을지(발표, 강의, SNS, …) 적어놓는다고 함.
    • 까먹더라도 나중에 독스 훓어보면서 직접 해본다고 함.
  • 스프링은 클래스 위에 설명에 너무 상세하고 좋은 내용들이 많아서 이를 읽어보면 좋음 (레퍼런스에는 없는 내용도 있을 수 있음.)
  • 공식 문서나 책을 읽고 모든 것을 이해할 필요는 없다. 그냥 이런게 있었다 정도만 남겨두고, 인상 깊었던 것은 정리해보면 좋다.
  • 호주 기준으로도 자바 스프링을 1등으로 많이 쓴다.
  • 테스트 코드를 작성해서 직접 검증해보는 것이 중요하다.

2023 인프콘: 스프링과 함께 더 나은 개발자 되기 - 이일민(토비)

영상 링크

스프링과 같은 기술을 사용해서 성장하기 위한 과정

1. 질문과 탐구

  • 내가 사용하는 기술은 왜 이렇게 만들어졌는가? (기술에 대한 철학 이해)
  • 나는 왜 이렇게 설계하고, 코드를 작성하는가?
  • 장단점은 무엇인가?
  • 다른 대안은 없을까?
  • 지금도 좋긴한데 다음에는 개선할 부분이 있을까?

2. 훈련과 개선

  • 회사 업무와 기술 공부 튜토리얼을 따라한 것 말고 코딩을 하는가?
  • 하지 않는다면 당장해보자.
    • 스프링을 통해서 배운 것을 응용해보는 코딩
    • 튜토리얼 예제를 반복해서 작성
    • 새로운 기능을 추가하고 설계 구조를 변경해보려는 시도
    • 실무에서 사용하지 못했던 기술 도입
    • 연습용 애플리케이션을 구상하고 설계
    • 초기 개발 생산성, 변경 용이성 등을 관찰
  • 토비님은 튜토리얼을 대략 30번씩 따라해보며, 익숙해지고 응용해본다고 함.
  • 테스트 코드를 작성해보자.
    • 학습 테스트는 기술을 이해하는데 많은 도움이 된다.
  • 토비님은 실제로 스프링을 신규 프로젝트에 성공적으로 도입하였고, 스프링 1.0버전에서 3.2까지 버전 업그레이드까지 해보았다고 한다.

3. 공유와 논쟁

  • 고민과 경험을 정리하는 기회가 꾸준히 필요
  • 글 작성이나 발표와 같은 형식이 도움
  • 학습한 내용/질문/고민 거리 등을 글로 기록하자.
  • 작성이 쉽고 이후에 빠르게 검색이 가능한 도구를 활용하자.
  • 단순한 정리하는 효율이 떨어지고 지속하기 힘들다.
  • 나만의 정리와 설명을 만들어나가는 것이 중요!! (다음 순서로 진행해보자!)
    1. 한 문장으로 정의
    2. 한 문단으로 정리
    3. 5분간 핵심을 설명
    4. 한 시간 동안 예제를 만들면서 설명
    5. 하루동안 진행되는 교육
    6. 인프런과 같은 온라인 강의
  • 공유
    • 블로그 글 작성
    • 커뮤니티, 게시판, 포럼 등에 정보/의견/경험 공유
    • 페이스북, 트위터 등에 가벼운 생각 기록
    • 다른 사람의 글에 의견 달기
  • 세미나, 컨퍼런스 발표
  • 커뮤니티 활동
  • 책 집필