대규모 시스템 설계의 첫 번째 단계는 요구 사항을 수집한 후 분석, 분류하는 것이다. 시스템 요구 사항이란 클라이언트를 위해 만들어야 할 항목을 파악하고 정리하는 것을 말한다.

대규모 시스템을 설계하는 경우 메서드, 알고리즘이나 클래스를 수행하는 일반적인 요구 사항과는 약간 차이가 있는데 추상화의 단계와 범위가 다르고 설계해야 하는 솔루션이 다르다. 또한 모호성의 정도가 달라서 어려움을 겪는다.

모호성은 두 가지로 나뉘는데, 대부분은 엔지니어가 요구 사항을 구상하지 않으며, 심지어 기술적인 내용을 모르는 클라이언트가 구상하기도 한다. 그런 내용을 보다 자세하고 기술적인 요청으로 바꾸는 게 우리의 역할이다. 그러한 기술적 요구 사항이 소프트웨어 아키텍처의 근간이 된다.

모호성의 정도가 커지는 이유는 세부적인 요구 사항은 솔루션의 일부이기 때문인데 클라이언트는 항상 원하는 바를 잘 알고 있는 편이 아니다. 그들이 확실히 아는 건 해결해야 할 문제뿐이다.

자세한 예시로 히치하이킹 서비스 설계를 의뢰 받았다고 가정했을 때 특정 경로에서 운전하는 운전자와 합승할 수 있도록 해야 하고 운전자는 비용을 받고 승객을 태워 줘야 한다고 하자.

클라이언트로부터 받는 요구 사항은 이게 다이기 때문에 실시간 서비스인지 아니면 운전자가 승객의 연락처를 미리 알고 있어야 하는지 확인하는 건 우리의 몫이다.

모바일 전용인지 데스크톱 전용인지 혹은 모두 서비스를 제공하는지 비용은 시스템을 통해 결제할지 승객이 직접 운전자에게 지불할지도 확인해야 한다. 가끔은 클라이언트조차도 우리가 묻기 전까지는 답을 알지 못한다.

그렇기 때문에 시스템 설계 면접에서는 이런 질문 사항을 미리 파악하고 확인하는 능력을 테스트하곤 한다. 애초에 요구 사항을 확실히 파악하는 게 매우 중요하다.

아키텍처와 설계에 완전히 다른 영향을 줄 수 있는 요구 사항을 몇 가지 카테고리로 분류하는 방법이 있다.

세 가지 주요 타입이 있는데 하나는 기능적 요구 사항에 속하는 시스템의 기능이 있고, 다음으로 비기능적 요구 사항인 품질 속성이 있고 시스템의 제한과 경계를 만드는 시스템 제약 사항이 있다.

시스템의 기능타입은 기본적으로 시스템의 행위를 나타내는 요구 사항으로 쉽게 말해 설계한 시스템이 하는 동작이다. 시스템의 목적과도 연결되는 사항이고 이를 기능적 요구 사항이라고 한다. 시스템을 블랙 박스 함수로 표현하는데 사용자의 입력 값이나 외부 이벤트가 함수로 입력되면 시스템에서 수행된 결과 값이 바로 이 함수의 결과 값이 된다. 기능적 요구 사항을 명시하는 건 중요하며 시스템의 기능성에 직결된다.

품질 속성 혹은 비기능적 요구 사항은 시스템이 꼭 가져야 하는 특성으로 수행해야 하는 것과는 반대로 품질의 예시로는 확장성, 가용성, 신뢰성, 보안성 성능이 있다. 시스템에 따라 목록은 추가되거나 바뀔 수 있고 기능적 요구 사항과는 반대로 품질 속성은 시스템의 소프트웨어 아키텍처와 직결된다.반대로 소프트웨어 아키텍처도 시스템 품질 속성을 정의하는데 다른 아키텍처는 다른 품질 속성을 제공한다

마지막은 시스템 제약 사항이다. 예시로는 마감 시한이 엄격하거나 예산이나 프로젝트에 참여하는 엔지니어 인원이 적을 수 있는데 이런 제약 사항은 절충해 가며 작업하도록 하고 일부 설계가 희생되기도 하고 특정 아키텍처를 선택하게 해서 제약 사항이 없었다면 하지 않을 방법으로 진행될 수 있다.