소프트웨어를 배울 때 겪는 어려움은 보통 5단계로 나뉘어진다. 우리가 무언가를 학습하고 활용할 때 처음엔 어렵고 버벅이지만 어느 순간 자연스럽게 모든 과정이 이해가 되듯 소프트웨어를 배울 때 누구나 경험하는 것은 점진적이 아닌 계단형 발전이다
인간은 행동할 떄 세세한 절차를 생각하며 행동하지 않지만 컴퓨터 언어는 위에서 아래로, 정해진 연산자의 순서대로 진행이된다
인간이 밥을 먹는 행위 조차 '팔의 근육에 신호를 주어 숟가락을 든 뒤, 밥알 사이를 45˚로 파고들어 퍼내어 입으로 가져간다' 라고 분해되며, 좀 더 잘게 분해한다면 엄청난 세부절차들로 구성된 일들이 많다. 때문에 처음 프로그램을 짜면 어느 정도까지 세부적으로 펼쳐야할지에 대한 고민도 많고, 놓치는 것이 많다
이렇게 무의식적으로 동작했던 모든 행위의 절차를 프로그래밍에선 모두 세세하게 지정해주어야 한다. 때문에 프로그램을 처음 배울 때는 어느 정도까지 세부적으로 펼쳐야할지에 대한 고민도 많고 놓치는 부분이 많다
이 어려움은 소프트웨어를 배우려는 동기가 없거나 부족한 이들에게는 너무 큰 문제이다
우리는 아침을 먹는다 할 때 보통 아침이라고 데이터의 집합을 말한다. 하지만 아침이 아침이기 위해서는 밥, 국, 반찬 등 수많은 데이터가 있으며 그러한 밥과 국, 반찬은 각각의 재료와 조리 방법 등 그 안에서도 많은 데이터가 존재한다. 사람은 당연히 그런 것이 그냥 당연하다고 생각하지만 프로그램을 만드는 사람은 이러한 데이터 하나하나를 선언하고 처리하는 코드를 작성해야 한다
말로는 쉽지만 이러한 생각을 코드로서 작성하기란 쉽지 않다. 사람은 행위와 데이터를 구분하지 않고 한번에 일을 처리하지만, 컴퓨터는 세 살배기 아이와 같아 하나하나 알려주는 과정을 거쳐야 한다
이 단계의 어려움은 각 프로그래밍 언어들이 명시적 또는 암시적으로 처리하는 데이터 타입의 다양성과 그 데이터를 처리하기 위한 구조적 표현 방식을 개념적으로 이해하는 일이다
자신이 가진 문제가 어떤 식으로든 간단하지 않은 데이터들과 관련이 있고, 그 문제를 프로그래밍 언어가 규정하는 문법에 따라 논리적·절차적인 방식으로 해결되어야 함을 느끼고 경험하는 것을 배우면 개발자와의 최소한 소통 능력을 가질 수 있다고 생각한다
이 단계에서 느끼는 어려움은, 그 동안 자동으로 된다고 믿었던 모든 것들이 원래부터 존재하는 것이 아니었고 누군가가 만들어준 도구였으며 이러한 도구가 없을 경우 스스로 모든 것을 0부터 쌓아 만들어야 한다는 것을 수용해야 한다는 점이다
여기서 프레임워크란 운영체제, 표준 라이브러리 등 우리가 직접 생성하지 않고 이용하는 모든 것과 다양한 프로젝트 도구까지를 의미한다. 이 3단계를 극복하는 수준에 이르면 프레임워크의 아름다움 때문에 새로운 프레임워크와 맞는 프로그래밍 언어, 도구들을 배워야 할 자발적인 학습 동기가 생기기 시작한다
이 과정에서의 어려움은 실제 프로젝트에서 프레임워크를 이용하는 과정에서 각 API, 함수, 기능들의 동작 방식, 리턴 값, 자료의 전달과 에러메시지 등 메뉴얼에 나와있는 내용들을 모두 이해해야 한다. 그리고 누가 만들어도 이러한 방식으로 만들어야 했었구나 라는 점을 깨닫는 과정을 경험해야 한다. 이 과정이 프로 개발자의 길을 갈 때 가장 중요하며 이 과정을 어설프게 넘기면 품질이 낮은 프로그램을 생산하게 된다. 이 단계를 거치며 코드 리뷰와 같은 개발 프랙티스를 같이 배워야 한다
이 과정을 지나면 이제 개발자로서 늠름하게 일을 할 수 있는 수준은 되었다는 것을 의미한다
쉽게 생각하는 알고리즘은 정말 쉽게 생각할 수 있지만, 파고들면 파고들 수록 효율적인 알고리즘은 제한적 자원인 컴퓨팅 파워와 메모리를 아끼기 위한 수학적·논리적 절차라는 것을 알 수 있다
내가 만들어내는 모든 것이 최적일 필요는 전혀 없지만 '누가봐도 최선의 효율로 동작하면 좋겠다'라는 간절함이 개발자에겐 필요하다. 그리고 이 부분은 학습 의지가 필요하며 이 의지가 흔들림이 4 단계의 어려움 이다
또한 패턴의 문제가 있다. 알고리즘에는 데이터에 대하여 동시성, 병렬성, Critical Section, Atomic Operation, Lock 등에 관한 설명 및 동기화/데드락 회피 방법을 배운다. 그러나 이러한 것들이 왜 문제인지 모를 가능성이 높으며 이 4 단계의 어려움은 경험적으로 이러한 문제를 이해하는 과정이다. 그리고 개발자라면 이 부분에 대한 경험적 이해가 반드시 필요하다
이 4 단계를 극복한 사람을 '만렙' 개발자라고 부를 수 있다. 이들은 위대하다
이 영역까지 오게 되면 다시 데이터의 문제가 나온다. 2 단계의 데이터에 대한 이해에 관한 어려움과는 전혀 다르다. 2 단계에서는 '사람이 생각하는 데이터'가 단위 데이터가 아니라는 점을 이해하기 어렵다는 것이고, 5 단계에서의 어려움은 세상의 모든 문제의 본질과 그 해결책이 데이터에서 기인한다는 것을 이해하는 것이다. 그렇기 때문에 빅 데이터·머신 러닝이 요즘 가장 중요한 단어인 이유이며 소프트웨어가 만들어내는 가치의 원천이 모두 데이터 인 것이다
데이터를 모아 저장하고, 처리하고, 분석하여 문제의 핵심에 해당하는 Insight를 얻는 전 과정이 전부 쉽지 않다. 이 영역에서도 각종 툴들이 존재하기 때문에 그 툴을 만드는 사람들과, Insight 영역에 집중하는 사람으로 분화되기도 한다
이 단계에서의 어려움은 앞선 단계들과는 달리 소프트웨어의 영역을 넘어서는 뭔가가 필요하다. 문사철/예술, 경제/경영, 수학/과학 등이 어려움의 전면에 있다. 정말 열심히 공부하고 경험을 쌓으면 제한적으로 통찰이 생기는 분야이며, 정말 시간과 힘을 들여 열심히 하지 않으면 뚫을 수 없는 영역이다
좋은 소프트웨어 교육이란 각 단계를 '충분한 경험을 쌓으며' 올라설 수 있게 도와주는 것이다. 좋은 경험은 능동적으로 문제를 해결할 수 있는 힘을 길러주며 이는 스스로 문제를 만들어보기도 하고 주변인들과 토론하고 비교하는 과정에서 쌓이게 된다
소프트웨어 엔지니어의 길은 멀고도 험하지만 반드시 도달할 수 있는 경지이다. 힘내자!