PyCon KR에서 2015년부터 매년 발표하기를 8년째, 드디어 본고장 PyCon US에서 발표를 하게 되었다. 주제는 "Improving debuggability of complex asyncio applications". 발표는 그동안 Backend.AI를 개발하면서 asyncio 환경에서 디버깅하기 너무 어려운 상황을 타개하기 위해 aio-libs에 있는 aiomonitor 프로젝트를 2년 전부터 활용하고 있는데, 그 과정에서 이런 기능이 더 있으면 좋겠다 하여 fork하여 개발한 aiomonitor-ng (next-generation)을 소개하는 내용이다. (fork를 한 이유는 원래 프로젝트가 거의 3년 가까이 새로운 릴리즈 없이 방치되고 있고 PR을 날려도 원작자가 바쁜지 반응이 없었기 때문)
일정은 4월 18일 출국-도착하여 26일 출발 27일 귀국하는 것으로, 원래는 Language Summit도 참가해볼 생각이었으나 이번에는 신청이 안 됐고(Typing Summit도 관심이 있었는데 이건 나중에 영상이 공개되기 때문에 굳이 신청하지는 않았다), 대신 시차적응 겸 발표준비를 하는 시간으로 앞 19~20일을 활용하고, 본 컨퍼런스 21~23일, 포스터 세션 23일, 스프린트 24~25일 참여하는 계획이었다. 내 세션 발표는 첫날 오후로 예정되어있었으나 중간에 발표 펑크가 다수 발생하여 첫날 키노트 직후 첫 시간으로 변경되었다. 한나절 더 준비할 시간이 없어지기는 했지만 뭐 차라리 빨리 매 맞고(?) 컨퍼런스를 빨리 즐길 수 있는 것이기도 해서 세션 체어가 물어봤을 때 흔쾌히 수락했다. 나중에 끝나고 느낀 것이지만 스프린트를 총 4일간 진행하는데 가능하다면 스프린트는 4일 전부 참여할 수 있으면 그렇게 하는 게 좋겠다는 생각이다. 내년과 내후년은 피츠버그에서 하는데 벌써 비행기표 예약해놔야 하나 싶은 생각이 든다.
이번에는 아버지가 쌓아두신 가족 마일리지의 도움을 받아 처음으로 비즈니스 클래스를 타고 다녀왔는데, 역시 돈 벌어야겠다는 의욕이 들게 만드는... 자본의 맛...이란 이런 것이가 싶었다. ㅋㅋ 재밌는 것은 비즈니스 클래스 좌석은 완전히 눕는 것이 가능해서 그런지 사람들이 오히려 영화 같은 거 보면서 버티기(?)보다는 그냥 자는 사람이 많았다는 것. 그리고 확실히 운동선수라거나 교수님이라거나 이런 사람들이 좀더 많이 눈에 띄었다. 원래 이코노미 클래스에서 주는 밥도 어지간하면 잘 먹는 편이긴 했지만 제대로 코스 요리로 서빙되고 식기도 제대로 만들어진 도기 그릇에 주니 좀더 먹을 맛이 났다. 비즈니스 클래스의 단점...은 VOD 스크린이 너무 멀어서(...) 터치 제어가 힘들고 리모컨을 써야 하는데, 비행기 상태에 따라 리모컨 버튼이 잘 안 눌린다거나 하면 좀 불편하다는 것.;;
이번 PyCon US에는 크게 2가지 목표를 가지고 갔다. 하나는 aiomonitor-ng와 같이 asyncio 생태계를 위한 보다 특화된 디버깅 도구의 필요성을 알리는 것, 그리고 다른 하나는 asyncio.TaskGroup
이 structured concurrency 구현을 위한 마침표가 아니라 중간 이정표라는 점—long-running server application을 위한 일종의 "task scope" 존재의 필요성—을 asyncio 메인테이너들에게 알리고 설득하는 것. 결론적으로 2가지 모두 다 성공했다.
우선 세션 발표는 첫날 첫시간이라 오히려 사람들의 집중도·주목도가 높아지는 효과가 있었는지 생각보다 많은 사람들이 왔다. 나중에 다른 세션 발표들도 몇 개 들어가보았는데, 내 발표가 사람이 많이 온 편에 속하는 듯. 일요일 오전에 했던 포스터 세션에서도 사람들이 굉장히 많이 와서 오전 11시에 Pantsbuild 개발팀 만나러 open space 가기로 한 것을 30분이나 늦게 갈 수밖에 없을 정도였다. 포스터 때 왔던 사람들 중에는 순전히 내 발표를 보기 위해 PyCon에 온 사람도 있다고 이야기해주는 분도 있었다.;; 그리고 결정적으로 aio-libs의 핵심 멤버이자 Ansible 코어 개발자 중 한 명인 webknjaz님이 나를 aio-libs/aiomonitor 프로젝트의 새 메인테이너로 만들어주었다. 원래는 Strawberry라거나 mypy 같은 프로젝트의 스프린트에 참여해볼 생각이었으나 어쩌다가 내가 직접 aiomonitor 프로젝트 스프린트를 주관하는 것으로 계획 변경. 첫날에는 샌프란시스코 스타트업에서 일하는 한 주니어 엔지니어 친구가 와서 간단한 포팅 작업을 같이 했고, 첫째날 오후와 둘째날엔 webknjaz님으로부터 aio-libs에 앞으로 적용하고자 하는 CI/CD 파이프라인 구성에 대한 집중 교육(?)을 받았다. 그 과정에서 linting을 매우 빠르게 돌려주는 pre-commit.ci 서비스도 알게 되었고, setup.cfg와 pyproject.toml의 차이점이라든지, setuptools_scm
으로 버전 번호를 자동으로 매기는 방법이라든지(마지막 릴리즈 태그로부터의 commit 거리를 계산하여 dev 버전 번호를 매겨주는 등), 깃헙 액션에서 required check를 YAML 설정 내에서 관리할 수 있게 도와주는 alls-green 액션이라든지...
컨퍼런스 첫날 오후에 이른바 "hallway track"에서 코어 개발팀과 인사할 기회가 있었다. 한국의 코어 개발자인 동희님 소개로 Victor Stinner와도 인사하고 마침 자리에 있던 asyncio 메인테이너인 Yury Selivanov, 그리고 옆에 있던 Guido van Rossum까지 모두 한 자리에서 만났다. 사실 Guido와는 이미 Python 디스커션 그룹의 Async-SIG 게시판에서 수 차례 TaskGroup 확장 필요성과 asyncio 디버깅 경험 개선을 위한 코어 확장 필요 가능성에 대한 논의를 해오고 있었기 때문에, Guido도 나를 알아보고 반갑게 인사해주었다. Guido와 Yury와 함께 셋이 서서 TaskGroup
이 매우 유용하기는 하지만 gather(return_exceptions=True)
시나리오를 커버하지 못한다는 점, 따라서 새로운 API가 필요하다는 점에 대해 이야기했고 Guido가 Yury의 의견을 묻자 Yury도 확장이 필요할 것 같다는 점에 동의를 표시해주었다. 다만 as_completed()
API 같은 경우는 Java에서 가져온 것이다보니 딱히 많이 쓰도록 권장(promote)하고 싶은 것은 아니고, 이걸 "safe"하게 만드는 것은 표준라이브러리에 넣기보다는 써드파티 라이브러리에서 해주는 게 낫지 않을까 하는 의견도 주었다. 여튼 필요성에는 모두 공감한다는 사실을 명확하게 대면으로 확인할 수 있었고, 다만 구체적인 디자인이나 구현에 대해서는 나도 고민이 필요한 부분이 있어 추가 후속 논의를 해보자는 것으로 정리하였다.
세션 발표들을 돌아다니면서 흥미로운 발표들도 몇 개 있었다. 하나는 코어개발자인 Łukasz Langa의 발표였던 Working Around the GIL with asyncio. 원래 asyncio의 설계 목적은 연산보다는 I/O의 중첩을 통해 싱글스레드 활용률을 높이겠다는 것이지만, asyncio.TaskGroup을 subprocess를 관리하기 위한 primitive로 활용하면서 동시에 shared memory 기법을 통해 다수 Python 프로세스를 활용함으로써 연산 성능을 CPU 코어 수에 따라 비례하여 늘어날 수 있게 하는 방법을 선보였다. 특히 나중에 subinterpreter가 정식 도입되고 메모리 공유 API가 정립되면 Python의 멀티코어 성능을 획기적으로 높일 수 있는 가능성을 보여주었다고 할 수 있겠다. 또다른 인상깊었던 발표는 Andrew Godwin의 Reconciling Everything이었다. Backend.AI에서 최근 고민하고 있는 문제 중 하나는, Manager가 중앙집중적으로 데이터베이스의 높은 isolation level을 통해 다수 연산 노드와 연산 컨테이너의 상태 관리를 수행하다보니 발생하는 transaction overhead를 어떻게 줄일 것인가에 관한 것인데, 작년부터 일종의 "async state machine" 도입에 관한 설계를 머릿속으로 돌려보고 있던 중이었다. 그런데 이 발표에서 그와 거의 동일한 예제 코드가 나왔다. Kubernetes와 Airflow와 같은 분산형 오케스트레이션 시스템의 기저에 깔려있는 상태 관리 기법으로 서로 독립적으로 실행되는 분산 컨트롤러들이 각자의 상태를 desired state에 가깝게 가도록 지속적인 action을 취하는 방식을 사용하는데, 개념적으로는 알고 있었지만 이것을 정확한 용어로 "reconcilation loop"이라 부른다는 것은 미처 모르고 있었다. 이 발표에서 정확하게 이 용어를 소개함과 동시에 장단점과 주의점에 대해서 설명해주어서, 앞으로 Backend.AI의 scalability 확장을 위한 설계에 중요한 단서가 될 것 같다. 발표 후 질의응답에서 자신도 PostgreSQL을 기반으로 이 개념을 구현했음을 확인했고, isolation level을 높게 가져가지 않고도 반복적 reconcilation을 통해 상태 관리를 한다면 충분히 필요한 수준의 scalability를 달성할 수 있을 것이라는 점을 파악할 수 있었다.
이렇게 발표 세션들도 흥미로웠지만, 사실 필요하면 온라인으로도 나중에 찾아볼 수 있기 때문에, 대면 파이콘의 꽃은 바로 Open Space와 Sprint라고 할 수 있다. Open Space는 과거 한국 파이콘에서는 BoF (birds of feathers) 세션으로 불리기도 했던 것으로, 여러 개의 20~30명 규모 세미나실을 잡아놓고 누구나 자유롭게 주제를 공개 게시판에 등록하여 같은 관심사를 가진 사람들끼리 1시간 동안 모여서 이야기하는 것이다. 특정 오픈소스 프로젝트에 관한 것부터 특정 직군이나 IT 분야의 전반적인 이슈까지 다양한 주제들이 나온다. (생각해보면 대학원 때 다녔던 학술 컨퍼런스에서는 이런 프로그램이 따로 없고 논문 및 포스터 발표 위주로만 돌아갔는데, 아무래도 주제의 폭이 좁고 깊어서 그런 것 같기도하지만 다소 아쉽다는 생각이 든다.) 내가 들어갔던 Open Space 세션은 SRE (site reliability engineer) 모임과 Pantsbuild 개발팀과 사용자들의 모임이었다. SRE 모임에서는 어떤 모니터링 도구를 어떻게 활용하고 있는지에 대한 이야기들을 나누었는데, 주로 Prometheus, Grafana, Open Telemetry, Datadog/Sentry, Influx DB, Timescale DB 등을 쓴다는 것을 알 수 있었다. (이중 일부는 이미 Backend.AI에서도 활용하고 있다.) Pantsbuild 개발팀 모임에서는 Pants를 도입하면서 겪은 몇 가지 어려움들, 현재 가지고 있는 질문들을 이야기하고 Slack에서만 보던 개발팀 멤버들과 함께 사진도 찍고 아예 점심식사도 같이 하러 갔다. 내 작년 PyCon KR 발표로 한국에서도 Pants를 모노리포 관리용으로 도입한 회사들이 있고 그 중에는 아예 유료 고객이 된 곳도 있으니, 이 사람들 입장에서는 내가 공짜로 세일즈를 해준 셈이다. (물론 Slack에서 100개 가까운 질문으로 괴롭히기도 했다...ㅋㅋ) 밥 먹으면서 Pants 프로젝트를 시작하게 된 계기에 대해 물어보았는데, 최종사용자 대상의 B2C 서비스보다는 뭔가 개발자를 위한 도구를 만드는 것이 더 재미있었다는 점, 그리고 Java 등 다른 언어에는 모노리포를 위한 툴링이 이미 정착된 반면 Python은 그런게 없었다는 점, 아직 비슷한 걸 만들고 있는 다른 경쟁자들이 없었다는 점 때문에 시작하게 되었다고 설명해주었다. 사실 제품 개발자로서 가장 어려운 부분 중 하나는 내가 만든 제품을 내가 직접 사용하지 않으면 피드백 루프를 잘 형성하기 어렵다는 것인데, 개발자를 위한 도구를 만들며 스스로 그 도구를 사용해서 개발하고 있다는 것은 그런 점에서 아주 특별한 경험이다. 그 점이 이 사람들을 잡아끌었던 동기인 것 같다.
Sprint는 위에서 얘기한 대로 aiomonitor-ng의 aiomonitor 백포트 작업 및 CI/CD 파이프라인 개선 작업 위주로 진행하였다. 낮에는 열심히 코딩하고 설명듣고 하다가 점심과 저녁을 webknjaz, Hypothesis 메인테이너인 Zac Hatfields, pydantic 메인테이너인 Samuel Colvin, hpy 메인테이너인 Simon 등과 함께 하기도 했다. 역시 메인테이너들과 직접 친해질 수 있는 가장 좋은 기회는 Sprint인듯. 사실 내가 aio-libs에 발을 들이게 된 계기도 우리나라에서 했던 PyCon APAC 2016에서 Andrew Svetlov와 Yury Selivanov가 모두 온 aiohttp 스프린트를 통해서였다. 내년과 내후년 파이콘에는 스프린트만 4일 꼬박 하고 오고 싶다는 생각이 들 정도로, 코딩 좋아하고 사람 만나는 거 좋아하는 사람이라면 필히 참석해봐야 할 이벤트다.
비행 일정까지 합쳐 총 9일 일정으로 이렇게 PyCon US가 끝났다. 개인적으로는 그동안 갔던 모든 컨퍼런스 중에 가장 밀도 있게, 가장 재미있고 의미있게 시간을 보낸 것 같다. 발표나 컨퍼런스 경험만 보자면 EuroSys나 OSDI/SOSP 같은 학술 컨퍼런스들도 좋았지만, Open Space와 Sprint와 같은 경험은 파이콘이 확실히 독특하고 차별화되는 지점이다. 앞으로도 꾸준히 참여할 수 있기를 바래본다.
덧1) 미국의 물가 상승, 스타트업과 IT 업계의 어려운 사정을 절감할 수 있었다. 스프린트 참여한 한 샌프란시스코 스타트업 친구와 밥먹던 도중 회사 슬랙을 보더니 방금 한 명 짤렸어~ 이런 이야기를 너무 당연하게 하는 나라. 어느 파이콘보다 Job fair가 핫했다고도 한다. 발표 펑크도 대부분 발표자들이 갑자기 해고되는 바람에 참가가 어려워져서 발생한 거라고 한다.
덧2) 앱에 미리 카드를 등록하고 쓰는 경우(우버 등) 및 호텔 숙박비 결제 빼고 대부분 애플페이로 결제가 가능했다. 결제 속도도 빠르고, 비접촉식이라 카드 주고받고 하지 않아도 되고. 식당도 전자식 휴대용 단말기를 가지고 있는 경우 bill split해서 각자 돌아가면서 결제하는 것도 카드 가져가서 팁 적고 서명하고 하는 경우보다 훨씬 빠르게 가능했다. (그리고 잠깐이긴 해도 카드를 그렇게 내가 볼 수 없는 손에 맡긴다는 꺼림칙함도 없다!) 한국에서도 비접촉식 결제가 좀더 빨리 보급되길...
덧3) 정작 솔트레이크 시티 관광은 할 시간이 전혀 없었다. 중간에 권한님 동희님과 함께 몰몬 템플 구역 잠깐 돌아본 게 전부인데 그나마 관광 비수기로 죄다 공사 중.... 종교적 색채가 짙은 도시라 그런지는 몰라도 도심 치안은 확실히 좋은 편인 것 같다. 너무 늦게 알아서 가볼 기회가 없었지만 몰몬 교회에서 낮 12시 30분마다 오르간 연주회를 한다고 하니 혹시 관심 있는 사람은 챙겨보면 좋을 듯하다.
덧4) 영국보다는 음식이 확실히 낫다. 다음에 영국 출장가면 꼭 먹을 것 많은 곳에 묵어야지... 커피는 역시 이탈리안이라고 제대로 붙어있는 곳들이 맛있다. 확실히 한국이 커피맛은 상향평준화되어 있다.
덧5) Bloomberg가 이번에 후원도 많이 하고 아예 코어 개발자 한 명을 full-time support하겠다는 계획도 발표했다. Microsoft 중심으로 Faster CPython 프로젝트를 하면서 최근 많은 성능 개선이 이루어지고 있는데, Bloomberg의 참여로 또 어떤 개선이 가능할지 기대된다.