알고리즘과 딥러닝을 공부하는 주니어 개발자의 개인적인 생각입니다.

반말인점 죄송합니다.

프로그래밍을 공부하는 이유는 다양하다.

  1. 취업이 있을 수도 있고,
  2. 해당 분야를 리서치하고 싶을 수 있고,
  3. 단순히 도구로 사용할 수도 있다.

나는 2에 가깝다. 공부하면서 계속 궁금증들이 생기고 이를 탐구하는 과정이 즐겁다. 그리고 즐거움은 지속적인 성장에서 나온다.

One of Them이 아닌 One & Only로 성장하기 위해 내 프로그래밍 공부 단계를 4단계로 구분하여 생각한다.

공부의 4단계

프로그래밍 공부를 4단계로 나누어 생각한다.

  1. 큰 주제를 알아가는 단계
  2. 문제와 필요한 기능(알고리즘)을 매칭할 수 있는 단계
  3. 필요한 로직을 구현하는 단계
  4. 이론을 탐구하고 소통하는 단계

1. 큰 주제를 알아가는 단계

큰 흐름을 아는 게 시작이다.

다음은 프로그래밍을 시작하는 뉴비들이 커뮤니티에 하는 대표적인 질문이다.

개발(보안 또는 딥러닝) 공부 시작하려는데 뭐부터 해야 하나요?

저렇게 질문하면 일단 답변하기가 싫다. (선생님, 친한 지인, 친절한 개발자분들이 종종 답변해주긴 한다. 답에 대한 적절한 보상을 할 게 아니면 저런 질문은 하지 말아야 한다.)

대다수의 개발자는 호의적인 답변을 하진 않을 거라 생각한다. 그 이유는 여러 가지가 있을 것 같다.

  1. 너무 큰 주제로 질문하면 부담스럽다. 개발 전체를 안다고 할 수 있는 개발자가 있을까
  2. 저런 질문은 최소한의 성의도 없고, 실제로 공부하고 싶은지 의문이다.
  3. 어디까지 떠먹여 주길바라는 걸까

저런 질문은 해당 주제로 구글/유튜브에 검색해서 조금이라도 찾아보면 자료가 많다. 아니면 시중에 파는 관련 책 아무거나 한 권 사서 봐도 기본적인 이해는 할 수 있다.

주제가 세분될수록 자료가 부족해지고 본인의 경험에 따라 이해가 부족할 수 있다.

그럴 때도 바로 질문보다는 본인이 찾는 능력을 기르기 위해 최소한의 도움만 받자.

~ 문제를 해결하고 싶은데, 어떤 키워드로 검색해야하나요?

공부는 혼자 하는 시간이 절대적으로 많기 때문에 키워드를 아는 연습은 중요하다. 이렇게 키워드를 익혀나가는 과정을 통해 하고 싶은 task의 큰 흐름을 찾을 수 있다.

문제를 알기 시작하면 보통 2가지 스타일로 나뉜다. (나뉘면 안 되고 병행해야 하는데 보통 나뉜다.)

  • Top-Down 스타일 : 이론부터 훑자. 전체적인 (문제, 알고리즘) 쌍들을 흩는다. 논문/책 등을 읽는다.
  • Bottom-Up 스타일 : 일단 기초부터 해보자. 기초부터 하나씩 연습하기 시작한다.

그래도 둘 중에 먼저 하는 건 Top-Down을 추천한다. Bottom-Up을 하는 분들은 기초하다가 -> 잠시 쉬다가 -> 까먹었으니 -> 다시 기초를 반복한다.

수학의 정석 집합 마스터가 되고 싶지 않다면 전자를 추천한다.

2. 문제와 필요한 기능(알고리즘)을 매칭할 수 있는 단계

큰 흐름을 아는 건 중요하다.

xx task에서 xx를 하는 데 xx를 써도 될까

이 질문의 답을 찾는 과정에서 프로그래밍의 시각이 넓어진다. 그리고 task와 알고리즘을 매칭할 수 있다면 검색 해서 찾아보고 구현하면 된다.

검색해서 얻을 수 있는 소스로는 대표적으로는 책과 논문들이 있고, 키워드만 적절하게 넣으면 튜토리얼/오픈소스들도 깃헙에 많다.

단, task와 알고리즘 매칭할 수 있다고 해서 이게 내 지식인가와은 다른 문제다.

해외 축구를 보며 분석하는 xx은 과연 축구를 잘할까 (아 저기서 오른쪽에 패스해서 공간을 만들었어야지)

과연 축구 분석을 잘한다고, 축구를 잘 하는 걸까? 축구선수에게 축구 실력에 있어 분석 능력은 도움이 되겠지만, 분석만 하는 사람은 선수가 아니다.

하지만 개발자의 목표는 칼럼니스트가 아니라 플레이어다. 분석도 하면서 직접 뛸 줄 알아야 한다.

잘 아는 것잘하는 것을 구분하자.

3. 필요한 로직을 구현하는 단계

잘하기 위해서는 이론과 구현(실험)을 병행해야 한다.

구글이 인공지능 비서를 만들었다고 해서 국내 기업이 바로 적용할 수 있는 건 아니다. 구현해보지 않은 분들은 SOTA(Stat of the Art)기술을 ‘적용’만 하면 되는 줄 안다.

‘BERT쓰면 자연어처리 문제들에 잘 된다니까 해보자.’ ‘딥러닝으로 이거 된다니까 이걸로 아이템을 만들어보자.’

여러 상황에서 저런 말들을 봤다. 보통 마음이 급한 사람이나 ‘높은’ 사람들이 저런 이야기를 많이 한다. (할많하않)

해결방법은 설득밖에 없다. (그리고 설득은 실력과 인품에서 나오니 둘 다 노력하자.)

그래서 나도 많이 아는 것처럼 적어논 사람보다 실제로 해본 사람을 선호한다. toy project를 진행한 사람, 서비스에 올려본 사람 등이 가치 있는 이유다.

종종 필요하면 하겠지~ 의 마인드가 생기는데, 이건 못한다+모른다와 같다.

구현할 때도 그 의미를 생각하면서 진행하면 좋다. 반복된 내용은 기계적으로 빠르게 하는 건 능력이다.

하지만 아직 손에 익지 않았다면 Ctrl+CV가 아니라 왜 되는지 음미하고 고민하는 과정을 거치면 좋다. 같은 방법도 다르게 구현해보거나, 더 빠르게 할 수 있는 방법은 없는지 등등..

단순 반복은 언젠가 인공지능에 대체되지 않을까??

운동할 때, 춤을 출 때 나를 지도한 선배나 선생님들은 ‘느낌’ 을 기억하라고 한다. 공부도 마찬가지다.

4. 이론을 탐구하고 소통하는 단계

기본들은 123 과정에서 쌓이고, 본인의 장점은 여기서부터 쌓는 거다.

  • 현재 프로세스의 효율성 및 증명 고민
  • 라이브러리를 파라미터별로 뜯어보기
  • 기존 방법론과 차이점을 살피기
  • 다른 사람들이 해당 분야를 이해하는 방식 살피기 (다양한 도메인 사람 만나기)
  • 타 분야와 연관성 고민 (ex. 이미지 <-> 오디오)
  • 배포 및 서비스 고민
  • 할 수 있는 것과 없는 것 구분하기

본인의 가치를 높이기 위해서는 끊임없는 노력이 필요하다.

적어도 내가 존경하는 개발자분들은 이런 과정들을 위해 노력하고 있다. 그리고 실력만 기르지 말자. 1인 개발자도 많지만, 대다수는 협업이 필요하다.

실력은 디테일에서 나오고, 효율은 소통에서 나온다.

빨리 가려면 혼자 가고 멀리 가려면 함께 가라

나는 과연 잘하고 있는가?

저렇게 단계로 나누지만 저 위는 실력적인 내용이 위주다. 나는 2가지를 항상 생각한다.

  1. 실력
  2. 즐거움

실력으로의 공부

나는 과연 1234 과정을 성실하게 따랐는가? 절대 그렇지 않다.

잘 아는 것잘하는 것을 구분하지 못했던 학부생이었다. 2번에 자주 빠져있었다. 그렇기에 상을 탈 수 있었던 대회들도 많이 기회를 놓쳤다. 구현도 많이 했고, 세부적인 내용도 탐구하는 시기가 있었지만 2에 만족하는 경우가 많았다. (심지어 잘 알지도 못함..)

회사에서 모델을 구현하고 실험하면서 난 3/4에 가지 못했구나를 알았다.

조금 더 덧붙이면 많은 분이 내 실력을 현실보다 높게 여기는 경우가 많다. 열심히 글을 쓰고 활동하면서 PR이 된 것 같다.

하지만 PR은 개발자로써 필수겠지만 그렇다고 거짓을 팔아서는 안 된다고 생각한다. 거품이 과하면 거짓이 된다. 거품을 없애기보다는 거품을 실력으로 채우도록 노력하자.

그리고 현재 해야하는 일이 있는데 좀 미루고 있었다. 공부랑 일은 좀 다르긴 한데 이것도 열심히 해야지.

즐거움으로의 공부

난 어릴 떄부터 공부가 즐거웠다. 아마 하고싶은 공부만 하고 잘해서 그럴 수도 있다. 고등학교를 졸업하고 온전한 즐거움으로 했던 공부하는 설렜다.

나한테 공부에서 1순위는 설렘을 잃지 않는거다.

그래서 공부를 즐겁게 할 수 있는 방법을 고민한다. 다양한 방법으로 시도해보는 중이다.

  1. 나는 짧은 시간내에 타임어택으로 무언갈 하는 걸 못한다.
    • 알고리즘에서는 CP를 못했고, 학교를 다닐 때 시험을 볼때면 손 떨면서 시험을 봤다.
    • 그래서 알고리즘은 후배들과 이 분야의 사람들에게 좋은 환경을 만들기 위해 노력했다.
    • 시험은 그냥 신경을 껐다. 그래서 4년간 즐겁게 학교 다녔다.
  2. 나는 공부에서 호흡(집중력)이 짧다.
    • 그래서 컴퓨터 앞에 앉아있는 시간을 늘렸다.
    • 일을 동시에 하는 경우가 많다. 개발에 기능 1, 기능 2가 있다면 1과 2를 번갈아가면서 개발한다.
    • 놀면서 일해도 일할 수 있게 적응한 부분들이 있다. 영화나 티비 틀어놓고 글쓰거나 자료를 만든다.
  3. 가벼운 성과를 즐긴다.
    • 여전히 캐글에서 노트북에 1 upvote 생기면 기분이 좋다.
    • 물론 페이스북 페이지 글들의 upvote도 즐긴다.
    • baseline 돌아갈 때 쾌감도 좋다.
  4. 메인으로 하는 일 이외의 공부를 종종 한다.
    • ps는 접었지만 종종 알고리즘 문제를 푼다.
    • 캐글에서 시각화 노트북을 조금씩 수정한다.

성장하면서 즐거운 것도 있지만, 잘하면 더 쉽게 즐길 수 있다. positive feedback 관계랄까

마무리

최근에 영화 세 얼간이를 연일 2번 봤다.

가장 좋아하는 장면은 가짜 단어를 주고 30초안에 단어를 정의하는 장면이다. 주인공 란초는 이 장면에서 다음 말을 한다.

제가 질문을 드렸을 때 설렜나요? 호기심이 생겼나요? 새로운 걸 배운다는 사실에 흥분됐나요?

아니요. 모두들 미친듯이 레이스만 펼쳤죠. 이런 방식이 무슨 소용 있나요? 만약 제일 먼저 풀었다고 해도 그게 지식을 늘게해주나요? 아니요. 스트레스만 주죠. 여기는 대학입니다. 스트레스 공장이 아니죠.

이정도의 단계에 도달하고 싶다.

공부를 하기 싫은 순간도 많지만 설레는 순간이 많기를 바라며 노력해보자!

Leave a Comment