2017년 3월 31일 금요일

[218호 웹진: 인사이드이슈] 소프트웨어공학의 오해와 필요성


소프트웨어공학의 오해와 필요성
불과 얼마 전까지만 해도 소프트웨어 개발 프로세스나 개발 방법론 등은 개발자들에게 환영 받지 못할 정도로 소프트웨어를 개발할 때 필요한 요소들이 정리된 소프트웨어공학의 관심은 일부 전공자들에게 한정되어 있었다. 하지만 최근에 소프트웨어공학을 다시 살펴보자는 주장들이 많이 나오고 있어 호윤시스템 김기향 팀장과 소프트웨어공학을 전공한 윤광렬 박사를 만나 이야기를 나눠본다.

Q: 안녕하세요. 2000년 전후로 집중적인 관심을 받다가 그 이후 지속적으로 관심이 줄어들고 있던 소프트웨어공학이 요새 다시 회자되고 있습니다.

이 얘기를 들으시는 분 중에 요새 소프트웨어공학이 다시 얘기되는 것을 모르겠다는 분들도 많을 겁니다. 그런데 최근에 이슈가 많이 되고 있는 애자일(Agile)이나 마이크로 서비스(Micro Service), 클라우드 서비스(Cloud Service) 등 많은 부분이 소프트웨어공학 없이는 구현되기가 어려운 것들입니다. 녹아 들어있는 소프트웨어공학을 인지 못하시는 것뿐입니다.

<그림1> 소프트웨어공학 활용의 예
D:\49376f6d9f5acBD.jpg
출처: http://blog.creation.net/306

최근까지도 소프트웨어공학을 소프트웨어를 개발하고 유지보수하는 생명주기 전반을 나타낸다고 이해하시는 분들이 많습니다. 특히 위키백과와 같은 사전적 정의도 이렇게 정의된 경우가 대부분이죠. 위키백과에서는 “소프트웨어의 개발, 운용, 유지보수 등의 생명 주기 전반을 체계적이고 서술적이며 정량적으로 다루는 학문이다; 즉, 공학을 소프트웨어에 적용하는 것이다”라고 정의되어 있습니다. 물론 틀린 말은 아니지만 소프트웨어공학이 적용되는 범위는 훨씬 광범위하다는 것이죠.
“소프트웨어를 만들 때”라는 말을 하나의 시스템을 개발하는 것에만 국한하지 말고 어떠한 제품을 만들 때 소프트웨어를 어떻게 하면 잘 적용할 수 있는가 하는 것도 포함시켜야 합니다.

Q: “제품을 만들 때”라는 말이 이해가 어려운데 조금 자세히 말씀해주시겠습니까?

일반적으로 소프트웨어를 만든다고 하면 시스템을 설계해서 코딩을 하고 운영을 하게 됩니다. 말 그대로 소프트웨어가 단독으로 만들어지는 것이지요. SI가 이러한 형태로 개발이 되고 솔루션 개발에서도 이러한 방식을 취하는 경우가 많습니다. 그런데 소프트웨어가 다른 제품에 들어가는 경우도 많지 않습니까? 최근에는 자동차나 비행기, 공장 등지에서도 사용되고 있는 것이 현실이지요. 반도체는 컴퓨터에만 쓰이는 것으로 잘 알려져 있지만 사람이 사용하는 거의 모든 전자 제품에 들어가는 것처럼 소프트웨어도 비슷합니다.

<그림2> 임베디드 소프트웨어 활용의 예
D:\embedded.png
출처: http://j.mp/ZYZ4KF

그림2에서처럼 임베디드 소프트웨어만 그런 것은 아닙니다. 이제 소프트웨어가 거의 모든 기계나 제품에 대부분 들어간다는 것을 인식해야 하고 이에 대비한 소프트웨어 만드는 방식을 준비해야 하는 것이죠.

Q: 요새 나오는 전자 제품에는 소프트웨어가 꼭 들어가니 소프트웨어를 적용하기 위해 소프트웨어공학이 필요하다는 말로 이해가 되네요. 맞나요?

맞는 말이긴 하지만 전자 제품이 아니더라도 소프트웨어공학은 소프트웨어를 만드는 방법적인 것을 말하는 것이기 때문에 개발 프로세스나 개발 방법론에 너무 한정해서는 안된다는 것을 말씀드리는 것입니다.
SI에서 소프트웨어를 만드는 것과 자동차에 들어가는 소프트웨어를 개발하는 것은 매우 다른 방법으로 소프트웨어가 이해되어야 하지만 소프트웨어를 만들기 위해 고민해야 하는 근본적인 문제는 똑같다는 것이죠. 예를 들면 소프트웨어가 어떤 운영체제에서 구동되는지, 보안상 필요한 부분은 무엇인지, 데이터는 어떻게 주고 받아야 하는지 등을 말합니다.

<그림3> 자동차에 탑재되는 소프트웨어의 예
출처: IT조선

그림3에서 차간거리제어를 보죠. 차간 거리를 제어하기 위해서는 거리를 측정하는 센서도 필요하지만 센서에서 거리를 읽어 판단하고 제어하는 소프트웨어도 필요할 겁니다. 이 때 만들어지는 소프트웨어를 SI 개발하듯이 개발할 수 있을까요? 아닐 겁니다. 이러한 소프트웨어를 만들 때는 또다른 방법이 필요하고 이러한 방법은 소프트웨어공학을 기반으로 정의되어야 한다는 것이 오늘 이야기의 핵심입니다.

Q: 그러한 소프트웨어 개발은 임베디드 소프트웨어에만 한정되어 있는 것 아닌가요? 그리고 임베디드 소프트웨어는 SI 개발과는 비교도 안될 만큼 개발 규모가 작지 않나요?

이 부분이 혼동하기 쉬운 부분입니다. 임베디드 소프트웨어는 이미 구분되어 있는 소프트웨어의 한 분야는 맞습니다. 하지만 어디서부터 어디까지 임베디드 소프트웨어라고 할 것인가라는 정의는 따로 없습니다. 어떤 제품이 원활하게 동작할 수 있도록 도와주는 것 정도로만 알고있는 것이 현실인데 최근에는 제품에 들어가는 소프트웨어가 임베디드 소프트웨어인지 시스템이라고 불릴 수 있는 소프트웨어인지 구분하기가 매우 애매해 졌다는 것입니다.

<그림4> 스마트 공장의 소프트웨어 활용
D:\158a26f9a939493afcee397b0ad82d4b_20150403111024_zihmcknj.jpg
출처: http://www.iuchem.com

Q: 이전의 인터뷰에서 소프트웨어 산업이라는 말이 없어지고 모든 산업에서 소프트웨어가 부자재로 사용될 것이다라는 말이 기억납니다.

네 맞습니다. 소프트웨어 시스템이라고 불리던 SI 형태 위주였던 대규모 소프트웨어 산업에서 모든 산업에서 필요로 하는 소규모지만 반드시 필요한 맞춤형 소프트웨어로 바뀌고 있는 것이지요.

Q: 4차 산업혁명과 맥을 같이 하는 것으로 봐도 되겠네요. 그렇다면 소프트웨어공학과 연관해서 정리를 해주시죠.

4차 산업혁명은 인공지능 중심으로 산업이 변화되는 경우가 많은 것으로 알려져 있지요. 하지만 그 전에 모든 산업에서 필요한 소프트웨어를 탑재하게 됩니다. 초연결 사회를 지향하는 4차 산업혁명의 경우 소프트웨어를 더 효율적이고 체계적으로 적용하기 위해서는 반드시 소프트웨어공학이 필요합니다. 그림5는 고건 교수가 말하는 초연결 사회에서는 소프트웨어공학이 해답이라고 말한 것을 나타내고 있습니다. 물론 시각의 차이는 있겠지만 시대가 지날수록 소프트웨어를 만들 때 소프트웨어공학의 필요성은 점점 증가한다는 것이지요.

<그림5> 초연결 사회와 소프트웨어공학의 연관성
출처: 고건 - 22nd SW Quality Insight Conference

Q: 각 산업 군에서 소프트웨어가 필요하고 소프트웨어 개발을 위해 소프트웨어공학이 필요하다는 것은 이해가 갑니다. 그런데 소프트웨어공학을 어떻게 적용해야 하는 걸까요?

앞에서 소프트웨어공학은 개발 프로세스나 개발 방법론에 국한해서는 안된다는 말을 했습니다. 말하자면 소프트웨어를 만들 때 표준화된 프로세스와 방법론에 따라 만드는 것에서 벗어나야 한다는 것이죠. 각 산업 군에서 사용되는 소프트웨어는 각자 만들어지는 방식도 매우 다를 겁니다. 아니 다르게 만들어져야 합니다. 왜냐하면 각 산업 환경은 매우 다르기 때문에 거기에 맞는 소프트웨어가 있고 개발 방법도 정해진다는 말입니다.
기존에는 임베디드 소프트웨어라는 범위로 획일화된 개발 방식이 있었습니다. 하지만 지금은 자동차에서 사용되는 소프트웨어에서 고민해야 하는 것과 공장 자동화에서 사용되는 소프트웨어에서 고민해야 하는 것이 다를 수 있다는 것이죠. 여기서 말하는 다르다고 하는 것은 소프트웨어를 만드는 방법뿐만 아니라 운영체제, 보안, 데이터 전달, 더 나아가서는 인공지능으로 확대되는 것까지 다양한 형태가 존재합니다.

Q: 운영체제나 보안 같은 분야는 소프트웨어 개발에서 기본적으로 고민되는 부분 아닌가요? 각 산업에서 다르게 적용될 것이라는 이유는 무엇인가요?

예를 들면 자동차에서 고민해야 하는 보안 문제는 무엇일까요? 자율 주행을 적용했는데 해킹을 당해 도로 위에서 사고를 유발할 수 있다는 것을 고려해야 하고 스마트 공장에서 보안을 생각해야 한다면 IoT 장비에 장애가 일어나서 기계들을 멈추게 할 수 있죠. 이와 같이 보안 문제도 산업마다 다르게 나타나고 그에 대비한 소프트웨어 관점의 고민도 달라진다는 것입니다. 바로 산업 안전성 문제가 대두되는 것이죠.

<그림6> 소프트웨어 안정성 분석

산업에 적용해야 할 제품을 체계적으로 분석하고 특성에 맞게 설계하고 효율적인 개발을 통해 산업 발전에 도움을 줄 수 있는 소프트웨어를 만들기 위해서 소프트웨어공학은 이전보다 더 필요한 시대가 왔다고 봐야 합니다. 소프트웨어공학은 소프트웨어를 만드는 순서를 나타낸 것이 아니라 효율적인 소프트웨어를 체계적으로 개발하기 위한 것이 목적이기 때문입니다. 특히 4차 산업혁명이 나타난 지금 시점에 소프트웨어공학의 필요성은 계속 증가할 것으로 예상됩니다.

Q: 최근에 각 산업에서는 안전성에 대한 이슈가 계속 부각되고 있는데 점점 복잡해지는 산업 구조에 소프트웨어가 차지하는 비중도 커지기 때문일 것도 같습니다. 소프트웨어 안전성에 대한 이슈도 더 커지는 것 같고요. 오늘 이야기를 정리해 주시죠.

소프트웨어는 이제 소프트웨어를 만드는 회사나 개발자만 고민해서는 안됩니다. 거의 모든 산업에서 소프트웨어를 사용하고 있고 소프트웨어로 인해 문제가 발생하고 발전도 이룹니다. 소프트웨어의 역할이 그만큼 커졌다는 말이겠죠. 소프트웨어로 인한 안전 사고도 계속 발생할 것으로 보이기 때문에 소프트웨어에 대한 안전성 이슈도 대두될 것이고요. 소프트웨어공학은 이러한 이슈나 문제를 해결하기 위해 반드시 필요한 것이라고 인식해야 합니다. 소프트웨어가 원하는 대로 잘 개발되게 하고 문제가 발생하지 않게 하기 위해서는 소프트웨어공학을 얼마나 잘 적용했느냐 하는 것이 중요하기 때문입니다. 소프트웨어공학에 대한 각 산업의 이해가 더 필요한 시점인 것 같습니다.


Keyword: software engineering, software safety, fourth industrial revolution, software development