함께 자라기 애자일로 가는 길 - 독후감 연재

[#9] 프로그래밍 언어 배우기의 달인

지상낙원 2022. 3. 2. 06:05

※ 빨간색 글씨 : 책 속 내용 중 중요하다고 생각하는 것
※ 파란색 글씨 : 제가 쓴 내용 중 중요하다고 생각하는 것

미 육군에서는 9년간 약 4천만 달러를 들여 개발한 지뢰 탐지 시스템을 취소하려고 하고 있었습니다. 프로토타입을 실제로 테스트한 결과 지뢰 탐지율이 너무 낮았기 때문이죠. 테스트에 따르면 저금속(low-metal) 대인 지뢰를 96%나 탐지에 '실패'하는 처참한 결과를 보였습니다.

카네기 멜론 대학교의 심리학과 교수 스타죠프스키는 지뢰 탐지에 대한 소위 아웃라이어(평균을 훌쩍 뛰어넘는 탁월한 사람)를 찾아갔습니다. 그중 하나가 플로이드 로키 락웰(Floyd Rocky Rockwell)이었습니다.

그는 새로운 장비를 갖고 저금속 지뢰를 찾을 수 있었습니다. 하지만 플로이드는 다른 대부분의 전문가들과 마찬가지로 자신이 어떻게 지뢰를 찾을 수 있는지 설명하지 못했습니다.

...

플로이드는 메뉴얼대로 장비를 사용하지 않았습니다.  그는 단순히 소리에 반응하는 게 아니라(사실 그는 다른 지뢰 탐지인에 비해 청력이 꽤나 떨어졌습니다) 소리의 패턴을 잡아내고 있었고, 매뉴얼에서 제안하는 속도보다 더 느리게 진행하고, 매뉴얼에 적혀 있는 높이보다 낮은 높이에서 탐지기를 사용했고,

...

스타죠프스키 교수는 플로이드 자신조차 인지하지 못하고 있던 이 비결을 다른 군인들에게 5일간 가르치고

...

훈련 전에 10% 대에 머물던 탐지율이 훈련 후 90%를 넘어서게 되었습니다.

 

  대부분의 사람들은 매뉴얼을 찾고 그것을 기반으로 학습하려는 경향이 강합니다. 저 또한 어떤 학습을 위해 책을 구입하여 읽고 그것대로 하려고 합니다. 그런 관점에서 본다면, 책 속의 지뢰탐지율 향상 방법은 다른 매뉴얼대로 하지 않고 다른 방법을 찾아서 해결한 것입니다. 탐지율의 향상폭이 너무 커서 매뉴얼이 의미가 없을 정도라고 생각될 정도입니다. 다만 이런 예시가 많은지는 궁금합니다. 과학이라는 것은 결국 사실의 명확함을 기반으로 문서를 작성하였을 텐데요. 매뉴얼이 정답이 아닐 수도 있다는 좋은 예시라고 생각합니다.

 

  그래서 제가 알고 있는 메뉴얼대로가 아닌 다른 방법을 통하여 성공한 케이스를 스포츠 분야에서 찾아볼 수 있었습니다. 일본 야구선수 스즈키 이치로는 기존의 타격 이론을 완전히 반(反)하는 이론으로 메이저리그에서 3000안타 이상을 기록하였습니다.  관점에 따라서 다르게 생각할 수 있지만, 축구선수가 양발을 다 사용하는 것을 매뉴얼로 생각한다면, 네덜란드 국적의 극 왼발잡이로 성공한 선수인 아르연 로번이 있습니다. 이렇듯 메뉴얼대로 하지 않았음에도 자신의 분야에서 성공한 케이스가 존재는 합니다.

 

저는 코칭이나 컨설팅을 할 때 이런 '인간' 역엔지니어링(reverse engineering) 방법을 사용하고, 또 가르치고 있습니다.

...

프로그래머나 관리자뿐만 아니라, 소위 전문가가 되려는 모든 사람에게 유용한 방법입니다. 미 해군의 연구 결과 선생과 학생들이 이 방법을 배워서 협력적으로 사용하는 것이 교육 효과를 높인다는 걸 발견했습니다.

...

S 님은 국내 오픈소스 쪽에는 널리 알려진 탁월한 프로그래머입니다. S 님의 어떤 전문성을 끌어낼까 하다가 '프로그래밍 언어를 배우는 전문성'을 하기로 했습니다. S 님은 프로그래밍 언어를 빨리 또 깊이 있게 습득하는 능력을 가졌습니다.

 

  역엔지니어링이란 설계도 없이 완성품으로부터 설계를 추론하는 것이라고 합니다. 소프트웨어 개발에 있어서는 대부분 순(?) 엔지니어링이 기본이라고 생각합니다. 보안과 같이 특수한 도메인이 아니라면 역엔지니어링 대신 설계서대로 하는 것이 효율적인 방법이라고 생각합니다. 그런데, 정답이 없고, 명확하지 않은 영역이라면 역엔지니어링이 좋은 방법이라고 생각합니다. 예를 들면, AI에 의하여 "프로그래머라는 직업이 사라질까?"에 대한 질문에 답하려면, 프로그래머들이 어떻게 AI시대에 대응하고 있는지를 찾아보면 도움이 되지 않을까 생각해봅니다.

 

튜토리얼을 읽을 때 뭘 만들지 생각하고 읽는다

...

읽을 때 다음 작성할 프로그램을 염두에 둔다는 점입니다. 그래서 튜토리얼을 읽다가도 이정도면 그 프로그램을 작성할 수 있겠다는 생각이 들면 그 자리에서 읽기를 멈추고 코딩을 시작합니다.

...

이런 것을 적극적 읽기라고 합니다. 

...

참고로 S 님이 첫 번째 목표로 주로 삼는 프로그램은 단어 개수 세기 프로그램이라고 합니다.

 

  저 또한 새로운 언어를 익히기 위해서 주로 정렬알고리즘을 작성해왔는데요. 문자열을 다루는 측면에서 본다면 '단어 개수 세기'가 좋은 훈련 목표가 될 것 같다는 생각이 들었습니다.

 

공부할 때 표준 라이브러리 소스코드를 읽는다

자연 언어 교육과는 다르게 프로그래밍 언어 교육에서는 읽기보다 쓰기를 더 강조하는 경향이 있습니다. 하지만 프로그래머가 실제로 업무를 할 때에는 코드를 읽는 시간이 쓰는 시간을 압도합니다. 좋은 코드를 읽어봐야 좋은 코드를 쓸 수 있기도 하고요.

...

표준 라이브러리는 보통 해당 언어 발명자가 직접 작성하거나 적어도 해당 언어의 스타일을 따르는 소수의 사람들이 작성합니다. 가장 그 언어다운 코드들의 말뭉치이지요.

 

  자연 언어인 영어를 공부하면서 연어(Collocation)이라는 것을 쓰지 않으면 엉터리 영어(콩글리쉬)를 사용하게 됨을 알았습니다. 예를 들면, 한국에서 즉석식을 영어로 패스트푸드(fast food)라고 쓰지, 퀵 푸드(quick food)라고 말하거나 쓰지는 않습니다. fast와 quick은 같은 뜻이지만 영어권 나라에서는 fast food를 사용한다는 것입니다. 마찬가지로 컴퓨터 프로그래밍 언어에도 비슷한 원칙이 적용될 수 있을 것 같습니다. 예를 들면, 자바에서는 상수를 대문자를 사용해서 표현하는 것이 관용적으로 사용하는 것은 자바다운 원칙을 지키는 것이라고 생각합니다.

 

공부 중 다른 사람의 코드에 내가 필요한 기능을 추가한다

...

S 님은 당시 SSH 클라이언트에서 지원되었으면 하고 바라던 특정 기능이 있었다고 합니다. 그래서 자신이 공부하던 언어로 구현된 오픈소스 SSH 클라이언트를 찾아 다운받고, 코드를 읽어가며 새 기능을 추가했다고 합니다.

더욱 인상적인 부분은, 처음 이 언어를 공부하기 시작한 시점부터 다른 사람이 완성한 프로그램에 자신이 필요한 기능을 추가하기까지 걸린 시간이 길지 않았다는 점입니다(며칠 이내).

...

이런 방식을 통해 자신이 튜토리얼을 읽으며 이해한 내용을, 실제로 살아 있는 코드를 수정하고 돌려보고 하는 등 실험하면서 피드백 받을 수 있었습니다. 더 나아가, 해당 오픈소스 커뮤니티와 교류를 통한 피드백받기도 가능했겠지요.

 

  사실 마지막 글은 동기부여가 되기에 진입장벽이 높은 예라고 생각합니다. "S 님"이라는 사람은 그야말로 잘하는 사람이기에 필요한 기능까지 추가해서 오픈 소스 커뮤니티와 교류를 통한 피드백이 가능했다고 생각합니다. 소스코드를 통해 필요한 기능 추가 말고 난이도가 낮은 다른 부분(번역, 오타 수정, 도움말 문서 작성) 등도 기능 추가만큼은 아니더라도 충분한 동기부여가 될 것이라고 생각합니다. 물론 코드를 수정할 수 있다면 그렇게 하는 것이 좋다고 생각합니다.

 

전문성을 효과적으로 뽑아내는 전문가가 되기

S 님에게 새로운 언어를 공부하는 비결을 배웠듯이, 타 영역에서도 전문가로부터 그의 비결을 배워 실행에 옮긴다면 어떨까요? 

...

제 코칭 경험에 따르면 단기간에 놀라운 효과를 냅니다. 경험이 전무한 IT 분야에 도전했는데 해당 분야 경력 5년 차를 2~3개월 만에 앞지를 수 있었다, 혹은 당구나 스노우보드를 빨리 배울 수 있었다 같은 무용담을 들려주곤 합니다.

...

그러면 여기에서 궁금한 점은 도대체 어떻게 해야 이런 비결들을 효과적으로 뽑아내냐는 것이겠죠. 한 가지 분명한 것은, 제가 S 님에게 "프로그래밍 언어를 빨리 배우는 비결이 무엇인가요?"라고 묻지 않았다는 겁니다.

...

이런 질문을 받았을 때 전문가들은 너무 일반적인 답(예컨대 "연습하세요!")을 하거나,

...

그렇다면 어떻게 해야 할까요? 한 가지 비결은 전문가가 구체적인 사건에 대해 말하도록 유도하는 겁니다. 경찰에서 증인을 효과적으로 심문하기 위해 쓰는 기법도 이와 비슷합니다.

...

'전문가가 빨리 되기'를 위해서는 '전문가에게서 전문성을 효과적으로 뽑아내기'에 대해 전문가가 되어야겠지요.

 

  이 부분을 읽고 갑자기 생각나는 전형적인 인터뷰가 있습니다. 수능시험 또는 과거 학력고사 시절 수석한 사람에게 비결을 물으면 "교과서를 위주로 공부했습니다." (정치인 원희룡 인터뷰) 이런 답변이 나온 이유가 아마도 구체적인 사건을 에 대해 말하도록 유도하기보다는 결과를 묻는 질문을 했을 가능성이 높다고 생각합니다. 오히려 "하루 일과가 어떠했는지 말씀해 주시겠어요"라고 질문한다면 일과에 대한 정보를 알 수 있게 될 것이고, 이를 통해 더 구체적인 질문을 하고 더 많은 답변을 이끌어 낼 수 있었을 것이라고 생각합니다.