속도는 제어 없이는 의미가 없다: AI 시대에 품질을 높게 유지하는 방법

발행: (2025년 12월 10일 오전 02:00 GMT+9)
9 min read

Source: GitHub Blog

속도가 빨라도 신뢰할 수 없는 코드를 배포한다면 무슨 의미가 있을까요?

우리는 이미 한동안 AI를 워크플로에 활용해 왔으며, 일상적인 개발 속도가 얼마나 빨라졌는지는 부정할 수 없습니다. 몇 시간 걸리던 작업이 이제는 몇 분 안에 끝납니다. 아침 커피를 마시기도 전에 전체 기능이 완성되기도 합니다.

하지만 그 속도의 반대편도 경험했습니다. 명확한 방향성이나 가드레일 없이 AI를 사용하면 흔히 AI 슬롭이라 부르는, 맥락 없이 얽힌 반기능 코드가 생성되어 버그, 깨진 import, 기술 부채가 조용히 쌓이게 됩니다.

이 새로운 시대에 빠르기만 해서는 충분하지 않습니다. 정밀함과 품질이 팀을 차별화합니다.

“가장 뛰어난 운전자는 단순히 가장 빨리 가는 사람이 아니라, 고속에서도 부드럽고 제어된 사람입니다.”라고 Marcelo OliveiraGitHub Universe 2025에서 말했습니다. “속도와 제어는 상충되는 것이 아니라 서로를 강화합니다.”

그렇다면 두 마리 토끼를 모두 잡으려면 어떻게 해야 할까요? 빠르게 움직이면서도 코드를 깔끔하고 신뢰할 수 있게, 그리고 확고히 제어하려면? 여기 세 가지 필수 전략이 있습니다.

Tip #1: Treat speed and quality as a package deal

보기에 깔끔해 보이지만 근본적인 문제가 숨겨진 AI 생성 코드를 쉽게 받아들일 수 있습니다. 품질 없는 속도는 더 빨리 배포하게 해 주는 것이 아니라 문제를 복합적으로 늘리는 위험을 증가시킵니다. 성공적인 팀은 AI 기반 속도와 실제 가드레일을 결합합니다.

GitHub Code Quality (현재 퍼블릭 프리뷰 중)는 AI와 CodeQL 기반 분석 도구로, 작업 중인 코드베이스 전반에 걸쳐 유지보수성 문제, 신뢰성 위험, 기술 부채를 바로 보여줍니다.

Enable with one click

레포지토리 수준에서 켜면 GitHub가 CodeQL과 LLM 기반 탐지를 결합해 코드를 분석하고, 유지보수성 및 신뢰성 문제를 명확히 보여줍니다.

Get automatic fixes inside every pull request

풀 리퀘스트를 열면 GitHub Code Quality가 사용되지 않은 변수, 중복 로직, 런타임 오류 등을 자동으로 표시합니다.

Example of problematic code

// fuelCalculator.js
export function calculateFuelUsage(laps, fuelPerLap) {
  const lastLap = laps[laps.length - 1]; // unused variable

  function totalFuel(laps, fuelPerLap) {
    return laps.length * fuelPerLap;
  }

  // duplicated function
  function totalFuel(laps, fuelPerLap) {
    return laps.length * fuelPerLap;
  }

  return totalFuel(laps, fuelPerLap);
}

AI‑generated fix

-export function calculateFuelUsage(laps, fuelPerLap) {
-  const lastLap = laps[laps.length - 1]; // unused variable
-
-  function totalFuel(laps, fuelPerLap) {
-    return laps.length * fuelPerLap;
-  }
-
-  // duplicated function
-  function totalFuel(laps, fuelPerLap) {
-    return laps.length * fuelPerLap;
-  }
-
-  return totalFuel(laps, fuelPerLap);
-}
+export function calculateFuelUsage(laps, fuelPerLap) {
+  if (!Array.isArray(laps) || typeof fuelPerLap !== "number") {
+    throw new Error("Invalid input");
+  }
+  return laps.length * fuelPerLap;
+}

트리아지나 속도 저하 없이—그냥 깔끔하고 신뢰할 수 있는 코드입니다.

Enforce your quality bar

Rulesets를 사용하면 팀 표준을 충족하지 못하는 병합을 차단할 수 있어, 리뷰어의 의지에만 의존하지 않고 품질을 일관되게 유지합니다.

Reveal (and fix) legacy technical debt

AI Findings 페이지는 팀이 이미 작업 중인 파일의 문제를 강조해, 문제를 바로 잡고 컨텍스트 전환을 줄이는 데 도움을 줍니다.

Bottom line: AI는 속도를 제공합니다. GitHub Code Quality는 제어를 제공합니다. 두 가지를 함께 사용하면 하나를 포기하지 않고도 더 빠르게 움직이고 더 나은 제품을 만들 수 있습니다.

Learn more about GitHub Code Quality

Tip #2: Be the driver, not the passenger

AI가 코드를 빠르게 생성할 수는 있지만, 품질은 자동화만으로는 나오지 않습니다. GitHub은 IDE 내 Copilot부터 풀 리퀘스트에서의 Copilot 코드 리뷰와 GitHub Code Quality까지, 오래된 이슈와 실행 가능한 수정 사항을 가시화할 수 있는 도구들을 제공합니다.

이 기능들을 통해 방향성, 표준, 제약조건을 설정할 수 있습니다. 의도가 명확할수록 AI가 더 잘 지원합니다.

Prompting framework

  1. Set the goal, not just the action
    Bad prompt:

    refactor this file

    Better prompt:

    refactor this file to improve readability and maintainability while preserving functionality, no breaking changes allowed
  2. Establish constraints

    • “No third‑party dependencies”
    • “Must be backwards compatible with v1.7”
    • “Follow existing naming patterns”
  3. Provide reference context
    관련 파일, 문서, 기존 테스트, 혹은 아키텍처 결정에 대한 링크를 첨부합니다.

  4. Decide the output format
    풀 리퀘스트, diff, 패치, 코멘터리, 혹은 코드 블록 중 선택합니다.

Multi‑step task with a coding agent

Create a new helper function for formatting currency across the app.
- Must handle USD and EUR
- Round up to two decimals
- Add three unit tests
- Do not modify existing price parser
- Return as a pull request

생각은 여러분이 책임지고, 실행은 에이전트가 담당합니다.

Bottom line: AI는 실행 속도를 높이지만, 여러분의 명확함과 GitHub의 가드레일이 그 속도를 고품질 소프트웨어로 전환시킵니다.

Learn more about the coding agent

Tip #3: Build visible proof of your thinking, not just your output

AI가 더 많은 실행 작업을 맡게 되면서, 효과적인 개발자는 의사결정, 트레이드‑오프, 그리고 사고 과정을 명확히 전달함으로써 돋보입니다. 이제 코드를 쓰는 것만으로는 충분하지 않으며, 기능 전체 수명 주기 동안 어떻게 생각하고 평가했는지를 보여줘야 합니다.

Best‑practice checklist

  • Create an issue that captures the why
    문제, 성공 기준, 제약조건, 위험 요소 등을 간략히 정리합니다.

  • Name your branch and commit thoughtfully
    의미 있는 브랜치명과 커밋 메시지를 사용해 단순 타이핑이 아닌 사고 과정을 서술합니다.

  • Use Copilot and the coding agent to build, then document decisions
    왜 특정 접근 방식을 선택했는지, 어떤 대안을 고려했는지에 대한 짧은 메모를 포함합니다.

  • Open a pull request with signal‑rich context
    “Why”, “What changed”, “Trade‑offs” 섹션과 스크린샷 혹은 테스트 노트를 추가합니다.

Example

Instead of a vague commit message:

Added dark mode toggle

Provide richer context:

- Added dark mode toggle to improve accessibility and user preference support.
- Chose localStorage for persistence to avoid server dependency.
- Scoped styling changes to prevent side effects on existing components.
- Added unit tests for toggle state persistence and UI rendering.

“무엇을” 하는 것과 함께 “왜” 하는지를 문서화함으로써, 팀원, 미래 유지보수자, 그리고 자동화 도구가 여러분이 배포하는 코드를 이해하고 신뢰할 수 있는 투명한 흔적을 남깁니다.

Back to Blog

관련 글

더 보기 »

Dependabot 기반 Go 의존성 그래프

공급망 보안이라는 주제로 패키지 생태계 지원을 지속적으로 개선해 나가면서, 이제 Go 프로젝트는 보다 완전하고 정확한 전이적…