운체조교
3k
2022-07-09 20:56:40
6
1818

기술력을 갖고 싶다면: 공부를 제대로 하세요.


지난번 "겁나 코딩하세요" 글에 관심 주셔서 감사합니다. 오늘은 댓글에 한 분이 지적 해주신 것처럼, 코딩만 해서는 발전할 수 없는 영역에 대한 얘기를 해보려 합니다.


===

1.

학부 때 어찌어찌 하다 연구실에 들어갔습니다. 연구실 선배가 저와 나이차이가 많이 나는 박사과정 막학기셨는데, 저와 대화를 하다 프로젝트와 관련된 과제를 내주셨습니다. 바로 OBBTree 라는 자료구조를 코딩하는 과제였습니다.

PPT - Today PowerPoint Presentation, free download - ID:4674186

OBB Tree는 기하 정보를 저장하는 트리인데, 직관적으로 매우 쉬웠습니다. 삼각형 집합이 있으면 얘네의 긴 방향으로 자르고, 둘로 나눠진 노드들을 또 긴 방향으로 잘라서 최소한의 삼각형 개수 집합 수준으로 나눠질 때까지 반복하는 것이었죠.


그때 저는 코딩에 자신감이 컸기 때문에, 고작 트리 하나 짜는데 얼마나 걸리겠냐며 넉넉히 일주일을 잡았습니다. 그 선배는 제게 한달 정도를 잡으라고 조언을 해주셨고, 실제로는 2달이 지났지만 코드를 짜는데 실패했습니다.


2.

계속 연구실에서 밤을 새면서 논문을 읽고, 수학 책을 보고, 심지어는 이미 나와 있는 코드를 보고도 이해를 못했습니다. 코딩에 자신감이 있던 저에게 있는 코드를 보고도 이해를 못하는 경험은 매우 충격적이었습니다.


그 연구실 형에게 나중에 왜 그 과제를 냈었냐는 질문을 했는데, 돌아온 답은 제가 코드 몽키에 머물지 않았으면 한다는 것이었습니다. 일부러 제가 못짤 것 같은 걸 줘서, 부족함을 느껴봤으면 했다고요. 최소한 저에게는 너무 납득이 되는 과제였습니다.


알고보니 OBBTree를 이해하기 위해서는 선형대수학을 이해해야 했습니다. 그 뿐만 아니라 선형대수학 문제를 코드를 통해 풀 수 있는 수치해석 기법도 가져다 쓸 수 있어야 했습니다. Recursion을 짜면 삼각형의 개수가 너무 많을 때 Stack overflow 가 나니, iterative 하게 recursion을 짤 줄 알아야 했습니다. 시간복잡도에 대한 이해가 필요했고, 중간 계산 과정을 캐싱해 놓는 코딩도 필요했습니다. 전 이때 제가 뭘 모르는지도 모르는 바보였습니다.


이걸 이해하고 OBBTree 의 레퍼런스 코드를 보니 더 가관이었습니다. 파고 들어가다 보면 컴파일 최적화 기법을 이용하기 위한 구문들도 들어가 있었고, 윗단에서는 template meta programming 으로 확장성 있게 다른 볼륨에도 적용할 수 있도록 만들어져 있었습니다. 심지어는 레퍼런스 코드를 컴파일 하려고 해도 몇개의 dependency를 컴파일 해야 했고, 그 난이도가 그 당시 저에게는 쉽지 않았습니다.


마지막으로, 영어 문서를 읽었어야 했습니다. 당시 토익 점수가 330점이었던 저에게는(...) 논문을 이해한다는 것도, 어떤 개념을 영어로 공부한다는 것도 시간을 잡아먹는 요소로 작용했습니다. 이 이후로 한글 문서나 전공책을 버리고 영어로 공부하려고 최선을 다했습니다. 


정리하면 이 기회로 이론과 실제가 다르다는 말은, 이론"도" 열심히 한 사람이 할 수 있는 말이라는 것을 깨달았습니다. 이론을 모르는 사람은 실제 문제의 구조를 볼 수 없고, 실제 문제의 구조를 보지 않으면 때우기 식으로 문제를 해결하게 됩니다. (특히 시간이 급한 경우에는 더욱 그렇죠) 그런 식으로 해결할 수 있는 문제는 보통 쉬운 문제이고, 조금만 난이도가 올라가서 제대로 해결을 해야 하는 상황이 생기면 공부를 제대로 해야만 풀 수 있다는 걸 알게 됐습니다.


3.

이 과제 이후로 공부를 제대로 하려고 노력했습니다. 새로운 프레임워크나 라이브러리를 쓸 때 1차문헌을 읽는 습관이 들었습니다. 1차문헌이 너무 어려운 내용이면 최소한 신뢰할 수 있는 저자의 교과서라도 읽으려고 노력했습니다.


또한 불확실한 문제에 대해서는 동료들과 토론하려고 노력했습니다. 어떻게든 제대로 모르는걸 뭉개지 않고, 조금이라도 제대로 더 알기 위해 설명하는 글을 써보거나, 구현된 오픈소스를 읽어보거나 직접 구현해보거나... 어차피 제대로 알지 못하는건 다시 공부를 해야 한다는 것을 몸으로 배웠습니다.


가장 중요한 것은, 잘하는 사람과 함께 시간을 보내는 기회를 가지려고 노력했습니다. 고수랑은 농담 따먹기를 해도 내가 한달은 걸려야 알 수 있었던 것이 한마디로 나올 수 있다는걸 배웠습니다. (어떻게 고수를 만나는지는 다음 글에서 써보겠습니다. 간단히 말하면 컨퍼런스를 가시는 것을 추천 드립니다.)


4. 마치며


저번 글에서는 어떻게든 코딩을 많이 해라, 즉 시간을 많이 들이라는 잔소리를 했다면, 오늘 글에서는 좋은 방향성을 갖고 노력을 기울이라는 잔소리를 한 것 같습니다.

특히 이쪽 분야는 트렌드가 바뀌기 때문에, 본질을 파악하냐 하지 못하냐에서 시간 소모의 양이 달라집니다. 본질을 파악하는 것은 흔히들 말하는 CS 를 공부하는 것도 있겠고, 시간을 부어서 경험으로 체득하는 것도 있겠습니다. 이 둘 중에 무엇하나 중요하지 않은 것이 없어서... 어렵지만 둘 다 시간을 써야 합니다.


다행인 것은, 우리가 하는 개발은 천재들만의 분야가 아니고, 점점 천재들의 분야가 아니게 되도록 변모하고 있습니다. 어쨌든 현대의 프로젝트는 특정 규모를 넘어가면 협업을 해야 하고, 프로젝트에는 다양한 인재가 필요합니다.

즉, 기본 수준을 넘어간다면 현재 내 기술력이 이상적인 엔지니어의 그것과 비교해서 너무 멀다고 좌절할 필요도 없습니다. 경력 분들은 경험과 이론 둘 다 빠삭한 사람 찾기 정말 어렵다는 것을 공감하시리라 봅니다. 하나라도 잘하면 훌륭한 것입니다. 자신의 자리는 있습니다.

거꾸로, 자기가 기술력을 갖췄다고 안심할 것도 아닙니다. 기술은 빠르게 바뀌니까요.


결국 개발자로서 커리어를 즐기는 가장 중요한 요소는 지속성 있게 이론과 실제를 파는 태도 그 자체에 있다고 봅니다. 그게 된다면, 엔지니어로서 그렇게 걱정할 필요는 없다고 봅니다.

14
9
  • 댓글 6

  • 동탄 초급개발자
    106
    2022-07-15 09:40:13

    안녕하세요  운체조교님 

    운체조교님 글을 쓰신거 잘 보고있습니다.

    글을 읽다보면  멋있고, 닮고 싶다라는 생각을 하고 있습니다

    바쁜 와중에 죄송하면 실례가 안된다면 대화 나눠볼 수 있을까요?


  • 운체조교
    3k
    2022-07-15 12:07:40

    @동탄 초급개발자: huhahahot@gmail.com 으로 연락 주세요!

  • Luna Jay
    127
    2022-07-15 20:16:44

    박사가 기선제압 한거네요..


    인간이란..

  • 매이슨
    130
    2022-07-18 12:06:50

    잘 읽었습니다. 좋은 글 감사합니다.

  • 더닝와이즈
    2
    2022-07-22 07:28:41

    정말 많이공감되고 좋은글입니다.

    이런 멋진 개발자? 분들이 오래동안 일할수있는 환경이 빨리 이루어져야 하는데. 

    다만 천재?들이 평범한 개발자 또는 개발에 취미가 있는분을 위해 기술? 프레임워크? 개발 툴? 등을 만들어 배포하는것에 약간 회의감이 듭니다.

    생산성 측면등 너무 많은 장점이 있지만 오히려 개발자를 안주하게 만들고 개발을 너무 쉽게 생각하는 환경을 만드는것 같아서요.

    물론 저는 감사히 쓰긴합니다만 . ㅋ

    바쁘신 와중에도 경험하신 많은 것을 기록해주시길 바래요. 


  • 솜사탕맛 사과
    49
    2022-07-24 04:03:17

    이렇게 좋은 글을 많이 써주시다니 너무 감사드립니다

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