이야기를 시작하기에 앞서
이 분야 용어들은 명확한 것을 선호하지만 정작 명확하게 무언가를 만드는 법은 잘 없는 이 분야 사람들을 닮아서인지 명확하게 정의되어 있지 않다. 용어의 모호함을 해결하기 위해서 사용한 정의를 우선 적어둔다. 각 용어의 정의는 일반적인 정의보다 넓거나 좁을 수 있다.
- ‘알고리즘’1은 수학적으로 잘 정의된 작업, 절차의 목록이다.
- ‘코드(소스코드의 줄인 형태)’는 알고리즘을 프로그래밍 언어로 적어둔 것이다.
- ‘프로그램’은 명령어(컴퓨터가 실행할 수 있는)의 모음이다. 이러한 명령어 모음은 컴퓨터가 처음 나왔을 때는 직접 작성하기도 했지만, 현재는 대부분 코드를 변환하여 만들어 낸다.
- ‘소프트웨어’는 물리적인 하드웨어에 반하는 개념으로 비 물리적인 것 들의 모음이다. 프로그램과 각종 데이터, 프로그램에 사용에 필요한 설명서 등의 문서와, 계약을 포함한다. 즉, 소프트웨어는 사용의 단위이자 제품의 단위이다. 지적재산권의 개념이 생긴 뒤에는 우리가 ‘프로그램’을 쓴다고 표현해도 실제로 사용해 온 것은 명령어만 아니라 명령어를 실행하기 위한 각종 데이터와 ‘계약’이 필수적이므로, 사실 우리는 엄밀히 따지면 늘 ‘소프트웨어’를 써왔다고 말할 수 있다.
코딩은 쉽다
주어진 알고리즘(로직)을 코드로 옮기는 것은 쉽다. 정확히는 쉬워졌다. 전통적인 코딩의 어려움은 인간의 눈에 맞춰진 알고리즘과 달리 코드는 기계에 맞추어 적어야 한다는 점이었다. 그러나 많이 쓰이는 알고리즘일수록 무상 혹은 유상으로 코드 혹은 프로그램 조각들을 이미 많이 공유하고 있고, 인간의 기준에 맞추어 대충 적어도, 상황에 맞추어 최적의 코드로 변환하는 프로그램들도 이제는 충분히 개발되었다. 인터넷과 스마트폰을 중심으로 한 개발환경의 변화와 각종 서비스의 등장은 이러한 변화의 전파를 매우 빠르게 앞당기고 있다.
이제는 복잡한 일을 하기 위해서 코드를 ‘적을’ 필요도 없다. 단축어나 IFTTT 같은 서비스나 Excel 같은 프로그램들은 알고리즘을 코드(말 그대로 기호로)로 기록할 수 있게 해 준다. 집에 도착하거나 해가 뜨면 자동으로 불이 켜지고 꺼지는 시스템을 구성하는데 필요한 것은 적당한 하드웨어 그리고 몇 번의 클릭이다. 개발자의 코딩도 생각보다는 많이 다르지 않아서 손글씨를 인식하거나 사진을 촬영해서 서버에 업로드하는 등의 사람이 생각하기에 복잡한 것도 이미 공유된 코드와 자원을 활용하면 쉽게 만들 수 있다. 위의 예시를 구현하는데 필요한 코드수는 파이썬 프로그래밍 언어 기준 20줄 미만이다. 즉, ‘알고리즘’을 ‘코드’로 옮기는 ‘코딩’은 매우 쉬워졌다.
프로그래밍은 이상하다
코딩이 쉬워진 만큼 프로그램을 만드는 것은 오히려 복잡해졌다. 가끔은 마법같이 느껴질 정도이다. 코드를 작성하면, 어떠한 프로그램으로 변환될지 완벽하게 예측되던 시절도 있었다. 시스템의 종류도 다양하지 않고, 코드의 변환도 정적이었다. 그러나 요즘처럼 다양한 시스템을 사용하고 코드를 한 번에 변환하는 것이 아니라 중간단계를 섞어가며 실시간으로 알맞은 프로그램으로 변환하는 것이 주류가 된 상황에서는 실제 동작할 결과물을 예측하기가 어렵다. 대표적인 경우가 브라우저 위에서 돌아가는 Javascript로 이 경우 브라우저의 종류/버전/변종 여부, OS의 종류/버전, system(CPU 아키텍처 등등) 그리고 JIT의 동작 유무까지 포함되면, 일반적인 코드 하나가 수십 개의 프로그램으로 변환되고 사용된다.
그래서 현재 프로그램을 만드는 법은 코드를 작성하고 모든 경우에 잘 변환되고 실행하게 해달라고 신께 기도하는 법과, 변환가능한 모든 경우2 혹은 대표적으로 변환될 경우의 수에 대해 확인하거나 혹은 각 결과를 충분히 추적할 수 있는 보조 수단 등을 마련하는 법이 있다. 생각보다 많은 경우가 기도를 드리는 수준이고, 아니면 기도하니만 못한 상황이다.
소프트웨어를 만드는 것은 어렵다
소프트웨어를 만드는 것은 어렵다. 소프트웨어는 사용의 단위이자 문제 해결의 단위이다. 물론, 최종적인 문제 해결은 이를 이용하는 사람/단체에 달린 것이고 기본적으로 소프트웨어는 자료를 생성한다. 이를 ‘출력’이라고 부를 수 있다. ‘출력’을 위해서는 사용자가 무언가를 제공해야 한다. 이를 ‘입력’이라고 할 수 있다. 다시 말하면, 소프트웨어는 포괄적으로 보면 프로그램과 그에 따라 필요한 데이터 및 계약을 통해 ‘입력’을 ‘출력’으로 변환한다. 그러나 여기에는 가장 중요한 개념이 빠져있다. 수학적인 개념에서 소프트웨어는 독립적으로 동작하지만, 현실의 소프트웨어는 독립적으로 동작하지 않는다. 가장 기본적으로는 운영체제의 영향을 받지만, 그외에도 수많은 요소들이 소프트웨어의 동작에 영향을 준다. 예를 들면 하드웨어에 제공되는 전원의 형식이 직류인지 교류인지같은 가장 기초적인 부분들에도 소프트웨어는 영향을 받을 수 있다. 이러한 소프트웨어의 구동에 영향을 주는 모든 것들이 ‘환경’이라 부를 수 있다.
코딩이 쉽다, 쉬워졌다 라고 말하는 것은 이미 입력, 출력, 알고리즘과 환경이 충분히 정의되고 결정하고 통제할 수 있는 상황일때의 이야기이다. 현실은 어느 하나도 결정하는게 쉽지가 않다. 현재 온도를 출력하는 소프트웨어를 생각해보자. 하드웨어에서 나온 값은 얼마나 신뢰할 수 있는가? 출력된 값의 단위는 무엇인가? 우리는 소수점 몇째자리까지 보여줄 것인가? 소수점 아래의 값은 올림인가 반올림인가 내림인가? 현재 온도를 정의할때 이것은 가장 최근의 측정값인가 아니면, 지난 15분간의 이동평균을 이용해야 하는가? 온도출력이 잘못되어 화재가 났을 때 책임소재는 누구에게 있는가? 측정이 불가능할 때 온도는 몇 도로 표기해야 하는가?(0? -1? -274?) 사소한 결정조차 당연하지가 않다.
그러나 소소한 것까지 신경써서 결정한다고 해도 입력 출력 환경에 무관하게 누구나 사용할 수 있는 코드를 만드는 것은 불가능하다. 일단 현실의 데이터가 일반적으로 실수의 형태이지만, 대부분의 컴퓨터가 입력과 출력이 이진수로만 가능한 디지털 컴퓨터라는 점부터 그렇다. 각종 사용 기준과 제한 사항을 정해야 하고, 그러한 정하기 위한 수많은 논의와 조사가 필요하다. 이를 다시 문서와 계약으로 다시 만들어 내고, 이를 다시 코드에 반영하고 검증해야 한다. 이렇게 되면, 알고리즘은 10줄인데, 지원 코드는 수백수천줄이 되거나, 부가 데이터와 계약내용이 수천 줄이 되기도 한다. 은행이자 계산이 대표적인데, 이자 계산식은 보통 한줄 정도이지만, 윤년을 366일로 볼 것인지 365일로 볼 것인지에서 시작해서 0.3333…떨어지는 이자를 소수점 몇째자리에서 올림하며, 세금은 어떻게 처리할 것인지 까지가 모두 포함한다. 다시 말하면, 단순히 코드를 작성하는 것은 쉽지만, 이를 필요한 만큼 동작하기 위해서는 여러 지식과 절차가 필요하다.3
어떤 소프트웨어는 코드에서 시작하고 어떤 소프트웨어는 사용자의 요구에 따라서 시작된다. 어디서 시작했든 간에 충분한 검토절차를 거치지 않으면 계약을 이행하지 못하는 프로그램이 만들어진다. 종종 어떠한 코드들은 저작권 침해4나 개인정보 침해5같은 법적인 문제를 야기한다. 어떠한 사용자의 요구는 물리적으로 구현이 불가능하다.6 어떠한 요구는 프로그램을 만들 수는 있지만, 프로그램에 필요한 데이터에 법적인 문제7가 있거나, 혹은 데이터 생성에 너무 많은 비용8이 필요하다. 가끔은 계약에서 해결해야 할 문제를 코드의 문제로 변환해 버려서 방대한 코드와 시간을 낭비하는 경우9도 있다.
소프트웨어를 만드는 데는 적절한 단계와 적절한 속도가 필요하다. 일부 대표적인 소프트웨어와 환경에는 일부 패턴정도는 존재하지만 모든 상황에 알맞는 절대 법칙은 존재하지 않는다. 수많은 소프트웨어 제작 사례10가 도움은 되겠지만, 완벽하게 맞는 경우는 드물다. 하나의 절대 법칙이 이라면 계약을 하고 나서 일을 수습하려고 하면 무조건 실패한다는 것이다.
코딩은 쉽고 소프트웨어를 만드는 것은 어렵다
코드는 논리속에 존재한다. 하지만, 소프트웨어는 현실 위에 존재한다. 코드도 주요 요소이긴 하지만, 소프트웨어의 전부는 아니기에 그 바다같은 현실의 출렁거림을 이해하고 반영해야 한다. 사람들은 종종 완성에 필요한 요소(조직, 사람, 조직문화, 도구, 자금, 국적 등)를 고려하지 않고 코드 완성도와 소프트웨어의 완성을 논한다. 그러나, 현실과 상황을 고려하지 않은 논쟁은 무의미하고 무책임하고 탐욕적인 행동일 뿐이다.