피톤
39
2021-04-15 22:02:27
9
732

프로그램 언어에서 가독성이란? feat. Python


우선순위 1번입니다.

유지보수는 물론이고 내가 짠 프로그램도 1년 뒤 이해못하는 상황이 허다하지요.

가독성에 올인한 랭귀지가 파이썬입니다.

제가 파이썬 빠돌이가 된 이유가 바로 이부분이죠.

들여쓰기 블록 문법...

이거 예술입니다.

들여쓰기를 해야 블록으로 인식하고 괄호따위 가비지 문자 안쓰는 덕에 타 언어 대비 가독성 50퍼센트가 올라가죠.

또한 리스트 컴프리헨션...

이거 첨보면 외계어 같기도 하고 일반 프로그래머는 생소해서 이해가 어려울 수도 있겠지만 결국 중3 수학의 조건제시법이라 이해하는 순간 오마이갓...

그동안 왜 이렇게 쉬운걸 for문 다중문 돌리고 있었을까 바보같은 나에 대한 아쉬움이 확 들죠.

집합자료형 set 이거 지원하는 언어 별로 없는데 이게 아주 막강하죠. list를 set으로 변환해서 교집합 합집합 차집합 구하는 로직이 파이썬 1줄로 끝나는 건 오르가즘입니다.

사실 딕셔너리는 json 또는 자바 오브젝트 타입 나오기 전 파이썬 고유 자료형이었죠.

다른 언어에도 있으니 생략...

들여쓰기, 리스트(튜플,셋,딕셔너리) 컴프리헨션, 막강 자료형...

이로 인해 파이썬 코드는 어떤 언어보다 짧지만 읽기쉬운 코드입니다.

읽기 쉽다는 의미는 상당히 다양하게 이해할 수 있는 데요...

수학전공자들이 논문 쓸 때 컴터를 사용해야 하는데 읽기 쉽운 언어를 사용해서 numpy가 만들어집니디.

물리학 전공자들이 논문 쓸 때 컴터를 사용해야 하는 데 쉬운 언어를 사용해서 scipy가 만들어집니다.

통계학 전공자들이 pandas를 만들죠.

비전공자가 막 들이대며 자기 전공분야 최첨단 라이브러리를 만들어 대는 언어가 그래서 파이썬입니다.

왜냐고요? 답은 가독성이죠.

파이썬은 1991년 발표되어 30년된 언어입니다. 1995년 발표된 자바보다 더 오래된 언어라는 거 몰랐죠?

귀도는 제가볼 때 빌게이츠, 스티븐잡스, 리처드 스톨만, 리누스 토발즈 보다 천재 같아요.


0
  • 댓글 9

  • rey
    373
    2021-04-15 22:10:10 작성 2021-04-15 22:11:35 수정됨

    저도 파이썬 빠돌이 였지만 줄리아(Julia) 해보니 깔끔한 맛이 있어 매력이 있더군요.

     요즘 서점 가보면 파이썬 책들이 벽면을 가득 채웠던데 10년전 생각해보면 자바책이 가득했던거 같기도 하고 흐르는 강물처럼 또 시간이 지나면 새로운 언어가 파이썬의 자리를 대체할 수도 있겠죠?

     요즘 함수형을 익히면서 생각하는 건데 파이썬은 람다관련해서는 욕먹고 좀 밀려날 수도 있지 않을까 생각이 들어요. 

  • 피톤
    39
    2021-04-15 22:20:46

    함수형을 지원하는 언어 중 메이저 언어는 파이썬이죠.

    리스트 컴프리헨션 도배질이 함수형 정의에 가장 잘 들어맞다고 봅니다.

    제너레이션, map, filter, 람다 몽땅 리스트 컴프리헨션으로 귀결되어 버리니까요.

  • allinux
    1k
    2021-04-16 00:24:40 작성 2021-04-16 00:30:03 수정됨

    파이썬은 동적타입 언어라 가독성을 떠나 실행해보기전엔 올바른지 조차 알기 어렵습니다.

    그런면에서 파이썬은 가독성이 좋지 못합니다.(타입힌트는 힌트일뿐이죠 강제가 아닙니다.)

    그리고 파이썬의 함수형 지원은 다른 언어들에 비하면 많이 부족합니다.

    일단 기본적으로 부수효과를 방지하는 가장 기본이 상수(const) 타입인데 파이썬은 기본적으로 const 가 없는 환경입니다.

    추가적으로 차라리 scala 가 훨씬 낫습니다. scala 도 파이썬만큼 표현력이 좋아서 짦은 코딩이 가능하고 컴프리헨션(for comprehension), map, filter 는 기본이고 태생이 함수형 언어입니다. 

  • pooq
    7k
    2021-04-16 05:50:42
    파이썬의 들여쓰기가 가독성에 좋다는 얘기는 처음 들어보네요.  처음 배우는 사람이 가장 빡처서 때려치는 이유중에 하나가 들여쓰기 강제일텐데요?  
    아무튼, 나중에라도 자바나 C#을 공부해보면 왜 파이썬이 메이저 언어가 될 수 없는지 알게될겁니다. 
  • fender
    22k
    2021-04-16 07:12:30 작성 2021-04-16 08:28:01 수정됨

    저는 파이썬이 가독성이 좋다는 이야기, 특히 함수형 지원과 관련해서 그렇다는 이야기는 절대로 공감하기 어렵습니다.

    파이썬을 거의 혐오 수준으로 싫어하는데 가장 큰 이유 중 하나가 제가 써 본 언어 중에 함수형 접근에서 압도적으로 불편하고 가독성이 떨어지는 것이 파이썬이었기 때문입니다.

    파이썬에서는 아래와 같이 매우 간단한 예에서 조차 이 지경입니다:

    from functools import reduce
    list(map(lambda c: c.upper(), reduce(lambda a, b: a + b, map(lambda x: x.split(","), ["a,b", "c,d"]))))

    람다를 쓰는 순간 모든 타입 정보가 날아가는 것과 같은 파이프라인에서 람다 변수가 충돌하는 건 덤입니다. 쉽게 말해 위의 코드에서 c의 타입 정보가 날아가서 c.upper()는 자동 완성 지원도 안 되고, 'c'를 'a'로 바꾸면 뒤에 등장하는 'a'에 가려지게 됩니다.

    한편, 같은 코드를 스칼라로 바꾸면 이렇습니다:

    Seq("a,b", "c,d").flatMap(_.split(",")).map(_.toUpperCase)

    참고로 자바의 예입니다. 글자수로만 따지면 꽤 장황해지긴 했어도 파이썬 함수형 API와 달리 체이닝을 지원해서 단계를 명확하게 알 수 있고 변수 충돌도 없는 것이 장점입니다:

    Stream
        .of("a,b", "c,d")
        .flatMap(v -> Arrays.stream(v.split(",")))
        .map(String::toUpperCase)
        .collect(Collectors.toList());

    당연한 이야기지만 실무에서 함수형 코드를 쓰면 플랫맵 단계가 한 파이프라인에 서너 개 쯤 되는 경우도 흔합니다. 플랫맵 컴프리헨션을 지원하는 스칼라나 러스트 같은 언어와 고작 플랫맵 단 한 번에 코드가 저 지경이 되는 파이썬과 어느 쪽이 가독성이 높은지는 더 이야기할 필요가 없을 것입니다.

    함수형으로서 더 큰 문제는 파이썬의 경우 map, reduce 등의 '인터페이스'를 적용할 수 있는 일반화 된 '컨테이너' 개념 자체가 존재하지 않는다는 것입니다.

    이는 스칼라 같은 언어는 물론, 그래도 진지하게 함수형을 추가하겠다고 설계한 자바나 C# 같은 언어와 비교해도, 파이썬의 함수형 지원은 그냥 흉내내기 수준이라고 혹평할 수 밖에 없는 이유인 듯 합니다.

    그리고 함수형을 떠나서 파이썬이 타 언어보다 유독 가독성이나 기능이 떨어지는 사례도 꽤 많습니다. 파이썬이 다른 언어보다 편리한 건 그냥 리스트나 딕셔너리 같은 간단한 자료 유형을 스크립팅 수준에서 가볍게 다루는 경우이고, 이를 벗어나면 다른 언어에 비해 장점이 없는 단계, 그리고 다른 언어에 비해 불편해서 쓰기 힘든 단계에 빠르게 도달하게 되는 것 같습니다.

    파이썬을 딥러닝 같은 분야에서 유독 많이 쓰는 건 아마도 해당 분야에서 필요한 프로그래밍 수준이 딱 그 정도로 충분한 경우가 대부분이기 때문일 것입니다.

  • agolta
    36
    2021-04-16 10:17:41

    왜 그렇게 하죠?

    [ y.upper() for x in ["a,b","c,d"] for y in x.split(',') ]

    리스트 컴프리헨션으로 훨씬 더 간단하게 되는데요?

    제가 볼때는 파이썬 철학이 더 간단하게 처리되는 방법이 있을 경우 굳이 다른 방법을 개선하려 하지 않는 것 같습니다.

    map, reduce로 구현할수 있는 모든 것들은 리스트컴프리헨션으로 더 쉽게 구현되기 때문에 차라리 리스트컴프리헨션 기능, 성능 개선에 집중하는 게 낫겠죠.

    map, reduce 같은거야 구색거리로 남겨두고요.

    또한 파이썬은 답을 먼저 말하는 방식을 사용하기 때문에 이 방식에 익숙해지만 가독성이 더 좋아집니다.

    c나 자바에서 

    a>b ? a : b

    이런 코드는 파이썬에서

    a if a>b else b

    로 바뀝니다.

    답부터 말하자는 것이죠.

    list(map(lambda c: c.upper(), reduce(lambda a, b: a + b, map(lambda x: x.split(","), ["a,b", "c,d"]))))

    이 코드도 답부터 말하려는 파이썬 철학에 의해 이렇게 구성된 거죠.

    다른언어는 upper()가 뒤에 나오지만 파이썬은 앞에 나오는 게 맞습니다.

    "난 upper()를 구할건데 upper()를 구하는 로직은 다음과 같아." 이런 말을 하고 싶은거죠.

    난잡해 보이긴 해도 답부터 보는 습관이라면 볼만 합니다.


    리스트컴프리헨션도 마찬가지로 답부터 말하는 방식으로 최종 원소를 먼저 정의하고 뒤에 루프나 조건이 붙는거구요.

    (이게 수학적 사고와 동일합니다. 조건제시법도 마찬가지고요.)

    오히려 다른 언어가 주저리, 주저리, 그래서 답은 뭐 라고 표현하는 것이 가독성 떨어지는 부분이라고 봅니다.

  • fender
    22k
    2021-04-16 10:39:16 작성 2021-04-16 10:50:19 수정됨

    agolta // 제가 언급한 코드는 가장 간단한 예시를 든 것이고, 당연히 실제 개발하면서 필요한 코드는 저 보단 훨씬 복잡합니다.

    리스트 컴프리헨션이 편할 때도 있다는 걸 부정하지 않습니다만, 문법의 특징상 메서드 체이닝 방식에 비해 단계가 하나 늘어날 때 마다 가독성은 크게 저하되는 것도 부정할 수 없는 사실입니다.

    그리고 map/reduce로 구현할 수 있는 모든 것을 리스트 컴프리헨션으로 처리 가능하다고 하셨는데, 함수형 언어에서 map을 적용할 수 있는 것은 리스트나 튜플만이 아닙니다.

    위에서 지적했 듯, 제대로 된 함수형 언어에서의 map이나 flatMap 같은 기능은 펑터나 모나드 같은 타입 클래스로 추상화 되는 개념이지만 파이썬의 리스트 컴프리헨션은 반복문을 개선한 문법 확장일 뿐입니다.

    단적으로 말해서 리스트가 아닌 파이썬의 Future를 리스트 컴프리헨션으로 다룰 수 있는지 생각해보시면 무슨 이야기인지 이해하실 겁니다.

    삼항식이 가독성 면에서 그렇게 큰 차이가 아니라는 것은 동의합니다만, 그렇게 따지면 솔직히 괄호 대신 들여쓰기를 쓰는 게 가독성 면에서 그렇게 대단한 장점이라는 것도 납득하긴 어려울 것 같습니다.

    그리고 upper()가 앞에 나오는 것이 파이썬의 철학이라고 하셨는데, 솔직히 그건 함수형 파이프라인의 맥락에 있어서는 납득하기 어려운 무리한 주장이라고 봅니다.

    파이프라인은 말 그대로 데이터를 처리하는 코드를 파이프 처럼 순서대로 쭉 이어 붙여서 가공하는 것인데, 그걸 소스부터 따라 가는 것이 아니라 반대로 최종 단계부터 거슬러 올라가려 하면 이해하기 어려운 경우가 많습니다.

    제시하신 리스트 컴프리헨션 버전에서 파이프라인의 출발점은 코드에 중간에 있는데 그게 한 눈에 바로 들어오나요? 파이썬에 이미 익숙해서 그렇다 쳐도, 저기에 필터, 맵 한 두 단계 만 더 들어가면 어떻게 될까요?

    역순으로 코드를 읽으면 c가 무슨 유형인지도 모르는데 upper()는 이름만 보고 어디 붙어 있는 무슨 메서드인지 짐작해야 하나요?

    더구나 람다 한 번 거치면 IDE 조차 타입을 잊어 버리는 파이썬 언어에서 그걸 눈으로 보고 파악하는 건 할 이유도 없고 하기도 어려운 일입니다.


  • NPE
    990
    2021-04-22 18:28:50

    함수 합성만 얘기하면 파이썬은 최악입니다.

    LISP 계열은 Thread Macro라도 지원하지,

    이건 계속 f(g(h(....))) 이런식이라 답이 없어요.


    pytoolz(https://github.com/pytoolz/toolz) 없으면 못쓰겠어요.

  • wjrmffldrhrl
    54
    2021-04-24 21:40:58

    표준 라이브러리 이름부터 맘에 안들어서 ㅎㅎ;

  • 로그인을 하시면 댓글을 등록할 수 있습니다.