책 11장을 읽고 다양한 의견을 댓글로 남겨 주세요.
책 11장을 읽고 다양한 의견을 댓글로 남겨 주세요.
솔루션 회사를 시작으로 컨설팅 회사 그리고 서비스 회사를 거쳐 지금은 스타트업에서 개발자로 일하고 있습니다. 주로 오픈소스 제품 개발, 기술 자문 및 코칭을 하고 있으며 기술과 인간의 상호작용에 관심이 많습니다.
[yeTi] 예티
2024-10-17 08:07
이번 장의 가이드는 코드의 의미상 구분이 될 때는 빈 줄을 넣어 나누라는 것입니다.
긴 코드 덩어리를 읽다가 ‘아, 이 부분은 이렇게 하고, 저 부분은 저렇게 하는구나'라고 구분이 될 때는 두 부분 사이에 빈 줄을 넣어 분리합시다. - p.59
실무에서 당연하게 하는 활동을 켄트 백이 언급해줘 반가운 마음이 듭니다. 나아가 이러한 사소한 활동에 의미를 더하여 소프트웨어의 설계 변화를 만드는 것으로 말합니다.
적절한 소프트웨어 설계는 변화를 가능하게 합니다. 작은 소프트웨어 설계로 변화를 좀 더 쉽게 만들 수 있습니다. - p.59
문득 ’소프트웨어 설계활동이란 무엇인가?‘ 라는 생각이 스칩니다.
현 tidy first 를 뒤져봐도 ’소프트웨어 설계는 어떤 것이다‘ 라는 명확한 문장은 없지만 지금까지 제가 받아들인 것은 이렇습니다.
어떠한 목적을 달성하기 위해 문제를 정의한다. 문제를 풀기 위해 이슈를 도출하고 이슈를 어떻게 해결할지 개념을 정리한다. 그 중 소프트웨어를 활용하는 부분에서는 소프트웨어가 동작하기 기대하는 움직임을 정의하고 움직이기 위한 내부 구조를 개념화한다. 이것이 소프트웨어 설계활동이다.
앞서 말한 빈 줄의 의미는 동작하는 코드를 개념화하는데 기여하기 때문에 작은 소프트웨어의 설계라고 말하는 것으로 생각합니다.
Sunghoon Park
2024-10-21 16:09
앞서 말한 빈 줄의 의미는 동작하는 코드를 개념화하는데 기여하기 때문에 작은 소프트웨어의 설계라고 말하는 것으로 생각합니다.
너무 좋은 의견인 것 같습니다!
유영모
2024-10-22 06:15 (수정됨)
현 tidy first 를 뒤져봐도 ’소프트웨어 설계는 어떤 것이다‘ 라는 명확한 문장은 없지만 ...
@[yeTi] 예티 켄트 벡이 ByteBteGo 인터뷰에 아래와 같은 문장이 있습니다.
The first sentence I wrote was: "Software design is an exercise in human relationships." I thought, what does that mean? That's nuts. I want to talk about coupling and cohesion, power law distributions, NPV, and optionality. These are very technical topics. But the more I thought about it, the more I realized that software design is indeed an exercise in human relationships. All the technical expertise we work so hard to gain is useless if it's not put in service of the relationships around software development.
제가 인상적이라고 느꼈던 부분만 DeepL로 번역해 보면 아래와 같습니다.
소프트웨어 디자인은 인간 관계의 연습이다. (중략) 우리가 열심히 노력해서 얻은 모든 기술적 지식은 소프트웨어 개발을 둘러싼 관계에 도움이 되지 않는다면 아무 소용이 없다.
[yeTi] 예티
2024-10-22 06:41
@유영모 그러네요. 인용해주신 부분까지 고려를 못하고 있었습니다.
소프트웨어 디자인은 인간 관계의 연습이다.
켄트 벡이 말하는 인간 관계의 연습이다
라고 말하는 부분이 인간 관계가 설계라는 활동을 함에 있어서 중요한 요소로 작용하기 때문에 어떤 맥락에서 말하는지는 감이 오는 것 같습니다.
반면에 실무적으로는 추상적인 정의라는 생각도 듭니다.
소프트웨어 설계활동이란 무엇인가?
라는 질문에 인간 관계의 연습이다.
라고 답한다면 무슨 활동을 하자는 것인지 의도 전달이 힘들 것 같다는 생각이 듭니다.
유영모
2024-10-22 06:55
반면에 실무적으로는 추상적인 정의라는 생각도 듭니다.
소프트웨어 설계활동이란 무엇인가? 라는 질문에 인간 관계의 연습이다. 라고 답한다면 무슨 활동을 하자는 것인지 의도 전달이 힘들 것 같다는 생각이 듭니다.
동의합니다. 저는 켄트 벡이 말하는 저 함축적인 말이 <Tidy First?>에 담겨 있다고 믿고
책을 다 읽을 때 쯤이면 나 스스로 내 말로 정의하는 것을 목표로 하고 있습니다.
seokmin hong
2024-10-20 12:59
최근 '설계란 무엇인가’에 대해 고민을 한 적이 있었습니다. ‘전체적인 시스템을 구상하는 것’, ‘애플리케이션이 동작하기 위해 어떤 개념을 차용하고 각 개념들이 어떻게 상호작용 할지 정의하는 것’ 등 다양한 관점에서 생각해 보았는데, 생각을 할수록 가장 낮은 수준에서 '이 코드를 어디에 위치할 것인가'에 대한 활동이라고 정의하게 되었습니다.
이 관점에서 비슷한 코드끼리 뭉쳐두는 행위 자체를 설계 활동이라고 할 수 있고, 그래서 설계라는 것이 큰 일이 아니라고 생각할 수 있었습니다. 빈 줄을 넣는 행위조차 코드의 위치가 바뀌는 것이기 때문에 (스스로 내린 정의 범위 안에서) 설계 활동이라 할 수 있기 때문입니다.
코드 사이에 빈 줄을 넣는 행위를 우리가 문장을 쓸 때, 단어 사이에 공백을 넣는 것과 같은 행위라는 생각을 했습니다. 예를들어문장을이렇게쓰면무슨말인지이해하기어렵지만, 공백으로 구분해주면 무슨 말을 하는지 비교적 쉽게 이해할 수 있기 때문입니다.
더 나아가 '관련 있는 코드를 뭉쳐둔다'는 것에서 객체 지향 스러운 면이 있다고 생각했습니다. 객체 지향은 관련된 데이터와 그 데이터를 조작하는 행위(메서드)를 하나의 단위(객체)로 묶는 프로그래밍 패러다임입니다. 이는 코드의 재사용성을 높이고, 유지보수를 쉽게 만들며, 복잡한 문제를 더 작고 관리하기 쉬운 부분으로 나누는 데 도움을 줍니다. 관련 있는 코드를 뭉쳐두는 행위는 이러한 객체 지향의 기본 원칙과 닮은 부분이 있다고 생각 했습니다. 비슷한 코드를 뭉쳐둠으로 응집도를 높이고, 자연스럽게 객체 지향적인 설계를 할 수 있겠다고 생각 했습니다.
추가로 데이터베이스 테이블 정규화 과정이 생각 났습니다. 데이터베이스 정규화는 데이터의 중복을 최소화하고, 데이터 무결성을 보장하며, 데이터베이스 구조를 명확하게 만드는 과정입니다. 이와 유사하게, 하나의 함수 내에서 맥락에 따라 구분 하면 공통적인 부분이 눈에 들어오고, 그대로 추출을 하면 재사용 가능한 형태로 리팩토링 할 수 있겠다고 생각 했습니다. 이는 마치 데이터베이스에서 반복되는 데이터를 별도의 테이블로 분리하는 것과 닮은 부분이 있다고 생각 했습니다. 결과적으로 코드의 재사용성이 높아지고, 변경이 필요할 때 한 곳만 수정할 수 있게 됩니다.
[yeTi] 예티
2024-10-22 04:35
@seokmin hong
다음 인용문에는 관련있는 개념들을 모아둔다는 공통점을 가진다는 것에서 공감을 했습니다.
'관련 있는 코드를 뭉쳐둔다'는 것에서 객체 지향 스러운 면이 있다고 생각했습니다.
반면에 비슷한 코드를 뭉쳐둔다고 자연스럽게 객체 지향적인 설계로 나아간다고는 생각이 들지 않았습니다.
비슷한 코드를 뭉쳐둠으로 응집도를 높이고, 자연스럽게 객체 지향적인 설계를 할 수 있겠다고 생각 했습니다.
왜냐하면 조영호님의 객사오에서도 언급된 부분이지만 객체지향은 은유와 은유를 기반으로 만들어지는 객체간의 관계인데 이 은유와 관계를 맺을 수 있는 능력은 코드를 뭉쳐둔다고 발현되지 않는다는 생각이 들었기 때문입니다.
유영모
2024-10-22 06:38
생각을 할수록 가장 낮은 수준에서 '이 코드를 어디에 위치할 것인가'에 대한 활동이라고 정의하게 되었습니다.
우와... 결합도와 응집성을 자신의 언어로 표현하는 듯해서 놀랍네요.
유영모
2024-10-22 06:41
코드 사이에 빈 줄을 넣는 행위를 우리가 문장을 쓸 때, 단어 사이에 공백을 넣는 것과 같은 행위라는 생각을 했습니다. 예를들어문장을이렇게쓰면무슨말인지이해하기어렵지만, 공백으로 구분해주면 무슨 말을 하는지 비교적 쉽게 이해할 수 있기 때문입니다.
@seokmin hong 어느 책에서 보았는지 출처는 기억나지 않지만
온전한 문장을 구성하는 낱말을 뒤섞어도 처음과 끝의 낱말만 바뀌지 않는다면
인간은 문장을 이해할 수 있다는 말을 들었습니다.
개인적으로 '맥락'을 파악하는 힘이라고 생각이 드는 데요. 말씀하신 공백이 그런 느낌이 들었습니다.
Sunghoon Park
2024-10-21 16:13
위에서 호성님, 석민님 께서 언급해주신 것 처럼 이것 또한 설계라고 부를 수 있다는게 재미있게 느껴졌습니다 ㅎㅎ
(물론 아직도 미시와 거시 사이의 미싱 링크는 아직 극복하지 못했지만요)
이게 닐포드 스타일과 캔트백 스타일의 차이일까요?
재미있는 생각들이 듭니다.
[yeTi] 예티
2024-10-22 05:01
@Sunghoon Park 닐 포드의 지식체계는 제가 경험한 적이 없어서 스타일 비교를 위해 Perplexity 에게 간단하게 물어봤습니다. :)
포드의 포괄적인 아키텍처 관점은 대규모 시스템과 엔터프라이즈급 프로젝트에 유용한 지침을 제공합니다. 아키텍처 특성, 패턴 및 문서화 도구에 대한 그의 초점은 팀이 복잡한 설계 과제를 해결하는 데 도움이 됩니다.
반면에 켄트 벡의 접근 방식은 실용적인 코드 수준의 개선과 지속적인 개선을 강조합니다. 테스트 중심 개발 및 리팩토링과 같은 그의 방법은 일상적인 코딩 관행과 코드 품질 향상에 특히 유용합니다. 또한 켄트 벡의 철학은 소프트웨어 개발에서 인간 관계와 협업의 중요성을 강조합니다.
유영모
2024-10-22 06:51
이게 닐포드 스타일과 캔트백 스타일의 차이일까요?
저는 차이를 비교하기 보다(닐포드가 쓴 글을 읽어 본적도 없고..)
누가 누구에게 무엇을 어떻게 전달할 것인가를 생각해 보았습니다.
켄트 벡은 스스로 Programmer 라고 자신을 소개 합니다.
그렇기에 <TidyFirst?>는 지금도 코딩을 하는 켄트 벡(누가)이 코딩하는 하는 개발자에게(누구에게)
'설계'(무엇을)라는 것을 추상적인 개념이나 도해가 아닌 '코드'(어떻게)라는 실용적은 것으로 전달하고자 하는 결과물이라고 생각합니다.
유영모
2024-10-22 06:07
긴 코드 덩어리를 읽다가 '아. 이 부분은 이렇게 하고, 저 부분은 저렇게 하는구나'라고 구분이 될 때는 두 부분 사이에 빈 줄을 넣어 분리합시다.
@Sunghoon Park 님이 화상 모임에서 코드 사이에 빈줄을 넣지 않는 사람들을 언급한 점과 '한국 Tidy First 모임' 댓글에서 의도적은 구둣점을 활용하여 빈줄을 넣었던 일이 동시에 떠오릅니다.
저 역시 코딩 시 습관적으로 빈줄을 넣습니다.
돌이켜 보니 빈줄을 넣는 행동은 코드를 구분하기 위해서 였던 것 같습니다.
무엇을 구분하고 싶었을까요? 코드 덩어리가 달성하고자는 목적이었습니다.
소프트웨어 설계가 큰일이 되면, 설계 작업을 아예 그만두고 싶은 위험에 직면합니다. 그러나 적절한 소프트웨어 설계는 변화를 가능하게 합니다. 작은 소프트웨어 설계로 변화를 좀 더 쉽게 만들 수 있습니다.
켄트 벡이 말하는
변화 요구의 대상은 다른 것이 아니라 바로 사람들이다. 변화는 안정을 뒤흔든다. 사람들이 변할 수 있는 속도에는 한계가 있다.
(중략)
아기 발걸음은, 단계를 잘게 쪼갤 때 생기는 부하가 큰 변화를 시도했다가 실패해서 다시 원상태로 돌아갈 때 드는 낭비보다 훨씬 작다는 사실을 인정하는 것이다. -XP