후하하핫
9k
2021-12-12 14:26:47
20
8582

빠르고 정확하게 공부하는 방법: 가르치기와 1차 자료 보기


박사과정은 빠르고 정확하게 공부를 해야 하는 경우가 많습니다. 일례로, 제가 인턴을 나간 어떤 회사에서는 저에게 2주의 시간을 주며 한번도 해보지 않은 분야의 공부를 하고, 자신들에게 발표해서 가르쳐 달라고 하더라고요. (정확히는 XX 기술의 expert가 되어서 2주 후에 발표해줘! 였습니다…) 제가 각을 봤을 때 내용은 학부 3학점에서 6학점 사이의 사이즈 분야였는데, 어떻게든 2주 안에 공부하고 두시간 분량의 발표를 했던 기억이 납니다. 사실 저 말고 다른 인턴들도 다 해서, 조금 시시한 미션 같이 느껴지기도 했죠.


오늘 글을 읽다보니, 공부 방향이나 방법에 대해 고민을 가지신 분들도 많은 것 같아, 이렇게 효율적이고 정확하게 공부할 수 있는 방법을 남기려 합니다.


0. 공부는 습관적으로, 놀때 하는 것


대학원에 대한 환상을 가지신 분들은 대학원에 가면 뭔가 고급 기술을 가르쳐 주고 공부할 시간을 가진다고 생각하실 수 있는데요, 현실은 다릅니다. Software Engineer와 대학원생을 모두 경험해본 저로서 느끼는 것은, 대학원생은 직장인보다 공부할 시간이 아주 조금 더 많은 수준이고, 같이 토의를 할 수 있는 좋은 동료가 많은 것 외에 시간적으로 차이가 많지 않습니다. 대학원생은 연구를 하는 사람들이지, 공부를 하는 사람들이 아니거든요.

그럼, 내가 언제 공부를 하지? 하고 따져봤는데, 저는 습관적으로 놀 때 공부를 하더라고요. 그냥 쉴 때, 잘 모르겠는 키워드가 있으면 YouTube, Wikipedia, Medium 등등 다양한 곳에 가서 읽어봅니다. 기차로 출장을 갈 때, 할게 없으면 노트북으로 새로운 프로그래밍 언어의 튜토리얼을 따라해 봅니다. 언제나 제 폰의 브라우저에는 읽다 만 트위터와 위키피디아 페이지가 켜져 있고, 팟캐스트에는 기술 팟캐스트가 켜져 있습니다. Slack 과 discord에서는 사람들과 기술 갖고 토론을 하고 있고요.

왜 이렇게 됐지? 를 따져보니, 생각보다 대학원생이든 직장인이든 공부할 시간이 없습니다. 어쩔 수 없이 짬을 내서 공부를 하지 않으면 일을 할 시간이 없습니다. 특히 저는 일을 하는데 시간이 걸리는 사람이라, 일하는 시간을 줄이는데에는 한계가 있거든요.

저는 이게 재밌어서 하지만, 이게 안맞는 분들도 분명 계실건데요, 그런 경우에는 시간을 어떻게 더 낼지를 고민해 보시는게 어떨까 싶습니다.


1. 공부를 하기 위한 기술을 연마하기


공부해야 하는 대상들 중에는 정보를 습득하면 되는 영역 (예: 컴퓨터 네트워크의 프로토콜들) 과 직관을 익혀야 하는 영역 (예: 프로그래밍 스킬) 이 있습니다. 사실 전자의 경우는 그냥 필요한 부분이 있으면 검색을 해보면 되기 때문에, 뭐가 있다 정도의 indexing만 거치면 되지만, 후자의 기술의 경우는 의식적인 시간 투입을 통한 수련이 필요합니다. 저는 이걸 공부하기 위한 기술이라고 부릅니다.


공부하기 위한 기술에는 여러가지가 있는데, 주로 얘기하는게 수학과 영어, 기초과학, 프로그래밍, 알고리즘, 삽질하는 능력 (환경 설정, 구글링 등), 독해, 글쓰기 등이 있습니다. 이건 직장을 다니면서 키우기는 굉장히 힘드므로, 최대한 학교를 다닐 때 잘 다져 놓는것이 효율적이고, 추후에 따라올 수 없는 차이를 만듭니다. 학생 때 디자인 패턴을 배워야 할까 (https://okky.kr/article/1113893) 글에서 디자인 패턴이 공부할 것들 중 우선 순위가 밀리는 이유는 이것입니다. 디자인 패턴은 회사 가서도 할 수 있고, 그게 더 효율적이거든요.


2. 가르치기


사실 실질적인 팁은 이것인데요, 가르치는 것은 매우 효율적이고 빠르게 지식을 습득할 수 있는 공부 방법입니다. 머리로만 생각하는 것보다, 다른 사람을 이해시키기 위해 글이나 말로 어떤 내용을 설명하는 것은 하늘과 땅 차이가 있거든요.


그럼 누굴 가르치냐… 에서는 여러 방법이 있습니다. 저는 제가 강의를 하는 스터디를 많이 만들었고 (특히 2000페이지가 되는 책을 읽고 싶을 때 그 책으로 강의하는 스터디를 엽니다. 그러면 끝까지 읽을 수 있는 책임감을 얻을 수 있죠), 만약 이게 어렵다면 블로그에 글을 올리는 것도 방법입니다. 가끔 블로그를 한다고 하면 그냥 복붙해서 아카이빙 용도로 블로그를 쓰시기도 하던데, 그것도 매우 좋지만 맥락이 있고 완결성이 있는 글로 작성을 해보시면 정확하게 내가 뭘 알고 모르는지를 파악하실 수 있고, 모르는 부분을 채우는 과정에서 큰 성장이 있으실 거라고 생각합니다.


3. 1차 자료 보기


질문을 하나 합시다. 왜 Java는 method라고 부르고 C++은 member function (멤버 함수) 이라고 할까요?


이 질문에는 명확한 답이 있습니다. Java와 C++을 정의하는 표준 스펙(standard specification)에 그렇게 적혀 있기 때문입니다. 언어의 스펙은 ISO와 같은 표준화 단체에 속한 언어를 만드는 위원회에서 학계, 산업계 등의 전문가 단체가 정의하는 언어 그 자체입니다. 이러한 합의되고 공통화 된 스펙이 있기 때문에 다양한 컴파일러가 하나의 언어를 지원할 수 있는 것이죠.


1차 자료란 이러한 언어 스펙과 같이, 어떤 사실의 근거가 되는 첫번째 자료를 의미합니다. 이곳에서 공식적인 용어들이 정의됩니다. 예를 들어 Thinking in Java 와 같은 Java를 다룬 교과서가 있다면, 해당 교과서는 1차 자료인 Java의 스펙을 근거로 사람들이 이해하기 쉬운 형태로 예제와 설명을 추가 했으므로 2차 자료가 되는 것이죠. 가끔 똥같은 책들은 2차 자료들을 근거로 3차 자료를 만들어 오개념을 전파시키는데 일조하기도 합니다.


하지만 1차 자료를 보는 것은 고됩니다. 애초에 설명을 위한 자료가 아니기 때문에 불친절하고, 대부분 페이지도 길죠. 그래서 저의 경우에는 N차 자료를 먼저 보고 (되도록 믿을 수 있는 사람의), 키워드와 대략적인 느낌을 캐치한 다음 불분명한 부분을 N-1 차 자료를 보며 일종의 Depth-first search를 합니다. 이러다 보면 1차 자료까지 가게 되는 경우도 있고 (필요하다면!), 2차까지만 봐도 충분한 경우가 있습니다. 주의하실 것은 정확도가 중요한 상황이라면 꼭 1차 자료를 보시라는 겁니다.


조금 응용을 한 질문을 하면, 토비의 스프링이라는 책은 1차 자료일까요? 답은 아닙니다. 토비의 스프링은 아주 좋은 책이지만, 스프링 프레임워크의 소스코드라는 1차 자료를 기반으로 작성한 2차 자료입니다. 오픈소스를 공부하실 때는 그렇기 때문에 필요한 경우 꼭 소스코드를 까볼 수 있도록 하셔야 합니다. 특히, 국비에서 스프링을 배울 때처럼 N차 자료로 오픈소스를 배운다면, 일단 돌아가니까 쓰긴 쓰지만 이건 100% 정확한건 아닐거라는 생각을 꼭 하셔야 합니다.


개발자로서 회사에서 일을 할 때, 제가 개인적으로 두번째로 마주치기 싫은 스타일의 사람들이 용어를 제대로 쓰지 않는 사람들이고, 가장 마주치지 않고 싶은 사람은 뇌피셜 이론을 참인양 갖고 있는 사람들입니다. 보통 이런 사람들은 1차 자료가 있는지, 그게 뭔지를 모르거나 관심이 없습니다. 근거를 물어보면 아는 형한테 들었거나… 저는 이런 태도가 지식노동자의 직업윤리에 반하는 행동이라고 생각합니다. 내 코드가 작동하는 근거가 아는 형이라뇨.


4. 마치며


오늘은 공부하는 방법에 대한 이야기를 해보았는데요, 분명히 위 방법들이 쉽지 않습니다. 바로 되지 않으실거고, 저도 이런 공부 방법을 익히는데 몇년의 시간이 필요 했습니다.

그럼에도 불구하고 이런 방법에 대해 공유를 한 이유는, 최소한 이런 방법들이 있고, 생각보다 많은 전문가들은 이렇게 공부한다는 것을 알려드리고 싶은 것과 더불어, 읽으시는 분들 중 자신이 없으신 분들도 꾸준히 긴 시간을 투입해서 연습하시면 언젠가는 빠르게 공부할 수 있게 되실거라는 말씀을 드리고 싶었습니다.

화이팅하세요!

55
86
  • 댓글 20

  • 케누사생팬
    39
    2021-12-12 14:45:47

    좋은 글 감사합니다

  • 19학번이유진
    84
    2021-12-12 16:14:25

    항상 좋은 글 감사합니다. 멘토님

  • 김룰룰룰
    646
    2021-12-12 17:24:42

    레퍼런스 자료를 보면 그 내용을 정확히 이해했다는 전제 하에 잘못된 것을 공부했을 리 없다는 확신을 할 수 있어서 한 번 공부하고 정리해 놓은 후에는 더 편한 것 같습니다.

  • Tejava_
    855
    2021-12-12 18:31:38

    메서드와 멤버함수에 대해 표현 방식의 차이일 뿐이라고 여기고 별 다른 고민을 해 보지 않았는데 글을 보고 문득 검색을 해보니 이 부분에 대해서 꽤나 차이점을 궁리하신 분들이 많으신군요 ㄷㄷ

    가장 공감 수가 높은 코멘트가 이거 같은데... https://stackoverflow.com/questions/155609/whats-the-difference-between-a-method-and-a-function

    본문과 비슷한 맥락에서 말하자면 깊고 넓게 아는 사람일수록 정의에 대해 깐깐한 것 같더라구요 모르는 사람일수록 이게 그거 아녀? 아녀? 뭐여 같은 말이구먼 머~ 하구요 ㅎㅎ

  • 아이스아메리카노
    2
    2021-12-13 11:43:19

    후하하핫 님 글 잘 보았습니다.

    말씀하신 내용중에 

    공부하기 위한 기술에는 여러가지가 있는데, 주로 얘기하는게 수학과 영어, 기초과학, 프로그래밍, 알고리즘, 삽질하는 능력 (환경 설정, 구글링 등), 독해, 글쓰기 등이 있습니다. 이건 직장을 다니면서 키우기는 굉장히 힘드므로, 최대한 학교를 다닐 때 잘 다져 놓는것이 효율적이고, 추후에 따라올 수 없는 차이를 만듭니다.

    다른건 이해가 가는데 여기서 말씀하신 프로그래밍이라는 것은 무엇을 의미할까요? 디자인 패턴은 아닌 것 같은데, 언어의 기본 문법을 말씀하시는걸까요?

    좋은 글 항상 잘 보고 있습니다.

    감사합니다.

  • 후하하핫
    9k
    2021-12-13 12:06:03

    @아이스아메리카노: 좋은 질문 감사합니다.

    말그대로 프로그래밍 스킬을 말합니다. 생각한 내용을 코드로 옮길 수 있는 능력, 내 코드와 다른 사람의 코드를 읽고 이해하는 능력 등등… 여기 계신 분들은 이미 잘 하시는 부분이죠 ㅎㅎ

    구체적으로 말씀 드리면 문법보다는 언어 그 자체에 가깝습니다. 프로그래밍을 많이 하다보면, 이것도 언어인지라 코드에 뉘앙스도 있고 느낌도 있는데, 문법에 맞춰서 쓰는 것은 당연한 것이고, 이런 언어적인 감을 읽고 쓸 수 있도록 되는게 중요합니다. 이렇게 되려면 코딩을 겁나 많이 해봐야 할 필요가 있겠죠?

    그 외에도, 규모가 큰 코드를 짜본 경험을 갖추면 좋습니다. 오픈소스에 기여하는 것도 매우 좋고, 저의 경우에는 학부 때 10만줄 이상이 되는 프로그램을 scratch 부터 작성해 본 일이 있는데, 이때 규모가 큰 코드를 관리하는데에 대한 통찰이 싹텄던 것 같습니다.

    마지막으로 다양한 언어를 해보시길 권합니다. 모든 언어와 언어의 feature들은 필요에 기반하여 수많은 논의 끝에 만들어지는데, 이 필요들을 느끼는게 매우 중요하다고 생각합니다. 왜 garbage collection이 생겼고, 왜 Java generic 은 upper bound까지 up casting 을 하는 방식으로 구현 되는데, C++의 template 은 code generation을 통해 구현했는지, 왜 Go는 unit test를 주석에 달아 놓게 했을지, Rust는 왜 pattern matching을 넣었는데 legacy 언어들은 이게 왜 안되는지, C++ 19에 concept이라는 개념이 왜 들어가고 등등… 이런 필요를 느끼려면 코딩을 진짜 많이 해봄과 함께 다른 사람들의 코드를 많이 읽어볼 필요가 있습니다. 이렇게 경험이 쌓인 후에 프로그래밍 언어론 책을 훑어보면 내가 감으로만 느끼던게 이렇게 개념화가 되어 있었구나, 하고 문득 느끼게 되더라고요.


    도움이 됐길 바랍니다!

  • 게미안
    11
    2021-12-14 11:49:57
    우연히 보게 됐는데, 1, 2, 3 번 어느 하나 버릴게 없는 좋은 말씀 같습니다. 더불어 말씀하신 내용을 혼자 하기 어렵다면 주변에 관심 있는 동료를 찾아 보라는 말을 추가 하고 싶습니다. 
  • hoon Cli
    110
    2021-12-16 14:39:51
    선추천
  • 개발정복
    2k
    2021-12-16 15:40:40 작성 2021-12-16 15:41:16 수정됨

    결국 사람이 만든 코드라 문제가 있을수 있다는 의심해보는 자세도 중요하다고 생각합니다.

    하지만 배울게 넘쳐나죠(잘못 알려져 있는 정보 혹은 해석들도...)

    개발 진영간의 정책도 있겠죠 - 누가 맞고 틀리다가 없는 부분

  • clr
    59
    2021-12-22 17:30:26 작성 2021-12-22 17:34:13 수정됨

    https://okky.kr/article/1125311 에서 넘어와서 글을 남깁니다.

    가르치기에서 저는 제가 책을 쓴다는 기분으로 정리를 합니다. 그러면 하나의 흐름에서 파편화된 지식이 정리되어서 이해가 잘 되더군요.


    1차 자료 보기 부분에서 뼈아프네요. 생각해보면 실무에서 논쟁이 붙을 때 누가 맞는지 판결을 내려주는 것이 1차 자료였습니다.

    좀 더 의식적으로 1차 자료를 보기 위해 노력해야겠습니다ㅎㅎㅎ

  • 곤조
    41
    2021-12-22 19:01:37

    선생님 글을 국비 초반부터 봐왔었는데 많은 도움이 되었습니다 감사합니다

  • 무명소졸
    6k
    2021-12-23 12:34:09
    Real Senior Engineer
  • Fullstacknology
    12
    2021-12-26 16:26:31

    1차 자료 보기라.... 생각지도 못 했네요... 덕분에 좋은 식견 얻어 갑니다. 감사합니다~!

  • 제노엔
    10
    2021-12-27 07:14:14

    아침부터 엄청 공감되는 좋은글 읽어서 기분이 너무 좋네요! 좋은글 감사합니다!

  • 애아빠
    2k
    2021-12-28 10:48:27

    '공부는 습관적으로, 놀때 하는 것' 에서 많은 공감을 해봅니다.

    저도 돌이켜보면 그렇게 짬을 내어 공부를 자주 했던 거 같습니다.


    추가적으로, 저는 시간을 내어 깊게 긴 시간 동안 고민하고 시행착오를 겪으며 코딩해보는 것도 아주 중요한 것 같습니다.

  • 알레그레스
    109
    2021-12-31 09:17:26

    후하하핫 


    안녕하세요

    글 너무 감사히 잘 읽었습니다.

    그런데 1차자료라는건 문맥상 알 것 같지만

    정확하게 그게 무엇인지는 모르겠습니다.

    그런건 어디에 나와있는건가요?


  • 후하하핫
    9k
    2021-12-31 09:28:21

    @알레그레스: 얻고자 하는 지식에 따라 다릅니다.

    대부분의 기술들은 누가 만들었고, 그 만든 내용을 어떤 과정을 통해 publish 했다는 것이 명확합니다. 예를 들어서 C언어는 Denis Ritchie 가 만들었고, 그 언어를 publish 한 방식은 The C Programming Langauge 라는 책을 통해서 이루어 졌죠. 하지만 그 이후에 ANSI나 ISO에 의해 표준화 규격이 만들어 졌고, 그 이후부터는 C 언어를 만드는 사람은 Bell Labs의 Denis Ritchie가 아닌 C언어의 표준화 위원회이기 때문에 위원회가 정의한 표준화 규격이 1차 자료입니다.

    이와 같이 HTML, CSS, HTTP, JavaScript 같은 표준의 경우는 표준화 스펙이 1차자료입니다. https://html.spec.whatwg.org/multipage/ 이런 식으로 표준 스펙이 있습니다. 구글에 HTML specification 이라고 검색을 해보시면 나올겁니다.

    오픈소스 프로젝트의 경우에는 오픈소스 소스코드 자체가 1차자료입니다. 예를 들어 Spring framework의 1차 자료는 https://github.com/spring-projects/spring-framework 이러한 코드들인 것이죠.

    개념에 대한 1차 자료는 논문이나 테크니컬 리포트 같은 형태의 문서로 되어 있습니다. 예를 들어서 Quicksort 알고리즘의 1차 자료는 Hoare 가 The Computer Journal 에 제출한 http://rabbit.eng.miami.edu/class/een511/quicksort.pdf 논문이 1차 자료입니다. 다만, 개념에 대한 정립이 이미 끝난 후라면 굳이 1차 자료를 꼭 논문까지 볼 필요는 없다고 생각합니다. 후대에 정리가 되면서 더 교과서에 깔끔하게 정리가 되어 있으니까요. 하지만 아직 개념적으로 정립이 되지 않은 분야는 1차 자료를 볼 필요가 있습니다.


    더 궁금하시거나 이해가 어려우신 부분은 댓글 주세요!

  • OKKY
    4k
    2022-01-01 02:41:23
    해당 게시물은 관리자에 의해 사는얘기에서 칼럼로 이동 되었습니다.
  • 호롤롤루
    203
    2022-01-03 11:42:48

    항상 좋은 얘기 감사합니다~

  • 도마도맛있당
    28
    2022-01-03 18:53:54

    너무 좋은 말씀 감사합니다!

  • 로그인을 하시면 댓글을 등록할 수 있습니다.