2015년 9월 18일 금요일

12명의 Architect에게 물어 본 “아키텍트의 길” part 1

요구사항분석 , 프로세스와 팀 빌딩 , 설계 시 고려사항

요구사항
모든 요구 사항을 수렴하는 소프트웨어는 존재하지 않는다 . - Mark Richards
전 프로젝트를 시작할 때 항상 꺼내는 이야기가 있습니다 . 소프트웨어 아키텍트 들이라면 알아야 하고 , 이해해야 하며 , 그리고 고객 , 동료와 함께 꼭 프로젝트 시작 전 나눠야 하는 이야기가 있습니다 .

1620 년대에 스웨덴과 폴란드의 전쟁에서 나온 ‘Vasa 호 ’ 라는 배 이야기입니다 . 스웨덴 국왕은 전쟁을 빨리 끝내기 위해 Vasa 호라는 특별한 배를 만들라고 주문했습니다 . 이 배가 갖춰야 했던 조건 ( 요구사항 ) 들은 그 당시의 어떤 배와도 비교할 수 없었습니다 . 선체가 200 피트 정도 더 길고 , 2 개의 갑판에 64 개의 총을 적재할 수 있고 , 300 명의 군사를 안전하게 태워 폴란드로 가는 바다를 가로지를 수 있는 수송 능력을 가져야 했습니다 . 배를 건조하는 데드라인 ( 시간 ) 을 엄수해야 했으며 , 재정 ( 자금 ) 적으로도 여유롭지 않았습니다 . 또한 배 설계자 ( 아키텍트 ) 는 이렇게 생긴 배를 이전까지는 설계한 적이 없었습니다 . 크기가 작고 총을 실을 수 있는 갑판이 한 개만 있는 배를 만드는 것이 그가 주로 한 일이었습니다 . 그럼에도 불구하고 , 설계자는 그의 예전 경험을 기반으로 추정하고 Vasa 를 설계하고 건조하기 시작했습니다 . 그 배는 결국 설계대로 건조되었고 마침내 배를 출항하는 날이 왔습니다 . 어떻게 되었을까요 ? Vasa 호는 위풍당당하게 항구를 출항했지만 예포를 쏘고 난 뒤 바로 바다 저 밑으로 가라앉고 말았습니다 .

Vasa 호의 문제는 명확합니다 . 그 어느 누구도 1600~1700 년에 큰 전투함에서 갑판을 본적이 없었고 이러한 배의 갑판은 특히 전쟁 중에 붐비고 안전하지 않다는 것을 알았습니다 . 전투함과 운송선 2 개의 역할을 다하는 하나의 배를 건조하는 것은 큰 실수였죠 .
국왕의 모든 소원을 충족하려고 한 배 설계자는 균형이 맞지 않고 , 불완전한 배를 만들 수밖에 없었던 것입니다 . 저희 소프트웨어 설계자들은 Vasa 호로부터 많은 것을 배울 수 있습니다 . 이와 같은 불행한 사건을 소프트웨어 아키텍처의 설계에 적용할 수도 있겠죠 . 하지만 Vasa 호와 같이 모든 요구사항을 충족시키려는 시도는 궁극적으로 아무것도 수행할 수 없는 불완전한 아키텍처를 만들게 됩니다 .

프로세스와 팀 빌딩
가장 큰 문제는 기술이 아니라 기회를 잡을 수 있느냐 이다. - Mark Ramm4)
대부분의 프로젝트들은 사람에 의해 만들어지며, 사람들은 성공과 실패에 대한 기반이 됩니다. 따라서, 사람들을 성공할 수 있게 만드는데 도움이 되는 것에 대해 생각해 볼 필요가 있습니다. 한편으로는, “단지 일을 올바로 하지 않고” 프로젝트를 어렵게 하는 누군가가 있다는 가망성에 대해 충분히 생각해 볼 수 있습니다. 이러한 경우들에서 문제를 해결하는데 필요한 기술은 매우 오래되었지만 정말 잘 입증되었습니다. 사실 이 기술은 인류의 역사에서 가장 중요한 기술 혁신일 것입니다. 여러분에게 필요한 것은 대화입니다. 기교로써 대화에 단지 익숙해지는 것만으로 충분하지 않습니다. 존경심을 가지고 사람을 대하는 것을 배우고, 사람에 대한 성급한 판단을 버리는 것을 배우는 것이 영리한 아키텍트가 유능한 아키텍트로 변하는 핵심 기술 중에 하나입니다.

설계
불확실성을 설계의 지표로 사용해라! - Kevlin Henny7)
여러분이 설계 시 둘 중 하나를 선택해야 한다면 대부분은 중요한 것을 선택합니다. 하지만 설계(소프트웨어 또는 다른 것들) 시에는 그렇게 해선 안 됩니다. 두 가지 선택사항이 존재한다는 것은 설계 시 불확실성을 고려할 필요가 있다는 것은 알려주는 지표(indicator)입니다. A와 B 두 가지 중 하나를 결정하려고 시도하는 것보다는 A와 B 사이의 결정을 덜 중요하게 만들기 위해 어떻게 설계해야 할지를 고민해야 합니다. 흥미로운 것은 A와 B 사이의 (적절한) 선택이 존재한다는 것입니다. 설계 시 변경되는 결정을 쉽게 수용할 수 있는 분할(separation) 또는 캡슐화 기법을 고민할 필요가 있습니다.

2015년 9월 17일 목요일

모바일 소프트웨어 개발을 위한 모바일 프레임워크

프레임워크는 다양한 형태로 해석됩니다. 구조적으로 고정된 자산을 재활용할 수 있도록 하는 것을 나타내기도 하고, 애플리케이션의 특정 기능을 모아 추가적인 사용자 코드를 통해 소프트웨어를 완성하는 플랫폼을 말하기도 합니다. 역할로 살펴본다면, 프레임워크는 필수적이고 표준적인 부분을 설계하고 구현하도록 도움을 주는 반제품 소프트웨어라고 할 수 있습니다.

프레임워크를 사용하는 장점은, 공통적으로 사용되는 구조를 그대로 재사용하면서 애플리케이션 부분만 추가해서 사용하기 때문에 빠르고 효율적인 개발이 이루어 질 수 있고, 이미 검증된 프레임워크이기 때문에 애플리케이션의 코딩과 테스트가 용이합니다. 하지만, 프레임워크의 기능이 업그레이드 되면서 점점 볼륨이 커지는 현상도 종종 나타납니다. 이 경우, 사용하지 않는 기능이 프레임워크에 적용되면서 불필요한 자리만 차지하기도 합니다.
 
최근에는 웹과 모바일을 구분하지 않고 사용하는 디바이스에 따라 UI 형태만 다르게 서비스하는 형태가 많아지고 있어 기존에 사용 중이던 웹 기반 프레임워크를 재사용하여 모바일 서비스를 구축하는 경우도 많아지는 추세입니다. 이번 회에서는 모바일 프레임워크의 구성과 활용에 대해 사례를 들어 알아보겠습니다.

모바일 프레임워크의 선택과 구성
프레임워크 없이 애플리케이션을 개발한다는 것이 점점 힘들어 지고 있습니다. 하루가 다르게 늘어가는 프레임워크들에서 효과적으로 모바일 프레임워크를 선택하는 방법에 대해 알아봅니다. 구축하고자 하는 소프트웨어에 따라 조금씩 다를 수는 있겠지만 “The Curious Coder's Java Web Frameworks Comparison!”에서 가이드 한 것을 6가지 정도로 정리하여 <표1>과 같이 나타냈습니다.
<표 1> 프레임워크의 선택 요소

글로벌 IT 기업의 新 랭귀지 개발 동향

주머니 속에서 실수로 휴대전화 통화버튼을 누른 경우를 의미하는, '포켓 다이얼', 지하철 의자에서 다리를 심하게 벌리는 남자를 뜻하는 ‘쩍벌남’, 배가 고파서 신경이 날카로워진 상태를 합친를 말하는 '행그리'(헝그리 + 앵그리) 등의 단어가 옥스퍼드 영어사전에 새롭게  등재되었습니다. 시나브로 사라지는 말이 있는가 하면 새롭게 창조되어 떠오르는 말이 있습니다. 컴퓨터 프로그래밍에서도 기술 발전과 시대의 변화, 즉 사용자 요구 변화에 따라 그에 부응하는 새로운 언어를 탄생시키고 있습니다(그림1). 

<그림1>  프로그래밍 언어의 변천사


지금까지 탄생한 프로그래밍 언어는 공통적으로 구문, 이름, 타입, 의미라는 4가지 구성 요소를 포함합니다. 세상에 없던 새로운 프로그래밍 언어를 개발한다면 당분간 이 구성요소를 고려해야할 것입니다. 
  1. 구문(Syntax): 식의 구조, 언어의 구조를 지배하는 규칙들. 즉, 문법(grammar)이다.
  2. 이름(Names): 변수, 함수, 클래스 등의 이름
  3. 타입(Types): 정수, 실수, 문자, 불린 등   여러 종류의 데이터를 식별하는 분류. 또한, 가능한 값, 수행 가능한 명령, 데이터 의미, 값의 저장 방식을 결정
  4. 의미(Semantics): 코드를 통해 표현하려는(의도하는) 것. 구문(문법)은 맞지만 의미의 오류로 의도와 다른 결과를 얻을 수 있다.
최근 소프트웨어 개발에서 가장 많이 사용되고 있는 언어들의 순위를 보면 2015년 9월 기준으로 Java가 1위를 차지했습니다. 이 순위는 단순히 사용 빈도가 높다는 것을 뜻할 뿐, 해당 언어가 가장 우수하다는 것을 말하지는 않습니다. 개발 목표, 서비스 목표, 유지보수 목표 등에 따라 선별해서 개발 언어를 채택해야 합니다. 

사물인터넷(IoT) 보안의 주요 기술

불과 5년 전만 해도 IT 기술이 우리에게 주는 생활의 편리함은 이루어 말할 수 없을 만큼 새로운 패러다임이었습니다. 그러나 그 신선했던  IT 기술은 일상이 되어 버렸고, 보편화가   되면서 사람들은 지금, 더 편리한 서비스와 기술들을 요구합니다. 가령, 컴퓨터로만 인터넷을 검색했던 사람들이 이제는 스마트폰으로  쉽게 정보를 찾을 수가 있습니다. 하지만 이제는 역설적으로 정보가 차고 넘쳐 나기 때문에 정보를 찾는 것도 또 하나의 일이며 귀찮은 것으로 여겨질 때가 많습니다. 그렇기 때문에 예전에는 사람들이 직접 정보를 찾았다면, ‘사물인터넷 시대’에는 정보가 먼저 사람을 찾게 됩니다. 내가 즐겨 찾는 매장이나 자주 가는 여행지가 있다면, 이러한 이력 및 data들을 알아서  모아주고 패턴 분석을 하고 그 결과,  나에게 맞는 맞춤형 서비스로 제공되는 것입니다. 사물인터넷이 이러한 것들을 가능하게 하는 핵심 요소로 ‘무선 통신’이 있습니다.
 하지만 그런 무선통신을 이용한다는 특성 때문에 ‘정보보안’이라는 불안요소가 항상 따라다니게 됩니다. 사물인터넷 보안에 대해 장성균 개발자에게 그 주요기술에 대한 자세한 설명을 요청했습니다.

 1. 사물인턴넷 정보보안의 특징
 2. 보안 기술요소 - 암호화 알고리즘, 시큐어코딩(Secure Coding)
 3. 더 나은 솔루션에 대한 tip

2015년 9월 16일 수요일

새로운 기능을 성공적으로 개발 및 출시하게 도와주는 6가지 팁

클라우딩 컴퓨팅의 세계에서 새로운 기능에 대해 고객에게 CD로 제공하는 대단위 출시는 더 이상 없습니다. 현재, 새로운 기능들이 유저들을 위해 클라우드 기반에서 제공되며, 또한 최종 유저가 새로운 기능을 완전하게 활용하는 것은 그 어느 때보다 중요한 사항입니다.
  
최종 유저가 더 이상 서비스를 이용하지 않으면 돈을 지불하지 않아도 되는 기존의 영구 라이선스 모델이 없어진 시점에서 새로운 기능을 성공적으로 개발하고 출시하기 위해 도와줄 수 있는 6가지 팁을 제시합니다.
  1. 기능을 구축하기 전에 유저들에게 물을 것
  2. 실제 유저들과 함께 반복해서 적절한 기능을 만들 것
  3. 사용되는 기능과 사용되지 않는 기능을 파악할 것
  4. 자기 발견(Self Discovery)과 알림(Notification) 기능을 제공할 것
  5. 최고 유저(Top Users)들을 위한 프로그램을 만들 것
  6. 애플리케이션 내에서 유저들의 관심을 공유할 수 있도록 허용할 것

애자일 방법론에서 시소러스를 이용한 비기능 요구사항 추출 방법

전통적인 개발방법론은 단계별 상세계획수립을 위해 요구사항 정의 단계에서 모든 요구사항이 정의되어야 하며 단계별 상계계획에 따른 산출물을 요구하기 때문에 생산성 저하 및 요구사항 변경 및 추가 요구사항에 대한 변경 비용이 기하급수적으로 증가하는 반면 애자일 방법론은 기본적인 개념이 소프트웨어 개발은 고객 중심적이며 , 고객의 참여를 중요하게 생각합니다 . 애자일 방법론에서 사용자의 요구사항을 파악하기 위해 사용되는 사용자 스토리는 사용자가 이해하고 , 필요하다고 느끼는 것을 사용자의 언어로 사용자가 직접 작성합니다 . 이렇게 개발 초기에 상세한 문서를 요구하지 않는 사용자 스토리를 사용하여 아주 단순한 구조를 갖고 동작하는 소프트웨어를 사용자에게 제공함으로써 사용자로부터 지속적인 피드백을 받아 요구사항을 좀 더 구체화 하고 , 반복적인 개발을 통해 지속적으로 변경하는 요구사항들을 수용하고 , 지속적인 통합 , 테스팅 , 리팩토링을 수행함으로써 개발 기간 동안에 변경 비용이 거의 수평적인 상태에 가깝게 유지하면서 유연성과 품질을 유지할 수 있도록 해줍니다 . 하지만 이렇게 유연성을 제공하는 사용자 스토리를 사용하는 애자일 방법론에서 이슈가 되는 것은 아키텍처 고려와 관련된 부분입니다 . 애자일 방법론을 사용하는 조직으로부터 애자일 방법론에 대한 이점과 도전과제를 연구한 내용 중 사용자 스토리를 사용하는 반복요구공학을 사용하는 측면과 관련하여 특히 도전과제로 제시된 내용은 비기능 요구사항들에 대한 무관심으로 시스템 완성도에 있어서 주요 이슈들을 발생시킬 수 있다는 것이었습니다 . 또 다른 연구로는 애자일 개발 방법론을 채택해서 사용했던 평균 18 년 정도의 개발 경험이 있는 전문직들을 대상으로 애자일과 소프트웨어 아키텍처의 공존에 대한 연구를 진행했는데 애자일 개발에서 상당부분의 참가자들이 애자일 개발 과정 중에 Context 에서 소프트웨어 아키텍처를 고려했다는 것입니다 .
  • 비기능 요구사항 분류 방법
  • 비기능 요구사항 추출 프로세스
  • 사례 연구 및 검증


분산된 개발팀에 동기를 부여하는 5가지 Tip

SW개발에 있어 아웃소싱 및 전문성 강화에 따라 지리적으로 분리된 버추얼 팀(virtual team) 운영이 확대되고 있습니다. 이와 같이 버추얼 팀이 운영되는 경우 상호간 목표공유 및 의사소통이 미흡함에 따라 개발일정 및 품질에 부정적인 영향을 미칩니다. 이에 따라 버추얼 팀의 동기부여를 위한 5가지 방안을 제시합니다.

버추얼 팀에 동기 부여하는 5가지 팁
  1. 지리적 한계를 극복하고 팀원들 간 관계를 형성하기위한 시간을 투자하기
  2. 고유한 방법으로 성과를 인정하기
  3. 정기적인 코칭(Coaching Session)을 계획하기
  4. 팀 내 교류하는 방법 고안하기
  5. 정기적으로 대면하는 기회 만들기