우리의 입장

AI는 C++ 코드를 작성할 수 있습니다.
하지만 그 유효성을 검증하는 것은 당신의 몫입니다.

그리고 매일 확인해야 할 항목이 더 많아집니다. Visual Assist는 결정론적 파서를 기반으로 작동하는데, 이는 절대 추측하지 않는 도구입니다. 기호의 위치를 ​​물어보면 어떤 컴퓨터에서든 항상 동일한 답변을 얻을 수 있습니다.

대규모 C++ 코드베이스의 상세한 개략도입니다. 단일 QUERY 노드에서 하나의 녹색 경로가 SAME ANSWER라고 표시된 단일 엔드포인트로 깔끔하게 연결되는 반면, 여러 개의 빨간색 경로는 RUN 1, RUN 2, RUN 3이라고 표시된 여러 엔드포인트로 분산됩니다.
동일한 질문을 실제 코드베이스에 매핑했습니다. 녹색 경로는 하나의 정답으로 연결되지만, 빨간색 경로는 흩어져 실행할 때마다 다른 결과를 보여줍니다.

AI 도구는 그 자리를 차지했습니다.

이것은 AI 자체에 반대하는 주장이 아닙니다. 저희가 직접 개발하고 배포하고 있습니다. VA Intelligence는 Visual Studio 내에서 로컬 모델을 실행하며, 호출되고 범위가 지정된 AI는 C++ 코드를 읽고 변경하는 데 실제로 유용합니다.

이러한 도구들을 사용하는 사람들을 비난하기는 어렵습니다. 백지 상태에서 시작하는 작업을 없애주고, 익숙하지 않은 코드를 빠르게 이해시켜주며, 초기 단계 프로토타입 제작에 실제로 매우 유용하기 때문입니다. 속도는 분명한 이점이며, 업계는 그에 걸맞게 가격을 책정해 왔습니다.

속도를 확실성으로 착각할 때 문제가 시작된다.

두 가지가 어떻게 조화를 이루는지

둘 다, 의도적으로

이 모델을 한 줄로 요약하면 다음과 같습니다. AI가 초안을 작성하고, 파서가 검증하고, 최종 결정은 사용자가 합니다. 이 두 가지는 별개의 작업이며, Visual Assist는 사용자가 이미 사용하고 있는 AI와 함께 검증 작업을 수행하도록 설계되었습니다.

Generation AI는 다음과 같은 점에 능숙합니다. 검증: 파서는 다음 사항에 능숙합니다.
낯선 코드 설명하기어떤 정의로든 정확한 탐색이 가능합니다.
구현 계획 초안 작성완벽한 참조 검색 — 모든 사용 내역 포함
초기 솔루션 및 기본 템플릿안전한 프로젝트 전체 리팩토링
블록의 기능을 요약하면 다음과 같습니다.결정론적 이해 — 매번 실행 시 동일한 결과
ONE WORK SESSION → MODEL invoked when you ask drafts drafts context context PARSER always on · your code's ground truth
파서는 전체 세션을 실행합니다. 모델은 사용자가 호출할 때만 나타나며, 해당 줄에서 컨텍스트를 가져옵니다. 엔지니어는 계속 직접 작업해야 하며, 어떤 것도 자동으로 적용되지 않습니다.
확실성, 정의됨

파서가 확실히 아는 것

비주얼 어시스트는 사용자가 입력하는 실제 C++ 코드(심볼, 스코프, 타입)를 분석하여 입력하는 동안 그림을 최신 상태로 유지합니다. 표시되는 모든 내용은 현재 코드에 대한 사실이며 예측이 아닙니다.

참고 자료를 찾아보세요

모든 참고 자료를 다 포함했습니다. 총합은 표본이 아닌 전체입니다.

이름 변경

모든 참조 사항을 다루거나, 다룰 수 없다고 명확히 밝힙니다. 어떤 것도 빠뜨리지 않고 꼼꼼하게 살펴봅니다.

정의로 이동

매크로가 많거나 편집 중인 코드에서도 정의에 정확히 맞춰집니다.

구체적인 것

모델에게 모든 사용 사례를 찾아달라고 요청하면 MAX_PLAYERS완전히 신뢰할 수 없는 그럴듯한 목록을 얻게 되는데, 그 목록은 다음에 다시 요청하면 바뀔 수도 있습니다. Visual Assist는 69개 파일에서 746개의 사용 사례를 반환합니다. 내일 다시 요청해도 결과는 똑같이 746개입니다.

Visual Assist의 참조 찾기 결과에는 MAX_PLAYERS 기호에 대한 69개 파일의 746개 참조가 표시됩니다.
700개 이상의 파일로 구성된 게임 코드베이스에서 하나의 심볼에 대한 참조를 찾습니다. 69개 파일에 걸쳐 총 746개의 참조가 발견되었습니다. 매번 정확한 참조 수를 확인합니다.
시각 지원을 사용해 보세요
30일 무료 체험 · 신용 카드 필요 없음
엔진

내부 구조: 병렬 파서

이 부분은 우리가 좀 더 자세히 살펴보는 부분입니다. 파서는 Visual Assist에서 우리가 공개적으로 거의 언급하지 않는 부분이지만, 바로 이 파서 덕분에 확실한 결과를 얻을 수 있는 것입니다.

병렬 + 증분

VA는 여러 코어에서 자체 파서를 실행하여 사용자가 입력하는 동안 다시 파싱합니다. 인덱스는 키 입력 시점에 맞춰 최신 상태로 유지됩니다.

코드 인텔리전스를 위해 설계되었습니다.

이 도구는 코드를 빌드할 필요 없이 이해하기만 하면 되므로 컴파일러가 오류를 일으키는 부분을 건너뛰고, 조각나서 컴파일되지 않는 코드에서 심볼을 계속해서 해석합니다.

모델이 아니라 알고리즘입니다.

샘플링도 없고, 온도도 측정하지 않습니다. 같은 코드를 사용하면 같은 결과가 나오므로, 추측이 아니라 확인할 수 있는 사실입니다.

IntelliSense는 컴파일러 프런트엔드에 의존합니다. 코드가 깔끔할 때는 정확하지만, 코드가 지저분할 때는 불안정하고 속도가 느립니다. Visual Assist는 몇 년 전부터 정반대의 전략을 펼쳤습니다. 개발자들이 언리얼 엔진과 셰이더 코드에서 공식 지원이 나오기 전부터 Visual Assist를 사용했던 이유도 바로 이 때문입니다. AI가 등장했다고 해서 그 전략이 바뀐 것은 아닙니다. 오히려 그 중요성이 더욱 커졌습니다.

VA Intelligence는 바로 그 파서를 기반으로 더욱 상황 인식적인 기능을 구현하고, 파서가 모델에 프로젝트에 대한 더 깊은 이해를 제공하도록 개발될 예정입니다.

보훈부 정보국(VA Intelligence)의 입장을 읽어보세요.

다른 길

그럴듯하지만 검증되지는 않았습니다.

모델은 가장 가능성이 높은 코드를 제공합니다. 가능성이 높다는 것이 곧 정확하다는 것은 아니며, C++에서는 바로 그 차이 때문에 문제가 발생합니다. 실제 팀들이 겪는 문제점 하나를 예로 들어보겠습니다.

// 코드베이스에는 두 가지 오버로드가 존재합니다.
void log( const std::string& message);
void log( bool ok);

// AI가 이 코드를 작성하고 컴파일했습니다. 이제 배포할까요?
log( "연결 끊김" );

// 문자열 리터럴은 const char*입니다.
// const char* -> bool은 const char* -> std::string보다 우수합니다.
// 따라서 이것은 log(bool)을 호출합니다. 방금 `true`를 로그에 기록했습니다.
오버로드 해결 과정에서 흔히 발생하는 함정입니다. 함수 호출은 분명히 올바르고 컴파일도 문제없이 되지만, 잘못된 함수가 실행됩니다. '정의로 이동'을 클릭하면 실제로 해결되는 오버로드로 이동하므로, 클릭 한 번으로 오류를 발견할 수 있습니다.

잘못된 과부하

컴파일은 문제없이 되지만, 의도하지 않은 함수가 호출됩니다.

불행한 인생

검토 단계에서는 괜찮아 보이지만, 실제 생산 과정에서는 문제가 발생합니다.

조용한 출연진

예고 없이 설치됩니다. 새벽 2시에 상태를 손상시킵니다.

쉽게 말해서

LLM 학위 소지자는 추측을 아주 잘합니다. 초안을 작성할 때는 딱 필요한 자질이지만, 제출이 임박한 문서에서는 절대 바람직하지 않은 자질입니다.

읽어보세요: 무엇이 진짜이고, 무엇이 과장된 것이며, C++는 어디에 속하는가

뒷받침 증거

검증 작업이 증가하고 있습니다.

AI가 품질 관리 작업을 없앤 것은 아닙니다. 다만 그 작업을 하위 단계 , 즉 변경 사항을 읽는 사람에게로 옮겼을 뿐이며, 그 결과 작업량이 눈에 띄게 늘어났습니다.

약 20%
더 빨리 — 그들은 예상했다
측정됨 ↓
약 19%
더 느리게 — 무슨 일이 일어났나요?

METR의 2025년 무작위 실험에서, 숙련된 개발자들이 자신이 잘 아는 코드에 AI를 적용했을 때, AI를 사용하지 않았을 때보다 작업 완료 시간이 19% 느려졌습니다. 하지만 개발자들은 자신이 더 빨리 끝냈다고 생각했습니다. 그 시간은 코드 검토, 수정, 그리고 재확인에 소요되었습니다. 여기서 얻을 수 있는 결론은 "AI가 느리다"는 것이 아니라, 코드 검증이 실제로 중요하고 점점 더 늘어나는 작업이라는 점입니다.

출처: METR.org — RCT, 개발자 16명, 작업 246개

복습이란 주로 간단한 질문에 확실하게 답하는 것을 의미합니다.

  • 누가 이 함수를 호출합니까?
  • 이 기호는 아직도 사용되는 곳이 있나요?
  • 이번 변화는 실제로 어떤 부분에 영향을 미칠까요?

저것들은 정확한 답을 가지고 있습니다. 생성된 코드를 더 많이 처리할수록, 추측에 의존하지 않는 도구에 더 많이 의존하게 됩니다.

핵심은 바로 이것입니다: 다시 물어보세요.

가장 큰 프로젝트에 비주얼 어시스트를 적용하고 이틀 연속으로 같은 질문을 해보세요. 언제나 똑같은 답을 얻게 될 겁니다. 장담합니다.

시각 지원을 사용해 보세요
30일 무료 체험 · 신용 카드 필요 없음
Visual Studio Marketplace에서 150만 건 이상 설치됨

자주 묻는 질문

이 페이지는 인공지능에 반대하는 페이지인가요?

아니요. 저희는 AI 기능을 개발하고 고객님께서 기존에 사용하시던 어시스턴트를 계속 사용하시기를 기대합니다. 핵심은 생성과 검증은 별개의 작업이며, 검증에는 매번 동일한 결과를 제공하는 도구가 필요하다는 점입니다.

Visual Assist가 Copilot을 대체하나요?

아니요, 그렇게 하려고 하지도 않습니다. VA와 Copilot은 Visual Studio에서 나란히 실행됩니다. Copilot은 초안을 작성하고, VA의 파서는 작성된 초안을 검증하는 데 사용됩니다.

여기서 "결정론적"이라는 말은 실제로 무엇을 의미하는 걸까요?

동일한 코드가 주어지면 파서는 매번 실행, 모든 머신, 모든 세션에서 동일한 모델(동일한 참조, 정의 및 이름 변경 범위)을 생성합니다. 샘플링도, 변동도, 편차도 없습니다.

인공지능 모델이 C++ 코드를 잘못 해석한 사례는 무엇인가요?

흔히 발생하는 오류로는 여러 개의 일치하는 오버로드가 있을 때 잘못된 오버로드를 선택하는 것(문자열 리터럴 이 다른 오버로드 bool보다 std::string우선시되는 경우가 대표적입니다), 해당 타입에 존재하지 않는 멤버나 API를 제안하는 것, 스마트 포인터 소유권을 잘못 처리하여 객체가 두 번 해제되거나 아예 해제되지 않는 것, 그리고 다른 라이브러리 버전의 시그니처를 호출하는 것을 "업데이트"하는 것 등이 있습니다. 이러한 오류들은 차이점을 비교해 보면 모두 완전히 합리적으로 보일 수 있습니다.

코드가 컴파일되면 괜찮은 거 아닌가요?

아니요. C++에서 클린 컴파일은 구문이 유효하다는 것을 의미할 뿐, 동작이 올바르다는 것을 의미하지는 않습니다. 해제 후 사용 오류, 유효하지 않은 참조, 정수 오버플로, 그리고 단순한 논리 오류는 모두 컴파일에는 문제가 없지만 런타임에, 그것도 부하가 걸릴 때만 나타나는 경우가 많습니다. 컴파일이 잘 된다는 것은 동작이 올바르다는 것을 의미하지 않습니다.

인공지능에게 특정 기호가 사용된 모든 사례를 찾아달라고 요청할 수는 없을까요?

물론 가능하지만, 목록이 완전한지 알 수는 없습니다. 모델은 그럴듯한 목록을 반환하지만, 매크로, 템플릿 또는 검토하지 않은 파일에서의 사용 사례를 놓칠 수 있으며, 다음에 실행할 때는 다른 목록을 반환할 수도 있습니다. 반면 파서는 전체 번역 세트를 탐색하여 매번 동일한 전체 개수를 제공합니다.