
안녕하세요! 😊 오늘은 소프트웨어 아키텍처의 대가 마틴 파울러와 ThoughtWorks China의 테크 리드 Xu Hao가 실제로 ChatGPT와 페어 프로그래밍을 어떻게 하는지, 그 과정을 시간순으로 따라가며 최대한 자세하게 정리해드릴게요. 실제 대화에서 오간 인상 깊은 대사들도 함께 인용해, 마치 현장에 있는 것처럼 생생하게 느끼실 수 있도록 구성했습니다.
페어 프로그래밍을 시작할 때, Xu Hao는 ChatGPT에게 자신이 만들고 있는 온라인 화이트보드 시스템의 전체적인 구조와 사용 기술 스택, 그리고 테스트 전략까지 아주 구체적으로 설명하는 프롬프트를 작성했어요.
"현재 제가 만들고 있는 온라인 화이트보드 시스템에 대해 소개하겠습니다. 저는 테크스택으로 TypeScript, React, Redux, KonvaJS, React-Konva를 사용하고 있습니다. ... 모든 코드는 위에 이야기한 테크 스택 만을 사용해야 합니다. 모든 요구사항은 MVVM 아키텍처 패턴을 따라서 리액트 컴포넌트를 이용하여 구현해야 합니다."
"위에서 언급한 가이드에 따라 전반적인 솔루션을 제공해주세요. ... 구현 방법에 대해 설명하고, 위에서 언급한 가이드에 따라 구현 방법을 할 일 목록 형태로 나누어주세요."
Xu Hao는 ChatGPT가 제시한 솔루션에 대해 꼬리 질문을 던지며, 답변을 점점 더 구체화해 나갔어요. 이 과정에서 할 일 목록(Task List)이 점점 명확해집니다.
"GPT… 너는 다 계획이 있었구나…"
"위 방식을 따라서 새로운 기능을 온라인 화이트보드 시스템에 구현할 수 있습니다."
Xu Hao는 ChatGPT에게 "할 일 목록을 모델, 뷰 모델, 뷰로 묶어서 다시 써줘"라고 요청합니다.
"할 일 목록을 새로 짜줘. 할 일들은 모델, 뷰 모델, 그리고 뷰에 따라 태스크를 묶어서 알려주라."
이렇게 꼬리 질문을 통해, 처음에는 빠졌던 구조적 분류까지 자연스럽게 추가할 수 있었어요.
할 일 목록이 마음에 들면, 이제 각 단계별로 구체적인 컴포넌트/메소드/props 이름을 요청합니다.
"좋았어! 할 일 목록을 다시 작성해줘. 이번에는 컴포넌트와 메소드 그리고 props 이름을 구체적으로 작성해줘."
"해당 컴포넌트는 커서 정보와 커서 이름, 그리고 현재 접속 중인지에 대한 정보도 렌더링합니다."
이제 ChatGPT에게 테스트 코드와 구현 코드를 차례로 요청합니다.
Xu Hao는 항상 테스트 코드부터 요청하는 TDD 스타일을 선호했어요.
"좋았어! 이제 AwarenessSlice와 AwarenessViewModel을 구현한 기능과 테스트 코드를 작성해줘. 먼저 테스트 코드부터 작성해줘."
describe('awareness slice', () => { it('should set the cursor location', () => { // ... }); // ... });
class AwarenessViewModel { setCursorLocation(cursorLocation: { x: number; y: number }) { ... } setName(name: string) { ... } setOnline(isOnline: boolean) { ... } }
"참고: 이 구현에서는 AwarenessViewModel을 사용하여 Redux Store 값을 새롭게 설정하는 데 사용된다고 가정했습니다."
ChatGPT가 처음 내놓은 코드는 redux-mock-store에 의존하고 있었지만, 실제 프로젝트에는 없던 라이브러리였어요.
그래서 Xu Hao는 "redux-mock-store를 쓰지 않고 테스트를 다시 작성해줘"라고 요청합니다.
"이제는 redux-mock-store를 사용하지 않으므로, 뷰 모델 생성자에 모킹 디스패치 함수를 전달해야 합니다."
이렇게 반복적으로 피드백을 주며, 실제 프로젝트 환경에 맞는 코드로 점점 다듬어 나갑니다.
예를 들어,
"테스트할 때 store를 초기화하기 위하여 configureTestingStore('awareness', initialState) 를 사용해주세요."
와 같이 팀 내 규칙에 맞는 코드를 요청할 수 있습니다.
"여기에 컴포넌트 따위를 import 하는 상대 경로만 조금 수정하고, reducer 내용만 조금 더 수정을 가해주면 코드는 정상적으로 동작하더라구요."
ChatGPT와 대화를 오래 하다 보면 토큰 제한 때문에 앞서 나눈 대화의 맥락을 잊어버릴 수 있습니다.
"대화를 지속할 수록 ChatGPT가 앞서서 얘기한 과거 내용부터 잊어버리기 시작한다는 것이 문제입니다. 즉, 맥락을 잊어먹는 것이지요."
"꼬리물기식 대화전략이 코드 작성에 매우 유용하다는 사실을 알게 되었습니다."
마틴 파울러는 LLM(대형 언어 모델)을 활용한 코딩 경험을 이렇게 정리합니다.
"LLM을 사용하여 코딩하는 경험은 LLM이 마치 주니어 개발자인 것처럼 대화를 나누면서 개발을 진행할 수 있도록 해줍니다. 기본적인 아키텍처 가이드라인을 제시하고, GPT라는 주니어 개발자에게 자신이 작성한 코드에 대해 '왜' 라는 질문을 던지게 하고, GPT가 작성한 코드에 대해 피드백하면서 구현해나갈 수 있는 것입니다."
ChatGPT와 페어 프로그래밍을 할 때는,
"내가 시니어 개발자, ChatGPT는 똑똑한 주니어 개발자"라는 마음가짐으로
문제의 맥락, 요구사항, 아키텍처, 테스트 전략까지 꼼꼼히 설명해주고
계속해서 "왜?", "이 부분을 더 구체적으로", "우리 팀 컨벤션에 맞게"
라고 피드백을 주면,
정말로 생산성 높은 페어 프로그래밍이 가능하다는 점!
꼭 기억해두세요. 🚀
"적절한 프롬프트를 작성하는 것이 필요하다고 생각합니다."
"꼬리물기식 대화법(Chain of Thoughts)를 잘 이용하면 코딩할 때 매우 유용할 것이라고 생각합니다."
© Martin Fowler
(번역 및 요약: Sigrid Jin)
원문 링크: An Example of LLM Prompting for programming
번역 및 요약글은 원문 링크와 함께 자유롭게 공유하실 수 있습니다.