소프트웨어 설계UX

소프트웨어의 본질
The Essence of Software

MIT 대니얼 잭슨 교수의 개념 설계 이론. 왜 소프트웨어 시스템은 설계로 인해 실패하는가, 그리고 어떻게 고칠 것인가.

20분 읽기너드보드

원본: Daniel Jackson (MIT) - ACM Tech Talk

🧩
Concept = Name + Purpose + State + Actions
소프트웨어의 원자는 클래스가 아니라 개념이다
개념(Concept) - 소프트웨어 설계의 기본 단위

1. 서론: 소프트웨어 설계의 근본적 질문

"집을 지을 때는 기술자가 아니라 건축가와 먼저 이야기한다. 소프트웨어는 왜 그렇지 않은가?"

- Mitchell Kapor, 1996 소프트웨어 설계 선언문

카포는 좋은 건물의 기준이 공학의 영역 밖에 있듯이, 소프트웨어의 구성 요소 선택도 '사용 조건'에 의해 주도되어야 한다고 주장했습니다.

대니얼 잭슨은 사용자가 올바른 개념적 모델(conceptual model)을 갖는 것이 핵심이라고 말합니다. 그는 나쁜 사례가 아니라, 대기업이 만든 최고의 제품들에서 발견되는 작은 실패들을 분석함으로써 더 나은 소프트웨어를 만드는 원칙을 찾고자 했습니다.

2. 세 가지 퍼즐: 실제 실패 사례

버그나 단순한 UI 오류가 아니라, 근본적인 설계의 문제입니다.

퍼즐 1: 드롭박스(Dropbox)의 파일 사라짐 현상

상황: 에이바가 'BellaPlan' 폴더를 벨라와 공유. 벨라가 이름을 'MyPartyPlan'으로 변경.

문제: 벨라가 이름을 바꿔도 에이바에게는 바뀌지 않는 경우가 있고, 바뀌는 경우도 있음. 최상위 공유 폴더 삭제 시 경고가 뜨지만, 내부 폴더 삭제 시 경고 없이 영구 삭제.

MIT 학부생 실험 결과: 동작 예측 정확도가 동전 던지기 수준

퍼즐 2: 트위터(Twitter)와 영부인의 '좋아요'

상황: 2017년, 멜라니아 트럼프가 자신을 모욕하는 트윗에 '좋아요'를 눌렀다가 취소

문제: 그녀는 모욕적인 트윗을 좋아한 것이 아니라, 나중에 다시 보기 위해 '저장'하려고 했을 가능성이 높음

'좋아요'가 공개적인 승인인지, 개인적인 북마크인지 혼동

퍼즐 3: 구글 캘린더의 미스터리한 취소

상황: 사용자가 자신의 캘린더에서 이메일로 온 행사 일정을 삭제

문제: 삭제 버튼을 누르자 의도와 달리 행사 주최자와 모든 참가자에게 "행사가 취소되었습니다" 메일 발송

개인 일정 관리와 사회적 조정이 잘못 동기화됨

3. 기존 접근법의 한계와 새로운 제안

기존의 사용성(Usability) 연구는 사용자 심리학에서 출발하여 인터페이스 해석에 집중했습니다. 하지만 시스템 자체가 잘못된 동작을 한다면 아무리 좋은 UI도 소용이 없습니다.

잭슨 교수의 제안

"디자이너의 모델이 올바른가?"라는 질문에서 시작해야 한다.

이는 프레드 브룩스(Fred Brooks)가 말한 "개념적 무결성(Conceptual Integrity)"이 시스템 디자인의 핵심이라는 주장과 일맥상통합니다.

4. 핵심 이론: '개념(Concept)'이란 무엇인가?

소프트웨어의 기본 단위를 '개념'으로 정의합니다. 이는 추상 데이터 타입(ADT)이나 클래스, 데이터 모델의 엔티티와는 다릅니다.

개념의 5가지 구성 요소

1. 이름 (Name)

개념을 식별하고 지식을 공유하는 데 필수. 예: "업보트(Upvote)", "옵저버 패턴"

2. 목적 (Purpose)

해당 개념이 존재하는 이유

개념목적
업보트인기순으로 항목 정렬
반응저자에게 피드백 제공 (순서 변경 없음)
추천내 취향 기반으로 다른 콘텐츠 제안

3. 상태 (State)

개념이 기능을 수행하는 데 필요한 최소한의 데이터 모델. 개념은 '마이크로서비스' 혹은 '나노서비스'처럼 자신만의 데이터 영역을 가짐

4. 동작 (Actions)

사용자가 수행할 수 있는 행위. 예: upvote, downvote, unvote

5. 작동 원리 (Operational Principle)

개념이 목적을 달성하는 방식을 설명하는 전형적인 시나리오

"많은 사람이 업보트를 하면, 그 항목은 목록의 상단으로 올라간다."

5. 개념의 구성과 동기화 (Synchronization)

소프트웨어는 여러 개념의 조합으로 이루어집니다. 개념들을 코드로 결합(coupling)하는 대신 동기화(Synchronization)해야 합니다.

예시: 업보트와 카르마 (해커뉴스)

  • • 사용자가 글을 투표(Upvote 개념)하면 → 해당 글 작성자의 점수(Karma 개념)가 올라감
  • • '다운보트' 동작은 카르마가 충분할 때만 허용 → '허가(Permit)' 동작과 동기화

장점

토니 호어(Tony Hoare)의 CSP(Communicating Sequential Processes) 아이디어에 기반하여, 각 개념을 독립적으로 유지하면서도 상호작용하게 만듭니다.

6. 퍼즐의 해결 (개념적 분석 적용)

드롭박스 해결: 잘못된 개념 선택

유닉스 디렉터리 모델: 디렉터리는 파일 자체를 담은 상자가 아님. '엔트리(Entry)'들의 목록일 뿐. 각 엔트리 = '이름' + '아이템에 대한 포인터'

결론: 유닉스의 '하드 링크' 개념은 기술적으로 훌륭하지만, 일반 사용자의 '공유' 목적에는 부합하지 않는 개념 선택

트위터 해결: 누락된 개념 (Missing Concept)

사용자는 '북마크' 개념이 필요했지만, 시스템에는 '좋아요(업보트)' 개념만 있었습니다.

트위터는 2018년에야 북마크 개념을 별도로 추가하여 해결

구글 캘린더 해결: 잘못된 동기화 (Bad Synchronization)

'캘린더(개인 일정 관리)' 개념과 '초대(사회적 조정)' 개념이 너무 강하게 묶여 있어, 개인 캘린더에서 삭제하는 행위가 초대 취소 행위와 강제로 동기화됨

해결책: 두 동작을 분리할지 묻는 옵션 제공 (선택적 동기화)

7. 개념 핸드북 (Concept Handbook)

디자인 패턴처럼 개념에 대한 지식을 담은 핸드북을 만들어 불필요한 시행착오를 줄일 수 있습니다.

'업보트(Upvote)' 핸드북 예시

관련 개념추천, 반응 등과의 비교
전형적 용도소셜 미디어 게시물, 뉴스 기사 댓글, Q&A 포럼 답변
디자인 변형다운보트 허용 여부, 시간 가중치, 가중치 비율
알려진 문제중복 투표 방지(로그인/IP/쿠키), 저장 공간 폭발
완화 전략오래된 게시물 '동결(Freeze)'하여 투표 데이터 삭제
연결된 개념카르마, 세션

8. 개념 설계의 원칙

1. 목적 적합성 (Fit for Purpose)

선택한 개념이 해결하려는 문제의 본질과 맞는가?

2. 모듈성과 독립성 (Modularity & Independence)

각 개념은 독립적으로 이해되고 동작할 수 있어야 함. 코드 레벨에서 결합되지 않고, 동기화 규칙으로만 연결

3. 친숙함 (Familiarity)

사용자가 이미 알고 있는 개념을 재사용하는가?

4. 개념 인벤토리 (Inventory)

앱을 구성하는 개념들의 목록을 만들고 자문: "누락된 개념은 없는가?" "잘못된 동기화는 없는가?"

5. 나노서비스 (Nanoservices)

개념은 기능 수행에 필요한 최소한의 데이터와 동작을 묶은 단위로 설계

9. 추가 사례들

시티은행 9억 달러 송금 사건

'중간 계좌(Wash account)'라는 혼란스러운 개념이 사용자로 하여금 전체 원금(약 1조 원)을 실수로 송금하게 만듦

슬랙(Slack)의 이모지 반응

페이스북 '좋아요'나 업보트와 UI는 비슷하지만, 메시지 순서(랭킹)를 바꾸지 않음. 저자에게 피드백만 제공 (연대기적 순서 유지)

페이스북의 반응과 랭킹

'화나요' 같은 부정적 감정도 '좋아요'와 동일하게 (5배 가중치로) 게시물 랭킹을 올림 - 사회적으로 해로운 결과를 초래한 '나쁜 동기화'의 사례

핵심 메시지

1.개념은 소프트웨어의 원자: 기능의 최소 단위는 클래스나 함수가 아니라 '개념'
2.목적이 핵심: 모든 개념에는 명확한 존재 이유가 있어야 함
3.동기화로 결합: 개념을 코드로 결합하지 말고 동기화 규칙으로 연결
4.실패는 설계에서 시작: 대부분의 사용성 실패는 UI가 아닌 개념 설계의 문제
5.핸드북으로 지식 공유: 검증된 개념을 재사용하여 시행착오를 줄임

자주 묻는 질문 (FAQ)

개념(Concept) 설계란 무엇인가요?
개념 설계는 소프트웨어의 기본 단위를 '개념'으로 정의하는 접근법입니다. 각 개념은 이름, 목적, 상태, 동작, 작동 원리의 5가지 구성 요소로 이루어지며, 클래스나 함수가 아닌 사용자가 이해하는 기능 단위입니다.
개념의 동기화(Synchronization)란 무엇인가요?
동기화는 여러 개념을 코드로 직접 결합(coupling)하는 대신, 독립적인 개념들이 규칙에 따라 상호작용하게 만드는 방식입니다. 토니 호어의 CSP(Communicating Sequential Processes) 아이디어에 기반합니다.
드롭박스 파일 공유 문제의 원인은 무엇인가요?
드롭박스는 유닉스의 '하드 링크' 개념을 사용했는데, 이는 기술적으로는 훌륭하지만 일반 사용자의 '공유' 목적에 부합하지 않았습니다. 최상위 폴더와 하위 폴더의 동작이 달라 혼란을 야기했습니다.
개념적 무결성(Conceptual Integrity)이란 무엇인가요?
프레드 브룩스가 주장한 개념으로, 시스템 설계의 핵심은 일관된 개념적 모델을 유지하는 것입니다. 디자이너의 모델이 올바른지 먼저 검증해야 좋은 소프트웨어를 만들 수 있습니다.