파이썬의 진정한 초능력
(youtu.be)PYCON UK 2025에서 Hynek Schlawack가 발표한 "Python의 진정한 초능력" 키노트 요약입니다.
발표자는 프레젠테이션을 시작하기 전에 자신의 경력을 간략하게 소개하며, 특히 14년간 PyCon 커뮤니티에서 활동하며 경험했던 '증오스러운 우정'에 대해 언급했습니다.
Python 2에서 3으로의 전환 (The Python 2 to 3 Migration)
- 배경: Python 3.0은 2008년에 처음 출시되었으며, 일반 소비를 위한 것이 아니라 Python의 목표를 보여주고 피드백을 받기 위한 것이었습니다. Python 3.2부터 사용이 권장되었습니다.
-
주요 변경 사항:
- 문자열 처리: Python 3는 문자열 기본 유형을 기계 친화적인 바이트에서 사람 친화적인 유니코드로 변경했습니다.
- 암묵적 동작 제거: Python 2에서 가능했던 문자열과 숫자 비교와 같이 개발자들이 실수로 의존했던 많은 암묵적 동작이 제거되었습니다. 이는 디버그하기 어려운 버그를 유발했습니다.
- 국제화 개선: Python 2 코드베이스는 유니코드 디코드 오류로 가득했으며, Python 3는 이를 개선하여 더욱 국제화된 언어가 되었습니다.
-
전환의 어려움:
- 커뮤니티 비용: 전체 생태계를 Python 3로 포팅하는 데 엄청난 비용이 들었습니다. 많은 소프트웨어를 포팅해야 했고, 당시에는 테스트 커버리지가 보편적이지 않았습니다.
- 혼합 코드베이스 개발: Python 2와 Python 3 모두에서 실행되는 하이브리드 코드베이스를 작성하는 방법에 대한 합의는 Python 3.3이 출시된 2012년이 되어서야 이루어졌습니다.
- 언어 모라토리엄: Python 3.0에서 3.3 사이에 새로운 기능이 거의 추가되지 않아 개발자들이 Python 3로 전환할 동기가 부족했습니다.
- 불확실성: Python 3가 지배적인 버전이 될지 불확실했으며, Perl 6와 같은 사례처럼 실패할 가능성도 있었습니다.
-
Python의 생존 이유:
- 신규 사용자 유입: Python은 다른 언어들(Go, Rust 등)이 성장하던 시기에 신규 사용자 유입이 출혈량보다 많았습니다.
- 과학 및 엔지니어링 커뮤니티: 과학자들과 엔지니어들은 오랫동안 Python을 사용해왔으며, 2010년대 중반부터 데이터 과학 분야에서 Python의 인기가 급증했습니다. 현재 Python 사용자 중 절반 이상이 데이터 탐색 및 처리에 Python을 사용합니다.
- 기존 생태계: NumPy와 같은 강력한 과학 계산 라이브러리 생태계가 이미 존재했습니다.
- 다른 컴파일 언어와의 상호 작용 용이성: Python은 다른 컴파일 언어와의 상호 작용이 용이하여 C, C++, Fortran, Rust로 작성된 고성능 구성 요소들을 연결하는 "접착제" 역할을 할 수 있습니다.
- 탐색적 프로그래밍: Python은 대화형 셸(REPL)과 Jupyter Notebook과 같은 도구를 통해 탐색적 프로그래밍에 매우 적합합니다.
- 점진성 (Graduality): Python은 다양한 수준의 엄격함(rigor)을 제공합니다. 개발자는 실험 단계에서는 유연하게 작업하고, 프로덕션 단계에서는 타입 힌트, 린터, 테스트와 같은 도구를 사용하여 엄격함을 높일 수 있습니다. 또한 Jupyter Notebook에서 시작하여 웹 서비스로 확장하는 등 다양한 사용 사례에 Python을 적용할 수 있습니다.
Python의 진정한 초능력: 점진성 (Graduality)
- Python은 진입 장벽이 낮을 뿐만 아니라 여러 개의 높은 상한선을 제공하여 사용자가 필요에 따라 유연하게 활용할 수 있습니다.
-
점진성의 양면:
- 긍정적 측면: 사용자가 원하는 수준의 엄격함과 복잡성을 선택할 수 있습니다. 예를 들어, 스크립트 작성 시에는 타입 힌트 없이 자유롭게 코딩하고, 대규모 애플리케이션에서는 엄격한 타입 검사를 적용할 수 있습니다.
- 부정적 측면: 시스템에 특수 사례나 예외를 추가하면 단기적으로는 개별 사용자에게 편의성을 제공하지만, 장기적으로는 시스템의 전체적인 복잡성을 증가시킵니다. "쉬운 것이 항상 단순한 것은 아니다"는 점을 강조하며, 이는 Python의 패키징 방식에서 나타납니다.
패키징 문제의 사례 (Packaging Problem Example)
- Python 애플리케이션을 구조화하는 방식에는 '임시(ad hoc)' 방식과 '패키지' 방식이 있습니다. 패키지 방식이 더 잘 정의되고 도구가 내장되어 있지만, 역사적인 이유로 임시 방식도 계속 지원되고 있습니다.
- 이로 인해
sys.path
와 같은 문제를 이해하기 어렵게 만들고,pip install --user
와 같은 기능은 전역 네임스페이스에 문제를 일으켜 디버깅을 어렵게 합니다. - UV와 같은 새로운 도구는 초기에는 패키지 방식만 지원했지만, 결국 임시 프로젝트도 지원하게 되면서 복잡성이 증가했습니다.
- 이러한 '매혹적인 골칫거리(attractive nuisance)'들은 단기적인 편의를 제공하지만, 장기적으로는 커뮤니티에 상당한 비용을 초래합니다.
소프트웨어 아키텍처 (Software Architecture)
- Python 커뮤니티에서 소프트웨어 아키텍처에 대한 논의가 부족하다는 점을 지적하며, 이는 "엔터프라이즈 패턴"에 대한 반감과 "자바가 되는 것에 대한 두려움" 때문이라고 언급합니다.
- 필요성: 복잡한 소프트웨어 시스템을 구축하고 유지보수하기 위해서는 모듈, 레이어, 상호 작용을 조직하고 관리하는 소프트웨어 아키텍처에 대한 논의가 중요합니다.
-
해결책:
- Python 커뮤니티는 "파이써닉(pythonic)" 또는 "비파이써닉(unpythonic)"과 같은 용어로 대화를 끝내는 것을 피해야 합니다.
- 다른 언어 커뮤니티의 모범 사례(예: 도메인 주도 설계)를 배우고 적용해야 합니다.
- 더 많은 사람들이 소프트웨어 아키텍처 관련 지식을 공유하고, 관련 콘텐츠를 만들며, 솔루션에 집중해야 합니다.
결론 (Conclusion)
- Python에 대해 불안해하지 말고, Python을 작성하는 다양한 방법을 포용해야 합니다.
- 새로운 스타일과 도구를 시도하여 사고방식을 확장해야 합니다.
- 옵션에는 비용이 따르므로, 특정 기능이 전체 커뮤니티에 미치는 영향을 신중하게 고려해야 합니다.
- 단순한 것을 쉽게 만드는 작업과 함께, 복잡한 것을 가능하게 만드는 작업에도 더 많은 노력을 기울여야 합니다.
- 소프트웨어 아키텍처에 대해 더 많은 대화를 나누고, Python을 더 나은 미래로 이끌기 위해 독단적인 사고방식에 질문을 던져야 합니다.
이 프레젠테이션은 Python 커뮤니티의 과거, 현재, 미래를 아우르며, 언어의 진정한 강점인 "점진성"을 강조하고, 커뮤니티가 직면한 과제와 극복해야 할 문화적 장벽에 대해 깊이 있는 통찰을 제공합니다.
영상을 보시려면 다음 링크를 참조하세요: https://youtu.be/gDvwRpl9erE