내가 15년간 프로그래밍을 하면서 얻은 가장 중요한 것
스티브 잡스: 더 로스트 인터뷰
스티브 잡스가 애플에 다시 복귀하기 직전인 1995년, 잡스를 인터뷰한 내용을 담은 <스티브 잡스: 더 로스트 인터뷰>라는 다큐멘터리 영화가 있습니다. 이 인터뷰에서 그는 다양한 주제에 관한 독창적이고 영감이 넘치는 생각을 밝히는데요. 그중에서도 특히 프로그래밍에 관한 이야기가 제게 깊은 인상을 주었습니다.
저는 이 나라 모든 국민들이 프로그래밍을 배워야 한다고 생각합니다. 컴퓨터 언어를 배워야 하는 이유는 사고하는 법을 배울 수 있기 때문입니다. 로스쿨 가는 것과 마찬가지예요. 저는 모든 사람이 변호사가 될 필요는 없다고 생각합니다만 로스쿨에 가는 것은 유용하다고 생각해요. 특정 방식으로 사고하는 요령을 가르쳐 주기 때문이죠. 그와 마찬가지로 컴퓨터 프로그래밍 역시 사고하는 법을 길러줍니다. 방식은 살짝 다르지만요.
아쉽게도 그는 자신이 프로그래밍을 통해 얻은 사고방식이 무엇인지는 구체적으로 말하지 않습니다. 그저 프로그래밍을 통해 어떠한 사고방식을 얻을 수 있는데, 이 사고방식은 모든 사람이 프로그래밍을 교양으로써 배워야 할 정도로 매우 유용하다고 이야기했을 뿐입니다.
비록 잡스가 배운 사고방식과 같은지는 확인할 길이 없지만, 저 역시 십수년간 프로그래밍을 하면서 한 가지 사고방식을 얻게 되었습니다. 이 사고방식은 제가 개발자로서 일할 때뿐만 아니라 다양한 상황에서 매우 유용한 시각을 제공합니다. 이 글에서는 제가 프로그래밍을 통해 얻은 이 사고방식이 과연 무엇이고 어떤 도움을 받았는지 공유하고자 합니다.
저녁 약속과 발렛 주차
금요일 저녁 강남에서 저녁 약속이 있다고 가정해 봅시다. 교통 체증도 문제지만 주차 때문에라도 차를 가져가야 할지 말아야 할지 고민이 될 것입니다. 약속한 식당에 주차장이 있다면 좋겠지만 만약 없다면 주변에 주차장이 있는지 확인해야 합니다. 또한 식당과의 거리는 얼마나 되는지, 주차 요금은 얼마인지, 빈자리가 있는지 알아봐야 합니다. 만약 적당한 주차장을 찾지 못해 하는 수 없이 골목에 주차를 하고 약속 장소로 이동했다면 식사하는 내내 주차 위반 딱지를 받게 될까 봐 걱정을 놓을 수 없겠죠.
하지만 식당에서 발렛 주차 서비스를 제공한다면 많은 것이 달라집니다. 우리는 그저 약속 시간에 맞춰 식당에 도착한 다음 직원에게 키를 넘겨주기만 하면 됩니다. 식사를 마친 후에는 발렛 요금을 지불하고 직원에게 출차를 요청하면 어딘가에 주차되어 있던 차를 식당 앞까지 가져다줍니다. 발렛 서비스 덕분에 우리는 식당 근처에서 가장 가까운 주차장은 어디인지, 그 주차장에 빈자리가 있는지 없는지, 빈자리가 없을 경우 대안이 있는지에 대해서는 전혀 고민할 필요 없이 우리의 본래 목적인 약속 시간 안에 식당에 도착하는 것만 생각할 수 있습니다.
소프트웨어 개발과 인터페이스(Interface)
저는 발렛 주차를 경험할 때마다 소프트웨어 개발의 인터페이스(Interface)라는 개념이 생각납니다.
일반적으로 소프트웨어를 개발할 때에는 큰 시스템을 여러 개의 작은 요소(Component)로 나눠 개발한 다음 이 요소들을 다시 결합하는 방식으로 개발합니다. 소프트웨어 설계자는 각 요소가 다른 요소들이 <무엇을 할 수 있는지>만 알고 <어떻게 실행하는지>에 대해서는 알 필요가 없도록 전체 시스템을 설계합니다.
여기서 각 요소가 <무엇을 할 수 있는가>를 정의한 것이 바로 인터페이스(Interface)로, 다른 요소들에 자신이 무엇을 할 수 있다고 약속하는 것과 같습니다. 반면에 <어떻게 실행하는가>를 소프트웨어 개발에서는 구현(Implementation)이라고 하며, 구현은 인터페이스에 정의된 것을 약속대로 수행하는 것을 말합니다. 조금 더 쉬운 이해를 위해 두 개념을 발렛 주차의 예를 들어 설명하면 다음과 같습니다.
발렛 주차 서비스의 인터페이스
- 식당 앞에서 차를 세우고 키와 차를 넘겨준다
- 식사가 끝난 후 발렛 비용을 지불하고 출차를 요청하면 차를 가져다준다.
발렛 주차 서비스의 구현
- 식당 옆 주차장에 주차한다
- 근처 기계식 주차장에 주차한다
- 길 건너편 공터에 주차한다
- 뒷골목에 몰래 주차한다
- 기타 등등...
이렇게 인터페이스와 구현을 분리했을 경우 발렛 주차 서비스의 수요자와 공급자는 어떤 이익을 얻게 될까요? 앞서 이야기한 것처럼 수요자인 발렛을 맡기는 고객은 발렛 주차의 인터페이스만 알면 되고 발렛 주차의 구현에 대해선 아무 생각 안 해도 됩니다. 다시 말해 그들은 주차를 어떻게 할지에 대해서는 전혀 고민할 필요 없이 자신의 진짜 목적인 약속 장소에 시간에 맞춰 도착하는 것만 신경 쓰면 됩니다.
공급자인 발렛 업체는 고객에게 발렛 주차를 서비스하는 방법만 그대로 유지한다면 주차 장소나 방법을 변경하더라도 고객에게는 아무런 영향이 가지 않기 때문에 사업을 필요에 맞게 유연하게 운영할 수 있다는 장점을 얻을 수 있습니다. 많은 차를 주차할 수 있는 주차타워를 짓고 발렛 서비스를 운영하건 뒷골목에 요령껏 주차해 비용을 절감하건 고객이 원할 때 차를 안전하게 가져다줄 수만 있다면 고객을 만족시킬 수 있습니다.
Amazon Web Service와 인터페이스 계층
다른 예를 좀 더 들어보겠습니다. 아마존의 AWS, 구글의 Google Cloud Platform(GCP), 마이크로소프트의 Azure 같은 서비스들은 컴퓨팅에 대한 인터페이스를 고객에게 제공하고 있습니다.
보통 웹사이트나 모바일 앱 등의 소프트웨어를 고객에게 서비스하기 위해서는 소프트웨어에서 사용하는 데이터를 보관하고 처리하는 컴퓨터인 서버가 필요합니다. AWS가 등장하기 전 서버가 필요한 회사들은 직접 데이터 센터를 짓고 많은 수의 컴퓨터를 직접 구매하고 관리했어야 했습니다. 이 데이터센터를 제대로 운영하려면 천재지변이 발생했을 때 데이터 유실을 막기 위해 여러 곳에 데이터를 분산해서 보관하고, 수많은 컴퓨터가 사용하는 전력을 안정적으로 확보하고 수많은 컴퓨터에서 나오는 높은 열을 식힐 수 정도로 냉방 장치를 설치하는 등의 많은 설비 투자가 필요할 뿐만 아니라 이를 지속해서 관리하기 위한 인력을 고용해야 하므로 큰 비용이 들었습니다.
또한 웹사이트나 서비스가 성공해 소비자의 수요가 급격하게 늘어났을 때 서비스를 안정적으로 운영하려면 미리 수요를 예측해 서버의 수를 늘려야 했는데, 이 예측에 실패한 경우 서비스의 장애가 일어나 어렵게 얻은 고객을 실망시키거나 심지어 잃는 경우도 많았습니다. 반면 장애를 막기 위해 많은 수의 서버를 증설했지만 예상과는 달리 트래픽이 늘어나지 않았다면 불필요한 설비를 증설하기 위해 투자한 비용은 기업에 큰 부담이 될 수밖에 없었습니다.
AWS와 같은 클라우드 컴퓨팅 서비스는 IT 기업들에 데이터 센터에 대한 인터페이스를 제공합니다. 이런 클라우드 컴퓨팅을 통해 고객은 크게 두 가지 장점을 누릴 수가 있습니다. 첫 번째로 고객사들은 실제 데이터 센터를 어느 곳에 만들지, 서버를 얼마나 증설할지와 같은 데이터센터의 구축(구현)에 관해서는 전혀 고민하지 않은 채 그저 그 컴퓨팅 파워를 활용해 무슨 비즈니스와 서비스를 구축하면 되는지 고민하는 데 역량을 집중할 수 있다는 점입니다.
두 번째 장점은 클라우드 컴퓨팅 서비스는 초기 투자 비용 없이 쓴 만큼 과금되는 구조이기 때문에 초기 투자 비용을 아낄 수 있다는 것입니다. 또한 컴퓨팅 수요에 따라 서버의 숫자를 순식간에 늘리고 줄일 수 있기 때문에 서버 수요를 예측할 필요 없이 실수요가 변할 때마다 유연하게 대응할 수 있습니다. 이러한 특징은 수요 예측은커녕 수요가 존재하는지에 대한 검증조차 아직 되지 않은 스타트업이나 신사업에서 막대한 비용을 초기에 투자하지 않고도 여러 가지 비즈니스 모델과 프로토타입을 실험해 볼 수 있는 환경을 제공하기 때문에 기업에 아주 커다란 가치를 줍니다.
더 나아가 클라우드 컴퓨팅 사업자는 처음에는 CPU와 스토리지와 같은 하드웨어 인프라 사용에 대한 인터페이스를 제공하는 IaaS(Infrastructure as a Service)로 사업을 시작했지만, 현재는 이 인터페이스 위에 고도화된 애플리케이션 서비스, 데이터 분석, 추천 시스템, 자연어 처리, 빅 데이터 웨어하우스를 구축하여 고객사들이 더욱 비즈니스에 집중할 수 있는 환경을 제공해 주고 있습니다.
이러한 사고방식은 또 어디에 적용되는가?
이외에도 인터페이스는 우리 주변에서 너무나도 쉽게 찾아볼 수 있습니다. 우리는 기계어 대신 프로그래밍 언어를 통해 컴퓨터에 일을 시킬 수 있습니다. 프로그래밍 언어라는 인터페이스를 통해 우리는 기계어를 직접 알 필요 없이 프로그램을 작성해 컴퓨터를 동작시킬 수 있습니다. 컴퓨터 안에서는 여러 장치가 서로 전자로 된 신호를 주고받지만, 우리는 마우스와 키보드, 모니터 등의 인터페이스를 통해 컴퓨터와 상호작용을 할 수 있습니다. 자동차 역시 복잡한 기계장치들이 서로 맞물려 전, 후진 방향 전환 등의 동작을 하지만 우리는 핸들을 원하는 방향으로 꺾거나 액셀과 브레이크 페달을 밟는 간단한 조작만으로 이 기계, 전자 장치를 모두 통제할 수 있습니다.
기존에 없던 인터페이스를 누군가에게 제공함으로써 거대한 사업과 기업을 만든 사례도 많습니다. 앞서 이야기한 클라우드 컴퓨팅 사업자 외에도 배달의 민족이나 쿠팡 이츠 같은 배달 플랫폼은 어떨까요? 이들 사업은 배달 인프라(오토바이, 배달 시스템)가 없는 매장들에 배달의 인터페이스를 제공해 줍니다. 배달 사업자가 음식을 고객에게 전달하는 과정을 모두 담당하기 때문에 매장은 음식을 만드는 일에 집중할 수 있고, 매장만 운영할 때보다 더 높은 매출을 일으킬 수 있습니다.
이렇듯 잘 설계된 인터페이스는 사용자에게는 더 중요하고 본질적인 일에 집중할 수 있는 힘을, 공급자에게는 변경의 유연함과 효율화의 기회를 제공합니다.
인터페이스 도입은 공짜가 아니다
하지만 모든 인터페이스가 성공적이지는 않습니다. 인터페이스를 도입할 때는 특히 주의해야 할 몇 가지 요소가 있습니다.
첫째, 구현을 잘해야 합니다. 만약 발렛 주차를 맡겼다가 다시 차를 받았을 때 흠집이 생기거나 주차 위반 딱지를 받았다면, 다시는 그 발렛 서비스를 이용하지 않을 것입니다. 인터페이스가 사용자에게 가치를 주려면, 공급자는 약속한 대로 일을 수행해야 합니다. 이 신뢰가 없다면 사용자는 인터페이스를 이용하지 않고 직접 일을 처리하려 할 것입니다.
둘째, 인터페이스의 경계와 내용을 잘 설정해야 합니다. 인터페이스는 한 번 정의되면 이를 중심으로 구현이 이루어지기 때문에 변경에 큰 비용이 들 수 있습니다. 사용자를 다시 교육하고, 구현을 모두 변경해야 하기 때문입니다. 잘 추상화되지 않은 인터페이스는 오히려 비용만 가중시키는 결과를 낳을 수 있습니다.
다시 말해 인터페이스는 공짜가 아닙니다. 인터페이스를 잘 구현하고 운영하는 데 드는 비용뿐만 아니라, 사용자를 교육하는 데 드는 비용 역시 고려해야 합니다. 따라서 인터페이스 도입은 수요자와 공급자 모두에게 비용 이상의 가치를 제공할 때만 그 의미가 있다는 점을 명심해야 합니다.
결론
스티브 잡스가 언급한 것처럼, 프로그래밍을 배우는 것은 단순히 기술을 익히는 것을 넘어서 사고하는 방식을 배우는 것입니다. 지난 15년간 제가 프로그래밍을 통해 얻은 가장 중요한 교훈은 바로 인터페이스와 구현의 개념이었습니다. 이는 프로그래밍을 넘어서 삶의 다양한 측면에서 적용할 수 있는 귀중한 사고방식입니다.
잡스가 모든 사람이 프로그래밍을 배워야 한다고 주장한 이유도 어쩌면 이러한 사고방식이 우리를 더 나은 문제 해결사로, 더 나은 사고자로 만들어 줄 수 있기 때문일 것입니다. 프로그래밍은 우리에게 복잡한 문제를 단순화하고, 중요한 것에 집중할 수 있게 해주는 도구입니다. 저는 앞으로도 이 사고방식을 바탕으로 더 많은 도전을 마주하고, 문제를 해결해 나가며, 성장할 수 있기를 바랍니다. 이 글을 읽는 여러분도 프로그래밍을 통해 자신의 삶을 더욱 풍요롭게 만들 수 있는 자신만의 사고방식을 얻으실 수 있기를 기원합니다.