2014. 11. 24. 16:14

개발 방식을 바꾸는 15가지 기술 - Q&A version


개발 방식을 15가지 기술이라는 인터넷 기사를 Q&A 버전으로 재구성했습니다. 

다음은 PPT 슬라이드로 제작할 예정입니다.


기사 출처 : http://www.itworld.co.kr/slideshow/90480


Q. 프로그래머가 되고 싶습니다. 무엇부터 공부해야 하죠?

A. 컴퓨터 구조부터 공부해야 합니다. 컴퓨터의 구성 요소를 간단히 요약하면 하드웨어와 운영체제 그리고 어플리케이션으로 표현할 수 있습니다.일반적으로 대다수의 프로그래머는 이중에서 어플리케이션을 개발하는 일을 수행합니다.


Q. 그렇다면 하드웨어를 어떻게 직접 제어(구동)할 수 있나요?

A. 그건 운영체제가 다 알아서 해줍니다. 신경쓰지 맙시다. 어플리케이션은 하드웨어를 직접 제어 못합니다.

Q. 하드웨어를 조작할 수 없다면, 어플리케이션은 어떻게 키보드, 마우스, 모니터에 입출력하고 통신도 하죠?

A. 운영체제가 Application Programming Interface (API)라고 하는 기능(함수, function)들을 제공합니다. 어플리케이션 개발자는 하드웨어와 운영체제가 제공하는 기능을 이해하고 제어하기 위해 운영체제가 제공하는 API 부터 공부해야 합니다.

  

Q. 그럼 API는 운영체제가 어플리케이션 개발자를 위해 제공하는 기능들을 말하는 건가요?

A. 최초의 API는 운영체제가 어플리케이션을 위해 제공하는 기능들을 말했지만, 점차 의미가 확대되고 무언가 하부 시스템 (운영체제, 가상 머신, 컨테이너 등)에서 상위 어플리케이션이나 앱, 위젯에 제공하는 각종 소프트웨어 기능(함수)들의 집합(set)을 API라고 부릅니다.

   

   API 정의 - http://ko.wikipedia.org/wiki/API

   예시 - MS Windows SDK (System Developement Kit), MS Direct X, 구글 API, 네이버 API


Q. API 와 라이브러리(library)의 차이는 무엇인가요?

A. API는 독자적으로 구동되는 프로그램(운영체제, 제품)나 서비스(운영)되고 있는 특정 플랫폼(구글/네이버 등의 서비스)에서 해당 소프트웨어를 제어하거나, 제공하는 기능을 호출할 수 있는 함수들의 집합입니다. 반면에, 라이브러리는 특정 알고리즘이나 작업을 처리할 수 있는 기능들을 수행할 수 있는 함수의 집합입니다.

API는 제품(운영체제 같은 경우)을 구매하거나, 사용(구글 같은 경우)해야 쓸 수 있는 것이고 개발자가 제작하는 어플리케이션에 포함되지 않습니다. 즉, 부품이 아니라 어플리케이션 외부의 기능을 호출하는 것입니다

반면에 라이브러리는 프로그래머가 제작하는 어플리케이션의 부품 형태로 사용할 수 있게 만들어져 배포되는 기능 모듈입니다.(라이브러리는 언어에 따라 배포되는 파일 형식이 다릅니다. 자바에서는 jar, C 혹은 C++에서는 lib, so, 윈도우에서는 dll 확장자 등)

  

라이브러리로 제작되고 있는 것들의 예시를 들자면, 암호화, 압축 및 해제(zip), 이미지 변환, 문자열 처리 등등이 있습니다.

  

그런데... 라이브러리와 API는 정확하게 구분하기 어려운 경우가 많습니다.

JDK(Java Development Kit) 같은 경우에도 API의 특징과 라이브러리 특징을 모두 포함하고 있습니다.

  

예시 - Apache commons 라이브러리 (문자열 처리, 날자 계산 등),  zlib 라이브러리 (압축 해제)

  Joda Time (날짜/기간 계산, 양/음력 변환)

  Netty (비동기 통신 라이브러리), jQuery, Dojo (자바스크립트 라이브러리)

  

Q. 그렇다면 라이브러리와 유사하게 들리는 (혹은 사촌이라는데..) 프레임워크(framework)는 무엇인가요?

A. 프레임워크는 특정 목적의 서비스 혹은 어플리리션을 제작하기 쉽게끔 일련의 작업 흐름을 미리 만들어 둔 소프트웨어 부품입니다. 라이브러리는 개별 부품들의 단순 집합 - 레고 블럭들을 넣어둔 상자라고 연상해 봅시다 - 이라고 설명할 수 있습니다. 동작하는 무언가를 만들고자 하면 직접 하나의 부품을 조립(혹은 코딩)을 해야 합니다.


반면에 프레임워크는 일련의 과정을 수행하는 부품들이 조립되어 있어 간단한 설정만으로 어플리케이션을 제작할 수 있습니다.

사례를 들어 보자면, 데이터베이스의 데이터를 읽고 있는 기능을 라이브러리만으로 구현하려 한다면, 데이터베이스에 연결하는 기능, 쿼리 전송하는 기능, 쿼리 수행 결과를 가져오는 기능, 연결을 종료하는 기능 등등을 직접 조립하고, 구현하고 테스트해야 합니다. 프레임워크를 사용하면 이러한 일련의 기능들이 쉽게 쓸수 있도록 구현되어 있는데다 테스트까지 완료되어 있고, 연쇄적으로 실행하고 결과를 반환하거나 오류 처리하는 기능을 한번의 호출로 처리할 수 있습니다. (실제 구현할 때는 개인의 적용 방식에 따라서 절차가 조금 다를 수 있습니다.)

요약하자면, 라이브러리는 그냥 '부품 상자'이고 프레임워크는 부품들을 연결하고 조립해둔 '모듈 형태의 반제품'입니다.


추가로, '엔진'이라고 불리는 것들은 특정 분야의 제품을 만들기 위해 사용되는 라이브러리/프레임워크의 진화된 형태를 말합니다. '게임 엔진'을 예로 들면, 개발자가 어떤 라이브러리들을 사용할지 고민하거나 필요한 기능들을 사전 제작하는 과정없이,바로 게임 개발에 착수할 수 있도록 게임 제작에 필요한 모든 기능을 제공합니다. 프레임워크는 일반적으로 범용적(general purpose)인 용도로 만들어지기 때문에 바로 원하는 소프트웨어를 제작할 수 없고,개발자 혹은 시스템 엔지니어가 각종 환경 설정 및 시스템 구성, 그리고 목표 소프트웨어에 맞도록 커스터마이징(customizing) 혹은 조립, 설계를 거쳐야 합니다.


Q. 통합개발환경(IDE : Integred Development Environment)는 무엇인가요?

A. 프로그래머는 자신이 구상한 프로그램을 '프로그래밍 언어'로 작성하고, 컴파일러를 이용해 실행 파일 형태로 만듭니다. 오동작 할 경우에는 원인을 찾기 위해 디버거(debugger)를 이용해 버그를 찾아냅니다. 이러한 일련의 작업을 수행하기 위해서는 프로그램 소스 편집기(program source editor), 컴파일러(compiler), 디버거(debugger) 등의 개발 도구(development tool)들이 필요한데, 이것들을 하나의 종합선물셋트로 모은 것이 통합개발환경(통칭 IDE)입니다.

가장 널리 쓰이는 통합개발환경으로는 MS Visual Studio, Eclipse, IntelliJ 등이 있습니다. 개발 현장에서는 델파이(Delphi), 파워빌더(Power Builder) 등도 더불어 사용합니다.

Q. 지속적인 통합이라는 것은 무엇인가요?

A. 앞서 언급한 통합개발환경이 도입된 이후로 단 하나의 개발도구만 가지고, 소프트웨어 개발에 필요한 모든 과정을 편하게 수행할 수 있습니다. 하지만, 소프트웨어의 규모가 커지면서 더 이상 소프트웨어를 단 한 명의 개발자가 만들어 낼 수가 없게 되었습니다.

대다수의 상용 소프트웨어는 수 명에서 수백명의 개발자가 하나의 제품을 만들기 위해 협력합니다. 동시에 여러 사람이 개발을 진행하다 보면, 각자가 작업한 소스 코드를 합치고(merge)하고, 컴파일한 후, 정상적으로 동작하는지 여부를 테스트하는 과정을 도저히 사람이 수행할 수 없게 됩니다. 따라서, 주기적으로 변경된 소스를 찾아서 자동으로 컴파일하고 기능을 테스트하며, 그 결과를 기록해주는 제품이 만들어진 것입니다.

Q. 깃허브(GitHub), 소스포지(SourceForge) 등의 소셜 코드 공유는 무엇인가요?

A. 90년대에는 소수의 개발자들이 작은 사무실에 모여서 개발하는 형태를 '소프트웨어 하우스'라고 부르는 유행이 있었습니다. 닷컴 열풍이 불기 전, 인터넷이 광범위하게 퍼지기 전에는 소프트웨어 개발은 자동차 창고 같은 허름한 공간에 열정적인 개발자들이 모여서 함께 작업하는 것이 당연했습니다.

하지만, 인터넷이 발전하고, 세상의 모든 개발자들 연결되면서 전세계의 모든 개발자들이 가상의 인터넷 공간에서 함께 작업할 수 있게 되었습니다. 서로 다른 시간과 공간에서 작업을 하면서도 서로의 작업을 확인하고, 의견을 나누고 소스를 취합할 수 있는 공간이 소셜 소스 공유 사이트입니다.

Q. 애플리케이션 컨테이너(Application Container)란 무엇인가요?

A. 개인 PC 환경에서만 작업해 본 사람에 '어플케이션'을 담는 컨테이너라는 용어가 생소하게 들릴 수 있다. 당연히 PC에서는 어플리케이션을  실행하는데 운영체제 이외의 요소는 필요 없습니다. - 윈도우나 OS X, 리눅스에서 바탕화면의 아이콘만 클릭하면 프로그램이 동작하는 건 너무나 당연합니다 -

하지만, 서버라는 환경에서는 이야기가 달라집니다. 서버에서 구동되는 소프트웨어들은 한 명의 사용자를 염두에 두고 개발되는 것이 아닙니다. 수십명에서 수천 명의 사용자가 네트워크틀 통해 접속하기 마련입니다. 게다가 서버 소프트웨어는 장비 자체의 자원(디스크, 메모리)만 사용하는게 아니라 이메일을 주고 받거나, 데이터를 송수신하거나, 원격지에 존재하는 장비들과 통신해야 하기 때문에 굉장히 높은 부하에서 다양한 작업을 수행합니다. 동시에 벌어지는 복잡한 작업에 필요한 자원을 할당하고, 관리하고, 반환하는 일련의 과정은 어플리케이션 서버가 담당하고, 서버 어플리케이션은 어플리케이션 서버가 제공해주는 각종 자원(스레드, DB 연결, 소켓, 메모리 자원 등)들을 이용해 동시에 수많은 작업을 처리합니다. 서버의 어플리케이션은 대게 운영체제 위에서 직접 실행되지 않고, 어플리케이션 컨테이너 위에서 실행됩니다. (물론 서버에도 운영체제가 있지만, 서버 운영체제의 역할은 여전히 하드웨어 제어가 최우선입니다.)

Q. '가상 머신(virtual machine)'은 무엇인가요?

A. 가상 머신(Virtual Machine, VM)은 컴퓨팅 환경을 소프트웨어로 구현한 것, 즉 컴퓨터를 에뮬레이션(emulation)하는 소프트웨어입니다. 초기에 나온 가상 머신은 특정 하드웨어 장비에서 다른 유형의 하드웨어에서 동작하는 소프트웨어를 구동하는자 하는 욕구에서 시도되었다고 볼 수 있습니다. (예전에는 매킨토시에서 윈도우용 게임을 실행할 수 없었습니다. 그 반대의 요구도 있을 수 있습니다.)

지금은 가상 머신 기술이 발전해서, 서버 차원에서 주로 활용되고 있습니다. 아마존 웹 서비스가 주요 사례입니다.


Q. '브라우저'가 개발 기술 중에 언급되는 이유는 뭔가요?

A. 초창기 웹 브라우저들은 정적인 HTML 컨텐츠를 마치 모니터에 출력해주고 책처럼 읽게끔 해주는 것이 주된 역할이었습니다. 그런데, 넷스케이프에서 웹 브라우저에 보다 동적인 요소를 가미하고자 자바스크립트 언어를 추가했고, 점차 웹 브라우저에서 다양한 기능을 구현할 수 있게 되었습니다. 이제 홈페이지 화면들은 액자 속의 그림처럼 멈추어 있지 않습니다. 마우스와 키보드를 이용해 다양한 상호작용(interaction)을 이끌어 낼 수 있고,브라우저 내에서 동작하는 다양한 어플리케이션들이 나타나고 있습니다. 이러한 혁신은 지속되고 있는 상황입니다.

Q. Node.js와 JavaScript의 의미는 무엇인가요?

A. 프로그램 개발 도구들이 점점 진화하듯, 개발 언어도 개발자가 좀 더 쉽게 코딩할 수 있게끔 문법적으로 단순화되어 가고 있습니다. 물론, 비즈니스 개발을 위한 언어들은 실수를 방지하기 위해 여전히 엄격한 문법을 고수하고 있기는 합니다. 

javascript는 쉽게 배워서 빠르게 원하는 목표를 달성할 수 있는 입문자용 언어입니다. 점차 비즈니스 업무을 개발하는데 필요한 기능들이 확장되고 있기 때문에, 과거에 '연습용 언어', '장난감이나 만들 수 있는 언어'라는 식의 평가도 사라지고 있습니다.


Q. '서비스로 제공되는 인프라/플랫폼'란 무엇인가요?

A. 다수의 사용자를 위해서 인터넷 서비스를 만들고자 한다면, 어딘가 인터넷 망에 연결된 고성능의 서버를 마련해야 해야 합니다. 또한, 서비스를 개발하고 테스트 할 수 있는 환경 (서버 하드웨어, 소프트웨어, 개발도구, 모니터링 도구 등)도 있어야 하고, 24시간 운영해 줄 운영요원도 구해야 합니다. 이러한 서버 구축/개발지원/운영 서비스를 가입하고 요금만 내면 즉시 제공해 되는 서비스들이 '서비스로 제공되는 인프라/플랫폼'입니다.

Q. '데브옵스(DevOps) 도구'란 무엇인가요?

A. 글로벌 시대에는 서버 장비의 규모도 달라지고 있습니다. 단 몇 대의 서버 장비를 운영하는 것이 아니라, 수십 혹은 수백대의 장비에 각종 소프트웨어를 설치하고 기능이 변경될 때마다 업데이트해야 합니다. 과거의 개발자는 소프트웨어를 서버에 일일이 설치했습니다. 하지만 지금은 쉐프(Chef), 퍼핏(Puppet) 같은 서버 관리 도구를 통해 자동으로 수백배의 서버의 설정을 변경하고, 재배치하는 것이 가능합니다. 이러한 기술들을 '데브옵스(devops)'라고 합니다.


Q. '성능 모니터링'이란 무엇인가요?

A. 서버는 당연히 수많은 사용자가 접속하기 마련입니다. 몇 명의 사용자가 언제 얼마나 접속할지 예측할 방법은 없습니다. 그렇다면 서버를 안정적으로 운영하기 위해서는 지속적으로 어느 정도의 부하(load)가 발생하는 모니터링해야 합니다. CPU 사용량의 변화, 메모리가 부족하지는 않는지, 사용자에게 응답하는 시간이 오래 걸리지 않는지 변화를 기록하고 통계를 만들어 냅니다. 그리고, 통계 결과를 통해 향후에 얼마나 많은 서버를 증설해야 하는지 계획을 수립하는 것입니다. 예측할 수는 없지만, 과거와 현재의 결과를 통해 미래를 준비하는 기술이 성능 모니터링 입니다.


Q. '소셜 미디어 포탈'을 염두에 두어야 하는 이유는 무엇인가요?

A. 초창기 인터넷은 고립된 섬들의 집합과 같았습니다. 좋은 휴양지나 보물섬과 같은 사이트는 최초 발견자가 자신의 지인들에게 알음알음 소개해서 알려졌습니다. 그러다가 제리 양이 'Yahoo.com'를 만들었습니다. 인터넷에 전화번호부가 생기고, 구글 검색이 생기고 사람들은 포털과 검색을 통해 흥미로운 사이트를 찾아다녔습니다.

하지만, 이제는 굳이 검색이 아니라 뉴스와 이웃들의 관심사를 통해 최신 정보를 얻고 있습니다. 아무리 좋은 사이트 혹은 어플리케이션을 만들어도 외딴 섬처럼 방치해서는 곧바로 망하고 마는 것입니다. 소셜 미디어 포털에 홍보하거나, 소셜을 활용하는 서비스 혹은 어플리케이션 제작을 염두에 두어야 합니다.

Q. 그리고 마지막으로 '소프트웨어를 판매하는 스토어'에 대해 알고 싶습니다.

A. 소프트웨어는 초기에 우편 배달 방식으로 팔렸습니다. 그리고, 이후에는 상자에 CD와 매뉴얼을 담아 팔던 시절이 있었습니다. 소포 포장이나 박스에 담은 형태를 패키지(package)라고 부르던 것에 빗대어 '패키지 소프트웨어'라는 표현이 여전히 쓰이고 있습니다.

이제는 인터넷을 모든 것이 팔리고 있습니다. 모바일 앱스토어, 브라우저 플러그인 스토어, 그리고 연쇄 할인마 라는 별명으로 유명한 스팀까지 다양한 형태의 소프트웨어 마켓이 존재합니다. 소프트웨어를 제작하고 설계하는 시점부터 온라인 스토어에 판매하는 것을 염두에 둘 필요가 있습니다.


Posted by 곽중선