단위 3 / 12

AI를 활용한 코딩 및 페어 프로그래밍

이득:

  • 명확한 입력-출력 및 제약 조건 정의를 통해 AI에 함수, 클래스 및 모듈을 작성하는 능력
  • AI를 쌍 프로그래밍 파트너로 사용하고 검증 가능한 작은 단위로 단계별로 진행할 수 있는 능력
  • AI가 생성한 코드를 컴파일하고 작은 예제로 실행하여 로직 및 엣지 케이스 오류를 포착하는 기능

페어 프로그래밍은 두 명의 개발자가 동일한 문제에 대해 한 사람은 작성하고 다른 한 사람은 수정하는 방식으로 작업하는 것입니다. AI를 사용한 코딩은 바로 이 관계의 디지털 버전입니다. 방향, 제약 조건 및 허용 기준을 설정합니다. AI는 빠른 초안을 생성합니다. 각 단계를 컴파일하고 테스트하여 확인합니다. 여기서 가장 큰 함정은 AI에게 “이 신청서를 처음부터 끝까지 작성해 주세요”라고 말하고 맹목적으로 200줄 블록을 받아들이는 것입니다. 좋은 쌍 프로그래밍은 작은 단계로 진행됩니다. 각 단계는 이해 가능하고 테스트 가능하며 되돌릴 수 있어야 합니다.

이 단원에서는 명확한 입출력 계약을 사용하여 함수, 클래스 및 모듈을 인쇄하는 방법을 배웁니다. AI를 단계별로 안내하는 방법 그리고 작은 예제를 통해 생성된 코드를 실행하여 논리 및 극단적인 경우 오류를 잡는 방법을 살펴보겠습니다. 목표는 속도가 아니라 검증된 속도입니다.

개념: 입출력 계약: 함수가 어떤 입력을 받고 어떤 출력과 오류 동작이 약속되는지에 대한 명확한 정의입니다. 엣지 케이스(Edge Case): 평범하지 않지만 실제로 발생할 수 있는 입력(비어 있음, 0, 음수, 매우 큼, 널). 증분 개발: 작은 작업 조각으로 진행하고 각 단계를 검증합니다.

순 계약으로 코드 인쇄

품질 코드의 기본은 작업을 시작하기 전에 "원하는 것"을 정확하게 정의하는 것입니다. AI에 함수를 작성할 때 언어 및 버전, 입력 유형 및 의미, 출력, 오류 조건 및 제약 조건(성능, 외부 라이브러리 금지, 스타일)이라는 다섯 가지 항목을 제공합니다. 이렇게 하면 AI가 추측하는 것을 방지할 수 있습니다.

  1. 계약서를 작성하세요. 입력, 출력, 오류, 제약.
  2. 소형 유닛을 요청하세요. 단일 책임을 갖는 기능입니다. 큰 모듈은 아닙니다.
  3. 테스트 블록을 요청하세요. 코드 옆에 몇 가지 샘플 실행/테스트를 추가합니다.
  4. 컴파일하고 실행합니다. 극단적인 경우에 시도해 보고 출력을 눈으로 확인하십시오.
  5. 다음 단계로 이동합니다. 조각이 확인되면 그 위에 구축하십시오.

계약된 함수 프롬프트: "TypeScript 5에 대한 함수를 작성합니다. 목적: 장바구니에 있는 항목의 총량을 계산합니다. 입력: { 가격: 숫자, 수량: 숫자 }[] 배열. 출력: 숫자(총계). 규칙: 수량 또는 가격이 음수이면 오류를 발생시킵니다. 빈 배열의 경우 0을 반환하고 소수 오류의 경우 소수점 이하 2자리로 반올림합니다. 외부 라이브러리를 사용하지 마십시오. 함수 아래에 5개의 테스트 사례를 추가합니다(일반, 비어 있음, 음수 수량, 소수 가격, 단일 항목).”

AI를 쌍으로 안내하기

페어 프로그래밍의 좋은 진전은 하나의 큰 요청보다는 대화입니다. 먼저 스켈레톤을 요청하고 실행합니다. 그런 다음 가장자리 상태를 추가합니다. 그런 다음 버그를 수정하세요. 이 접근 방식을 사용하면 코드를 이해하기 쉽게 유지하고 모든 단계를 제어할 수 있습니다.

증분 진행 프롬프트: "CSV 파일을 읽고 행을 객체로 변환하는 리더를 작성할 것입니다. 각 단계를 확인하지 않고 단계별로 다음 단계로 넘어갑시다. 1단계: 파일을 행으로 나누고 헤더 행을 분리하는 뼈대를 작성하십시오. 아직 유형 변환이나 오류 처리를 추가하지 마십시오. 짧게 유지하고 설명하십시오."

코드 프롬프트를 설명하고 정당화합니다. "방금 작성한 함수를 한 줄씩 설명하지 않고 결정별로 설명하십시오. 어떤 디자인 결정을 내렸고 왜, 어떤 극단적인 경우를 처리했는지, 어떤 경우를 의도적으로 제외했는지 설명하십시오. 코드에서 놓치지 말아야 할 3가지 가정을 나열하십시오."

팁: AI 생성 코드를 이해하지 못한 채 받아들이지 마세요. "이것을 나에게 설명해주세요. 어떤 가정을 하셨나요?" 질문은 숨겨진 오류를 드러내고 해당 코드를 방어할 수 있게 해줍니다. 왜냐하면 코드는 여전히 귀하의 책임이기 때문입니다. 이해하지 못하는 코드를 프로덕션에 넣는 것은 서명하지 않고 계약서를 보내는 것과 같습니다.

약한 프롬프트 / 강한 프롬프트

WEAK:"정렬 함수를 작성합니다."(결과: 어떤 언어, 정렬되는 항목, 안정적인지, 성능 제약 조건은 무엇인지, 모호하고 요구 사항에 맞지 않는 코드입니다.)STRONG:"Java 17의 경우 먼저 List<Employee> 개체를 부서별로(알파벳순), 그런 다음 급여별로(내림차순) 정렬하는 메서드를 작성합니다. 원래 목록을 바꾸지 말고 새 목록을 반환합니다. null 부서를 마지막에 오게 합니다. 주석 줄에 4개의 샘플이 포함된 기본 테스트 블록을 추가하도록 지정합니다.

강력한 프롬프트; 정렬 기준(2단계), 부작용 규칙(원본 대체), Null 동작 및 테스트 기대가 포함됩니다. 이러한 세부 사항이 없으면 AI는 그럴듯하지만 잘못된 솔루션을 생성합니다. 예를 들어 원래 목록이 손상될 수 있으며 이로 인해 다른 곳에서는 소리 없는 오류가 발생하게 됩니다.

엣지 케이스 및 소규모 샘플을 사용한 검증

행복한 시나리오에서 작동하는 코드는 올바른 코드가 아닙니다. 생성된 각 기능을 의식적으로 강제합니다.

엣지 케이스 유형

샘플 입력

예상되는 동작

공백 입력

빈 배열/문자열

오류가 아니며 논리적으로 빈 결과입니다.

0/음수

0, -1

정의되고 올바른 동작

훌륭한 가치

수백만 개의 기록

오버플로/성능 제어

null/정의되지 않음

누락된 공간

제어된 오류 또는 기본값

중복/특이

반복, 역순

올바른 결과

미니 케이스

사례 1 — 자동 반올림 오류. AI는 십진수(float) 유형으로 돈을 모으는 함수를 작성합니다. 0.1 + 0.2는 0.30000000000000004를 제공합니다. 엔지니어가 "2자리 숫자로 반올림하고 동전 전체를 사용합니다"라는 규칙을 추가하면 오류가 해결됩니다. 3줄 규칙을 사용하면 월간 조정에서 수천 센트의 차이가 발생하는 것을 방지할 수 있습니다.

사례 2 - 부작용 함정. AI는 목록을 "정렬"하는 방법을 작성하지만 원래 목록을 그 자리에서 수정합니다. 다른 모듈이 동일한 목록을 사용하기 때문에 예기치 않은 동작이 발생합니다. 프롬프트에 "원본 변경" 제약 조건이 있으면 오류가 발생하지 않습니다. 코드 검토에 걸려서 2시간의 디버깅을 방해합니다.

사례 3 — 단계별 수입. 개발자는 150줄 가져오기 모듈을 한 번에 인쇄합니다. 실수를 발견하면 그것이 어디서 왔는지 찾을 수 없습니다. 또 다른 개발자는 동일한 작업을 5개의 작은 단계로 나누어 각 단계를 2분 안에 테스트하고 3단계에서 오류를 즉시 잡아냅니다.

일반적인 실수

  • 한 번의 요청으로 큰 블록을 인쇄합니다. 이해하기 어렵고 디버그하기 어려운 위험한 코드가 탄생합니다.
  • 계약서를 제공하지 않고 코드를 요청합니다. 입출력 오류가 모호하면 AI가 추측해서 틀립니다.
  • 행복한 시나리오를 테스트하는 것뿐입니다. 비어 있음, null, 음수 및 큰 입력이 시도되지 않으면 오류는 프로덕션에 맡겨집니다.
  • 이해하지 못한 채 받아들이는 것. 공개하지 않은 코드는 방어할 수 없는 빚입니다.
  • 부작용, 돈/날짜 등 민감한 유형은 무시합니다. 시대를 초월한 역사를 지닌 부유 화폐는 오류의 전형적인 원인입니다.

요약하면

AI를 사용하여 코드를 작성하는 것은 명확한 계약, 작은 단계, 각 단계의 빌드 및 테스트 등 엄격한 쌍 프로그래밍입니다. 처음부터 입력-출력-오류-제약 조건 4중주를 제공하면 코드 품질이 결정됩니다. 생성된 코드를 설명하고 이를 엣지 케이스로 강제하면 행복한 시나리오 아래 숨겨진 오류가 표면으로 드러납니다. 속도의 원천은 맹목적인 수용이 아닙니다. 빠른 초안과 빠른 검증이 필요합니다.

응용과제

작지만 실제적인 기능(예: 장바구니 합계, 날짜 차이, 텍스트 구문 분석)을 선택하세요. 계약된 기능 프롬프트를 사용하여 인쇄합니다. 옆에 최소 5개의 테스트 시나리오를 추가하세요. 코드를 실행하고 표를 가이드로 사용하여 의식적으로 5가지 극단적인 경우를 시도해 보세요. 최소한 하나의 예외 사례에서 버그를 찾아(그렇지 않은 경우 기능을 강제하기 위한 새 입력을 설계) AI로 수정하고 수정 사항이 작동하는지 다시 테스트하여 확인합니다.

체크리스트

  • [ ] 입력, 출력, 오류 및 제약 조건을 포함하는 계약서를 작성했습니다.
  • [ ] 하나의 큰 블록 대신 작은 단계로 코드를 생성했습니다.
  • [ ] 코드 옆에 테스트/샘플 실행 블록을 추가했습니다.
  • [ ] 나는 의식적으로 최소한 5가지의 극단적인 경우를 테스트했습니다.
  • [ ] AI에게 코드를 설명하고 가정을 검토했습니다.
  • [ ] 발견된 오류를 수정하고 다시 테스트하여 수정사항을 확인했습니다.