마을스테이에서 적는 개발자로서 일한 6개월 회고록

Junu Moon·2021년 8월 8일
0
post-thumbnail
post-custom-banner

여름휴가를 공주 원도심에서 보내고 있다. 퍼즐랩(주)가 주최하는 LogIn 공주 프로그램을 신청하여 방문하게 됐다. 5일간 숙소와 코워킹 스페이스를 제공하며 로컬 커뮤니티의 삶을 체험하도록 돕는 프로그램이다. 5일 정도 조용한 곳에서 쉬면서 C 프로그래밍 공부도 하고 지난 6개월 회고도 하기에 좋아보였다. 지나치게 빨리 흘러가는 시간에 잠시 감속이 필요한 타이밍이기도 했고.

What I have done

갑작스럽게 개발자로서 일하기 시작했지만 시작은 정말 막막했다. 취미 수준의 파이썬을 해오던 내가 실제로 현업에서 할 수 있는 일은 극도로 적었다. 살아남으려면 배워야 했다. 지난 6개월, 여러 프로그래밍 프레임워크, 알고리즘, 개발 지식, 데브 옵스 등등을 짧은 시간 동안 정말 열심히 찍먹했다. 한 가지 주제를 맛보면 그로부터 파생되는 수많은 주제들이 튀어나왔다. 배울 것이 이토록 많다는 사실은 가슴을 두근거리게 하면서도 압박감으로 다가왔다. 나는 아직 바닥인데 저 수많은 것들을 언제 정복하겠냐는 생각 때문이었다. 여름휴가 직전엔 야근을 하지 않으면 자기 전에 마음이 불안해질 정도로 압박감이 심해졌다. 잠시 숨을 고를 필요가 있었다.

파이썬 미니프로젝트

프로그래밍에서 가장 좋은 건 만드는 즐거움이다. 파이썬으로 결과물을 실현시킬 수 있다는 게 좋았다. 튜토리얼 영상을 보며 웹 프레임워크인 장고와 플라스크로 블로그나 CMS를 만들어봤다. 파이썬 파일을 실행시키니 서버가 돌고 내 눈 앞에 웹페이지가 등장했다. 유튜브에서는 개발자로서 빨리 성장하는 방법으로서 하나 같이 익힌 지식을 곧바로 프로젝트에 적용해보라고 했기에 문장을 입력하면 지명, 인명, 그룹명 등을 인식하여 분류하는 Named Entity Recognition 기능을 웹에 구현해보려 했다. Spacy 라이브러리의 ner모델을 flask로 만든 웹서버에 올리면 된다. 튜토리얼을 따라하는 클론코딩에서 아주 조금 나아간 수준의 프로젝트였기에 적당한 난이도라고 생각했다. 그러나, 적은 양의 코드임에도 실행할 때 마다 이곳저곳에서 오류가 쏟아져나왔다. 이제 개발자기에 오류에 익숙해져야 했다. 구글링과 스택오버플로우를 뒤져가며 오류를 해결하며 차근차근 전진했다. 결과적으로 "Kim likes apple"과 "Junu hates banana"를 입력하면 Kim과 Junu의 Named Entity인 PERSON을 보여주는 코드를 작성할 수 있었다.

app = Flask(__name__)
model = NerClient()

@app.route('/ner', methods=["POST"])
def ner():
    try:
        data = request.get_json()
        ents = model.get_ents(data['sentence'])['ents']
        return json.dumps(ents)
    except Exception:
        abort(404)
        return ""

if __name__ == "__main__":
    app.run(debug=True)

지금보면 예외처리도 되지 않은 아주 조잡한 코드지만 당시에는 뭔가를 만들어냈다는 뿌듯함을 가득 느꼈다. 제대로 웹 프레임워크를 사용하기 위해서는 서버, 게이트웨이, HTTP 프로토콜, 데이터베이스 등이 어떻게 작동하는 지 이해해야 한다.

Deep Dive into Python

파이썬 자체를 더 많이 알고 싶었다. 그냥 피상적으로 사용만 했던 딕셔너리나 링크드 리스크 같은 자료구조를 배우고 구현했다. 객체지향을 더 잘 이해하기 위해 매직메소드, 메타클래스 등을 직접 정의하면서 파이썬의 기저 작동 원리를 손으로 깨닫는 쾌감은 컸다. 그저 파이썬을 프로그래밍을 위한 도구로서 대하기보다 세상을 분해하여 이해하고 다시 재조립하여 구현하는 방식으로 생각하게 되니 컴퓨터과학에 대한 더 깊고 깊은 이해를 하기를 원했다.

class Node:
    def __init__(self, data=None, next_node=None):
        self.data = data
        self.next_node = next_node
        
class LinkedList:
    def __init__(self):
        self.head = None
        self.last_node = None
        
    def to_list(self):
        l = []
        if self.head is None:
            return l
        else:
            node = self.head
            while node:
                l.append(node.data)
                node = node.next_node
            return l

빨리 성장해야 한다는 압박감은 내가 개발을 취미로 시작하며 느꼈던 만드는 즐거움을 잊게 만들었다. 공주 원도심에서 진행된 DIT(Do It Together) 목공 테이블 클래스에서 만드는 즐거움을 다시 떠올릴 수 있었다. 목표 완성품에 대한 어떠한 강박 없이 순수하게 지금 내가 나무를 자르고 끼우고 코팅하는 데 열중했다. 날리는 분진과 흐르는 땀이 몸을 축축하게 했지만 즐거웠다. 무엇을 만들 때 나는 그것에 대해 훨씬 깊은 이해를 하게 된다. 테이블의 상판은 무거운 고무나무로 테이블의 다리는 그것보다는 소프트한 목재로 구성된다. 퍼즐랩의 메인 스페이스가 될 이곳의 커뮤니티 공간성에 부합하도록 분해와 조립이 쉬운 형태여야만 했다. 시작 때 그냥 길쭉했던 나무는 6시간이 지나자 마을에 활기를 불어줄 테이블이 됐다.

Simple Blockchain

역시 만드는 것보다 대상을 쉽게 이해하는 방법은 없다. 회사에서 암호화폐 프로젝트에 들어가게 됐다. 암호화폐에 대한 지식이 전무했기에 역시나 파이썬으로 직접 암호화폐를 만들어보면서 이해하고자 했다. 출퇴근길에 비트코인에 사용된 암호학과 기술 개념들을 영상으로 보고 공부했다. 비트코인 백서에 따라 심플한 구조의 비트코인을 구현해봤다. 이 과정을 회사에서 세미나로 발표했다. 지루한 내용이었지만 몇몇 선임분들은(아마.. 코인을 하시는?) 재밌게 들어주셨다. 내용을 정리해서 <파이썬으로 비트코인 만들기>라는 제목으로 유튜브 영상으로 만들어보면 좋을 것 같다.

@dataclass(order=True)
class Block:
    previous_hash: str
    nonce: int
    miner: str
    timestamp: datetime = field(default_factory=datetime.now, repr=True)
    transactions: Deque[Transaction] = field(default_factory=deque, repr=True)

DexiNed

시각장애인의 전시물 관람 경험을 개선하기 위한 프로젝트에서 AI모델 개발을 맡았다. 직접 데이터를 추리고 모델을 최적화할 필요는 없는 작은 규모의 프로젝트였다. pytorch로 만들어진 DexiNed 모델을 분석하고 CLI 로 구동가능하도록 수정했다.

What I'm doing

공주 원도심에는 고양이가 많다. 밀집되어 있는 공간이 아니다보니 고양이마다 제 구역이 있고 밥을 챙겨주시는 분들이 따로 있다. 약간 시골 집 지키는 진돗개 느낌? 퍼즐랩에서 대여해주는 자전거를 타다가 고양이를 만나 선 곳에는 <가가책방>이라는 무인서점이 있었다. 적혀있는 번호에 연락을 하여 비밀번호를 받아 직접 문을 열고 들어갔다. 마치 해리포터의 킹스크로스역 9와 3/4 승강장를 통해 이세계로 들어가는듯 했다. 한 쪽 벽을 가득 채운 엽서에 적힌 방명록은 이 책방의 신비로움을 더하고 있었다. 이 책방이 나중에 내가 다시 찾을 때까지 있었으면 해서 책도 한 권 샀다. 메리 셸리의 프랑켄슈타인이다.

비동기 크롤링

회사에서 작은 프로젝트가 맡겨졌다. 특정 주제에 대한 인식을 살펴보고자 SNS 검색 결과를 크롤링하고 자연어처리 분석 툴로 토픽 모델링하는 것이다. 개발기간은 1달 정도로 잡고 나 혼자 진행하게 됐다. 크롤링 건 수도 적은 편이어서 빨리 하자면 selenium으로 긁어버리면 1주일 안에 가능한 정도였다. 그러나 selenium은 리소스도 엄청나게 잡아먹으며 튕겨나가는 오류가 너무 많이 일어난다. 시간적 여유도 있기에 대신 비동기 방식으로 크롤링하는 프로그램을 작성하는 것을 목표로 잡고 매달렸다.

async def get_post_text(url_lst, proxy_lst, session_num) -> None:
    fh = fake_headers.Headers()
    timeout = aiohttp.ClientTimeout(total=90)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        logger.debug(f"session num: {session_num}")
        session.headers.update(fh.generate())
        proxy = proxy_lst.pop()
        while True:
            try:
                resp = await session.request(method="GET",
                                            url=url_lst.pop(),
                                            proxy=proxy.request
                                            )
                resp.raise_for_status()
                html = await resp.text()

컴퓨터 공학을 전공하고 엘리트코스를 밟은 프로그래머는 어떻게 하는지 모르겠지만, 나는 코딩을 할 때마다 우당탕탕의 연속이다. 관련 라이브러리 튜토리얼을 따라하고 doc을 읽으며 한 줄 한 줄 적는 코드는 실행할 때마다 오류를 뱉어낸다. 파이썬 강의에서만 접해본 비동기 프로그래밍을 실제로 하려니 멘붕은 하루에 한 번 꼴로 찾아왔다. 다만 취미가 아닌 직업으로서 개발을 하고나서 바뀐 건 어떻게든 방법을 찾는다는 것이다. 해답을 찾는다는 뜻이 아니다. 문제 A의 해답을 찾지 못하면 문제를 A'로 바꿔서라도 작동하게 만든다. 문제를 구글링하고 처음 보는 단어들이 튀어나오고 그의 정의를 찾고 다시 해법에 적용하는 과정은 인내심이 필요한 일이다.

시도를 할 때마다 수포로 돌아가곤 했다. 사람들의 발음은 빨랐다. 그리고 그들이 내뱉는 말은 눈에 보이는 세계와 명백한 연관이 하나도 없었기에, 그들이 지칭하는 대상의 미스터리를 풀어낼 단서를 도무지 찾을 수가 없었다. 그러나 엄청난 노력을 쏟으며 달이 몇 번 공전할 때까지 축사에 머문 결과, 나는 이야기에 가장 친숙하게 등장하는 물건들의 이름 몇 가지를 알게 되었다. 나는 ‘불’, ‘우유’, ‘빵’과 ‘나무’ 같은 단어들을 배우고 또 사용하는 법을 익혔다. _ <프랑켄슈타인>, 메리 셸리, 148~149p

자연어처리 및 분석 툴 개발

크롤링한 문서를 자연어처리를 통해 토픽모델링까지가 이번 프로젝트의 목표다. 자연어처리는 대학교 때도 여러 번 시도해봤는데 언어를 수학적으로 계산할 수 있다는 것이 굉장한 매력으로 다가왔다. 당시 개인적으로 언어학도 공부하고 있었는데 촘스키가 언어를 분해하여 규칙을 도출하는 과정과 닮았다는 생각도 했다. 예를 들어 자연어처리에서는 문장을 벡터로 표현하여 문장 간의 유사도를 구하기도 한다. 현재 나는 통계 기법에 익숙하지는 않다. 따라서 구현되어 있는 라이브러리를 적용하는 정도로 프로젝트를 마무리할 것이다. 크롤링을 통해 자연어를 수집하고 AI모델을 통한 분석하는 과정에 개인적으로 많은 흥미를 느낀다. 또한 앞으로 참여하게 될 암호화폐 관련 프로젝트에서도 자연어 처리는 꽤나 큰 비중을 차지하기 때문에 이 분야에 대해 조금 더 깊게 들어가 볼 생각이다. 우선 현재 구현되어 있는 AI 모델을 적용하여 분석해보는 시도를 할 수 있고, 크롤링에 있어서는 Django로 admin 페이지를 만들어 크롤링 cronjob을 실행하고 db에 쌓고 나아가 분석 결과를 보여주는 것까지 생각해볼 수 있다.

What I will do

서울에서는 코로나 4단계로 러닝크루 활동을 한동안 하지 못했다. 공주 원도심이라는 작은 마을에 러닝 크루가 있다는 말을 듣고 캐리어에 운동화를 챙기며 얼마나 신났는지 모른다. 제민 러닝 크루와 달린 1시간은 천천히 달리는 즐거움을 다시 일깨워줬다. 양팔과 어깨가 긴장하지 않은 채로 아주 가볍게 달렸다. 비가 온 터라 선선해진 바람이 목 뒤로 느껴졌다. 천천히 뛰면서 땅을 밀어내는 발바닥의 힘을 느낄 수 있었다. 옆사람과 호흡을 맞추며 뛰다보니 어느새 금강과 맞닿은 지점에 도착했다. 공주의 유네스코 문화유산인 공산성이 불을 밝힌 채 있었다.


출처: 제민러너스

내가 정말 좋아하는 수학 유튜버 3Brown1Blue의 한 영상에서 그는 이렇게 말한다. 억지로 이해하거나 외우려 하지 말고 개념을 머릿속에 담고 충분히 시간을 들여 갖고 놀아보라고. 아직 쥬니어 개발자인 입장에서 완벽을 추구하기보다는 즐거운 마음으로 탐구하려고 노력하고 있다. 오래 즐겁기 위해서는 나만의 페이스를 찾을 필요가 있다. 앞만 보고 가면 주변에 펼쳐진 아름다운 가능성을 놓칠 수도 있다. 또한 같이 가기 위해서는 주변을 살피는 여유도 가질 필요가 있다.

방송통신대학교 통계학과 편입

수업과 시험을 통한 교육은 올드패션이지만 기초를 다지기엔 여전히 가장 좋은 방식이라고 생각한다. 하반기에 방통대 통계학과 3학년으로 편입하게 됏다. AI 모델링 회사에 들어온 만큼 통계지식은 필수이며, 컴퓨터공학 수업도 같이 들을 수 있기에 시간과 노력을 투자할 만한 가치가 있다고 판단했다.

통계학과에서는 <선형대수>, <이산수학>과 같은 기반이 되는 수학을 배울 수 있는 과목과 AI모델링에 주로 쓰이는 <회귀분석>이나 <비정형 데이터 처리>와 같은 과목들을 수강할 것이다. 개중에 <생산관리>나 <품질경영>과 같은 과목도 있는데 데이터 분석 플랫폼 개발 쪽으로 역량을 키우는 데 좋은 과목도 있다. 교양 학점은 모두 컴퓨터 공학과 수업으로 채울 예정이다. 컴퓨터 구조부터 <C 프로그래밍>, <알고리즘>, <운영체제와> 같은 기초를 쌓을 수 있는 과목 위주의 수강 계획을 갖고 있다. 인터넷에서 얻는 소스는 간편하지만 깊이가 부족한 경우가 많기에 늘 아쉬움을 갖고 있었다. 그리고 사실 이런 과목들은 대부분 엄청 지루하다고 정평이 나있기에 주입식 교육만큼 좋은 방법이 없다고 생각한다.

아직 개발자로서의 경험이 충분하진 않지만 나만의 포지션을 만들어가야 한다. 현재로서는 분석보다 개발에 더 재미를 느끼고 있지만 다양한 분야를 경험해보며 앞으로의 커리어를 만들어갈 것이다.

2022 Pycon 참여

나는 지식을 공유하며 대화하는 것이 즐겁다. 회사에서 매주 목요일 11시 돌아가며 세미나를 진행하고 있다. 자유주제로 20-30분 정도로 꾸리는데 여태까지 서핑, 메타버스, 제주 방언, 확증 편향 등 다양한 주제가 등장했다. 앞서 말했듯 내 차례에서는 '파이썬으로 비트코인을 구현하기'를 주제로 발표했다. 다음 내 차례는 9월 중순에 잡혀있는데 역시나 프로그래밍에 관해 진행할 생각이다.

보통 출근길 지하철에서 프로그래밍 관련 유튜브 영상을 본다. 클론코딩이 아니더라도 파이콘이나 기술 스택을 소개하는 영상은 지루하지도 않고 어쨌든 유관 지식이기 때문에 보는 맛이 난다. 파이썬 코어 디벨로퍼 중 한 명인 Raymond Hettinger가 추천 영상에 뜨면 무조건 클릭하고 본다. 그가 발표에서 보여주는 파이썬과 개발 자체에 대한 사랑과 열정은 나까지 들뜨게 만든다.

2022년 파이콘에 참가하는 것을 목표로 하고 있다. 처럼 프로그래밍을 잘 모르더라도 같이 웃고 즐길 수 있는 세미나를 만들고 싶다. 이를 위해 꾸준히 개발에 관해 글을 쓰면서 다양한 개발 주제를 색다른 시선으로 바라보는 연습을 할 것이다.

공주에서 5일은 길지도, 짧지도 않았다. 그냥 평상 걸음을 걷듯 편안한 시간이었다. 처음보는 사람들과 새벽 3시까지 이야기를 나누기도 했고 목공일을 하며 육체적으로 스트레스도 풀 수 있었다. 간이 덜 된 것처럼 느껴지는 심심한 음식들은 공주의 매력을 더했다. 힐링을 위해 애써 노력하지 않아도 좋았다. 내 인생 노력할 게 너무 많은데 힐링까지 노력하고 싶진 않으니까.

profile
Machine Learning Engineer who is obeying the TDD Goat!
post-custom-banner

1개의 댓글

comment-user-thumbnail
2021년 8월 20일

어쩐지 응원하고 싶은 마음이 생기네요, 글 잘 읽고 갑니다.

답글 달기