- 효과적인 소프트웨어 엔지니어는 요구사항과 코드에 대한 명확한 정신적 모델을 만들고 유지하며, 이를 반복적으로 비교·갱신하는 루프를 수행함
- LLM은 코드 작성과 수정, 테스트 작성, 디버깅 등은 가능하지만 정확한 정신적 모델 유지 능력이 부족해 복잡한 작업에서 혼란을 겪음
- 현재 LLM은 문맥 누락, 최근성 편향, 환각 문제로 인해 코드와 요구사항 간 차이를 정확히 파악하고 적절히 수정하는 데 한계가 있음
- 사람은 상황에 따라 전체 맥락을 임시 저장하거나, 세부사항을 잠시 숨기고 큰 그림을 보는 등 유연하게 사고를 전환할 수 있지만 LLM은 이를 구현하지 못함
- LLM은 요구사항이 단순한 작업에는 유용하지만, 복잡한 소프트웨어 개발에서는 결국 소프트웨어 엔지니어가 직접 요구사항의 명확성과 코드의 동작을 책임져야 하며, LLM은 보조 도구의 역할임
소프트웨어 엔지니어링 루프
- 숙련된 엔지니어는 다음 단계를 반복하며 작업함
1. 요구사항의 정신적 모델 구축
2. 해당 모델에 맞춰 코드 작성
3. 작성한 코드가 실제로 수행하는 일을 이해
4. 차이점을 식별해 코드 또는 요구사항 수정 - 이 루프의 핵심은 정확하고 유지 가능한 정신적 모델을 보유하는 능력임
LLM의 한계
- LLM은 코드 작성, 문제 식별 후 수정, 테스트 작성·실행, 로깅 추가, 디버거 사용 등 기능을 수행 가능
- 그러나 정신적 모델을 유지하지 못해 다음과 같은 문제가 발생함
- 자신이 작성한 코드가 잘 작동한다고 가정
- 테스트 실패 시 코드와 테스트 중 어느 쪽을 고칠지 추측에 의존
- 혼란 시 전체 코드를 삭제하고 처음부터 다시 작성
- 사람과 달리 테스트 실패 시 모델을 점검해 수정 방향을 결정하거나, 좌절 시 대화를 통해 문제를 풀어가는 유연성이 부족함
- 소프트웨어 엔지니어는 작업 중간에 테스트를 실행하며, 문제 발생 시 어떤 부분을 수정해야 할지 명확히 판단할 수 있음
- 때로는 작업 전체를 다시 시작할 때에도 문제에 대한 이해도가 더 깊어지는 결과로 이어짐
향후 가능성
- 추후 모델이 더 발전하면 변할 가능성은 있으나, 소프트웨어 엔지니어링은 단순한 코드 생성 이상을 요구함
- 인간은 중대한 문제를 해결할 때 전체 맥락을 임시로 기억에서 꺼내어 다루고, 이슈에 집중하거나 큰 그림을 볼 수 있음
- 컨텍스트 정보를 계속해서 늘려나가는 방식이 아니라, 필요한 정보를 선택적으로 다루는 사고 방식이 중요함
- 사람처럼 맥락을 임시 저장·복구하거나, 큰 그림과 세부사항을 오가며 사고하는 기능이 LLM에는 결여됨
- 현재 LLM의 주요 제약
- 문맥 누락(Context omission): 필요한 정보가 빠진 부분을 잘 찾지 못함
- 최근성 편향(Recency bias): 문맥창 내에서 최신 정보에 과도하게 치중
- 환각(Hallucination): 존재하지 않는 세부사항을 만들어냄
- 메모리 기능이 추가되면 일부 개선 가능하지만, 복잡도를 넘어서면 여전히 문맥 이해와 모델 유지에 실패
- 두 개의 비슷한 정신적 모델을 유지하며 차이를 분석하고, 요구사항이나 코드를 어디서 수정해야 할지 결정하는 기능이 부족함
현재의 역할과 활용
- LLM은 빠른 코드 생성과 요구사항·문서 통합에 강점이 있어 단순·명확한 작업에는 충분히 활용 가능
- 하지만 비단순 문제에서는 충분한 맥락 유지와 반복적 개선이 어려움
- 따라서 요구사항 명확화, 코드 검증 등은 여전히 소프트웨어 엔지니어 책임임
- 사람과 에이전트(LLM)가 함께 소프트웨어를 만드는 환경을 추구하지만, 현재 시점에서는 엔지니어가 주도하고, LLM은 도구로서 활용해야 함