Offcanvas

AI / CIO / How To / 빅데이터 | 애널리틱스 / 애플리케이션 / 오픈소스 / 클라우드

김진철의 How-to-Big Data | 빅데이터의 미래 (5)

2020.03.26 김진철  |  CIO KR


코틀린(Kotlin) 개발자들은 현대의 소프트웨어 개발 과정이 이런 팀으로 이루어지는 소프트웨어 엔지니어링 과정이라는 것을 인지하고, 팀으로 개발하는 소프트웨어 엔지니어링을 효과적으로 지원할 수 있도록 언어 디자인부터 근본적으로 다시 고려한 언어라는 것이 코틀린(Kotlin)이 다른 언어들과 다른 근본적인 차이이다. 과거 C/C++와 자바(Java)에 비하면 코틀린(Kotlin)의 표현들은 간결하고 가독성도 높다. 함수형 프로그래밍을 어렵지 않게 수용한 덕분에 함수형 프로그래밍을 통해 얻을 수 있는 극단적인 단순함을 소프트웨어 엔지니어들이 어렵게 느끼지 않고도 활용할 수 있게 되었다.

이렇게 표현의 간결함과 경제성을 추구한 코틀린(Kotlin)언어의 디자인 덕분에 소프트웨어 엔지니어들이 같은 기능을 작성하더라도 소스 코드의 양을 대폭 줄이고 더 가독성이 높은 소스 코드를 작성할 수 있게 되었다. 소프트웨어 엔지니어 한 사람이 들이는 노력과 시간도 경감이 되지만, 소프트웨어를 개발하고 유지보수하는 팀의 노력과 시간도 경감할 수 있게 되어 소프트웨어의 품질이 더 높아지게 된다.

사실 소프트웨어 엔지니어링이라는 학문의 발전을 촉발했던 “소프트웨어의 위기”라는 이런 현상 때문에 소프트웨어 개발에 도움이 되는 수많은 방법과 도구들이 개발되어 오늘날 소프트웨어 엔지니어들이 더 복잡하고 세련된 소프트웨어를 개발하게 되었다. 기존의 소프트웨어 엔지니어링 도구들은 이미 디자인된 프로그래밍 언어의 특성을 지원하도록 도구들이 개발, 활용되었다면, 코틀린(Kotlin)은 코틀린(Kotlin)언어를 만든 회사인 젯브레인즈가 소프트웨어 개발 도구를 만드는 회사이고, 코틀린(Kotlin)을 지원하는 소프트웨어 개발 도구와 이의 활용을 코틀린(Kotlin)언어를 디자인하기 시작한 초반부터 소프트웨어 엔지니어들이 고려한 것이 다른 프로그래밍 언어와 근본적으로 큰 차이이다.

프로그래밍 언어중에서 객체지향 소프트웨어 개발의 효시가 된 스몰토크(Smalltalk)가 바로 이런 접근 방식으로 디자인된 몇 안 되는 언어의 하나이다. 스몰토크는 프로그래밍 언어를 디자인할 때부터 “클래스 및 객체 브로우저”와 같이 이클립스(Eclipse) 같은 현대 개발 도구에서 볼 수 있는 개발 도구가 같이 고려되어 개발되었다. 코틀린(Kotlin)도 프로그래밍 언어와 함께 젯브레인즈 고유의 영역인 소프트웨어 개발 도구와 환경이 같이 개발되어 지원되기 시작한 아주 드문 경우이다. 코틀린(Kotlin)언어는 젯브레인즈의 개발 환경인 IntelliJ IDEA에 코틀린(Kotlin)언어 지원을 위한 플러그인이 코틀린(Kotlin)언어 초창기부터 지원되어 코틀린(Kotlin) 개발 환경의 일부로서 지원되고 있고, 많이 쓰이는 개발 환경인 이클립스 플러그인과 빌드 도구인 앤트(Ant), 메이븐(Maven), 그레이들(Gradle)에서도 기본으로 지원되고 있다.

프로그래밍 언어 개발 초반부터 이렇게 개발 도구가 완전하게 지원되어 포함되는 경우는 매우 드문 경우이다. 프로그래밍 언어를 디자인하고 개발하는 초반부터 팀으로서 개발 협업을 고려하여 디자인하고, 팀 개발을 지원하기 위한 소프트웨어 개발 및 빌드 도구들을 완전하게 개발, 지원하기 시작하며, 코틀린(Kotlin) 개발의 시작이 된 스칼라(Scala)의 긴 컴파일 타임을 자바(Java) 수준으로 줄일 수 있는 프로그래밍 언어를 개발한다는 목표를 가지고 프로그래밍 언어를 근본적으로 다시 설계, 개발하는 노력을 들이는 것이 사이버 물리 시스템과 클라우드 컴퓨팅 시스템과 어떤 관계가 있을까?

사이버 물리 시스템은 규모나 복잡성으로 보았을 때 하둡과 같이 특징지어질 수 있는 새로운 기술이라기보다는 엔지니어링 체계에 가깝다. 사이버 물리 시스템은 지금까지 사람들이 만들어온 기계와 시스템중에서 가장 복잡하고 규모 면에서도 가장 큰 시스템들로 발전해 나갈 것으로 보인다.

이런 사이버 물리 시스템들을 개발할 때, 다양한 배경을 가진 과학자와 엔지니어들이 설계, 디자인하고 개발에 참여하면서, 이들이 개발하는 소프트웨어에 대해 쉽게 이해하고 구현할 수 있도록 하는 프로그래밍 언어가 없다면 크고 복잡한 사이버 물리 시스템 소프트웨어를 결함 없이 신뢰성 있게 동작시키기 위해서는 훨씬 더 많은 시간과 노력이 필요하게 될 것이다. 또한, 결함과 오류가 많아져 원하는 수준의 안전성을 확보하기 어려워지기 때문에 전체 시스템이 목적하는 기능과 서비스를 제공하기 어려워질 것이다. 

프로그래밍 언어에서 제공되는 작은 자질 하나가 대형 사이버 물리 시스템을 위한 소프트웨어를 개발할 때에는 수천, 수만 라인의 소스 코드, 또는 수십, 수백 일에 걸치는 개발 일정을 단축할 수 있게 해줄 수도 있다. 나비의 날갯짓 하나가 연쇄 작용을 통해 증폭되면서 지구 반대편에 폭풍을 일으킬 수도 있다고 하는 일종의 “나비 효과(butterfly effect)”인 셈이다.

프로그래밍 언어는 사람이 사용하는 언어와 비슷해서, 새롭게 디자인한 프로그래밍 언어가 정말로 유용하고 쓸모 있는지 확인하기 위해서는 최소 십 년 이상의 시간이 걸리게 마련이다. 수십 년에 걸쳐 발전된 컴퓨터 과학과 소프트웨어 기술의 발전으로 요즘은 예전에 비해 프로그래밍 언어를 만드는 것이 상대적으로 쉬워졌다. 범용 프로그래밍 언어까지 아니더라도, 요즘 나오는 그루비(Groovy), 코틀린(Kotlin)이나 스칼라(Scala) 같은 언어는 언어 자체에서 도메인 특화 언어(Domain-Specific Language; DSL)를 쉽게 만들고 확장할 수 있는 기능을 제공하여 사용자의 도메인에 맞는 프로그래밍 언어를 만들어 활용하기도 쉬워졌다. 최근 다양한 프로그래밍 언어들이 새롭게 나타나고 경쟁하는 것도 이런 상황을 반영해주는 것이다.

프로그래밍 언어나 도메인 특화 언어를 개발하고 활용하는 것이 쉬워졌기 때문에, 사이버 물리 시스템과 같이 복잡한 시스템을 만들 때 아예 시스템 특성에 맞고 개발 비용과 시간을 절약하기 위해 새로운 종류의 프로그래밍 언어나 도메인 특화 언어를 개발해서 소프트웨어 복잡도를 근본적인 제어하는 것도 가능해진 것이다. 코틀린(Kotlin)과 같은 언어가 이런 트렌드를 반영한다고 볼 수 있다.

사이버 물리 시스템과 클라우드 컴퓨팅을 위한 프로그래밍 환경의 미래를 엿볼 수 있게 해주는 프로그래밍 언어의 마지막 예로 요즘 시스템 프로그래밍 언어로 주목받으며 성장하고 있는 “러스트(Rust)” 언어를 살펴보려고 한다. 

“러스트(Rust)” 언어는 파이어폭스 웹브로우저로 유명한 모질라 재단에서 일하던 그레이든 호아레라는 소프트웨어 엔지니어에 의해 2006년에 처음으로 개발되었고, 이후 그레이든이 일하고 있던 모질라 재단이 공식적으로 후원을 하면서 같이 개발에 참여하였다[21]. 2012년에 처음으로 0.1 알파 버전이 공개되었으며, 2020년 현재 1.41.1 버전이 공개된 상태이다[19-20].

러스트언어 또한 최근 프로그래밍 언어의 가장 큰 특징 중 하나인 함수형 프로그래밍(functional programming)과 인터넷 환경에서의 프로그래밍을 위한 개선된 병행(concurrent) 프로그래밍을 지원한다. 러스트언어 자체가 인터넷에서 실행되는 클라이언트와 서버 프로그래밍을 효과적으로 할 수 있는 언어로 개발되었기 때문에 인터넷 환경에서의 확장성을 효과적으로 지원할 수 있는 병행 프로그래밍 지원이 언어 개발 초기부터 목표였다.

러스트언어에서 눈여겨보아야 할 특징은 바로 컴파일된 바이너리의 안전성과 메모리의 직접 관리, 컴파일 시간 메모리 할당 오류 검출, 타입 추론과 같이 시스템 프로그래밍을 하는 개발자들이 가장 취약한 부분을 지원하는 기능을 가졌다는 점이다.

C와 C++언어를 사용하는 소프트웨어 엔지니어라면 누구나 공감하는 것이 바로 메모리 관리의 어려움일 것이다. 1998년 처음 제정된 C++ ANSI/ISO 표준 이후에 기존의 포인터를 보완하는 새로운 종류의 포인터 라이브러리들이 표준 템플릿 라이브러리에서 지원되기 시작하면서 예전보다는 메모리 관리가 조금 수월해졌다고 해도, C/C++로 개발된 소프트웨어들은 언제나 실행 시간(runtime) 메모리 오류가 일어날 수 있는 잠재적인 폭탄을 안고 있는 셈이다. 

메모리 오류가 가장 많이 일어나는 경우는 초기화되지 않는 포인터로 인해 생기는 문제, 그리고 포인터에 할당된 메모리를 미처 해제하지 않고 프로그램이 종료되거나 다른 메모리 영역이 포인터 변수에 할당되어 메모리 누수가 생기는 경우인데, 메모리 관리 오류들은 컴파일 때 검출되지 않고 실행 시간 오류가 되는 경우가 많아 소프트웨어 엔지니어들이 찾아내고 수정하기가 어려웠다.

러스트언어는 이렇게 메모리 관리 과정에서 일어나는 소프트웨어 결함과 생산성 저하를 막기 위한 구문과 자질을 포함하여 메모리 관리의 안전성과 컴파일 시 메모리 오류 검출을 지원하는 기능을 가지고 있다. 지나친 메모리 관리의 통제로 인해 생길 수 있는 프로그래밍의 경직성을 해소할 수 있도록, 프로그래머 자신이 위험을 안고 직접 메모리를 제어할 수 있도록 하는 “안전하지 않은 러스트(unsafe rust)” 모드를 지원하는 “unsafe” 예약어를 가지고 있다[19-20, 23-24].

러스트언어가 가장 각광 받는 이유가 바로 메모리 관리를 비롯한 시스템 프로그래밍의 안전성을 강화하여 컴파일 시 오류를 낼 수 있도록 한 것이다. 지금까지 C/C++ 언어를 사용하던 시스템 프로그램 및 저수준(low level) 소프트웨어를 개발하던 소프트웨어 엔지니어들이 얼마나 C/C++언어의 메모리 관리를 활용하는 과정에서 어려움을 겪었는지 알 수 있을 법하다.

사이버 물리 시스템의 개발 과정은 임베디드 시스템과 같이 커널 및 저수준 프로그래밍이 필요한 소프트웨어 계층과 고수준의 서비스 계층을 구현하는 것과 같이 다양한 계층에서의 소프트웨어 개발과 데이터 수집, 여러 계층에서 수집된 데이터를 기반으로 하는 기계 학습 및 인공지능 기술을 활용한 자동화된 판단, 이 판단 결과를 사이버 물리 시스템의 물리 요소 제어를 위한 다양한 계층의 소프트웨어에 피드백을 주는 과정을 포함한다. 이때, 계층별로 필요한 로직을 구현하는 데 집중하지 못하고, 하위 계층에서 일어나는 메모리 관리 오류 같은 것들에 자꾸 신경 쓸 수밖에 없다면 안 그래도 복잡한 사이버 물리 시스템을 개발하는데 생산성을 높이기는 정말 어려울 것이다.

러스트와 같은 언어가 앞으로의 사이버 물리 시스템과 클라우드 컴퓨팅 통합에 주는 의미는 바로 이와 같은 저수준의 시스템 자원 관리를 프로그래밍 언어 수준에서 손쉽게 하고 복잡도를 낮출 수 있도록 지원하는 것에 있다. 사이버 물리 시스템의 복잡도와 개발 범위의 광범위함을 극복하고, 다양한 계층 수준의 자원 관리를 하면서 신뢰성 있는 서비스를 만들기 위해서는 이를 만드는 소프트웨어 엔지니어들과 데이터 과학자들이 시스템 개발의 모든 계층 수준에서 일관된 생산성을 발휘할 수 있도록 기존 프로그래밍 언어의 단점을 보완하는 것이 필요하고, 현재 프로그래밍 언어 기술의 트렌드가 이를 보여주고 있다. 사이버 물리 시스템의 발전과 함께 프로그래밍 언어와 환경의 발전이 기대되는 이유이기도 하다.

사이버 물리 시스템을 이용한 지능형 서비스가 인간과 기계의 상호 작용을 통해 사회 문제를 해결하는 고급 사회 인프라로서 역할을 다하도록 빅데이터와 데이터 과학이 온전하게 활용되기 위해서는, 사이버 물리 시스템 개발 과정의 수많은 기술적인 난관과 복잡성을 극복하게 해주는 다양한 기술들이 필요하다. 이런 기술 중, 클라우드 컴퓨팅을 이용한 자원 관리와 저수준의 시스템 프로그래밍 과정에서 동원되는 자원 관리가 다양한 계층에서 통합되고 프로그램되는 데에 가장 근본적이고 중요한 기술인 클라우드 컴퓨팅 서비스 API와 최근 급격하게 발전하고 있는 새로운 프로그래밍 언어의 발전 양상을 같이 살펴보았다.

클라우드 컴퓨팅 기술의 발전과 함께 점점 구체적으로 정의, 확장되어 가는 클라우드 컴퓨팅 인터페이스들은 그 인터페이스를 정의하고 구현하는 과정에 들어가는 많은 시행착오와 비용, 개발 노력으로 인해 그 자체로 중요한 의미가 있다고 얘기하였다. 사이버 물리 시스템에 요구되는 다양한 계층의 자원 관리와 소프트웨어 복잡도 극복을 위해, 간결한 프로그래밍 표현 방식, 함수형 프로그래밍, 간단한 병행성(concurrency) 지원, 널 값 및 초기화되지 않은 변수의 관리, 소프트웨어 엔지니어링 도구 지원 강화, 메모리 관리 개선과 같은 방법을 통해 소프트웨어 엔지니어들의 고충 사항을 해결하려 노력하고 있는 “고(Go)”, “코틀린(Kotlin)”, “러스트(Rust)”와 같은 현대 프로그래밍 언어들의 눈에 띄는 특징을 같이 살펴보았다. 

이들 클라우드 컴퓨팅 서비스 인터페이스와 새로운 프로그래밍 언어들의 자질들은 사이버 물리 시스템이 데이터를 기반으로 자율적, 지능적으로 환경에 적응하며 우리에게 서비스를 제공하는데 필요한 컴퓨팅 자원을 손쉽게 끌어 쓰고 관리할 수 있도록 하여 사이버 물리 시스템의 실현에 중요한 디딤돌 역할을 하게 될 것이다. 최근 인공지능과 같이 눈에 띄지는 않지만, 분명한 효용과 쓰임으로 보다 구체적인 비즈니스 기회를 만들어 내는 이런 흐름을 독자 여러분들이 관심을 가지고 지켜보았으면 한다.

사이버 물리 시스템, 프로그래머블 하드웨어, 클라우드 컴퓨팅
이번 글을 마무리하기 전에 마지막으로 클라우드 컴퓨팅이 발전하면서 나타난 최근 하드웨어 아키텍처의 변화에 대해 필자의 생각을 공유하고 싶다. 사이버 물리 시스템과 클라우드 컴퓨팅의 상호발전 과정에서 독자 여러분들이 관심을 가지고 지켜봐야 할 중요한 트렌드로 “프로그래머빌리티(programmability)”가 높아지고 소프트웨어와의 통합이 긴밀한 하드웨어 아키텍처가 발전하는 경향을 들고 싶다.

사실 컴퓨터 자체가 이미 “프로그램 가능(programmable)”한 하드웨어이지만, 필자가 여기서 얘기하는 프로그래머블 하드웨어란 전통적인 계층과 구조의 노드 단위의 컴퓨터에서 얘기하는 “프로그래머빌리티(programmability)”가 아니다. CPU와 같은 프로세서, 메모리와 같은 휘발성 저장장치, SSD와 같은 비휘발성 저장장치, 그리고 네트워크 자원이 서버 노드 단위로 가상화 기술과 클라우드 컴퓨팅 소프트웨어를 통해 분할, 할당, 관리되는 것이 아니라, 클라우드 컴퓨팅의 개념과 컴퓨팅 자원의 확장성 있는 프로그래머빌리티(programmability) 개념을 근본적으로 수용한 컴퓨팅 하드웨어를 의미하는 것이다. 



클라우드 컴퓨팅의 개념이 하드웨어 수준으로 근본적으로 수용된 프로그래머블 하드웨어에 가장 근접한 시스템은 최근 인텔이 데이터센터 컴퓨팅과 클라우드 컴퓨팅을 위해 발표했던 “랙스케일 아키텍처(Rack-Scale Architecture; RSA)” 또는 “랙스케일 디자인(Rack-scale Design; RSD)”이다[27-32].

CIO Korea 뉴스레터 및 IT 트랜드 보고서 무료 구독하기
추천 테크라이브러리

회사명:한국IDG 제호: CIO Korea 주소 : 서울시 중구 세종대로 23, 4층 우)04512
등록번호 : 서울 아01641 등록발행일자 : 2011년 05월 27일

발행인 : 박형미 편집인 : 천신응 청소년보호책임자 : 한정규
사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.