linuxer // 우선 파이썬도 C와 마찬가지로 훌륭하게 쓰일 수 있는 영역이 있다는 전제로 이야기하고 싶습니다.
오픈소스 생태계도 좋고 특히 리스트 같은 데이터 조작이 간편하고 대체로 간단한 스크립트나 프로그램을 짜는데는 꽤 편리합니다. 아마 입문용이나 개발 자체가 주가 아닌 분야에서 널리 쓰이는 것도 비슷한 이유가 아닐까 싶습니다.
문제는 이걸 범용 언어로 복잡한 개발에 활용하는 경우인데, 이제까지 써 본 경험으로는 불편한 점이 한 두가지가 아니었습니다.
우선 동적 언어의 단점을 고스란히 가지고 있습니다. 동적 언어는 일반적으로 간단한 것을 만들 때 장점이 부각되고 코드가 복잡해질수록 단점이 도드라지는데, 파이썬도 예외가 아닙니다.
정적 타이핑을 선택적으로 지원하고 있고 MyPy 같은 관련 모듈도 있지만 처음부터 정적 언어로 설계한 경우에 비해 꽤 불완전하고 어색합니다. 제너릭 같은 건 매우 괴랄한 모양이고 람다 같은 건 제대로 타입 추론도 되지 않습니다. MyPy가 있어서 도움이 되는 느낌보다 MyPy와 싸우는 느낌이 들 때도 많고, 때에 따라선 타입 정보를 틀리게 써도 오류가 발생하지 않습니다.
그리고 파이썬 코드는 클래스를 선언하는 순서에 영향을 받습니다. 역시 __future__ 같은 모듈이나 꼼수로 일정부분 해소는 가능하지만 그렇지 않은 경우도 있고, 그런 문제가 없는 언어를 쓰다가 이런 문제로 클래스 추가할 때 마다 import 순서를 바꾸고 (그래서 다른 언어처럼 IDE에서 import 구문 자동 정리를 하면 코드가 망가질 수도 있씁니다) 클래스나 import문을 이리저리 옮기다 보면 이게 뭐하는 짓인지 회의가 듭니다.
그리고 람다나 함수형 지원이 매우 불편합니다. C#을 쓰면서 스칼라에 비해 람다 문법이 장황해서 불만이었는데 파이썬을 써보니 C#이 그리웠습니다. 람다를 쓰려면 매번 "lambda"라고 정확하게 입력해야 하고 인자를 deconstruct하는 기능은 있다가 없어졌고, 심지어 타입 추론도 제대로 동작하지 않습니다.
함수형을 지원하는 모듈이 없는 것은 아니지만 메서드 체이닝 방식이 아니라 문법도 매우 장황해질 수 있고 기능이 많지도 않습니다.
그리고 당연한 것들이 때로는 말도 안되게 복잡해집니다. 객체지향을 표방하고 있는데 setter를 오버라이드 하기 위해선 꼼수를 동원해야 한다거나, 메서드 오버로딩을 하려면 역시 별도의 데코레이터를 동원해야 한다거나, 그나마 생성자 오버로딩 같은 건 지원하지 않는 등의 문제도 있습니다.
있어야 할 것이 없어서 불편한 경우도 있는데, 접근 제어자가 존재하지 않아 내부에서만 쓰는 메서드 같은 걸 컨벤션에 의존해서 처리하지만 protected나 internal 같은 개념을 표현할 수 없는 건 대책이 없습니다. 상수 같은 기본 개념도 언어가 자체적으로 지원하는 것이 아니라 API를 통해 나중에 덧대어 붙인 느낌입니다.
그 밖에 소소하게 불편한 건 셀 수 없이 많은데, 메서드 반환형에 셀프 타입을 쓸 수 없다거나, 3항 연산자 문법이 쓸데없이 장황하다거나 패턴 매칭이나 스위치 구문도 아직 지원하지 않는다거나 제너릭에 고계도 유형 표현이 안된다거나 예외 객체가 자체적으로 스택 정보를 포함하고 있지 않다거나 다 기억하기 힘들 정도입니다.
때로는 파이썬이 권장하는 방식("The Pythonic Way")이 의문이 들 때가 있습니다. 대표적으로 'EAFP 원칙' 같은 건 전 안티패턴에 가깝다고 생각합니다.
이런 이유로 어쩔 수 없이 파이썬을 사용하고 있고 아마 앞으로 최소 몇 년은 그럴 것 같지만 할 수만 있다면 다른 언어로 바꾸고 싶은 생각이 자주 들더군요.