제품 분야에서 일하려면 소프트웨어 기능에 대해 신속하게 결정을 내려야 하는 경우가 많습니다. DevOps 팀에서 일해 본 적이 있다면 기능을 실시간으로 푸시하는 데 필요한 결정이 얼마나 많은지 알 수 있습니다. 이러한 선택은 코드베이스, 사용자 경험, 시장 출시 시간 등에 영향을 미칠 수 있습니다.
기술 부채는 무엇보다 속도에 기반하여 의사 결정을 내린 결과를 설명하는 데 사용되는 용어입니다. 이러한 신속한 실시간 의사 결정은 소프트웨어 업데이트의 성패를 좌우할 수 있습니다. 하지만 좋은 결정과 빠른 결정 사이에 균형이 있어야 합니다. 기술 부채를 발생시키는 것은 부정적인 결과를 초래할 수도 있고, 여러분과 팀이 내리는 결정에 따라 그럴 만한 가치가 있을 수도 있습니다. 항상 나쁜 것은 아니지만, 과도한 부채는 유지 관리성과 코드 품질을 저하시킵니다.
이 글에서는 기술 부채의 정의, 개발 과정에서 신속한 결정을 효과적으로 관리하는 방법에 대해 논의하고, 향후 사고를 방지하는 방법을 더 잘 이해할 수 있도록 사례를 공유합니다. 리팩터링, 자동화, 메트릭, 코드 검토, 비즈니스 요구 사항에 맞게 조정하는 등의 주제를 다룰 것입니다.
기술 부채는 가장 효율적인 솔루션이 아닌 가장 빠른 솔루션을 선택하여 발생하는 추가 재작업의 대가입니다. 소프트웨어 개발자 Ward Cunningham은 1992년에 이 문구를 처음 사용했지만, 이후로 발전했습니다.
오늘날 기술 부채(tech debt, code debt) 라고도 알려진 기술 부채는 일반적으로 개발 팀이 소프트웨어 개발 제품의 새로운 기능을 구축하는 동안 빠른 코드를 작성하기로 선택할 때 발생합니다. 신속한 코드 전달은 팀이 마감일을 지킬 수 있도록 도와주며, 발생하는 부채는 그만한 가치가 있을 수 있지만 잘못 관리하면 부정적인 결과로 이어질 수도 있습니다. 이러한 부정적인 결과는 기술 부채를 발생시키기로 결정한 후에는 항상 피할 수 있는 것은 아닙니다.
좋은 결과든 나쁜 결과든, 기술 부채에 대한 중요한 사실을 살펴보겠습니다. 그래야 올바른 결정을 내릴 수 있습니다.
이 전자책에서 조직을 구조화하여 사일로를 방지하고 더 빠르게 움직이며 변화에 대응하는 방법을 알아보세요.
금융 부채와 마찬가지로 기술 부채는 좋은 방법과 나쁜 방법으로 활용될 수 있습니다.
경우에 따라 기술 부채는 소프트웨어 마감일을 준수하고 스프린트 내에서 고품질 코드를 제공하기 위해 계산된 이동의 결과입니다. 다른 경우, 기술 부채는 소프트웨어 업데이트를 릴리스할 때 발생하는 피할 수 없는 실수의 결과입니다.
참고: 릴리스 관리: 성공적인 프로세스를 위한 5가지 단계기술 부채에는 네 가지 다른 원인이 있으며, 이를 기술 부채 사분면이라고 합니다. 마틴 파울러(Martin Fowler)가 만든 네 가지 기술 부채 사분면에는 무모함, 신중함, 의도적, 부주의함이 포함됩니다. 이 사분면은 팀원과 이해관계자가 코드베이스에 축적될 수 있는 다양한 유형의 부채를 이해하는 데 도움이 됩니다.
이 네 가지 사분면에 기술적 부채를 할당하면 코드 문제에 대한 의도와 배경을 측정하는 데 도움이 됩니다. 일부 코드 부채는 의도적인 것으로 좋은 부채로 분류될 수 있지만, 빠른 수정 및 나쁜 코드와 같은 다른 부채는 부주의한 것으로 나쁜 부채로 분류될 수 있습니다.
신중하고 의도적인: 신속하게 출하하고 나중에 결과를 처리하려는 결정은 신중하고 의도적인 부채를 초래합니다. 이러한 유형의 부채는 소프트웨어 프로젝트의 위험이 비교적 낮고 빠른 납품의 이점이 위험보다 더 큰 경우에 가장 일반적으로 사용됩니다. 이는 시장 출시 시간을 개선하기 위한 의식적인 절충안입니다.
무모하고 의도적: 최고의 코드를 생산하는 방법을 알면서도 빠른 전달을 우선시하는 것은 무모하고 의도적인 부채의 원인이 됩니다. 이것은 종종 유지 관리가 더 어려운 레거시 코드로 이어집니다.
신중하고 부주의한 부채: 신중하고 부주의한 부채는 최고의 코드를 생산하려는 욕망이 있지만 구현 후 더 나은 솔루션을 찾을 때 발생합니다. 자동화된 테스트 및 기타 방법론은 이를 더 일찍 포착하는 데 도움이 될 수 있습니다.
무모하고 부주의한 경우: 무모하고 부주의한 부채는 팀이 필요한 지식 없이 최고의 코드를 생산하려고 할 때 발생합니다. 팀은 종종 자신이 저지르는 실수를 알지 못합니다. 이로 인해 취약점과 유지 관리 문제가 발생할 수 있습니다.
팀은 신속한 납품을 위해 의도적인 기술 부채를 선택하는 반면, 부주의한 부채는 우발적입니다. 구현 후에 발생합니다. 이 차이점은 소프트웨어 엔지니어링 Steve McConnell이 기술 부채의 두 가지 전반적인 유형을 설명할 때 가장 잘 설명됩니다. 이러한 사분면을 이해하는 것은 개발 주기 전반에 걸쳐 부채를 관리하는 데 핵심적인 역할을 합니다. 더 잘 이해하기 위해 각각에 대해 자세히 살펴보겠습니다.
Construx Software의 수석 소프트웨어 엔지니어인 Steve McConnell은 의도적인 것과 의도하지 않은 것, 두 가지 유형의 기술적 부채가 있다고 제안했습니다.
의도적인 부채는 조직이 미래가 아닌 현재를 위해 최적화하려는 의도적인 결정을 내릴 때 발생합니다. 비즈니스 요구 사항과 제품 관리자 및 CIO와 같은 이해관계자가 기능을 신속하게 제공하려는 압력이 종종 이러한 원동력이 됩니다.
의도적인 부채에는 단기 부채와 장기 부채가 있습니다. 예를 들어, 이전 설계 부채를 상환하기 위해 발생한 의도적 부채는 단기 부채이며, 미래의 더 큰 문서 부채를 방지하기 위해 발생한 의도적 부채는 장기 부채입니다.
단기 부채: 단기 부채는 기존 자원을 사용하는 것과 같은 전략적 이유로 인해 발생합니다. 또한 단기 부채는 집중적이거나 비집중적일 수 있습니다. 팀 멤버는 버그 수정이나 기타 사용자 경험 개선을 신속하게 제공하기 위해 단기 부채를 떠맡을 수 있습니다.
집중된 단기 부채: 여기에는 개별적으로 식별 가능한 바로 가기가 포함됩니다.
비집중 단기 부채: 여기에는 수많은 작은 지름길이 포함됩니다. 시간이 지남에 따라 개발 주기를 크게 늦출 수 있습니다.
장기 부채: 장기 부채는 마감일 준수와 같은 전략적 이유로 선제적으로 발생합니다. 자동화 및 리팩터링 작업량은 종종 이 범주에 속합니다.
보시다시피, 발생한 부채의 유형에 따라 상환하는 데 걸리는 시간이 결정됩니다.
반면에, 의도하지 않은 기술 부채는 이해 부족, 우발적인 실수 또는 경우에 따라서는 잘못 작성된 코드로 인해 발생합니다. 의도하지 않은 기술 부채의 예로는 오류가 발생하기 쉬운 설계 접근 방식이 있습니다. 정기적인 코드 검토는 이러한 문제를 더 일찍 발견하는 데 도움이 될 수 있습니다.
의도하지 않은 기술 부채는 팀이 의도적으로 발생한 것이 아니기 때문에 우발적인 것으로 가정할 수 있습니다. 가장 일반적으로는 소프트웨어 업데이트를 구현하거나 프로젝트를 완료한 후에야 실수를 깨닫게 됩니다.
참고: 추적해야 하는 비즈니스 성공 지표 27가지소프트웨어 개발 팀이 코드 부채의 정도를 이해하고 이를 관리하기 위한 정보에 입각한 결정을 내리기 위해서는 기술 부채를 측정해야 합니다. 기술 부채를 정량화함으로써 팀은 리팩터링 작업량을 우선시하고 코드베이스가 장기적으로 유지 가능하고 확장 가능하도록 보장할 수 있습니다.
소프트웨어 프로젝트의 기술 부채 금액을 평가하기 위해 다양한 지표를 사용할 수 있습니다. 여기에는 코드 복잡성, 중복, 테스트 범위 및 유지 관리 가능성 지수가 포함됩니다. SonarQube, CAST 및 Kiuwan과 같은 도구는 측정 프로세스를 자동화하여 코드베이스의 상태에 대한 귀중한 인사이트를 제공할 수 있습니다.
기술 부채를 평가할 때는 개발자, 제품 관리자, 비즈니스 리더를 포함한 모든 이해관계자를 참여시키는 것이 필수적입니다. 정기적인 코드 검토와 부채 비유 토론은 기술 부채의 영향에 대한 인식을 높이고 공통의 이해를 촉진하는 데 도움이 될 수 있습니다. 효과적인 평가를 위해서는 개발 주기, 기능, 사용자 경험을 방해할 수 있는 능력에 따라 부채의 우선순위를 정하는 것이 핵심입니다.
의도적으로 기술 부채를 발생시킬 수 있지만, 많은 제품 팀은 기술 부채를 추적하고 소통하는 데 어려움을 겪습니다. 이로 인해 소프트웨어 코드의 간극을 해결하려는 데 예상보다 많은 작업이 발생할 수 있습니다.
이 단계별 가이드는 기술 부채를 상환하고 부채 부담에 대한 직장 투명성을 높이는 데 도움이 됩니다.
기술 부채를 상환하는 첫 번째 단계는 코드베이스에서 주의가 필요한 영역을 식별하고 우선순위를 정하는 것입니다. 여기에는 지표 분석, 코드 검토 수행, 팀원의 의견 수집이 포함됩니다. 기능성, 유지 보수 가능성 및 비즈니스 요구에 미치는 영향을 기준으로 부채의 우선순위를 정하세요.
추적 시스템 내에서 부채 목록을 유지합니다. 부채가 발생할 때마다 추적 시스템에 해당 부채를 상환하는 데 필요한 작업과 예상 작업량 및 일정을 입력합니다. 부채 백로그를 사용하여 기술 부채 진행 상태를 추적하세요. 90일이 지난 미해결 부채는 모두 심각하게 취급해야 합니다.
스크럼을 사용하는 경우, 스크럼 제품 백로그의 일부로 부채 목록을 유지하고, 각 부채를 스크럼 '스토리'로 취급하며, 스크럼의 다른 스토리를 추정하는 것과 동일한 방식으로 각 부채를 상환하기 위한 작업량과 일정을 추정합니다.
우선순위가 높은 기술 부채를 파악했다면 이제 코드를 리팩터링하고 최적화할 때입니다. 여기에는 복잡한 기능을 세분화하고, 중복을 제거하고, 명명 규칙을 개선하고, 오래된 프레임워크를 업데이트하는 것이 포함될 수 있습니다. 장기적으로 더 많은 부채로 이어질 수 있으므로 지름길과 빠른 해결책을 피하세요.
새로운 기술 부채가 쌓이는 것을 방지하려면 개발팀을 위한 명확한 코딩 표준과 모범 사례를 수립하세요. 여기에는 코드 구조, 주석, 테스트 및 문서에 대한 지침이 포함됩니다. 팀원들이 이러한 표준을 일관되게 따르도록 권장하고 필요에 따라 교육과 지원을 제공하세요.
기술 부채는 지속적인 우려 사항이며, 새로운 부채가 발생할 때마다 지속적으로 모니터링하고 해결하는 것이 중요합니다. 지표와 도구를 사용하여 코드베이스를 정기적으로 평가하고 개발 프로세스에 부채 관리를 통합하세요. 스크럼 또는 DevOps 와 같은 방법론을 채택하여 지속적인 개선과 부채 감축을 지원하는 것이 좋습니다.
참고: 비즈니스에서 효율성 vs 효과: 팀에 두 가지 모두가 필요한 이유기술 부채 관리와 의도하지 않은 부채와 의도적인 부채의 원인에 대해 이해했으니 이제 실제 사례를 살펴보겠습니다.
설명: 팀은 구축 속도가 빠르고, 알려진 성능 문제가 있으며, 기능이 최소화된 프레임워크를 선택합니다.
솔루션: 팀은 누락된 프레임워크 기능을 갖춘 소프트웨어 구현 후 추가 애플리케이션을 사용합니다.
부채: 제품 마감일을 준수했지만 팀은 출시 후 기능을 재작업해야 하며 추가 자금이 필요합니다.
설명: 팀에는 많은 주니어 개발자가 있으며, 코드의 각 부분을 검토할 수 있는 수석 개발자가 부족하여 촉박한 마감일 내에 새로운 소프트웨어 기능을 출시하는 데 도움을 줍니다.
솔루션: 팀은 코드를 살펴보고 적절한 기능을 확인하기 위해 선임 개발자로부터 추가 임시 지원을 받습니다.
부채: 팀이 대부분의 문제를 해결했지만, 정규 직원과 임시 지원팀 간의 소통이 원활하지 않아 코드에서 일부 버그가 누락되었습니다. 이는 팀이 출시 후 이러한 문제를 해결해야 함을 의미합니다.
보시다시피, 의도적인 부채와 의도하지 않은 부채는 서로 다르지만 시간이 지남에 따라 모두 상환해야 합니다. 기술 부채에 대한 해결책을 브레인스토밍하면 소프트웨어 업데이트가 적시에 출시되고 부채가 거의 발생하지 않도록 할 수 있습니다.
소프트웨어 제품 출시를 위해 작업할 때 부채를 피할 수 없는 경우도 있습니다. 어려운 결정부터 코드의 실수까지, 애자일 팀은 발생한 기술 부채가 소프트웨어 업데이트에 어떤 영향을 미칠 수 있는지 알고 있습니다.
부채를 갚는 핵심은 점진적인 지불을 유지하고 추적하는 것입니다. 각 시나리오에서 부채 상환 유형은 다르지만, 팀의 투명성과 커뮤니케이션은 부채를 더 빨리 상환하는 데 도움이 될 수 있습니다. 이는 애자일 프로젝트에 대한 명확성이 향상됨에 따라 당면한 문제에 대한 집단적 해결책을 강요할 수 있기 때문입니다.
이 전자책에서 조직을 구조화하여 사일로를 방지하고 더 빠르게 움직이며 변화에 대응하는 방법을 알아보세요.
스크럼에서 기술 부채란 무엇인가요?
스크럼에서 기술 부채는 소프트웨어 제품의 품질을 유지하고 개선하기 위해 수행해야 하는 작업의 누적을 의미합니다. 이는 개발 팀이 품질보다 속도를 우선시하기로 의식적으로 결정하거나 경험이나 지식 부족으로 인해 자신도 모르는 사이에 부채를 지게 될 때 발생합니다. 스크럼에서 기술 부채는 종종 향후 스프린트에서 해결해야 하는 백로그 항목으로 표시됩니다.
기술 부채는 좋은 것인가요, 나쁜 것인가요?
기술 부채는 본질적으로 좋거나 나쁘지 않으며, 관리 방식에 따라 달라집니다. 경우에 따라 기술 부채를 떠맡는 것은 팀이 더 빠르게 가치를 제공할 수 있도록 하는 전략적 결정이 될 수 있습니다. 그러나 기술 부채를 방치하면 유지 관리 비용 증가, 생산성 저하, 심지어 프로젝트 실패로 이어질 수 있습니다. 따라서 기술 부채를 발생시키는 것과 상환하는 것 사이의 균형을 맞추는 것이 중요합니다.
기술 부채의 일반적인 원인은 무엇인가요?
기술 부채의 일반적인 원인으로는 팀이 지름길을 택하도록 만드는 촉박한 마감일, 코딩 표준 및 모범 사례의 부족, 불충분한 테스트 및 문서화, 오래되었거나 호환되지 않는 기술의 사용 등이 있습니다. 팀 이직률과 커뮤니케이션 부족과 같은 다른 요소도 기술 부채의 축적에 기여할 수 있습니다.
기술 부채가 프로젝트에 어떤 영향을 미칠 수 있나요?
기술 부채는 프로젝트의 성공에 상당한 영향을 미칠 수 있습니다. 부채가 증가함에 따라 코드베이스가 더 복잡해지고 유지 관리가 어려워져 개발 주기가 길어지고 버그 수정이 증가합니다. 이에 따라 새로운 기능의 제공이 지연되고 사용자 경험에 부정적인 영향을 미칠 수 있습니다. 극단적인 경우에는 기술 부채로 인해 프로젝트가 실행 불가능해져 코드베이스를 완전히 다시 작성해야 할 수 있습니다.
기술 부채를 어떻게 방지할 수 있을까요?
기술 부채를 방지하려면 개발팀 전체가 참여하는 선제적 접근 방식이 필요합니다. 여기에는 코딩 표준 및 모범 사례를 수립하고 준수하는 것, 정기적인 코드 검토를 수행하는 것, 테스트 및 문서화를 우선시하는 것이 포함됩니다. 스크럼과 같은 애자일 방법론은 빈번한 피드백과 지속적인 개선을 장려하여 기술 부채를 방지하는 데 도움이 될 수 있습니다. 또한, 각 스프린트에서 기술 부채를 해결하는 데 시간을 할애하면 이를 통제하는 데 도움이 될 수 있습니다.