둘이 하나고 하나가 둘인 뗄레야 뗄수 없는 관계입니다.
"저는 사람입니다. 입, 귀, 코, 눈, 다리 등이 있고요. 잘 생겼죠. 두 발로 걷고 앉았다가 눕기도 합니다. 식물이나 동물도 입으로 넣어 소화시켜 에너지원으로 삼습니다. 또한 저는 다른 이들보다 빠르게 걷고 성격이 급해 주어진 일을 겁나 빠르고 열심히 처리하려고 하는 습성이 있습니다."
여기서 기능은 걷는 것, 앉는 것, 눕는 것, 소화시키는 것, 이런 것들이겠죠. 그럼 비기능은요? '잘 생김', '빠르게' 라는 것입니다. 기능과 비기능은 같이 존재합니다. 이렇듯 소프트웨어도 기능과 비기능이 있습니다. 반대되는 말일 수 있지만 늘 같이 다닙니다. 하지만, 비기능이란 말은 잘 쓰이지 않습니다. 마치 비기능은 그림자 같기도 합니다. 나와 그림자는 늘 같이 다니는데, 우리는 그림자를 잘 보지 않습니다. 그림자를 보고 인사를 나누지 않지요. 부각되지는 않지만 존재하는 그리고 뗄레야 뗄수 없는 비기능, SW는 이 두 항목을 늘 생각해야 합니다.
먼저, 기능에 대해 좀 더 알아봅시다. 쉽게 생각하실 수 있지만, 정작 기능을 물어보면 답하기가 어렵습니다. 이렇게요.
"자동차의 기능이 무엇인지 아나요?"
"음... 달리는것! 사람을 태우고 움직이는 것? ..."
이렇게들 말합니다. 공학적으로 정확한 답이라 하기에는 부족합니다.
'기능'이 뭘까요? 기능은 사전적 의미로 '하는 구실이나 작용을 함', '어떤 실체의 존재 목적 또는 특징적인 동작' 입니다. 이 기능의 요구사항을 이루는 주요 요소는 입력과 출력입니다. 물론 처리방식이나 로직, 알고리즘도 주요 요소 중의 하나일 수 있습니다. 일단 이러한 것들은 차치하고 자동차의 입력과 출력을 보죠.
자동차의 입력은 무엇일까요? '사람'입니다. 정확히 말하면 '지금 위치의 사람' 입니다. 그럼 출력은요? 이것도 '사람' 이죠. 더 정확히 말하면 '위치가 변경된 사람'입니다. 여기서의 위치는 입력인 '사람'의 원하는 위치이겠지요. 그럼 자동차의 기능은 무엇일까요? 특정 위치의 사람을 변경된 위치의 사람으로 이동시키는 것입니다. 물론 다른 기능으로도 쓰일수 있습니다. '사람'이 아니라 '물건'일 수도 있겠지요. 본질을 다르게 가져간다면 자동차가 집의 기능을 할 수도 있고요.
그럼 자동차의 '비기능'은 무엇일까요? 특정 위치의 사람을 변경된 위치의 사람으로 빠르게 이동시키는 것입니다. 네 여기서 뭐가 달라졌죠? '빠르게'라는 단어가 추가되었습니다. 바로 언어로 얘기하면 부사를 추가하였습니다. '빠르게' 말고 '안전하게'로 바꿀수도 있겠죠. 정리하면 기능을 꾸며주는 것을 비기능이라고 합니다. 소프트웨어로 다시 돌아와서 비기능이라함은 소프트웨어가 효율적으로 작동하게 하는 것. 소프트웨어가 안전하게 작동하게 하는 것. 소프트웨어가 사용하기 편리한 것. 이런 것들을 소프트웨어의 비기능이라고 부릅니다. 소프트웨어를 만드는 분들은 기능과 비기능의 영역을 모두 고려해야합니다. 기능만 구현했다고 해서 개발을 완료했다고 하는 것은 반만 아는 것일지 모릅니다. 나중에 큰일 날 수도 있고요. 기능도 고려해야하고 비기능도 신경써야합니다. 아울러 예외처리까지 생각한다면 더 없이 훌륭한 개발자 아닐까 생각합니다.
그래서 기획자들은 요구사항을 분석할 때 항상 시스템의 기능과 비기능 요구사항을 같이 고려합니다. 정확히 소프트웨어 비기능 요구사항은 소프트웨어 기능들에 대한 조건(시스템의 속성)과 제약사항에 관한 요구사항으로 정의할 수 있습니다. '조건', '속성', '제약' 이란 말만 봐도 비기능은 이런 성격의 것이구나! 라고 아실 수 있으실 것 같습니다. 요구공학으로 가면 더 심도있는 이야기를 할 수 있지만 여기까지만 해도 충분할 것 같네요.
뭐, 굳이 소프트웨어가 아니어도 다른것에도 적용해 볼 수 있지 않을까요? 냉장고를 사도 냉장고 기능에만 충실한 것을 사지는 않으니까요. 제가 새 집에 들어간다면 꼭 사고 싶은 냉장고가 있는데요. 바로 '스메그(SMEG)'라는 브랜드의 냉장고죠. 제가 스메그에 꽂힌 이유는 기능이 아닙니다. 기능만 생각하면 다른 것을 구매할겁니다. 가격도 훨씬 저렴할테니까요. 하지만 스메그를 사는 이유는 '감성', 즉, 갬성 아니겠습니까? 아마도 마케터나 기획자는 시장에 나오기 전에 이것을 비기능 요구사항으로 정리하고 개발했으라 짐작합니다.
그러고 보면 기능보다 비기능이 각광받는 시대가 되었습니다. 특히 비기능 영역의 '사용성'이라는 말들을 많이 들어보셨을 줄 압니다. 이 사용성도 비기능의 영역입니다. 사실 좀 더 따지고 보면 기능도 비기능도 사용성의 울타리 안에 있다고 볼 수 있다고 생각합니다. 결국 고객은 기능이건 비기능이건 사용성 좋은 것에 가치를 높게 평가하기 때문입니다. 똑같은 물건을 고객에게 팔아도 고객이 기분좋게 산다면 더 좋을 것이고, 똑같은 음식을 대접해도 고객이 맛있게 먹으면 더 좋겠죠. 이게 다 사용성이고 비기능을 이야기하는 것! 아닐까요?
FYI.
(소프트웨어 공학에서의 정의)
기능적 요구사항: 시스템에 주어지는 특정 입력에 대한 시스템이 산출하는 출력
비기능 요구사항: 소프트웨어 기능들에 대한 조건(시스템의 속성)과 제약사항에 관한 요구사항