AI 엔지니어링 스킬 맵: 소프트웨어 엔지니어링 기본기
TMT에이전틱 코딩 시대에 소프트웨어 엔지니어링 기본기는 어떻게 달라졌을까요? 코드를 전부 코딩 에이전트에게 맡겨 작성하더라도, 소프트웨어 기본기를 이해하고 있어야 원하는 트레이드오프를 선택하도록 에이전트를 이끌 수 있고, 애초에 어떤 트레이드오프가 존재하는지도 알 수 있습니다. 또한 AI 애플리케이션을 만들 때 AI 핵심 기능은 대개 더 넓은 소프트웨어 애플리케이션의 형태로 구현되며, 그 애플리케이션을 만들고 방향을 잡는 일에도 직접 참여하게 됩니다.
소프트웨어 기본기 없이 바이브 코딩만 하는 초보자도 간단한 애플리케이션은 만들 수 있습니다. 하지만 이 경우 코딩 에이전트가 지연 시간, 가용성, 일관성, 신뢰성, 유지보수성, 단순성, 비용 측면에서 잘못된 트레이드오프를 선택하는 일이 잦습니다. 개발자가 그런 트레이드오프가 존재한다는 사실 자체를 몰랐기 때문에, 자기 애플리케이션 상황에 맞는 올바른 결정을 내리도록 에이전트를 이끌지 못한 것입니다.
이 글에서는 저희가 진행한 AI 엔지니어링 역량 연구에서 드러난, 소프트웨어 엔지니어링에서 알아야 할 가장 중요한 것들을 소개합니다. 다음 역량을 갖추어야 합니다.
- 풀스택 애플리케이션 구축
- 데이터 관리
- 시스템 아키텍처 설계
- 안전하고 신뢰할 수 있는 시스템 만들기
- 프로덕션 환경에서의 확장과 운영
풀스택 애플리케이션 구축. 에이전틱 코딩 덕분에 프런트엔드 개발자나 모바일 개발자처럼 특정 영역에 집중하던 많은 개발자가 이제 풀스택이라는 더 넓은 역할을 맡을 수 있게 되었습니다. 개발 과정 중 익숙하지 않은 부분은 코딩 에이전트의 도움을 받을 수 있습니다. 그래도 풀스택이 실제로 어떻게 동작하는지 이해하는 일은 중요합니다. 숙련된 개발자는 UI 컴포넌트, 캐싱, 페이지 렌더링, API 선택과 설계, 인증, 상태와 세션 관리, 비동기 처리, 데이터 영속화, 테스트, 보안, 접근성을 비롯해 프런트엔드와 백엔드 시스템의 핵심 구성 요소와 개념을 이해하고 있습니다.
데이터 관리. 데이터는 특별히 주의를 기울일 만한 영역입니다. 소프트웨어가 그 위에 세워지는 토대인 데다, 에이전트가 마이그레이션을 도와준다 해도 한번 정하면 바꾸기가 비교적 어렵기 때문입니다. 데이터를 관리할 줄 알면 접근 패턴을 따져 보고, 이를 바탕으로 무엇을 얼마나 오래 저장할지 결정할 수 있습니다. 알맞은 데이터 모델을 찾아내고 관계형 테이블, 문서, 키-값, 그래프 같은 저장소 유형과 인프라를 적절히 고를 수 있으며, 이 선택은 다시 속도, 확장성, 가용성, 신뢰성, 비용에 영향을 미칩니다. 트랜잭션과 동시성을 이해하고, 데이터를 깨끗하고 일관되며 최신 상태로 유지하는 방법도 압니다. 필요하다면 개인정보 보호, 거버넌스, 규정 준수도 제대로 챙길 수 있습니다. 데이터 수명 주기를 관리하는 방법도 알고 있습니다.
애플리케이션이 발전하면 데이터 아키텍처도 그에 맞춰 발전시킬 줄 알아야 합니다. 데이터를 어떻게 관리할지 결정하는 데는 사람이 제공하는 맥락이 상당히 많이 필요합니다. AI 시스템은 여러분의 데이터 소스에서 자기 입력 컨텍스트를 얻기 때문에, 데이터 아키텍처를 잘못 선택하면 AI는 자신이 무엇을 모르는지조차 모르게 됩니다. 그래서 관련 맥락을 갖추고 AI 엔지니어링에 능숙한 사람, 바로 여러분이 직접 나서서 바로잡아야 합니다. 전통적인 소프트웨어나 사람만이 아니라 에이전트를 위한 데이터 인프라를 구축하는 방법 역시 빠르게 발전하는 분야이므로, 분야가 발전함에 따라 모범 사례를 계속 조정해 나가야 합니다.
시스템 아키텍처 설계. 소프트웨어와 데이터 풀스택의 주요 구성 요소를 이해하면, 그 조각들을 어떻게 조합할지 결정하기가 한결 수월해집니다. 좋은 시스템 설계를 하려면 이 소프트웨어가 무엇을 하려는 것인지부터 이해해야 합니다. 사용자는 몇 명인지, 지연 시간은 얼마나 중요한지, 비용은 얼마나 중요한지 같은 질문입니다. 그래야 애플리케이션 플랫폼, 프런트엔드와 백엔드의 경계, 시스템 분해, 애플리케이션 상태를 둘 위치, 그리고 모놀리스로 갈지 마이크로서비스로 갈지 같은 아키텍처 세분화 수준을 선택할 수 있습니다. 프로그래밍 언어, 런타임, 컴포넌트·프런트엔드·백엔드 프레임워크, 데이터 기술 같은 스택도 골라야 하는데, 하나로 정하기 전에 실험을 돌려 선택지를 평가해 보기도 합니다.
게다가 올바른 아키텍처는 프로젝트 단계에 따라 계속 달라지는 움직이는 목표입니다. 빠른 프로토타입을 만들 때 고른 단순한 아키텍처가 첫 프로덕션 시스템에는 맞지 않을 수 있고, 그 아키텍처도 애플리케이션이 커지면서 다시 바뀔 수 있습니다. 이런 결정을 내리려면 소프트웨어 구성 요소와 애플리케이션 맥락 양쪽에 대한 깊은 기술 지식이 필요합니다. 그래야 더 나은 트레이드오프를 선택하도록 아키텍처를 설계하고 발전시켜 나갈 수 있습니다.
안전하고 신뢰할 수 있는 시스템 만들기. 신뢰할 수 있는 시스템을 만들려면 시스템의 정확성을 검증하는 테스트 전략을 세울 줄 알아야 합니다. 단위 테스트와 통합 테스트를 어떤 비율로 섞을지, 어떤 프레임워크를 쓸지, 커버리지는 어느 수준으로 가져갈지 같은 문제입니다. 발생할 수 있는 장애를 염두에 둔 설계도 할 줄 알아야 합니다. API가 호출 한도(rate limit)에 걸리는 것 같은 장애를 어떻게 처리할지, 장애가 나도 서비스가 한꺼번에 멈추지 않고 단계적으로 기능을 줄이도록(graceful degradation) 어떻게 만들지, 장애의 파급 범위를 어떻게 최소화할지 아는 것입니다. 또한 소프트웨어를 먼저 만들고 나서 보안을 고민하는 대신, '시프트 레프트(shift left)' 흐름에 따라 보안 작업이 수명 주기의 더 이른 단계로, 즉 전통적인 프로젝트 일정표에서 왼쪽으로 옮겨 가고 있습니다. 모든 개발자가 풀스택 개발자로 나아가고 있듯이, 이제 많은 개발자가 부분적으로 보안 엔지니어 역할도 맡고 있습니다. 지금은 AI 도구로 코드의 취약점을 스캔하고, 의존성에 공급망 공격이 끼어들지 않았는지 확인하고, 클라우드 설정의 공격 표면을 점검할 수 있습니다. 다만 이 일을 잘 해내려면 여전히 보안 지식이 어느 정도 필요합니다.
프로덕션 환경에서의 확장과 운영. 실제 사용자에게 서비스를 제공하려면 소프트웨어를 프로덕션에 배포하는 방법을 알아야 합니다. 소프트웨어 개발 수명 주기(SDLC)를 수행할 줄 알면 도움이 되는데, 여기에는 빌드와 테스트뿐 아니라 배포 환경 구성, 릴리스 전략 결정, 배포 자동화(CI/CD) 적용, 서비스형 인프라(IaaS) 이해가 포함됩니다.
프로덕션 운영에는 관측 가능성(observability) 도구 구축, 알림 설정, 장애 대응이 필요합니다. 그리고 애플리케이션을 확장하려면 실제 부하를 파악하고, 서버를 늘리고 부하를 분산하는 방법을 알아야 하며, 샤딩, 인덱싱, 복제를 통해 데이터 인프라를 조정하거나 아키텍처를 바꿔 시스템이 규모 변화에 적응하도록 만들 수 있어야 합니다. 마지막으로 버전 관리, 코드 리뷰, 의존성 유지보수, 기술 부채 관리 같은 코딩 모범 사례를 이해하고 있으면 시스템을 오랫동안 계속 발전시켜 나갈 수 있습니다.
코딩 에이전트는 소프트웨어를 만드는 방식을 바꿔 놓았습니다. AI 구성 요소가 전혀 없는 소프트웨어도 예외가 아닙니다. 코딩 문법을 외우는 것처럼 코딩 지식의 일부는 쓸모가 없어지고 있습니다. 하지만 소프트웨어가 어떻게 동작하는지 깊이 이해하는 개발자는 이해 없이 바이브 코딩만 하는 사람보다 훨씬 뛰어난 성과를 냅니다.
AI에 더해 소프트웨어 기본기를 이해하면 소프트웨어로 무엇을 할 수 있고 무엇을 할 수 없는지 가늠하는 데도 도움이 됩니다. 그래서 소프트웨어 기본기는 코딩 에이전트를 어떻게 활용하고 빌드 방향을 어떻게 잡을지 판단하는 중요한 맥락이 됩니다. 이 주제는 앞으로 올릴 글에서 더 다루겠습니다.