문과생 언더독의 파이콘(Pycon) 뽀개기
F-Lab : 상위 1% 개발자들의 멘토링
올해 10월, Pycon KR 2022에서 “Asyncio 라이브러리들은 어떻게 동작할까?”라는 주제로 발표를 진행했습니다.
Pycon 발표를 준비하면서 3가지 교훈을 얻었습니다. 우선 “책임감”에 대해 다시 한번 생각해 볼 수 있었습니다. 이름을 걸고 하는 발표에서 잘못된 정보를 전달하면 안 된다는 생각이 강했기 때문에 그 책임감으로 더 열심히 찾아보며 준비했습니다. 질문답과 비판 등 돌아올 수 있는 피드백에 대한 준비도 철저히 했습니다.
두 번째로는 흔히들 말하는 “큰 그림”을 체화하는 경험을 가질 수 있었습니다. 프레임워크를 사용하는 데 그치지 않고 프레임워크 내부 구현을 살펴보고, 어떻게 동작하는지에 대해 이해하려 노력하다 보니 전체적인 흐름에 대해 감을 잡을 수 있었습니다.
마지막으로는 “왜”라는 질문에 대한 중요성입니다. 똑같은 코드 구현임에도 오늘 본 바와 내일 보고 느낀 바가 달라지는 것을 알았습니다. 어제는 전체 흐름에 초점을 맞췄다면 전체 흐름에 익숙해지고 나서는 코드의 최적화 방법, 코드 스타일 그리고 에러 처리 규칙 같은 세부적인 사항들이 눈에 들어왔습니다. 왜 이러한 방식으로 코드를 작성했을까, 이렇게 작성하면 어떤 장점이 있을까와 같은 궁금증을 갖고 들여다보면 같은 코드라도 매번 다르게 보였습니다.
문과생 언더독의 개발 성장통
저는 요새 흔히 말하는 “비전공자” 출신으로, 국어국문학을 전공했습니다. 어문계열 전공자가 개발자로 전향해 1년 8개월 만에 Pycon에서 발표를 했다는 사실은 여러 사람을 놀라게 했죠. 어떻게 보면 코딩 교육 열풍에 휩쓸려 개발을 시작하게 된 사람이기도 합니다. 그 과정에서는 고민과 여러 시행착오가 정말 많았습니다. 비전공자분이 개발에 관심을 갖고 시작 방향성에 대해 찾아보기 시작한다면 아마 저와 비슷한 고민을 하실 거라고 생각하는데, 이 글에서는 Pycon발표 경험을 중심으로 제가 했던 고민들과 다양한 시도들에 대한 이야기를 해볼까 합니다.
학부생 시절 지인 추천으로 인공지능에 쓰이는 언어 데이터 가공 프로젝트에 참여할 기회가 있었습니다. 그때 처음 자연어처리라는 분야에 대해 알게 되었는데, 자연어처리는 아이언맨의 자비스처럼 사람과 말을 할 줄 아는 컴퓨터라는 막연한 생각을 했던 기억이 납니다. “컴퓨터는 도대체 어떻게 사람의 언어를 이해할 수 있을까”라는 궁금증도 막 떠오르던 시기였죠. 여러 책을 읽던 중 <수학의 아름다움>에서 “언어는 정보 전달의 매개체이자 일종의 코딩 방식이며, 자연어처리는 언어가 가진 정보를 다룬다”라는 문장을 접했습니다. 인문학도에게 언어는 의사 소통의 수단 그 이상도 이하도 아니었기에 언어 안의 정보와 측정하는 방법이라는 관점에서는 생각해 본 적이 없었습니다. 사람이 언어를 통해 전달하고자 하는 정보를 수학을 이용해 측정하고, 컴퓨터에 입력하는 방법에 대해 논하는 이 책을 통해 적잖은 충격을 받았습니다. 그 시기가 졸업을 앞둔 4학년 2학기였습니다. 동기들이 하나 둘 취업시장으로 뛰어들 때 즈음 뒤늦게 자연어처리 개발자라는 꿈을 갖게 되었고 개발을 배울 수 있는 여러 교육 기관을 찾아보기 시작했습니다.
그중 눈에 띄는 것이 국비 지원 부트캠프였습니다. 무료 교육은 갓 졸업한 사회 초년생에게는 매력적인 상품이었죠. 처음에는 아무것도 몰라 따라가기 급했습니다. 클릭 몇 번이면 파이썬을 설치할 수 있었고, 구글 코랩을 이용하면 파이썬을 설치하지 않아도 GPU를 이용한 모델 학습까지 가능했습니다. 간단한 튜토리얼들이 너무 많았고, 남의 코드를 따라치다 보면 성장한 듯한 기분이 들기까지 했습니다. 웹 프로젝트도 마찬가지였습니다. Flask, FastAPI 같은 웹 프레임워크를 이용해 코드를 작성하고 uvicorn main:app만 따라치면 서버가 작동했고 내가 무언가를 해낸건가 하는, 지금 생각해 보면 정말 웃픈 상황이었습니다.
교육과 영업을 구분하는 방법
언젠가부터 이건 아니다 싶은 생각이 들었습니다. 머신러닝이든, 딥러닝이든, 웹 개발이든 분야를 상관하지 않고 같은 상황이었습니다. 가장 많이 접할 수 있는 머신러닝 프로젝트 흐름을 예시로 들어보겠습니다.
대출 연체자를 사전에 선별하는 이진 분류 프로젝를 하기 위해서는 로지스틱 회귀를 사용하면 된다고 말하며 간단한 로지스틱 회귀 수식을 설명한 후 sklearn 라이브러리의 LogisticRegression 클래스를 이용해 분류를 진행합니다. 직접 로지스틱 회귀 로직을 구현할 필요도 없고, 이미 만들어져 있는 제품을 그대로 사용할 뿐이었습니다. 이런 고민을 주변에 이야기하면 “요즘 누가 밑바닥부터 구현하냐 원래 이런거다”라는 답변을 듣곤 했습니다. 이런 학습 과정이 반복될수록 “왜”에 대한 충분한 고민이 점점 결여되기 시작했습니다.
“왜 이 방법을 선택했나요?”, “왜 이런 구현 방식을 선택했나요?”라는 질문에 스스로 납득하지 못하는 그럴싸한 말들로 자신을 포장하기 바빴습니다. 모델 학습 속도가 느리거나 좋지 못한 결과가 나와도 원인을 알 수가 없었고, 원인을 알지 못하니 발전도 없이 제자리걸음이었습니다. 분석 결과가 좋지 않으면 “데이터 품질이 안 좋나 보다, 어쩔 수 없지”라는 합리화를 하고 넘어가곤 했습니다. 웹 프로젝트도 마찬가지였습니다. 남이 알려준 대로, 책에서 알려주는 대로 코드를 따라치면 웹 서버가 띄워지고, 무언가 작동하고, 그것에 만족하는 과정의 연속이었습니다. 이것들이 어떻게 동작하는지에 대한 깊은 이해가 없었고, 학습은 기계로 치면 단순히 사용 설명서를 보고 버튼을 누르며 작동 방법을 익히는 데 초점을 맞춘 학습이었습니다.
개발자 오버독으로의 여정
이런 고민 이후부터는 놓치고 있던 CS 기초 지식뿐만 아니라 주로 사용하는 개발 언어, 프레임워크의 작동 원리에 대해 파고들기 시작했습니다. 시중에서 접할 수 있는 인터넷 강의나 교재들은 대부분 사용 방법에 대해 초점을 맞추는 경우가 많습니다. 웹 프로젝트 Deep Dive를 목표로 잡은 이후부터 뿌리박혀 있던 몇몇 습관들을 고치기로 마음먹었습니다. 그 중 하나가 바로 “한글 블로그 글에 의존하지 말기”입니다. 개발 관련 내용을 검색해 보면, 정말 많은 분들이 블로그에 학습한 내용을 정리해서 올려준 것을 확인할 수 있습니다.
하지만 정말 아쉽게도 이런 내용들 또한 단순 사용 방법에 그치는 경우가 많고, 잘못된 정보일 가능성이 높다고 판단해 주로 3가지 자료 위주로 찾아봤습니다. 우선 공식 문서를 살펴보고, 주요 컨트리뷰터가 작성한 자료(블로그 글, Pycon 발표 자료 등)를 둘러봤습니다. 이후, 내부 구현 코드 위주로 살펴봤습니다.
웹이 어떻게 동작하는가와 파이썬 웹 생태계에 대한 내용만으로도 생각하지 못하는 방대한 분량이었습니다. 클라이언트 요청이 네트워크를 통해 서버에 도달하기 위한 과정을 알기 위해서는 네트워크에 대한 이해가 필요했고, 이렇게 도달한 요청을 서버가 어떻게 이해하고 처리하는지를 알기 위해서는 소켓, HTTP 프로토콜, 비동기 I/O 관련 내용부터 파이썬 웹 생태계에 대한 이해가 필요했습니다.
파이콘(Pie-Corn)? 그거 먹는 건가요?
Pycon KR 2022 발표 주제 또한 이러한 학습 과정 속에서 정할 수 있었습니다. F-Lab 멘토님께서 지금까지 멘토링 과정에서 공부해온 것들을 Pycon에서 공유해 볼 것을 제안을 해주셨습니다. 처음에는 “내가 되겠어?”라는 심정이었습니다. “내가 공부한 것들은 남들 다 아는 내용 아닐까, 이게 무슨 도움이 되겠어?”라는 걱정이 앞섰습니다.
그럼에도 멘토님은 다른 사람들 앞에서 발표하는 과정은 성장에 분명 도움이 될 것이고, 좋은 개발자는 공개된 장소에 자신을 드러내는 데 두려워해서는 안된다는 말씀을 많이 해주셨습니다. 그렇게 Pycon 발표 준비를 시작했습니다.
비동기 웹 서버, 웹 프레임워크 구현을 위한 asyncio 라이브러리에 대한 내용을 Pycon 발표 주제로 결정한 후 다음과 같은 순서로 Pycon 발표를 준비했습니다.
우선 asyncio 라이브러리 공식 문서를 정리했습니다. 파이썬의 asyncio는 비동기 I/O를 위한 파이썬 표준 라이브러리입니다. 파이썬에서 비동기 네트워크 I/O를 위해 제공하는 여러 기능들을 정리했고, CPython의 asyncio 라이브러리 내부 구현을 하나씩 뜯어보면서 asyncio 라이브러리가 기존 파이썬을 이용한 소켓 프로그래밍과 비교했을 때 어떤 특징이 있는지 확인했습니다.
이후에는 비동기를 지원하는 파이썬의 웹 프레임워크와 웹 서버가 asyncio의 이런 기능들을 어떻게 사용하는지에 관한 내용을 정리하기 위해 발표 때 예시로 설명할 라이브러리들을 선정했습니다. 웹 프레임워크로는 FastAPI를, 웹 서버로는 Uvicorn을 선정했고, 공식 문서를 살펴봤습니다. 아무래도 공식 문서는 해당 라이브러리를 어떻게 사용하는지와 같은 사용법 위주로 정리되어 있었습니다. 그렇기에 내부 코드 구현을 살펴보고 asyncio 라이브러리가 사용되는 부분을 체크했습니다.
글을 마치며
정말 좋은 기회로 Pycon 발표와 더불어 기고글 작성까지 했는데요. 저의 경험이 다른 분들께 아주 조금이나마 도움이 되었으면 좋겠습니다. 받은 것을 당연하게 생각하지 않으려는 마음에 시작한 일들이 이렇게 이어져서 도전해 보길 참 잘했다는 생각도 듭니다. 긴 글 읽어주셔서 감사합니다.
이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.