brunch

부드러운 제품 소프트웨어

본질이 중요하단 말입니다

by 맛소금

소프트웨어가 무엇인지 쉽게 설명하기 위해서는 컴퓨터의 프로그램이나 스마트폰의 앱과 같은 예를 들어 설명할 수 있지만, 소프트웨어라는 용어 자체는 실체가 존재하는 기계장치인 하드웨어에 대응하는 개념으로 존재하기 시작했다. 딱딱한 기계장치와 달리 부드럽게 변경 가능하다는 의미로 소프트웨어, 즉 부드러운 제품이라는 이름을 갖게 되었다.


요즘에는 하드웨어라는 단어도 일반인들에게 많이 익숙해져서 신체 조건이 좋은 사람이나 기반 시설이 탄탄한 회사를 꾸미는 말로 '하드웨어가 좋다'고들 표현하기도 한다. 반대로 말을 잘하거나 센스가 좋은 사람 또는 기업 문화나 업무 프로세스가 좋은 회사를 꾸미는 말로 '소프트웨어가 좋다'라고 표현한다. 하드웨어와 소프트웨어를 잘 구분하고 적절하게 사용하는 사례가 많아지는 것을 보면 일반인들에게 IT 기술이 점점 친숙해져가고 있다는 생각이 든다. �


소프트웨어 개발자라고 다 같지 않아요


쉽게 설명하기 위해서 컴퓨터 프로그램과 스마트폰의 애플리케이션의 예를 들었지만, 사실 소프트웨어에는 굉장히 다양한 종류가 있다. 그래서 소프트웨어 개발자라고 해서 다 같은 일을 하는 것이 아닐 뿐만 아니라 경우에 따라 전혀 다른 일을 할 정도로 소프트웨어의 형태와 역할이 다르다. 몇 가지만 간단하게 이야기해봐도 차이를 확 느낄 수 있을 것이다.


하드웨어랑 친한 순으로 소개를 해보자면, 우선, 펌웨어 Firmware라는 소프트웨어가 있는데, 이 녀석은 하드웨어랑 가장 가까이 붙어서 기본적인 동작을 처리해 주는 역할을 한다. 본래 기계 장치는 하드웨어로만 구성되어 있었는데, 전자 부품이 발전하면서 기계 장치에 펌웨어라는 소프트웨어가 자리를 잡았다고 볼 수 있다. 예를 들어 옛날 선풍기의 스위치는 기계식 버튼으로 구성되어서 스위치가 눌려진 상태에 따라서 속도나 방향 조절을 담당하는 부품에 전달되는 전기적 신호를 조절했다. 하지만 요즘 선풍기는 버튼을 누르면 그 버튼의 신호를 분석해서 속도와 방향을 조절하고 현재 상태를 화면에 표시하는 등의 동작을 수행한다. 그 동작을 처리하는 소프트웨어가 바로 펌웨어다. 버튼 상태로 동작하던 것이 버튼의 신호를 처리해서 동작하도록 만든 프로그램이 펌웨어인 것이다.


1703766968814.jpg 진짜 컴퓨터일까

여담이지만, 내가 초등학교 때 전자 공학을 배워야겠다고 생각한 이유는 잘 사는 친구 집에 가서 최신 밥솥이나 선풍기가 전자식으로 변하는 것을 보고, 훗날 모든 것이 전자 제품이 될 것 같았기 때문이었다. 그런 생각을 하던 찰나에 삼촌이 컴퓨터 회사에 취업했고, 우리 집은 없는 살림에도 아버지가 AT 컴퓨터를 팔아주게 되면서 나는 지하실에 살면서 최신 컴퓨터를 다루는 긱 geek이 되었던 것이다.


다시 돌아가서, 펌웨어는 하드웨어와 직접적으로 신호를 주고받는 녀석이며, 그렇기 때문에 때때로 펌웨어는 거의 하드웨어처럼 취급된다. 왜냐하면, 부드러운 제품이라는 이름답지 않게 수정하기도 쉽지 않고, 변경할 수 있는 폭도 굉장히 좁기 때문이다. 그래서 소프트웨어의 대가 밥 아저씨는 클린 아키텍처라는 책에서 하드웨어와 밀접하게 고정된 펌웨어는 소프트웨어라 볼 수 없다고 선을 그어 버렸다.�

다운로드.jfif 밥 아저씨의 대담한 아키텍처 이야기

펌웨어가 선풍기나 밥솥, 냉장고, 에어컨 같은 곳에서 더없이 중요한 역할을 담당하고 있지만, 가전제품뿐만 아니라 컴퓨터와 스마트폰 부품에도 펌웨어가 들어간다. 컴퓨터나 스마트폰에서도 하드웨어 부품들이 시스템 소프트웨어와 신호를 주고받으면서 제대로 동작할 수 있게 해주는 친-하드웨어 소프트웨어로서 중요한 역할을 하고 있다.


그래서 펌웨어 개발자는 해당 하드웨어 지식을 많이 알아야 하는 경우가 많고, 복잡하지 않은 경우 하드웨어 개발자가 펌웨어까지 간단하게 개발하는 경우도 많다. 그러다 보니 자연스럽게 소프트웨어보다는 하드웨어 지식이 더 많이 필요하기에, 다른 종류의 소프트웨어 개발자와 쉽게 호환(?)이 되질 않고 고용시장에서도 소프트웨어 개발자로 인력을 선발하기보다는 해당 제품 기술의 엔지니어로 직업설명 Job Description을 대신한다.

스크린샷 2025-02-05 234816.png 소프트웨어 개발자보다는 펌웨어 개발자로 불린다


다음으로 펌웨어와 소통하면서 시스템이 제대로 동작하도록 운영하는 역할을 담당하는 프로그램이 시스템 소프트웨어와 임베디드 소프트웨어다. 시스템 소프트웨어는 익히 알려진 윈도나 안드로이드와 같은 운영체제 Operating System을 생각하면 이해가 쉽다. 윈도나 안드로이드가 일반적으로 다양한 목적으로 사용되기 위해 만들어졌다면, 임베디드 소프트웨어는 특정 하드웨어에서 동작하도록 만들어진 시스템 소프트웨어라고 생각해도 좋다.


마지막으로 응용프로그램과 순수 소프트웨어로 구분할 수 있을 것 같은데, 응용프로그램은 영어로 애플리케이션, 그렇다 바로 우리에게 너무나 친숙한 앱이다. 응용프로그램은 해당 운영체제에서 특정 목적을 달성하기 위해서 만들어지는 것이 보통이다. 카카오톡 같은 메신저는 우리가 소통하기 위해서 사용하는데, 윈도용 응용 프로그램이 있고, 안드로이드나 아이폰 앱이 따로 있다.

1262px-Android-System-Architecture.svg_-1024x831.png 안드로이드 시스템 아키텍처


순수 소프트웨어는 응용프로그램과 달리 특정 운영 체제나 제품과 강하게 연결되지 않고 독립적으로 작성된 프로그램을 뜻하는데, 인공지능 모델이나 알고리즘 같은 것이 대표적이다. 논리적이고 개념적인 사고의 집합을 글 대신 소프트웨어로 작성했다고 보면 된다.


시작하면서 말했듯이 펌웨어부터 인공지능까지 하드웨어와 멀어지는 순서로 소개해봤다. 이외에도 사용 기술이나 주요 고객, 기술 도메인과 연관 산업에 따라서도 소프트웨어는 정말 다양하게 분류할 수 있다. 사실 거의 모든 분야에 소프트웨어가 사용되기 때문에 그만큼 다양한 모습을 하고 있다고 보면 된다. 그러니까 소프트웨어 개발자라고 소개받은 사람들이 모두 같은 일을 한다는 오류를 조심하자. 또 하나, 소프트웨어 개발자라고 소개하는 사람을 만난다면 어떤 소프트웨어를 개발하는지 물어보는 것으로 관심을 표현해도 좋다. 분명 눈을 크게 뜨고 신나게 추가 소개를 하면서 좋은 분위기를 이어 갈 수 있을 것이다.�


소프트웨어 본질은 같다


다양한 모습을 하고 있지만 소프트웨어가 부드러운 제품이라는 본질은 같다는 것을 잊어서는 안 된다. 종종 소프트웨어를 하드웨어처럼 만드는 프로그래머가 있다. 복잡하고 변경이 어려워서 쉽게 건들 수 없는 아주 딱딱한 제품으로 만드는 경우가 있는데, 정말 함께 일하는 것이 부담되는 사람이다. 한다고 하지만 오히려 짐이 된다는 것이 어떤 상황인지 절실히 느끼게 해주는 경우다.�


부드럽다는 것은 변화에 유연하게 대응할 수 있다는 것이다. 하드웨어의 경우 기계적으로 제품이 만들어지기 때문에 기능이나 성능을 변경하는 데에 많은 비용이 든다. 하드웨어 제작을 위한 주형을 생각하면 이해가 쉬울 것 같다. 반면, 소프트웨어는 상대적으로 변경에 많은 비용이 필요하지 않는데, 이것이 소프트웨어의 본질이자 가장 강력한 장점이다. 이러한 장점 때문에 소프트웨어 개발자는 항상 제일 마지막까지 변경을 요청받는다. 시스템 엔지니어한테, 디자이너한테 심지어 제품 기획팀으로부터 계속되는 변경 요청을 받는데, 이것이 개발자에게 상당히 큰 스트레스가 되기도 한다.

Untitled-design-87.jpg 주형 - 만들기도 변형하기도 쉽지 않다

소프트웨어가 부드러운 제품이라고 소프트웨어 개발자에게 이랬다 저랬다 마음대로 변경을 요청해도 된다는 것은 아니고, 부드러운 제품이라고 해서 모든 변경을 다 수용할 수 있도록 만들어야 한다는 것도 아니다. 소프트웨어 개발자가 동네북도 아니고, 무엇이든 시키는 대로 다 바꿀 수 있는 것도 아니다. 오히려 불필요하게 변경 가능성을 고려하여 설계하는 것은 리소스 낭비이며, 오버 엔지니어링이 될 수 있다. 하지만 필요한 변경이라면, 해야 한다면 멋지게 팔을 걷어 부치고 소프트웨어의 위대함을 뽐낼 수 있는 준비된 소프트웨어 개발자가 되자.


요즘의 소프트웨어는 특히나 더 빠르고 많은 변경을 지속적으로 수행하면서 발전하는 형태로 개발되는데, 기민한 에자일 프로세스와 함께 다음 기회에 이야기해보는 걸로�


코더, 프로그래머, 개발자 그리고 엔지니어


소프트웨어 개발자를 부르는 단어로 코더, 프로그래머, 개발자 그리고 엔지니어등 다양한 단어가 있다.


코더 Coder는 코드를 만드는 사람이라는 뜻으로 초기 소프트웨어 개발에서 하나의 역할자를 의미했으나 이후 코딩한다는 의미로 프로그래머를 칭하는 단어로도 사용되었지만, 코드를 만드는 사람이라는 설명 자체가 매우 제한적인 역할을 나타내는 바 단순히 프로그램을 만들기만 하는 사람으로 부정적인 의미로 사용되었다. 뭐랄까 작가랑 비교한다면 손을 다쳐서 글을 쓸 수 없는 사람을 대신해서 대필해 주는 대필가 정도의 느낌이다.


제 실력이 없는, 무늬만 프로그래머인 단순 코딩 노동자를 일컫는 말.


프로그래머 programmer는 프로그램을 만드는 사람이라는 뜻으로 단순히 코드를 만드는 코더 보다 조금 더 상위 개념으로 사용되곤 한다. 더 나아가서 개발자 developer는 좀 더 포괄적인 개념으로 프로그래밍에 필요한 구조를 기획하고 설계하여 프로그램 또는 시스템을 만드는 사람이라는 의미로 사용되는데, 사실 현업에서 프로그래머와 개발자를 엄격하게 구분하거나 하지는 않는다. 코더는 조금 얕보는 느낌이 있지만 프로그래머와 개발자는 크게 다른 느낌도 없고, 혼용해서 사용한다.


마지막으로 엔지니어라는 호칭이 있다. 엔지니어는 앞에 세 단어와는 확연히 다른 의미를 추가로 가지고 있다. 코더나, 프로그래머, 개발자는 사실 모두 소프트웨어를 만드는 사람을 일컫는 말이다. 하지만 엔지니어는 단순히 소프트웨어를 만드는 것이 아니라 소프트웨어 기술을 엔지니어링 하는 사람이다. 엔지니어는 공학자를 뜻하는데, 단순히 어떤 소프트웨어 제품이나 프로그램을 만드는 것을 넘어서 상황에 맞게 기술을 사용하고, 그것을 유지보수, 관리하는 비용까지 모두 고려해서 기술을 적용한다는 포괄적인 의미를 가지고 있다.


공학자(工學者, engineer)는 공학에 종사하는 사람을 의미하는데, 현실성, 규제, 안전, 비용에 의해 부과되는 제한을 고려하면서 목표와 요구사항을 충족할 수 있도록 기계, 체계, 구조, 물질을 발명, 설계, 분석, 제작, 실험(테스트)하는 사람을 말한다.


이론을 연구하고 탐구하는 사람을 과학자라고 하고, 그 과학 이론을 사용해서 주어진 환경에서 실용적인 문제를 해결하는 사람을 공학자라고 한다. 소프트웨어 엔지니어는 단순히 소프트웨어를 만드는 것을 넘어서 소프트웨어 기술을 활용해서 당면한 문제를 해결하는 사람을 의미한다. 단순히 기술을 연구할 뿐만 아니라 기술이 어떻게 사용될지까지 고민하는 사람이다.


단순히 동작하는 프로그램을 만드는 사람은 프로그래머, 프로그램을 사용해서 어떤 제품이나 시스템을 만드는 사람을 개발자라고 한다면, 엔지니어는 어떤 기술을 어떻게 사용할지 결정하고, 시스템의 설계부터 폐기까지 모든 과정의 비용과 프로세스를 함께 고민하는 사람이라고 할 수 있다.


누구나 프로그래밍을 배울 수도 있고, 개발자가 될 수도 있다. 하지만 진정 소프트웨어와 공학을 좋아한다면, 소프트웨어 엔지니어가 되는 것을 추천한다. 개발자로 성장하는 방법에 대한 질문에 나는 주저 없이 엔지니어로 성장하라고 답한다. 넘쳐나는 코딩 교육과 학습 자료 덕에 프로그래머도 많고, 개발자도 많지만, 정작 소프트웨어의 본질을 깨닫고, 엔지니어링 마인드를 갖춘 사람은 좀처럼 찾아보기 힘든 것이 현실이다.


참고

'소프트웨어' 한 방 정리! [안될과학-긴급과학 X LG CNS]

[독후감] 뒤늦게 클린 아키텍처를 읽고

코더 - 나무위키

공학자 - 위키백과


keyword
수요일 연재