← 블로그 목록

소프트웨어는 분석-설계-구현-테스트를 한 번만 도는 것이 아니라 계속 되감기며 만들어진다

소프트웨어 개발은 분석-설계-구현-테스트가 한 번 직선으로 끝나는 공정이 아니다. 작은 단위를 반복하며 스코프를 줄이고 피드백을 되감는 순환 구조로 보는 편이 실제에 가깝다.

소프트웨어는 분석-설계-구현-테스트를 한 번만 도는 것이 아니라 계속 되감기며 만들어진다

소프트웨어는 분석-설계-구현-테스트를 한 번만 도는 것이 아니라 계속 되감기며 만들어진다

소프트웨어 개발 과정을 설명할 때 흔히 분석 → 설계 → 구현 → 테스트라는 순서를 말한다. 이 설명 자체는 틀리지 않다. 다만 현실에서 문제는, 많은 사람이 이 순서를 한 번만 쭉 가는 직선 공정으로 받아들인다는 데 있다.

실제 개발은 그보다 훨씬 반복적이다. 요구를 이해하고, 작은 설계를 만들고, 구현해 보고, 테스트와 피드백을 받은 뒤 다시 앞 단계로 돌아간다. 애자일 선언문이 “계획을 따르는 것보다 변화에 대응하는 것”을 더 중시한다고 밝힌 이유도 여기에 있다.


분석 단계에서 중요한 것은 “무엇을 만들지”만이 아니라 “무엇을 아직 만들지 않을지”다

분석은 아이디어를 길게 쓰는 단계가 아니다. 더 실용적인 질문은 이쪽에 가깝다.

처음부터 모든 요구를 받아 적으면 대부분 스코프가 커진다. 그래서 분석의 실력은 추가보다 제외에서 더 잘 드러난다.


설계는 완벽한 청사진보다 “다음 한 조각을 구현할 수 있는 구조”면 충분하다

설계 단계도 자주 오해된다. 모든 것을 미리 확정해야 한다고 생각하면 설계 문서만 커지고 실제 검증은 늦어진다. 현실적인 설계는 오히려 작아야 한다.

즉 설계의 목적은 미래를 전부 맞히는 것이 아니라, 다음 구현 단계를 덜 위험하게 만드는 것이다.


구현은 “코드를 쓰는 단계”이면서 동시에 분석과 설계를 검증하는 단계다

구현을 시작하면 많은 가정이 깨진다. 처음에는 간단해 보이던 요구가 실제 코드에서는 복잡하게 드러나기도 하고, 반대로 필요할 줄 알았던 추상화가 전혀 필요 없다는 사실이 드러나기도 한다.

그래서 구현은 설계의 하위 단계가 아니라 검증 단계이기도 하다. Martin Fowler가 정리한 YAGNI, 즉 지금 필요하지 않은 것은 만들지 말라는 원칙도 이 지점을 겨냥한다. 너무 이른 일반화는 구현보다 상상을 앞세우게 만들기 쉽다.


테스트는 맨 마지막 검수보다 “되감기 장치”에 가깝다

테스트를 마지막 품질 검사처럼만 생각하면 개발이 느려진다. 더 현실적인 역할은 되감기 장치다.

즉 테스트를 하면 버그를 찾는 동시에, 분석과 설계 단계의 오해도 다시 발견하게 된다.


실제 흐름은 작은 반복으로 보는 편이 더 맞다

GitHub flow가 보여 주는 가벼운 브랜치-리뷰-병합 흐름도 결국 이 반복을 작게 유지하려는 접근이다. 큰 덩어리를 오래 붙잡지 않고, 작은 변경을 만들고, 검토하고, 반영하는 쪽이 피드백을 빠르게 돌리기 쉽다.

현실적인 개발 흐름은 보통 이런 식이다.

  1. 요구를 아주 작게 자른다.
  2. 그 조각에 필요한 최소 설계를 한다.
  3. 구현한다.
  4. 테스트와 리뷰를 통해 다시 되감는다.
  5. 다음 조각으로 넘어간다.

이 흐름을 이해하면 “왜 개발은 늘 앞 단계로 돌아가는가”가 이상하게 느껴지지 않는다. 원래 그렇게 만들어지는 것이기 때문이다.


핵심 정리

소프트웨어는 분석-설계-구현-테스트를 한 번 직선으로 통과해서 완성되는 제품이 아니다. 실제로는 작은 단위를 반복하며, 구현과 테스트를 통해 앞 단계의 가정을 계속 수정해 나가는 순환 구조에 가깝다.

그래서 좋은 개발 프로세스의 핵심도 거창하지 않다. 스코프를 작게 자르고, 지금 필요한 만큼만 설계하고, 구현과 테스트를 통해 계속 되감는 것. 그 반복이 쌓여 소프트웨어가 된다.

참고 자료

← 목록으로
Related

함께 읽으면 좋은 글

프로그래밍애자일익스트림 프로그래밍
익스트림 프로그래밍은 과격한 방법이 아니라 변화를 버티기 위한 공학 습관이다

익스트림 프로그래밍은 이름과 달리 사람을 몰아붙이는 문화가 아니라, 테스트·리팩터링·작은 릴리스·지속 가능한 속도를 엮어 변화 비용을 낮추려는 공학 습관의 묶음이다. ‘Extreme’의 의미도 중요한 실천을 끝까지 밀어 보자는 태도에 가깝다. XP는 빨리 만드는 법이 아니라 바뀌어도 계속 만들 수 있는 법을 묻는다는 점을 정리한다.

프로그래밍테스트테스트 주도 개발
테스트 주도 개발은 테스트를 나중에 붙이는 습관이 아니라 설계 순서를 바꾸는 방식이다

테스트 주도 개발은 테스트를 나중에 붙이는 습관이 아니라, 실패하는 테스트부터 써서 설계 순서 자체를 바꾸는 방식이다. 레드-그린-리팩터링의 짧은 피드백 주기에서 핵심은 테스트 개수가 아니라 설계와 검증 사이의 왕복 거리이며, 마지막 단계의 리팩터링이 빠지면 TDD는 반쪽만 남는다. 진짜 가치는 커버리지 숫자보다 더 분명한 경계선과 안전한 변경 능력에 있다.

프로그래밍데이터 구조상태 전이
모든 프로그램을 데이터와 상태 전이로 보면 설계가 더 선명해진다

‘모든 프로그램은 데이터베이스다’는 엄밀한 정의는 아니지만 사고 실험으로는 꽤 쓸모 있다. 저장·조회·갱신·삭제, 무결성, 상태 전이의 관점으로 코드를 보면 객체 이름보다 접근 패턴과 유효 상태가 먼저 보이고, 프레임워크가 바뀌어도 설계가 덜 흔들린다. 데이터를 어떻게 다루는지가 결국 프로그램의 성격을 결정한다는 점을 정리한다.