초심자들을 위해서 코딩이란 능력의 본질을 이야기 해봅니다.
프로그래밍이 바로 코딩입니다. 우선 쓸데없이 격을 구분하고
가오를 넣으려는 그 마음을 버려야 합니다. 이 글을 보기 전에.
근본적으로 코딩은 노래, 미술, 복싱, 축구, 당구, 소설과 똑같은 것이지만
코딩이란 기술장르의 최대 단점은 기술깊이의 공감이 잘 안된다는 것입니다.
노래, 미술은 창작자가 누군지 알 필요도 없이 결과물만 몇초를 보고
그 퀄리티의 깊이를 쉽게 알아챌 수 있지만 코딩은 그게 안되니까
명성과 브랜드를 먼저 보고 결과물의 퀄리티를 예상(?)하게 됩니다.
헬로월드 따위도 구글에서 작성했다고 하면 쳐주고 반겨주게 되는거죠.
구글이 뉘 사람은 아니지만.. ㅎ
그래서 저는 코딩을 설명하기 위해 타 분야의 사례를
가져와서 설명을 합니다. 그게 훨씬 더 전달이 잘되거든요.
위 동영상은 클레이라는 겁니다. 가벼운 고무느낌의 점토입니다.
개발자가 입체의 모형을 만들기 위해서는 재료를 먼저 선택해야 합니다.
클레이는 Java정도 됩니다. 통나무를 깎아서 입체모형을 만든다면 그게 C++정도 되겠죠.
일단 동영상을 한번 쭉 봐주세요.
눈을 제작하는 장면이 있습니다. 동그라미를 몇개 만들어서
투명판으로 눌러버립니다. 왜 투명판으로 누를까요? 보면서 눌러야 하기 때문이죠.
누르면서 디테일하게 세밀한 힘조절을 합니다.
눈의 요소를 하나하나 잘라서 합칠 수도 있지만
저 개발자는 다 만들고서 자르는 선택을 합니다. 선택지가 있는 것이며
저 개발자의 다른 영상들을 보면 그 선택은 매번 조금씩 달라집니다.
토끼같은 귀를 제작할때도 어떤때는 덩어리 3개를 이어붙이고
어떤때는 덩어리 2개에다가 색면을 돌려 붙입니다.
저 개발자의 영상에는 4년전 만든 같은 캐릭터와 지금 만든 캐릭터를
비교해서 보여주는 영상이 있습니다. 어마어마하게 많이 만드는 다작 경험을
하고 있는 분입니다. 결과물의 퀄리티가 점점 향상되고 있네요.
그리고 또 느껴지는 것이 없나요? 바로 경제성입니다.
저 분은 무수한 클레이경험을 통하여
"시간과 노력을 덜 들이면서 더 높은 확율로 항상 높은 재현율의 성공방법"을
깨우치고 있다는 점입니다. 한마디로 경제성.
코딩의 성장단계도 마찬가지입니다.
레벨1) 기능별로 어떻게 만드는지를 배운다.
레벨2) 어떤 점이 힘들고 어떤 점이 쉬운지를 알게 된다.
레벨3) 경제성을 따져가며 구현하는 긴 훈련과정을 거친다.
레벨4) 자기에 맞는 도구를 찾거나 만들게 된다.
레벨5) 노가다부분을 컴퓨팅파워를 이용하여 자동화한다.
결과적으로 나의 뇌에 남는 것은 시뮬레이션능력이 될 것입니다.
저 클레이 개발자도 매번 여러가지 실수를 해가면서 하지는 않죠.
자신의 시뮬레이션능력으로 짧은 미래를 내다보면서
손이 움직이는 것입니다. 대체로 실수하지 않게 됩니다.
CPU 1200개 GPU 170개를 사용하여 수년간 기보를 학습시키고
이세돌을 꺾은 구글의 알파고가 근사해 보일지는 모르겠지만
그런건 상용기술이 될 수 없습니다. 경제성이 없기 때문입니다.
클레이를 하루종일 만지거나, 수억원짜리 기계를 만들어 클레이의 색상을
뽑아내면 안되는 것입니다. 경제적으로 만들 수 있어야 합니다.
아래 동영상은 일본 혼다의 아시모입니다.
많은 분들이 과거에 뉴스를 통해 아셨다가 잊어버리셨겠지만.
AI와 로봇공학의 꽃은 아시모였다고 생각합니다. 4차산업이라는 말이 나오기도 전이죠.
그러나 현재 아시모는 개발이 중단되었습니다.
아시모개발의 경제성 없음을 결국 못견딘거죠. 결국 알파고도 중단될 것입니다.
요즘은 어떤 로봇을 만드는지 아시나요?
꼭 인간형태의 휴머노이드를 만들지는 않고 4족 보행, 바퀴혼용식 보행.
꼭 머리가 있어야 하는 것도 아니고 팔만 있거나 인간의 몸에 부착하는 등
힘든 인간형태를 고집하지 않습니다. 왜? 경제성 때문에.
제가 위에서 정리한 성장단계에서 레벨2인
"어떤 점이 힘들고 어떤 점이 쉬운지"를 알아서 레벨3인
"경제성을 따지면서 구현하는" 단계로 넘어가고 있죠.
경제성을 따질때는 사람(인건비)도 그 계산에 넣어야 합니다.
아니 개, 곤충, 단순한 도구들도 그 계산에 다 넣어야죠.
내가 만드는 SW가 사람을 위한 것이니 내 SW앞에는
항상 사람이 있다는 겁니다. 그럼 사람을 이용하여
쉽게 넘어갈 수 있는 문제는 그렇게 해야죠.
그런데 이 경제성이라는 것이 사람마다 받아들이는 것이 다르고
추구하는 것이 다르며, 기업의 규모와 사풍에 따라 다릅니다.
명품을 만들 것인가? 기성품을 만들 것인가? 이런 다양한 척도가
SW개발에 영향을 끼치게 됩니다. 그래서 뭐다? 정답이 천차만별.
그러나 한번 도의 경지에 올라간 분의 뇌에 남은
시뮬레이션 능력은 다양한 생산과정에 응용될 수 있습니다.
재료가 클레이가 아니라 돌이거나 나무거나 시멘트거나.
만드는 결과물이 작거나 크거나에 약간의 영향은 있겠지만
결국 훨씬 빨리 최고점에 도달하게 됩니다.
그래서 뛰어난 프로그래머에게도 언어의 타입같은 것은
큰 영향이 없습니다. 특히 요즘 대부분의 코딩언어들은
매커니즘이 너무 유사하고 도구의 스펙이 서로 빼낀 것처럼
비슷합니다. 그래서 언어와 자신을 분리하고 이성과 감정을 분리하고
자기 언어와 개발환경도 비판할 줄 알아야 합니다. 수용도 하구요.
남들이 이룩해 놓은 방법과 이론에 주눅들지 마세요.
모든 것들이 장단점이 있습니다. 냉철하게 경제성을 따지는 레벨이 되면
시시한 것들이 많습니다. 대신 자신의 뇌를 발달하기 위한 훈련과정을
꾸준히 반복해야 합니다. 훈련만이 기술자를 경지에 올라가게 합니다.
외국의 유명한 기술들은 굳이 내가 찾아다니지 않아도
내 성장과정속에서 필연적으로 만나는 때가 있습니다.
내가 필요해서 그것을 만나고 배울 때 스펀지처럼 흡수할 수 있습니다.
끝으로 위 성장단계를 좀 더 코딩스럽게 부연설명하는 것으로 글을 마칩니다.
레벨1) 기능별로 어떻게 만드는지를 배운다.
- 통신을 하는 것은 결국 소켓사용법을 배우는 것이고.
- 파일은 스트림이라는 방식으로 제공되네.
레벨2) 어떤 점이 힘들고 어떤 점이 쉬운지를 알게 된다.
- TCP소켓은 패킷이 잘라져서 도달하니 붙이는 과정이 필요.
- UDP소켓은 패킷은 붙여오나 패킷자체가 사라져 버리기도 하네.
- 파일은 HDD, SSD에 따라 SEEK속도가 크게 차이가 나네.
- 파일을 통으로 메모리에 다 올리지 못하는 동영상플레이같은 상황도 있구나.
레벨3) 경제성을 따져가며 구현하는 긴 훈련과정을 거친다.
- 항상 포인터처리는 실수를 유발하네. 객체화/상속하는 것이 좋을까?
- 내가 뭔가 만들어 놓아도 외부기술과 연동하면 모든 질서를 확립할 수는 없네.
- 프로그램을 2개, 3개로 쪼개어 놓으면 재사용성이 늘어날까?
레벨4) 자기에 맞는 도구를 찾거나 만들게 된다.
- 매번 만들어야 하는 테스트도구는 라이브러리화하자.
- 텍스트 리소스로 구성된 리소스를 관리하는 에디터를 만들어 쓰자.
- 항상 사용하는 상용툴 몇개 정도는 구매해 두고 써야겠다.
레벨5) 노가다부분을 컴퓨팅파워를 이용하여 자동화한다.
- 병합과정이 너무 힘들다. 머징툴을 만들자.
- 리소스검증이 너무 힘들다. 빌드툴을 만들자.
- 코드리뷰가 너무 힘들다. 리뷰툴을 만들자.
- 기획자와의 소통이 너무 힘들다. 기획자에게 AI툴을 만들어 주자.