Yunseok's Dev Blog

배운 것을 적는 블로그입니다.

The Nature of Software Development 서평

소프트웨어 개발에는 본질적인 방법이 존재한다. 그 방법은 사용자, 비즈니스, 경영진, 개발자 모두에게 도움을 준다. 따라서 본질적인 방법을 가장 높은 위치에 있는 경영진부터 가장 아래쪽에 있는 제품 책임자 그리고 개발자 모두가 알아야 한다.

소프트웨어를 개발할 때 본질적인 방법은 무엇일까?

작동하는 소프트웨어를 보여주는 것이다. 작동하는 소프트웨어는 가치를 전달한다. 이러한 가치를 빠르고 자주 전달해야 한다. 이게 전부다. 나머지는 그래서 작동하는 소프트웨어를 보여주려면 어떻게 해야 되는가?에 대한 문제다.

가치가 무엇인지 알아야 한다

가치란 우리가 원하는 것이다. 우리가 왜 일을 하는지에 대한 것이다. 돈을 벌 수도 있고 삶을 더 좋게 할 수도 있다.

계속해서 변화해야 한다

가치를 전달하면 피드백으로부터 우리가 다음에 어떤 가치를 전달하지 변한다. 그래서 계획을 한 번만 세우고 지속하는 것이 아닌 무엇을 바꿀지 항상 고민하고 바꾸기 위해서는 지속적인 학습을 해야 한다.

피처 단위로 개발해야 한다.

우리와 사용자 모두 이해할 수 있는 조각을 개발해야 한다. 이는 피처라고 부른다.

피처 단위로 프로젝트를 진행하면 예측하기 더 쉬워진다. 왜냐하면 소프트웨어를 볼 수 있기 때문에 무슨 일이 일어나는지 바로 알 수 있기 때문이다.

주기마다 하나의 완성된 제품을 만들도록 목표를 세워야 한다. 주기마다 다음에 개발해야 할 피처와 그 피처의 테스트 방법을 정리해야 한다.

가장 높은 가치를 가진 피처를 먼저 개발해야 한다. 조직은 한정된 시간과 돈으로 가장 좋은 제품을 개발하는 방법을 배우게 된다. 이 과정은 반드시 투명하게 진행되어야 한다.

피처는 완료와 미완료로 구분해야 한다. 중간은 없다.

피처 단위 개발은 매 주기가 완벽한 개발 프로세스를 포함한다. 프로세스에는 요구 사항, 설계, 코딩, 그리고 테스트를 포함한다.

피처를 유연하게 추가하기 위해서는 프로젝트가 시작할 때부터 끝날 때까지 시스템의 기반을 견고하게 유지해야 한다.

피처를 개발할 수 있는 개발팀을 구성해야 한다.

각 개발팀은 피처의 일부가 아닌 전체를 개발할 수 있는 기술을 가지고 있어야 한다. 그러면 작업을 쉽게 할당할 수 있고 모든 작업이 어떻게 진행되고 있는지 쉽게 알 수 있다.

기술이 부족하다면 기술을 공유할 학습공동체를 만들어야 한다. 조직에서 가장 뛰어난 사람은 경험이 적은 사람들을 이끌어야 한다.

지속적인으로 계획해야 한다.

먼저 개발해야 할 핵심 피처를 추려야 한다. 시간과 예산을 정해 두고 가장 중요하고 가치 있는 피처를 우선으로 제품을 개발한다. 제품은 언제든지 배포할 수 있는 상태로 준비한다.

프로젝트는 가치를 우선하므로 계획은 프로젝트 기간 내내 필요하다. 1 ~ 2주를 하나의 주기로 각각의 피처는 2 ~ 3일 정도로 작업할 분량이 좋다.

오늘은 어제의 업무량만큼 일할 수 있다. 가장 최근 주기의 작업량을 기준으로 업무량을 계획해야 한다.

개인이 아닌 팀이 할 수 있는 양을 추정해야 한다.

테스트를 해야 한다

반드시 개발주기가 끝날 때마다 가능한 한 버그가 없도록 유지해야 한다. 오직 테스트만이 결함을 최소화하는 방법이다.

개발 주기가 끝날 때마다 반드시 비즈니스 테스트를 수행해야 한다. 새로운 피처가 잘 작동하는지 뿐만 아니라 이전에 있던 피처들에 문제는 없는지도 확인해야 한다. 그러려면 반드시 비즈니스 관점에서 테스트해야 하며 제품이 마주칠 다양한 환경도 확인해야 한다.

테스트는 비즈니스와 개발자 관점으로 나눠 진행해야 한다. 비즈니스 테스트에서도 결함이 발견되기를 기대할 수 있지만 비즈니스 테스트는 매우 오랜 시간에 걸쳐 진행되며 문제가 발생해도 구체적인 에러를 알려주지 않는다. 따라서 개발자도 자동화된 전체 테스트를 진행해야만 결함을 조기에 발견하고 수정하여 제품을 더 안정적으로 만들 수 있다.

설계를 개선해야 한다

피처 단위로 제품이 성장할수록 설계 또한 함께 성장해야 한다. 그러려면 지속적으로 설계를 개선해야 한다. 따라서 리팩터링을 지속적으로 수행해야 한다.

올바른 설계를 유지하지 못하면 작업 속도는 점점 떨어지고 시간과 비용이 점점 커지게 된다.

따라서 피처 단위로 개발하려면 테스트와 리팩터링을 함께 진행해야 한다.

다음 질문에 답해보자

  • 작고 가치 있는 피처를 자주 배포하면 어떤 장점이 있을까?
  • 피처 단위로 프로젝트를 진행하면 일반 과정에 비패 무엇이 더 좋을까?
  • 프로젝트 개발팀은 어떻게 구성해야 할까?
  • 프로젝트 계획은 어떻게 세워야 할까?
  • 피처 단위 개발을 어덯게 할 수 있을까?
  • 어떻게 해야 설계와 피처 사이에서 최적의 균형을 맞출 수 있을까?
  • 피처 단위로 개발할 때 테스트와 리팩터링이 왜 중요한가?
  • 가치가 뜻하는 것은 무엇일까?
  • 가치를 정하는 기준은 무엇일까?
  • 복잡한 소프트웨어 개발을 어떻게 헤쳐나가야 할까?
  • 가치를 기준으로 소프트웨어를 개발하면 무엇이 좋을까?
  • 성장하는 개발팀은 어떻게 만들 수 있을까?
  • 파이브 카드란 무엇인가?
  • 경영진에게 소프트웨어 개발의 본질적인 방법은 무엇일까?
  • 개발팀의 생산성을 높이려면 어떻게 해야 할까?
  • 프로젝트를 일정한 속도로 유지하려면 어떻게 해야 할까?
  • 애자일 프로세스를 어떻게 도입하는 게 좋을까?

Sources