[토론] 8장 설명하는 변수

책 8장을 읽고 다양한 의견을 댓글로 남겨 주세요.

photo
유영모

솔루션 회사를 시작으로 컨설팅 회사 그리고 서비스 회사를 거쳐 지금은 스타트업에서 개발자로 일하고 있습니다. 주로 오픈소스 제품 개발, 기술 자문 및 코칭을 하고 있으며 기술과 인간의 상호작용에 관심이 많습니다.

댓글 5

img

[yeTi] 예티

2024-10-07 02:26

변수로 설명하면 가독성이 높아진다.


실무에서 코딩을 할 때 당연하게 수행하는, 의미를 변수나 함수로 나타내는 행동을 켄트 벡이 말해줍니다.


어렵게 크고 복잡한 코드의 표현식을 이해했다면 전체에서 일부 표현식을 추출한 후, 표현식의 의도가 드러나도록 변수 이름을 만들어 할당해 보세요. - p.53


가끔 누가 코드를 이렇게 짜논 나 를 발견하기도 하는데요.


제 경험내에서도 설명하는 변수가 가지는 인식의 효율이 크다고 느끼고 있기 때문에 깊은 공감을 합니다.


그리고 당연하게도 커밋을 분리하라는 말을 합니다.


코드 정리에 대한 커밋commit과 동작 변경에 대한 커밋은 분리해야 합니다. - p.54


이를 저는 각각의 커밋이 만들어가는 맥락이 중요하기 때문에 이를 만들어가는 과정으로 받아들입니다.

img

정승주

2024-10-13 08:16

설명하는 xxx의 어려움


저도 설명하는 변수, 상수, 메서드를 사용하는 것에 반대하는 것은 아닙니다.
오히려 차라리 길어질지언정 다 갖다 넣자! 라고 하는 편에 속합니다.
다만 이 설명이 누구나 알아들을 수 있는 설명이냐 관점에서 어려움을 겪는 상황이 있습니다.
저는 다음과 같은 메서드 명을 본적이 있습니다.

fun sendAlarmQuietly() {
    // 알람 부서에서 제공하는 API 호출
}

Quietly? 처음에 알림을 조용히 보낸다? 알람을 제공하는 곳에서 조용히 보내기 기능이 있나보다. 생각했습니다. ***Quietly 라고 postfix가 붙은 메서드는 심심찮게 보였습니다.
이런 것들은 callee 쪽에서 조용히 처리해주는 기능이 있는걸로 인지하고 있었습니다.


나중에 알게되었습니다.
Quietly는 발생하는 exception을 무시한다는 뜻이라는 것을.
조용히 보내기 기능이 있는 것이 아니라, 그냥 우리가 알람을 보낼 때 문제가 발생해도 무시한다는 것이었습니다.


이런경우, 우리는 예외를 무시하는 메서드에는 **Quietly 라고 명명해야 된다는 규칙을 정해놓고 어딘가 적어놨어야 하는 걸까요?
이런 경우가 참 어려운 것 같습니다.
설명하는건 좋은데... 이 설명이 누구나 다 알아들을 수 있는 설명이야?!

img

유영모

2024-10-15 02:02

공감가는 경험이네요. 더불어 켄트 벡의 다음 책 'Tidy Together' 에서 해당 내용을 다룰지 궁금해 집니다. :)


다만 이 설명이 누구나 알아들을 수 있는 설명이냐 관점에서 어려움을 겪는 상황이 있습니다.


이 부분에는 저는 생각이 다릅니다. 저는 누구나 알아들을 수 있는 설명은 없다고 생각합니다.
각자가 살아온 맥락이 다 다르기 때문에 구사하는 어휘 역시 다르기 때문입니다.


관점을 두 개로 나누어 보겠습니다.

  1. 내가 짠 코드 && 바꿀 수 있는 코드
    자주 혹은 간혹 내가 짠 코드도 햇갈리는 경우가 있습니다.
    이 때에는 다시 볼 때 반복되지 않도록 Tidying 합니다.


  1. 내가 짜지 않은 코드 && 바꿀 수 없는(바꾸기 힘든) 코드
    책 4장 '새로운 인터페이스로 기존 루틴 부르기' 같은 것들을 이용하여
    내가 알아들을 수 있도록 래퍼를 만들어 Tidying 할 수 있을 듯 합니다.
    그 후에 함께 일하는(혹은 마음이 맞는) 동료들에게 공유하여 기존 코드와 Tidying 코드를 비교할 수 있는 자리를 만들어 서로의 맥락을 맞추는 일을 할 듯 합니다.



img

안영회

2024-10-15 12:49

@정승주 ‘설명하는‘은 맥락을 이용한 응집(압축)일 뿐입니다. 결과는 전혀 범용적으로 쓰지는 못합니다. 에릭 에반스가 이러한 언어의 한계를 Bounded context 라고 말한 그 현상이죠.

img

정승주

2024-10-15 14:30

오.. 두분의 이야기를 들으니, 맥락이 다 다른건 어쩔 수 없는 거구나. 이걸 인정하고 어떻게 맞춰가야 할지 논의해야겠구나는 생각이 듭니다.


어떤 BoundedContext 라는 개념은 어떤 비즈니스 안의 용어 정도로만 정의했었는데, 기술적인 것도 BoundedContext로 다뤄야 할 수 있구나 싶네요
(ex. *Quietly 를 붙이면 예외를 무시하는 메서드임 등등, 기술적인 것도 구성원의 맥락을 맞추기 위해 Bounded Context를 정의하기.)

img

nimkoes

2024-10-14 13:53

잊지 않으려고 노력하는 말이 있습니다.
그 자체로 설명이 가능하다는 것을 뜻하는 'self-descriptive' 와
'코드 자체가 문서가 되게 하라' 는 말 입니다.
말 자체에 대한 이해는 어렵지 않게 할 수 있지만, 보통 현실은 이론과 다른 경우가 많아 실무에 적용하는 것을 또 다른 문제라고 생각 합니다.


그럼에도 주석 없는 코드와 동화책 처럼 읽히는 코드를 작성하기 위해서는, 약속된 구조에 코드를 작성하는 것도 중요하지만, 늘 함께 있어 소중함을 깜빡하는 변수의 이름을 짓는 일을 소홀히 해서는 안되겠다고 다시 한 번 생각 했습니다.


가끔 주석 없이 표현 해보겠다고 장고 끝에 긴 이름의 변수를 만들면, '이럴 거면 용어 사전에 그럴듯한 이름을 가져다 조합해서 쓰고, 주석에 설명을 잘 남겨놓자' 는 결론에 도달하기도 합니다.


변수 이름을 짓기 어렵다면 다른 문제가 (예를 들면, 모호한 도메인 정의, 풀고자 하는 문제를 해결할 수 없는 구조 등) 있어서는 아닐지 되돌아보고, 더 늦기 전에 개념부터 재설계 하는 것을 고민해보는 것도 좋겠다 생각 했습니다.




추가로 짧게 언급 된 '코드 정리에 대한 커밋과 동작 변경에 대한 커밋은 분리' 한다는 부분에서 한 편의 소설을 읽는 느낌을 받을 수 있을까 상상 했습니다.

img

유영모

2024-10-15 02:08

의견 고맙습니다. :)


먼저 아래 문장에서 문학적인 소양이 엿보이는 듯 하네요.


늘 함께 있어 소중함을 깜빡하는 변수의 이름을 짓는 일을 소홀히 해서는 안되겠다고 다시 한 번 생각 했습니다.

img

유영모

2024-10-15 02:09

추가로 짧게 언급 된 '코드 정리에 대한 커밋과 동작 변경에 대한 커밋은 분리' 한다는 부분에서 한 편의 소설을 읽는 느낌을 받을 수 있을까 상상 했습니다.


'한 편의 소설을 읽는 느낌'이라는 은유를 하셨는데 그런 느낌 든 이유를 조금 더 구체적으로 설명해 주실 수 있을까요?

img

nimkoes

2024-10-15 03:13

관심 있게 봐주셔서 감사합니다 : )
'한 편의 소설을 읽는 느낌' 이라고 표현한 것은, 아직 많은 경험이 없어서 '느낌을 받을수 있을까' 정도로 생각을 한 것인데요.


이게 적절한 표현으로 전달이 될지 모르겠지만, 예를 들어 식사를 할 때도 물을 먼저 마시고 밥을 한 술 뜨는 사람이 있고, 반찬 부터 먹는 사람, 밥 부터 먹는 사람. 또는 손 부터 씻고 '잘 먹겠습니다' 하고 먹는 사람 등등 다양한 순서로 식사를 할 수 있는데요.
'식사를 한다'는 것을 '코드를 작성한다' 라고 생각 한다면, '식사 순서' 를 '커밋 순서' 가 될 수 있겠다고 생각 했습니다.


결국 동작하는 코드를 작성 함에 있어서, 최종 결과물이 같을 수 있지만
어떤 순서로 작업을 했는지 보면 (코드가 변경되는 과정) 그 사람이 어떤 생각을 가지고 있는지 옅볼 수 있고

코드 정리를 먼저 한다 -> 먼저 이해를 선행하는 것을 선호한다. 어쩌면 조심스러운 성향이다.
구현 후 정리를 한다 -> 결과를 먼저 보고 나중에 개선하는 것을 선호 한다. 어쩌면 성격이 급하다(?)


또 변경되는 과정 중에 작업한 것을 되돌리기도 할 수 있는데, 그런것을 보면 소설 속에 인물들이 갈등을 빚고 있는 순간 (코드를 작성한 사람의 내면의 갈등) 처럼 보일 수 있곘다고 생각해서
'소설을 읽는 느낌' 이라고 표현 해보았습니다 : )

img

유영모

2024-10-15 08:31 (수정됨)

@nimkoes 말씀을 들으니 커밋 컨벤션이 떠오르네요.
가장 잘 알려진 컨베션은 Udacity Git Commit Message Style Guide으로 보여 집니다.
전에 제가 코칭했던 조직의 어느 개발자가 도입하자는 의견을 주셔서 취향을 존중해 주었습니다.
그 후에 함께 쓴 동료들에게 어떠냐고 느낌을 물어보니 시큰둥한 반응이었습니다.
다른 분들의 의견도 들어보고 싶네요.


말씀하신 '소설을 읽는 느낌'을 더 잘 살려내려면 접두사 보다도 제목(Udacity 기준으로 Subject)에 집중하는 것이 효과적일 것 같다는 생각입니다.
그런 의미에서 저는 Udacity Git Commit Message Style Guide 같은 것을 따르진 않았지만
예전부터 지켜오던 규칙이 있습니다.


  1. 이슈 트래커에 해야 할 일들을 최대한 작게 나누기
    보통 의사소통의 기록은 이슈 트래커를 기준으로 하기 때문에 제목을 최대한 작게 그리고 제목만 보고도 대강 작업을 짐작하도록 만들려고 합니다.


  1. 이슈 트래커 번호(아이디)와 제목을 Commit 메시지에 쓰기
    코드와 이슈 트래커를 연결하는 것입니다.
    Commit 메시지로 표현하기 어려운 것이 의사소통 과정 즉 맥락 입니다.
    일일이 의사소통 과정을 커밋 메시지에 기록하기 어렵기에 이 방식을 선호합니다.


  1. 작업 하나에는 하나의 Commit 메시지 유지하기
    작업 하나에 여러 커밋 메시지가 있으면 응집성이 떨어 집니다.
    그래서 체리 픽하거나 롤백하기 어렵습니다.



img

안영회

2024-10-15 12:51

@nimkoes 동감입니다. 다만, 정성을 다할 수는 있습니다. :)

img

유영모

2024-10-15 01:32 (수정됨)

코드를 찾아보고 AI와 함께 코드 정리하기

먼저 코드를 찾아봅니다.
현재 사이트(tidyfirst.bettercode.kr) React JSX 코드가 눈에 들어옵니다.
댓글 목록 중 자신이 단 댓글이면 수정 버튼이 보이게 하는 코드네요.
조금은(?) 긴 표현식이 눈에 들어 옵니다.

{
    session && session.user.id === comment.createdBy && !editMode &&
    <Button
        size="sm"
        variant="text"
        color="gray"
        className="flex items-center gap-1 flex-shrink-0 ml-auto"
        onClick={toggleEditMode}
    >
        <Pencil className="w-4 text-4 h-4" />
        수정
    </Button>
}


어렵고 크고 복잡한 코드의 표현식을 이해했다면 전체에서 일부 표현식을 추출한 후, 표현식의 의도가 드러나도록 변수 이름을 만들어 할당해 보세요.


JSX 안에서 설명하는 변수를 만들어서 표현하면 좋겠다는 생각이 듭니다.
그런데... 저는 JSX에서 그런식으로 사용해 본 적이 없네요.
저는 Cursor Code Editor 를 쓰고 있습니다.
위의 코드를 블록으로 잡아 AI 에게 말합니다.

표현식을 변수로 리펙토링해줘


아래와 같이 만들어 주네요.

{
    (() => {
        const isCurrentUserComment = session && session.user.id === comment.createdBy;
        const showEditButton = isCurrentUserComment && !editMode;

&lt;br/&gt;

        return showEditButton && (
            <Button
                size="sm"
                variant="text"
                color="gray"
                className="flex items-center gap-1 flex-shrink-0 ml-auto"
                onClick={toggleEditMode}
            >
                <Pencil className="w-4 text-4 h-4" />
                수정
            </Button>
        );
    })()
}


음. 조금 더 나아졌나요? :)

img

안영회

2024-10-15 12:52

@유영모 람다식으로 tidying 해 준 건가요?

img

유영모

2024-10-16 03:16 (수정됨)

@안영회 AI가 만들어준 코드는 JSX 문법 상 변수 선언이 어렵기 때문에 화살표 함수(arrow function, 람다)를 사용해서 변수를 선언할 수 있는 공간을 만들어 tidying 한 것이라고 저는 이해 했습니다.

img

Sunghoon Park

2024-10-16 09:31 (수정됨)

변수명 + 함수명


저는 로직을 쉽게 읽기 위해선 가장 중요한 개념들이 도드라지게 표현 되어야 한다고 생각합니다.
그런면에서 변수명은 무언가 처리된 결과가 그 변수명과 함께 자신을 표현한다고 생각하구요.


그런데 이 과정에서, 변수의 최종 상태를 유도하는 과정들이 지저분하게 나열 되어 있으면
도드라짐이 덜해진다고 생각해요.
그래서 대부분의 로직이 추상화 레벨에 맞춰 private method에 의해 처리 되고, 그 수행 결과가 final 변수로 반환 됩니다.


이 과정의 반복을 통해 각 추상화 레벨에서, 그 수준에 맞게 도드라지는 읽기 쉬운 코드들이 나오는 것 같아요.

하고 자유롭게 의견을 남겨 주세요.