개발은 새롭고 유용한 것을 반복적으로 만들어내는 과정입니다.
개발하면 흔히 신제품 개발을 떠올립니다. 이것은 개별 제품을 생산하는 제조와는 다르며, 제품의 설계 사양이나 틀을 만드는 것을 의미합니다.
따라서 신제품 개발을 통해 만들어진 청사진이나 틀은 공장에서 반복적으로 사용되어 수많은 동일한 제품을 제조하는 데 쓰입니다.
개인의 능력 개발이나 사회 및 국가 개발과 같은 용어도 있습니다. 이는 단순히 소유하고 있는 것이 증가하는 것이 아니라, 개발된 능력을 반복적으로 사용하여 이점을 얻을 수 있음을 의미합니다.
개인과 사회의 경제력은 경제 상황에 따라 변동될 수 있지만, 개발된 능력은 근본적으로 영구적입니다.
설령 감소하더라도, 그것은 경제적 번영의 오르내림이 아닌 쇠퇴로 간주됩니다.
이 외에도 기술 및 지식 개발이 있습니다. 이는 개인이나 특정 사회의 능력과는 달리 쉽게 공유될 수 있다는 특징이 있습니다.
그리고 이러한 개발의 결과물인 제품, 능력, 지식, 기술 중 일부는 다음 개발에 기여할 수 있습니다.
이처럼 유용한 결과물을 개발함으로써 개발의 범위가 넓어지고 효율성과 품질이 향상됩니다.
AI 중심 소프트웨어 개발
일반적으로 개발은 상당한 시간과 노력을 필요로 했습니다. 특히 사회가 발전하고 다양한 것들이 더욱 정교해짐에 따라 새로운 것을 만드는 것은 더욱 어려워졌습니다.
그러나 생성형 AI의 등장으로 이러한 상황이 변화하고 있습니다. 현재 소프트웨어 개발은 생성형 AI의 뛰어난 프로그래밍 능력 덕분에 극적인 변화를 겪고 있습니다.
이러한 환경에서 생성형 AI를 기반으로 한 자율 에이전트가 소프트웨어 엔지니어로서 소프트웨어 개발의 중심이 되는 미래 비전은 이미 현실이 되어가고 있습니다.
우리는 현재 과도기에 있습니다. 개발을 생성형 AI에 전적으로 맡길 수는 없지만, 생성형 AI를 능숙하게 활용하면 소프트웨어 개발을 강력하게 진전시킬 수 있습니다.
이를 AI 중심 소프트웨어 개발이라고 부릅니다.
개발형 개발
생성형 AI가 소프트웨어 개발을 효율화하면, 최종 목표 소프트웨어 개발뿐만 아니라 개발 자체를 돕는 소프트웨어 개발도 간소화할 수 있습니다.
앞서 언급했듯이, 개발을 촉진하는 결과물은 개발의 범위를 넓히고 효율성과 품질 향상에 기여합니다. 더욱이 효과적으로 생성되면 다른 개발 프로젝트에서도 재사용될 수 있습니다.
따라서 소프트웨어 개발 과정에서 개발을 돕는 소프트웨어를 개발함으로써 전반적인 효율성을 높이고, 이러한 자산을 미래 개발에 활용할 수 있습니다.
기존에는 이러한 보조 소프트웨어를 개발하는 것이 일반적인 관행이었지만, 자체 개발 시간과 노력이 필요하여 신중한 고려와 집중적인 실행이 요구되었습니다.
생성형 AI를 활용하면 떠오르는 사소한 작업을 자동화하는 간단한 소프트웨어를 빠르게 만들 수 있습니다. 작업이 명확한 처리를 포함한다면, 생성형 AI는 거의 오류 없이 정확하게 프로그램을 생성할 수 있습니다.
결과적으로 소프트웨어 개발 과정에서 개발을 돕는 소프트웨어를 개발하는 것이 이전보다 쉬워졌습니다.
그리고 이에 대해 깊이 생각해보면, 개발 과정에서 유용한 개발 도구들이 지속적으로 생성되어 개발 방법론 자체를 변화시키는 개발 스타일이 나타납니다.
우리는 이를 "개발형 개발"이라고 부를 것입니다.
개발형 개발을 실천하려면 자신의 소프트웨어 개발을 객관적으로 관찰하고, 어떤 부분은 소프트웨어로 처리할 수 있고 어떤 부분은 인간만이 할 수 있는지 고려하는 습관과 더불어 그러한 보조 소프트웨어를 개발하는 기술이 필요합니다.
또한, 생성형 AI를 이러한 소프트웨어 도구에 통합할 수 있습니다. 소프트웨어 내부에 임베딩함으로써 생성형 AI 에이전트와 달리 처리 범위를 어느 정도 좁히고 경로를 정의할 수 있습니다.
AI 에이전트도 프롬프트를 통해 유사한 결과를 얻을 수 있지만, 생성형 AI가 내장된 소프트웨어는 프로그램과 프롬프트를 모두 결합하여 정확도를 더 쉽게 높일 수 있습니다.
이러한 개발형 개발을 실천할 수 있다면, 두 번째 프로젝트는 첫 번째 프로젝트에 비해 품질과 비용 면에서 모두 개선될 것입니다. 나아가 세 번째, 네 번째 등 후속 프로젝트마다 개선이 계속해서 누적될 것입니다.
이는 단순히 생성형 AI를 사용하여 소프트웨어를 개발하는 것과는 완전히 다릅니다. 생성형 AI 도구만을 숙달하는 팀과 개발형 개발을 실천하는 팀 사이에는 시간이 지남에 따라 상당한 격차가 발생할 것입니다.
리팩토링 주도 테스트
테스트 주도 개발(TDD)이라는 개념이 있습니다. 이는 사양을 기반으로 테스트를 먼저 설계한 다음, 해당 테스트를 통과하도록 소프트웨어를 개발하는 방식입니다.
처음에는 저 역시 생성형 AI를 활용하면 자동 테스트를 위한 테스트 프로그램을 쉽게 개발할 수 있어 TDD가 실현 가능할 것이라고 생각했습니다.
그러나 개발형 개발을 실천하기 시작하면서, 구현 전에 테스트를 먼저 생각하는 것이 항상 가장 적합한 접근 방식은 아니라는 믿음을 갖게 되었습니다.
특히 사용성 및 시각적 디자인과 같은 주관적인 측면이 포함되어 직접 상호작용하는 웹 애플리케이션과 같은 소프트웨어의 경우, 상세한 테스트보다 실제로 소프트웨어를 실행하고 상호작용하는 것이 우선임을 깨달았습니다.
이는 UI/UX 수준에서 상당한 불만이 발생할 경우, 프레임워크, 기본 아키텍처, 데이터 모델 또는 유스케이스와 같은 근본적인 부분을 변경하고 싶을 가능성이 있기 때문입니다.
현재 진행 중인 개인 소프트웨어 개발 프로젝트에서 기능 유연성과 성능 문제를 발견하여 두 가지 프레임워크를 다른 것으로 교체했습니다.
또한 비효율적인 메모리 사용으로 인해 일부 영역의 처리를 완전히 검토해야 했습니다.
바로 이러한 리팩토링 시점에 테스트가 처음으로 의식적인 고려 대상이 됩니다.
만약 개발 초기 단계이거나 기능과 사양이 어차피 크게 변경될 예정이라면 테스트는 불필요할 수 있습니다.
하지만 개발이 이미 상당히 진행되었고 확인할 항목이 많다면, 리팩토링으로 인해 기능적 결함이나 누락이 발생하지 않았는지 확인하기 위해 테스트가 필요할 것입니다.
따라서 개발이 어느 정도 진행되어 리팩토링이 필요할 때 테스트 프로그램을 작성하는 접근 방식도 나쁘지 않습니다.
이때 중요한 것은 모든 코드에 대한 테스트를 만드는 것이 아니라, 앞으로 크게 변경될 가능성이 적은 성숙한 부분에 대한 테스트에 집중하고, 유동적인 부분은 자동 테스트 없이 남겨두는 것입니다.
이를 리팩토링 주도 테스트라고 부를 수 있습니다.
결론
생성형 AI는 소프트웨어 개발을 극적으로 변화시키고 있습니다.
이전 글에서 저는 전통적인 풀스택 엔지니어를 넘어 다양한 도메인, 인프라, 실행 환경을 결합한 시스템을 개발할 수 있는 "전방위 엔지니어"가 되는 것의 중요성에 대해 썼습니다.
또한 명세와 구현의 일치보다는 소프트웨어의 동작을 통해 사용자 경험을 향상시키는 "경험 및 행동 중심 개발"의 시대로 접어들고 있다는 내용의 글도 작성했습니다.
개발형 개발과 리팩토링 주도 테스트는 바로 이러한 소프트웨어 개발의 새로운 지평으로 이끄는 요소들입니다.