기간 | 2019.01.17-2019.02.28 |
목표 | 데이터 수집 기술 조사 및 툴 만들기 |
언어/라이브러리 | Python/BeautifulSoup, Urllib, Requests, Pytube, Selenium, Csv, Tqdm, cv2, Numpy, Moviepy(ffmpeg) |
1. 계기
2학년을 마치고 나서 나는 여러 가지 의문을 가지고 있었다.
'과연 학교에서 배우고 있는 전공 과목들이 실무에서도 쓰일까? '
'대학에서 필요한 공부 따로, 회사에서 필요한 공부 따로 아닐까?'
'회사에 가서 제대로 일하지 못하면 어떡하지?'
같은 여러모로 불안감에서 파생된 의문이었는데,
'뭐 어떻게든 되겠지'라고 가볍게 생각하고 넘어가기에는 무거운 고민이었다.
그러던 도중 과 홈페이지에 인턴십을 모집하는 공지가 올라왔고 나는 지원을 결심하게 됐다.
1. 개발? QA?
처음에는 개발 실력에 자신이 없어서 QA로 지원하려고 했다. 지금 생각해보니 QA도 그런 마음으로 가면 제대로 하지 못할 것이 분명하지만, 당시에는 그렇게 생각하고 지원을 위해 교수님의 연구실에 찾아갔다. 교수님께서 인턴십을 지원하게 된 동기에 대해 물어보셨을 때 나는 내가 가지고 있는 생각을 솔직히 말했다.
'지금 대학에서 배우고 있는 전공 과목이 정말 회사에서 필요한 지식인지,
회사에 가서 한 사람 몫을 제대로 해낼 수 있게 될지 궁금하다.
그런데 개발 직무로는 도저히 지원할 자신이 없다.
지원자에게 필요한 역량도 전혀 없고, 제대로 해내지 못할 것 같다'
교수님은 그런 마음으로는 QA에 지원해도 원하는 결과를 얻을 수 없을 거라고 말씀하셨고, 우선 개발 직무로 지원해보는 게 어떻냐고 하셨다. 면담을 마친 뒤 혼자 다시 생각해보니 내가 얻고 싶은 것은 개발 직무로 일을 했을 때 얻을 수 있는 것이었다. 애초에 개발도 해보지 않았는데, 내가 개발을 잘할 수 있을지 없을지 어떻게 알겠는가. 그건 남들 개발하는 것만 구경한다고 알 수 있는 게 아니다.
그렇게 나는 스타트업의 개발 인턴 직무로 지원하게 되었다. 인턴을 마치고 나서는 학업으로 복귀해야 하니까 방학 기간 내에 마칠 수 있는 것으로...
2. 돈은 필요 없으니 일단은 맡겨주세요
이제 갓 2학년을 마치고 업무 관련 지식이라곤 하나도 없기에 탈락을 각오하고 냈던 서류에서 합격 소식을 받고, 나는 두근 거리는 마음을 감추며 면접을 보러 갔다.
대표님과의 20분 가량의 짧은 대화를 나누고, 만약 합격을 하게 된다면 함께 일하게 될 연구소장님과 면접을 보게 됐다.
기술 관련 질문에는 대답을 하나도 못하고, 과거에 작성했던 코드를 보여달라는 말에는 1년도 넘게 전에 작성했던 학교 정규 교과목 프로젝트에서 진행했던 결과물을 보여드렸다. 내가 봐도 엉망진창인 코드에서 박사님은 이 코드의 어디를 고치면 개선할 수 있을 거냐고 물어보셨고, 어떻게 개선을 할지 이야기하며 면접을 진행했다.
사실 면접 내용은 정확히 기억이 안난다. 다만, 면접이 끝나갈 때쯤 완전히 '탈락을 하겠다!'라는 감이 왔고 그때 박사님께 드렸던 말씀이 기억이 난다.
'오늘 이후로 다시 뵙게 될 일이 없을지도 모르겠지만, 그래도 오늘 불러주셔서 덕분에 많은 것을 배웠습니다. 제가 어느 부분이 부족한지, 앞으로 어떤 부분을 공부해야 할지 알게 됐고 코드를 바라보는 관점에 대해서도 배우게 됐습니다.
전혀 믿음직스럽지 않을 수도 있겠지만, 저는 코딩테스트나 이런 (기술) 면접보다 실제 프로젝트에서 강합니다. 돈은 필요 없으니까, 업무를 위해 필요한 지식이 요구되는 과제라도 하나 주시면 안 될까요? 반드시 내일까지 해오겠습니다.'
과제를 내주시는 것도 시간이 필요하고 그걸 확인하시는 것도 시간이 걸릴텐데, 당시 나는 '꼭 이 일을 해야겠다', '기회가 필요하다'는 생각으로 가득 차서 무례한 부탁을 드렸다. 박사님은 내 말에 잠시 기다려보라고 대표님과 이야기를 하고 오겠다고 하셨다.
그리고 약 5분간 기다리니 대표님이 나오셔서 박사님이 같이 일하고 싶다고 하셨다고 언제부터 일할 수 있냐고 물어보셨다. 나는 '내일이요'라고 말씀드렸고, 그렇게 내 첫 인턴 생활이 시작됐다.
2. 과정
1. 공부
첫 출근을 했을 때, 박사(연구소장)님은 논문을 주시면서 여기에 나와있는 기능이 필요하다고
(1) ㅇㅇ, ㅇㅇㅇ와 같은 요구 사항을 만족하는 데이터 수집툴을 만들어줬으면 한다.
(2) 우선은 10만개(정확한 개수는 기억이 안 나지만 우선 10,000개는 넘는 수였으니까 10만 개 즈음으로 추측한다) 정도를 목표로 하면 좋을 것 같다.
라고 하셨다. 그런데 문제는 박사님이 설명하신 내용이 내가 전혀 모르는 용어들로 가득 차 있었다는 거고, 설명을 들을 때 뭐가 중요한지 몰라 엉망으로 받아 적었고 이로 인해 나는 후에 시행착오를 크게 하게 된다.
아는 건 없지만, 일단 맡겨주면 할 수 있다고 했으니 어떻게든 일을 성공해내야 했다. 그래서 나는 우선 속성으로 데이터 수집 기술을 조사하기 위해 웹 크롤링 강의를 들었다.
이 강의인데 업무 시간은 일을 하는 시간이지, 공부를 하는 시간이 아니라고 생각했기에 퇴근을 하고 강의를 들었다. 다음 날 좀 더 자세히 설명을 해준다고 하셨기에 하시는 말씀을 이해할 정도로는(용어를 알아들을 정도로는) 공부를 해야 한다고 생각했고, 결국 밤을 새우고 출근을 하게 됐다.
물론 잠을 자지않은 보람이 있게 다시 설명들은 업무는 충분히 이해가 됐고 나는 개발을 시작했다.
# 빵
스타트업의 장점 중 하나는 유연하다는 것이라고 생각한다. 나는 출근할 때마다 빵을 사 왔다. 오전에 개발을 하고, 점심시간에 밥을 먹으러 가지 않고 빵을 먹으면서 공부해야 밤에 잠을 30분이라도 더 잘 수 있을 거라고 생각했기 때문이다. 그리고 오후에 박사님이 진행상황을 확인하고 피드백을 해주시기 때문에 어떤 질문을 할지도 결정을 해야 했다.
# 야근?
나는 딱히 야근이라고 생각하지 않았지만, 직원 분들은 내가 맨날 야근을 한다고 생각하셨다. 공부를 하고, 시행착오를 하다보니 집으로 가는 것도 귀찮아지기도 했고 퇴근 시간에 지하철을 타면 앉아서 집에 가지 못했기 때문에 8~10시까지는 남아있는 게 편했다. 특히 박사님이 업무 시간이 끝나고 나서는 조금 더 여유로워지시기 때문에 많은 질문을 할 수 있어서 좋았다. 그런데 지금 생각해보니 나한테 맨날 야근한다고 하신 건.. 다른 분들도 맨날 야근을 하셨다는 거였다.
2. 피드백과 개선
# 컴퓨터 구조 # 소프트웨어 개발 방법론
나는 정말 좋은 곳에서 첫 개발 경험을 했다고 생각한다. 며칠에 한번씩 박사님은 회의실을 대여해서 CS 기초 지식에 대해 설명해주셨다. 컴퓨터 구조에 대해서도 설명을 해주신 적이 있는데, 여기에는 정말 잊을 수 없는 추억이 있다.
처음 나는 프로그램의 프로세스를
(1) 크롤러 : 동영상 다운로드 시작(외장하드로 저장)
(2) 전처리(외장하드에서 파일 읽어와서, C드라이브에 있는 폴더... 각종 요구사항 처리)
(3) 전처리가 된 파일을 외장하드로 이동
(4) 크롤러 : 자막 파일 다운로드 시작
(4) 외장하드에 다운로드 받은 자막 파일 전처리
(5) 다운로드 받은 파일 정보 업데이트(csv)
(6) 크롤러 : 다음 동영상 다운로드 시작
이런 식으로... 정말 엉망진창으로 구현했다. 그러다 보니 당연히 프로그램이 동영상을 다운로드하고 처리하는데 걸리는 시간은 길었다. 그리고 내 코드를 읽으신 박사님은 나에게 컴퓨터 구조에 대한 강의를 한 시간가량 해주셨다ㅋㅋㅋ. 캐시가 왜 빠른 지부터 해서 실전에서부터 이론까지 설명을 대략적으로 해주셨고 이때부터 나는 요구사항만 대충 만족하는 프로그램을 만들 때는 CS 기초지식이 필요없을 수도 있겠지만, 제대로 된 프로그램을 만들려면 꼭 필요하다는 것을 깨닫게 되었다.
물론 프로그램의 프로세스도 개선했다. 간단히 설명하자면 동영상, 자막을 내장하드로 다운로드하고 전처리가 완료되면 우선 내장 하드로 저장해두었다가, 파일들의 용량이 일정 량 이상이 되면 외장하드로 이동하는 방식으로 개선했고, csv 파일은 프로그램이 돌아가는 곳에 같이 두었다.
당시 요구사항을 모두 구현 한 뒤 프로그램을 보여드리고 피드백을 받았던 거라서 구조를 아예 갈아엎어야 했는데, 이때 소프트웨어 개발 방법론에 대한 설명도 들었다. 전공과목은 정말 피와 살이 된다는 것을 알게 됐다.
# 네트워크 # HTTP통신
다운로드 요청을 하다가 중단되는 경우도 있었는데, 이에 대해 물어봤을 때는 크롤링의 간격이 너무 짧아서 호스트에서 크롤러의 중단을 요청해서 그런거라는 답을 받았다.
그러고 나서 나는 크롤링에 대한 책을 찾아보면서 robots.txt의 중요성과 크롤러는 정보를 제공하는 웹 사이트가 의미가 있는 프로그램이기에 대상 웹 사이트에 피해를 끼쳐서는 안 된다는 것을 깨달았다. 이론적으로야 알고 있었지만.. 직접 겪게 되니 여러모로 많은 게 느껴졌다.
그렇게 나는 크롤링을 할 때 지켜야 하는 매너, robots.txt를 다루는 방법에서부터 최대한 피해를 주지 않고 크롤링을 하는 방법을 공부하게 되었다(페이지가 변경이 되었을 때만 크롤링하거나, 크롤링을 하지 않을 수 있으면 하지 말기 등 -> API, XML...).
# 그 외에도
데이터 전처리를 할 때도 문제가 있었다. 이건 여러모로... 라이브러리를 그저 가져다쓰는 것밖에 몰랐기에 발생한 문제였다. A라는 라이브러리가 a부터 c까지의 기능을 제공하는데 난 d가 필요하면, 나는 d라는 기능을 제공해주는 B 라이브러리를 사용했었다. A의 a-c기능을 사용해서 d 기능을 충분히 구현할 수 있는데 말이다😅. 그러다 이래저래 코드도 너무 복잡하고 프로그램 동작 속도도 너무 느려져서 결국 사용하는 라이브러리가 어떻게 구현되어있는지 코드를 분석하고, 내가 어떤 식으로 활용하면 사용하는 라이브러리 개수를 줄일 수 있을지 고민하면서 코드를 수정했고 결국 원래 속도보다는 훨씬 빨라질 수 있었다(동영상 처리할 때 1초에 60 프레임-재생 속도에 맞춰서-만 처리를 했었다... 정말 이건 라이브러리 가져다 쓰기만 했던 수준.. 나중에라도 문제가 있다는 것을 깨닫고 고쳐서 정말 다행이었다).
4. 인수인계
# 클린코드 # 리팩토링
인수인계 자료를 준비하면서 나는 내가 코드를 엉망진창으로 짰다는 것을 알게 됐다. 코드는 함수로도 묶여있지 않고, 그저 쭉 기능이 구현이 되어있을 뿐이었다. 이를 박사님께 말씀드리자 클린코드라는 책을 추천해주셨고, 책을 읽으면서 읽기 좋은 코드란 뭘까 고민을 하게 되었다.
마지막 날까지 하루이틀이 남은 시점이었기에 많은 부분을 수정 하지 못했지만 반복되는 부분은 함수로 묶고, 변수명을 수정했다.
당시에는 SUBLIME EDITOR로 개발했었는데, 지금 생각해보니 PYCHARM으로 개발했으면 훨씬 좋았을 것 같다. 적어도 PEP 8 스타일에는 맞춰주니, 변수명이 엉망이라서 고생했을 일은 없었을 테니...
3. 결과
여러모로 많은 것을 배웠다.
다만, 지금 생각해보니 다른 것은 컴퓨터 비전에 관심이 생긴 것이 아니라 데이터 엔지니어링, 백엔드 프로그래밍에 관심이 생겼다는 거! 연구실 생활을 하면서 알게됐다. 컴퓨터 비전이 좋은게 아니라, 데이터가 좋은거였다...!
4. 평가표 & 느낀 점
학교를 통해 진행했기에 인턴을 마치고 평가표를 받을 수 있었다. 70점 이상을 받아야 통과였는데 다행히(놀랍게도) 96점을 받아 가뿐히 통과했다.
부족한 실무 지식을 채우기위해 공부하고, 다양한 시행착오를 한 것을 좋게 평가해주셨다!
여러모로 첫 개발 경험이 정말 좋았고, 일을 하는게 아니라 나를 성장시킨다는 기분이 들었다. 개발이 정말 좋아졌고, 학업으로 복귀하면 정말 열심히 공부해야겠다고 생각하게 된 좋은 계기가 되었다.
'회고 > 회사' 카테고리의 다른 글
이직 6개월차 느낀점(부제: 달라진 업무제도 적응기) (0) | 2023.06.18 |
---|---|
IT서비스기업 현장실습 회고 (0) | 2021.03.08 |