2015년 7월 30일 목요일

소프트웨어(SW)개발은 공학적 접근방법이 필요하다

1. 우리가 사는 세상은 SW공학을 필요로 한다.

지금 우리는 디지털 시대에 살고 있습니다. Smartphone, Facebook, Twitter, Cyworld 등 효과적인 커뮤니케이션 전달수단을 통해 사회 전반적으로 새로운 휴먼 네트워크 문화를 구축하고 있습니다. 이와 같은 디지털 시대 중심에 바로 소프트웨어(이하 SW로 명명함)가 자리잡고 있습니다. SW가 없는 우리의 삶은 상상 할 수 없을 정도로 불편할 것입니다. 이제 SW는 글로벌 경쟁력을 위하여 신경써야 할 핵심자산으로 자동차, 조선, 전자 분야 등 국가 전략산업의 가치혁신을 견인하고 있습니다.

이와 같이 우리의 삶에 필수불가결한 요소로 자리잡은 SW를 개발하는데 있어서 체계적인 절차와 방법이 필요한 것은 당연한 것입니다. 초등학교의 수학 학습과 SW공학을 비교하여 설명해보자. 요즘 어린이들은 초등학교 1학년이면 구구단 정도는 이미 알고 있다고 합니다. 이것은 아이들이 살아가면서 부딪힐 일상에서의 생활 수학에 대한 중요성과 필요성에 대한 교육결과입니다. 이때 가장 중요하게 배우는 것이 수의 개념입니다. 자연법칙인 것입니다. 이를 통하여 우리는 미지의 세계와 보이지 않는 것들에 대한 계산과 예상을 해낼 수 있으며, 더 높은 수준의 과학적용과 경쟁력의 밑거름이 됩니다.

우리의 SW개발 상황들은 어떠한가? 이미 다양한 언어들, 플랫폼, 통신기술, 기기제어기술 등 매우 복잡하고 고난이도의 개발기술들이 존재하며, 개별적인 기술들을 구현하고, 발전시키려는 수많은 노력들을 하고 있습니다. 정보의 규모, 학습할 대상의 규모 면에서, 이미 외워서 될 일이 아닌 것입니다. 체계적인 절차와 방법이 정립된 공학적 개념이 필요한 것입니다. 즉, 초등학교 학생들에게 수의 개념이 필요하듯이, 우리 생활에 깊게 파고든 SW를 위해서는 발주처, SW관련 기업 등 이해관계자들에게 SW공학적 개념이 필요한 것입니다.

지난 1990년대 초반 IT열풍과 함께 SW인력에 대한 양적인 성과를 이루어 냈습니다. 이후 SW관련 취업관문에서 ‘SW개발’은 간단한 ‘XX언어 2주 완성’이라는 책 한권을 보거나, ‘속성 XX개발자 1개월 과정’을 이수하면 할 수 있다고 생각하는 많은 사람들이 있습니다. 이것은 마치 주어진 몇 개의 덧셈 문제를 외우려 노력하는 것과 같습니다. 이렇게 출발한 SW개발은 결국 수많은 시행착오와 반복되는 작업, 결과적으로 통제가 불가능한 SW개발 상태, 즉 SW위기를 초래하기가 쉽습니다.

또한 우리는 SW개발 과정 속에서 단순 반복적인 일들과 복잡하고 방대한 작업들의 비효율적인 대처 방법에 대하여 의문을 갖게 됩니다. 체계적으로 접근해서 보다 빠르고, 신뢰성 있는 개발 결과물을 도출하고 싶은데, 현실은 항상 납기 시간에 쫓기면서 비효율적으로 작업을 하고 있는 것입니다. 이와 같은 것을 극복하기 위하여 SW공학이 존재하며, SW공학은 SW개발 프로젝트의 품질과 생산성을 높이기 위한 뼈대가 되는 것입니다.

유비쿼터스 시대에 살고 있는 우리는 생활 곳곳에서 SW를 이용하고 있으며, 우리 생활의 일부분으로 자리잡은 SW의 품질과 생산성을 높이기 위해서 SW공학 적용은 선택이 아니라 필수인 것입니다. 즉, 우리가 사는 세상은 SW공학을 필요로 하는 것입니다.

2. 이제 SW공학의 세계로…

SW공학이란 용어는 1960년 후반에 ‘SW 위기’라는 것을 토론하기 위해서 열린 국제 회의에서 제안되었습니다. 3세대 컴퓨터 하드웨어의 소개로 이전의 시스템 개발 방법을 큰 SW시스템에 적용하는 것이 불충분하게 되면서 SW 위기가 대두되었던 것입니다. SW공학은 컴퓨터 시스템들의 SW를 개발하는데 필요한 방법, 도구에 관심을 두고 있다1). 좀 더 SW공학을 이해하기 쉽게 방송 제작 프로세스와 SW개발 프로세스를 비교하여 설명하면 다음과 같습니다.

모 방송사의 인기 버라이어티 프로그램의 제작과정을 한번 살펴보자. 제작진과 출연진이 구상한 프로그램의 각 코너들은 자체적으로 수많은 검토와 검증, 리허설을 거쳐 무대에 오르게 됩니다. 무대에 오르게 된다고 해도 반드시 방송에 나가는 것은 아닙니다. 현장의 반응을 살펴 바로 편집되는 경우도 있으며, 방송 후에는 시청자의 반응에 따라 코너가 폐지되기도 하고 반응이 좋을 경우 새롭게 다듬어져서 장수코너로 자리 잡기도 합니다. 장기간 제작진과 출연진이 끊임없이 바뀌어 왔지만 인기프로그램으로 존속할 수 있는 이유는 바로 이러한 체계를 엄격하게 유지해 왔기 때문이라고 볼 수 있습니다.

3. 우리의 미래는 SW공학이다

앞에서 SW 중요성을 반영하여 SW공학의 실체를 설명하고자 하였으며, SW공학의 필요성, 우리나라와 선진외국과의 SW공학 수준 차이, SWEBOK의 소개, SW공학 기술 적용 성공사례를 통해 SW공학에 대하여 체계적으로 접근하고자 하였습니다.

그 동안의 수많은 SW 개발 프로젝트를 통해 성공사례와 실패사례가 존재합니다. 우리는 지속적으로 SW공학을 적용하지 못해 실패한 SW개발 프로젝트들을 쉽게 찾아 볼 수 있습니다. 이들 사례를 보면, 비용, 기간 등 현실적인 문제 때문에 SW공학 적용이 결코 쉬운 것만은 아니다. 그러나, 장기적인 관점에서 SW개발비용 절감, 적기개발, 품질개선을 위해서 SW개발 프로젝트에서 SW공학을 적용해야 하는 것도 주지의 사실입니다. 이에 발주자 측면, 기업 측면, 인프라 측면에서 SW개발 시 효과적인 공학 적용 방향에 대하여 정리하면 다음과 같습니다.

첫째, SW개발기업 뿐만 아니라 발주자도 SW공학 사상을 인지하고 성공적인 SW개발 프로젝트가 되기 위해서 SW요구사항 제시부터 SW인수까지 양질의 SW가 생산되도록 노력해야 합니다.
둘째, SW개발 및 유지보수 관련 기업은 지속적인 SW공학 적용에 대한 의지가 반드시 필요하다. 또한, 선행 SW프로젝트의 시행착오 결과를 평가하고 정리한 후 후행 SW프로젝트에서 효율적으로 대처해야 할 것입니다.
셋째, 인프라 측면에서 효율적인 방법론, 자동화된 도구를 사용해야 한다. 복잡해지는 SW아키텍처 특성과 프로젝트 환경을 고려한 SW 개발방법론 및 프로젝트 관리방법론을 적용해야 하며, 자동화된 도구 활용을 통해 SW 컴포넌트의 재사용성을 증대시키고 SW개발 생산성을 향상시켜야 합니다.

자세히 보기 →

2015년 7월 29일 수요일

사용자 관점의 솔루션 개발 방법과 사례

소프트웨어 개발방법론을 사용하는 대부분의 프로젝트는 사용자의 요구사항을 받아 분석하고 설계한 후, 개발하는 프로세스로 진행된다. 개발방법론은 폭포수 모델에서 OO(Object Oriented) 개발방법론, CBD(Component Based Development) 개발방법론 등으로 계속 발전되었지만, 큰 형태는 요구사항 분석(Requirement Analysis), 분석(Analysis), 설계(Design), 개발(Development), 구현(Release)으로 구성되어 있는 폭포수 모델을 바탕으로 하고 있t습니다.
 이러한 개발방법론들은 어떠한 목적으로 만들어졌던 간에 납품(Delivery)형 소프트웨어를 위한 것으로 볼 수 있습니다. 그러다 보니 요구사항이 원하는 형태로 개발되는가 보다는 계약관계가 잘 이행되고 있는지에 더 초점이 맞춰져 있는 것이 사실입니다. 이러한 이유로 기존의 개발방법론은 대기업 위주의 SI(System Integration)형 프로젝트의 변화에 따라 발전했다고 봐야 할 것입다. 이와는 다르게, 중소규모의 솔루션(Solution)형 프로젝트는 개발자 위주로 개발되다 보니 개발방법론의 필요성 자체를 못 느낀 경우가 많았습니다. 하지만 소프트웨어를 더 체계적으로 개발해야 한다는 필요성은 예나 지금이나 소프트웨어를 개발하는 사람이라면 누구나 공감하는 얘기일 것입니다.

<사용자와 개발자 간의 비전 공유(기능적 측면)>

자세히 보기 →

‘얼랭(Erlang)’을 이용한 서버 프로그램 개발

MMORPG 엔진을 C, JAVA, Ruby, Python, 얼랭(Erlang)으로 개발하여 성능 테스트를 해보면,  얼랭이 상대적으로 퍼포먼스가 좋고, 코드의 양도 JAVA나 C언어에 비해서 3분의 1 수준으로 줄어들어 프로그래밍이 간단하다는 것을 확인할 수 있습니다.

특히, 다른 언어로 짜면 실제 로직과 코드가 달라져서 복잡해지는 부분이 있지만 얼랭은 그대로 표현할 수 있다는 점이 가장 큰 매력이라고 합니다. 아직은 우리나라에 생소한 프로그램 개발 언어인 ‘얼랭(Erlang)’을 2008년부터 사용해온 전문가 의견을 정리했습니다. 

자료 처리를 수학적 함수의 계산으로 취급하는 얼랭과 같은  함수형 프로그램 개발은(Functional Programming) 이해가 용이하기 때문에 개발 속도도 빠르다고 할 수 있습니다. 반면, 기존의 다른 프로그래밍 방식(즉,  상태와 가변 데이터에 중심을 두고 명령형으로 처리하는 개발)에 익숙하다면 얼랭을 사용할 때 어려움을 느낄 수 있습니다. 따라서,  편리하고 빠르며 효율 높은 얼랭을 이용하여 모바일 서버 프로그래밍을 자유자재로 하기 위해서는 부단한 연습만이 정법이 될 것입니다.

얼랭 Cowboy 처리 흐름도(자료: Cowboy 홈페이지)

웹 개발을 위한 효율적 테스트

  • 테스트가 중요한 이유
  • 테스트 구간에서 자주 발생하는 문제점들
  • 효율적 개발을 위한 테스트 팁
  • 발생 가능한 예외 상황에 대한 테스트 및 대응
  • 단위별 부하 테스트
  • 주기적인 시스템 모니터링
  • 다양한 환경에서의 테스트 수행
  • 화면 중심의 의사소통


 자세히 보기 →

2015년 7월 28일 화요일

SW공학 웹진

매주 공학 트랜드, 인사이이드 이슈, 동향 브리핑 등 최근 소프트웨어에 관한 정보를 확인하실 수 있는 웹진이 발행되고 있습니다.

Cloud Computing 기반의 Smart Working 시스템

스마트워킹 (Smart Working) 에 관한 관심이 매우 높아지고 있습니다 . 특히 클라우드 컴퓨팅과 다양한 스마트 디바이스를 이용한 SaaS(Software as a Service) 에 대한 활용을 통하여 기업 및 조직의 경쟁력과 조직원 및 개인의 업무 능력을 향상시키기 위한 노력들이 전 세계적으로 펼쳐지고 있습니다.

전 세계적으로 공장 및 현지 사무소 등을 운영하고 있는 회사에서는 전 세계적으로 협업을 추진할 수 있는 스마트워킹 시스템이 이제 필수적입니다 . 특히 , 다양한 스마트 디바이스와 연계하여 언제 어디서나 다양한 방법으로 커뮤니케이션을 촉진하고 더 나아가 스마트워킹을 위한 다양한 시스템이 필요한 시점입니다 .

하지만 아직 국내외적으로 이러한 시스템을 개발하기 위한 효율적인 소프트웨어 아키텍처가 부재한 것이 사실입니다 . 기술적으로는 클라우드 컴퓨팅과 관련된 다양한 기술을 이용하여 효율적인 관리 및 비용의 감소를 추구할 수 있습니다.

이에 따라 위와 같이 스마트워킹을 위한 솔루션은 클라우드 컴퓨팅을 중심으로 협업 솔루션과 스마트디바이스를 지원할 수 있어야 합니다 . 만약 이러한 솔루션을 제고한다면 기업 및 조직 등에 많은 발전을 견인할 수 있을 것으로 판단합니다.

자세히 보기 →

소프트웨어 아키텍처 분석방법

소프트웨어 아키텍처 분석 목적 및 배경

1. 소프트웨어 아키텍처 분석 목적

시스템의 아키텍처에 대한 가장 중요한 사실 중 하나는 , 비록 소프트웨어가 아직 개발이 되어 있지 않는 상황에서도 소프트웨어 아키텍처는 시스템의 중요한 요소에 대해서 표현하고 있다는 것입니다 . 소프트웨어 아키텍처를 바탕으로 이해관계자 및 아키텍트는 중요한 의사결정을 할 수 있게 될 뿐만 아니라 예상되는 사이드 이펙트 (side effect), 위험요소 및 시스템 구성에 대한 예측을 할 수 있게 됩니다 . 만약 소프트웨어 아키텍처가 없다면 이해관계자나 아키텍트 , 혹은 관리자들이 쉽게 파악할 수 없는 소프트웨어에 대해서 특별한 해결책 없이 의사결정을 해야만 하고 그로 인한 위험이나 불확실성은 시스템의 규모가 크고 복잡해질수록 기하급수적으로 커지게 됩니다 .

아키텍트가 소프트웨어 아키텍처를 파악할 수 있게 되면 , 정교한 의사결정이 가능하게 되고 , 우선순위화도 쉽게 결정할 수 있게 됩니다 . 또한 , 다양한 아키텍처의 팁 및 패턴의 적용이 가능 하여 , 소프트웨어 시스템이 더욱 견고해지고 개발과 유지보수가 용이해 지게 된다 . 이러한 이유로 소프트웨어 아키텍처는 “ 분석 가능한 ” 상태이어야 합니다 . 다시 말해 , 소프트웨어 아키텍처가 분석 가능하면 이해관계자 및 아키텍트는 중요한 의사결정을 내릴 수 있을 뿐만 아니라 , 성공하는 소프트웨어를 위한 다양한 전략 및 패턴의 적용이 가능하고 , 개발자와 테스터들도 분석된 소프트웨어 아키텍처를 기반으로 개발 및 검증이 가능하여 보다 견고한 소프트웨어 시스템을 개발 및 배포할 수 있게 됩니다 . 또한 , 소프트웨어의 지속성 및 업데이트를 고려하여 다양한 소프트웨어 아키텍처의 발전 및 유지 보수가 가능하게 됩니다 . 이러한 소프트웨어 아키텍처의 분석은 심지어 아직 개발이 완료되지 않은 소프트웨어에 대해서도 충분히 적용이 가능합니다 .

2. 소프트웨어 아키텍처 분석 시점

일반적으로 가능한 이른 시점에 소프트웨어 아키텍처를 분석하면 할수록 비용절감의 효과를 크게 노릴 수 있습니다 . 즉 , 문제를 빨리 발견할수록 고치기가 쉬워지며 요구사항이나 스펙 , 특징 , 기능 등 필요한 부분에 쉽게 적용시킬 수 있습니다 . 소프트웨어 품질은 프로젝트의 마지막 부분에 점검하는 것이 아니고 , 가능한 시작점으로부터 시작되고 그 품질 검증이 프로젝트의 마지막까지 , 테스트 마지막 시점까지 연결되고 상속되어야 합니다 .

소프트웨어 아키텍처를 분석하는 시기에 대해서는 특별히 정해진 단계나 프로세스는 없으나 , 일반적으로 소프트웨어 아키텍처를 분석하기 위한 최적의 시점은 디자인 단계로 이야기됩니다 . 그러나 소프트웨어 아키텍처 분석은 많은 단계에서 수행되면 다양한 문제점 분석 및 소프트웨어 아키텍처의 개선을 가져올 수 있기 때문에 , 전체 소프트웨어 프로젝트 라이프 사이클 단계에서 몇 개의 지점을 선택하는 것이 좋습니다 . 만약 소프트웨어 아키텍처가 아직 정해져 있지 않고 많은 의견이 오가는 단계이면 , 여러 가지 의사 결정을 위해 소프트웨어 아키텍처 분석을 실시할 수 있고 , 이미 소프트웨어 아키텍처가 정해지고 개발을 진행하는 단계라면 , 개발이 소프트웨어 아키텍처를 잘 참조하여 개발하고 있는지 혹은 개발에 문제가 있거나 다시 고려해야 할 아키텍처 요소가 없는지 , 아니면 소프트웨어 아키텍처를 재설계할 필요가 있는지를 파악하기 위해서 분석을 실시 할 수 있습니다 . 이미 개발되고 완료된 소프트웨어 프로젝트나 레거시 코드라면 소프트웨어 아키텍처를 분석을 통해서 기존 아키텍처를 쉽게 파악하면서 , 개선이나 유지보수가 필요한 점을 찾을 수도 있고 , 재활용한 컴포넌트나 구조에 대해서 자산화 (asset) 을 할 수 있습니다 . 그리고 다른 시스템이나 다른 구조로 적용 (porting) 을 위한 레거시 시스템의 분석 기준으로도 삼을 수 있습니다 .

결국 , 소프트웨어 아키텍처 분석은 소프트웨어 시스템이 품질 속성이나 시스템의 요구사항을 어떻게 잘 만족시키고 있냐를 다수의 사람들이 쉽게 이해하고 파악할 수 있는 최고의 발굴 행동 이라고 할 수 있습니다 .
더군다나 , 만약에 매우 크고 긴 개발기간을 가진 소프트웨어 시스템이라면 , 개발팀이 소프트웨어 아키텍처 분석을 통해서 전체적인 큰 그림과 디자인을 파악하고 , 후보 아키텍처와 트레이드 오프에 대해서 상호 토론을 통해서 발전시켜 나가는 것이 매우 중요합니다 . 이러한 것을 통해서 개발팀은 중요한 품질 ( 속성 ) 에 대한 팀의 의견을 통일 시키고 지속성장 가능한 소프트웨어 아키텍처를 유지 , 발전 시켜나갈 수 있게 됩니다 .