소프트웨어를 잘하려면 하드웨어도 잘 이해해야 하는 이유
컴퓨터(Computer)는 외래어로 그냥 컴퓨터라고 부르지만, 이름 그대로 원래는 계산을 하는 용도로 만들어진 장치다. 간단한 덧셈 뺄셈에서 보다 복잡한 수학 연산과 논리적인 연산을 엄청난 속도로 실행하도록 발전을 거듭해 왔지만, 컴퓨터의 가장 근본적인 구조는 역시 계산기에 저장 공간이 있는 기계인 것이다.
현재 우리가 사용하는 개인용 컴퓨터 (PC: Personal Computer)는 너무나 많은 기능과 저장 공간, 빠른 처리속도, 인터넷 접속, 업무용 문서처리나 화려한 멀티미디어 및 게임 등의 기능을 제공해서 너무나 복잡하고 이해하기 어려워 보이는 것이 사실이다.
그래서 처음에 소프트웨어를 배우는 과정을 보면 컴퓨터의 구조를 이해하기보다는, 그건 그냥 다른 사람들이 만들어주는, 당연히 주어지는 환경으로 생각하고 넘어가는 경우가 많다. 또한 컴퓨터의 사용에 있어서 가장 기본이 되는 소프트웨어인 운영체제 (OS: Operating System)도 역시 마찬가지로 그냥 기본적으로 주어지는 환경으로 생각하고 넘어가기도 한다.
필요한 부분에만 집중을 해서 배우기에도 알아야 할 내용이 너무나 많고, 어차피 당장 내가 하고 싶은 업무에 크게 중요하지 않은 분야라고 생각을 하는 것도 충분히 이해가 간다. 예를 들어서 내가 관심 있는 분야가 PC에서 돌아가는 게임을 개발하는 것인데, PC의 자세한 구조나 윈도 운영체제를 알아야 할 필요가 있겠냐는 생각을 할 수도 있다.
하지만 조금 더 넓게 볼 필요가 있다고 생각한다. 첫 직장에서부터 나중에 수십 년이 지나 은퇴를 할 때까지 비슷한 분야의 업무만 할 확률이 얼마나 될까? 지금처럼 기술의 발전 속도가 엄청나게 빠른 세상에서, 인공 지능이 점차 실용화되는 세상에서, 내가 하고 싶은 일, 혹은 처음에 하게 된 일을 평생 하게 될 확률은 거의 없을 것이다.
설사 평생 어떤 특정 분야에만 깊이 파고들어서 그 분야의 끝을 보고 싶다고 해도 여전히 기초를 탄탄하게 쌓는 것은 중요하다. 땅에 구덩이를 팔 때도, 좁고 깊게만 파고 들어가면 처음에는 속도가 빠른 것 같아도 점점 한계를 맞게 되는 것과 비슷하다. 정말로 깊게 구덩이를 파고 싶다면 처음부터 넓게 파기 시작해야 오래 그리고 보다 더 깊이 들어갈 수 있다.
내가 거의 한평생 일을 해온 분야는 임베디드 컴퓨팅(Embedded Computing)이라는 분야이다. 이름이 의미하는 것처럼, 컴퓨터가 어떤 장치의 일 부분으로 들어가 있어서 컴퓨터처럼 보이지도 않고, 그 안에 복잡한 소프트웨어가 돌아가고 있는지도 잘 모르는 사람이 많다.
하지만 우리가 눈떠서 사용하는 커피머신부터, 토스터, 냉장고, 텔레비전, 블루투스 이어폰, 자동차, 신호등, 지하철, 에스컬레이터와 엘리베이터, 도어록 등등 이 세상은 이렇게 수없이 많은 숨어있는 컴퓨터와 소프트웨어에 의해서 유지되고 있다고 해도 과언이 아니다.
휴대폰도 예전에는 임베디드 컴퓨팅의 한 분야였었다. 전화를 걸고 받는다는 기능에 특화되어 있는 일종의 숨어있는 컴퓨터였다. 하지만 스마트폰의 등장으로 휴대폰에도 화면이 생기고, 앱스토어에서 애플리케이션을 받아서 인터넷도 하고 게임도 할 수 있는 등, 이제는 일종의 휴대용 컴퓨터로 사람들이 많이 인식을 하는 것 같다.
휴대폰이나 개인용 컴퓨터가 연결되는 인터넷, 그리고 우리가 흔히 사용하는 소셜 네트워크 서비스들도 서로 연결된 컴퓨터에 의해서 제공되는 것이다. 엄청나게 거대한 저장 공간과 매우 빠른 인터넷 그리고 수많은 컴퓨터들이 서로 연결된 이 공간을 클라우드(Cloud)라고 부르고, 이런 곳에서 사용되는 컴퓨터를 서버(Server)라고 부르기도 하지만, 이것도 크게 봐서는 대용량 서비스 처리에 최적화된 하나의 컴퓨팅 구조(Computing Architecture)라고 볼 수도 있고, 그래서 이를 클라우드 컴퓨팅이라고도 한다.
이렇게 다양한 분야에서 다양한 용도로 컴퓨터가 사용되는데, 당연히 이런 컴퓨터는 소프트웨어가 없다면 그냥 복잡하게 얽힌 전자기기로 이루어진 깡통일 뿐이다. 물론 그 반대의 경우도 마찬가지이다. 소프트웨어라는 것은, 가장 간단한 형태로 표현하면, 외부에서 어떤 입력을 받아서, 필요한 계산을 하고, 그것을 다시 외부로 출력을 해 주는 역할을 한다. 외부 세계와 이어주는 하드웨어가 없는 소프트웨어는, 아무리 천재적인 아이디어가 있다고 할지라도 그냥 좋은 이론일 뿐이다.
사람의 목소리를 입력으로 받아서, 전기 신호로 변환하고 필요한 계산을 해서 안테나를 통해서 통신사에 보내준다. 통신사에서 들어온 전기 신호를 받아서 압축을 풀고 필요한 계산을 해서 목소리로 변환해서 스피커로 보내준다. 이것이 휴대폰이 하는 전화 통화의 원리이며, 이런 일을 하는 하드웨어와 소프트웨어를 같이 통틀어서 모바일 컴퓨팅이라고 부르는 것이다.
장비 내부의 온도를 입력으로 받고, 필요한 계산을 해서 냉매가 통과하는 압축기와 밸브 등을 제어함으로써 온도를 낮추면 냉장고가 되고, 반대로 코일로 전류를 보내는 스위치를 켜서 온도를 올리면 토스터기가 되는 것이다. 자동차 가속 페달이 밟힌 정도를 입력으로 받아서, 필요한 계산을 한 다음에 엔진에 들어가는 연료의 양을 늘리거나 모터로 가는 전류의 양을 늘리는 것도 모두 임베디드 컴퓨팅에서 하는 일들이다.
우리가 분명하게 컴퓨터라고 인지하고 있건 아니건, 모든 소프트웨어는 외부 세계의 물리적인 입력을 받아서 이를 전기 신호로 변환한 후에, 컴퓨터를 통해서 계산을 하고, 그 계산된 결괏값을 다시 외부 세계의 물리적인 출력 형태로 바꾼다는 기본적인 동작 원리를 갖고 있다. 따라서 어떤 분야의 소프트웨어를 개발하던, 컴퓨터라는 하드웨어가 어떤 방식으로 동작하는지를 잘 이해하는 것은, 소프트웨어 엔지니어로서 가장 단단한 기본을 갖게 되는 것이다.