프로그래밍 언어 배우기의 달인
미육군에서는 9년간 약 4천만불을 들여 개발한 지뢰 탐지 시스템(Handheld Standoff Mine Detection System, HSTAMIDS 나중에 PSS-14로 개명)을 취소하려고 하고 있었습니다.  프로토타입의 실 테스트에서 지뢰 탐지율이 너무 낮았기 때문이죠. 테스트에 따르면 저금속(low-metal) 대인 지뢰를 심지어 96%만큼이나 탐지 "실패"하는 처참한 결과를 보였습니다.

지뢰 탐지를 하는 병사의 사진. 출처는 위키피디어


카네기 멜론 대학의 심리학과 교수 스타죠프스키(James Staszewski)는 지뢰 탐지에 대한 소위 아웃라이어(평균을 훌쩍 뛰어넘는 탁월한 사람)를 찾아갔습니다. 그 중 하나가 플로이드 로키 락웰(Floyd Rocky Rockwell)이었습니다. 그는 새로운 장비를 갖고 저금속 지뢰를 찾을 수 있었습니다. 하지만 플로이드는 다른 대부분의 전문가들과 마찬가지로 자신이 어떻게 지뢰를 찾을 수 있는지 설명하지 못했습니다.

스타죠프스키 교수는 수십년 동안 개발된 "전문성을 효과적으로 뽑아내는" 방법들을 사용하여 그의 전문성을 끄집어 냈습니다. 플로이드는 매뉴얼 대로 장비를 사용하고 있지 않았습니다. 그는 단순히 소리에 반응하지 않고(사실 그는 다른 지뢰 탐지인에 비해 청력이 꽤나 떨어졌습니다) 패턴을 잡아내고 있었고, 매뉴얼에서 제안하는 속도보다 더 느린 속도(1/3의 속도)로 진행하고, 매뉴얼에 적혀있는 높이(2인치 이상)보다 낮은 높이에서(심지어는 지면에 거의 접촉해서) 탐지기를 사용했고, 지속적으로 탐지기의 민감도 스위치를 조정했습니다.

스타죠프스키 교수는 플로이드 자신 조차도 인지하지 못하고 있었던 이 비결을 다른 군인들에게 5일간 가르치고 그 효과를 측정하는 실험을 해보았습니다. 훈련 전에 10% 대에 이르던(예컨대 M14 같은 탐지하기 어려운 저금속 지뢰 경우) 탐지율은 훈련 후 90%를 넘어서게 되었습니다(물론 기존 훈련 방식을 거친 대조 그룹의 군인들은 탐지율이 그대로 10%대에 머물렀습니다) -- 긍정오류(false-positive) 비율의 큰 변화 없이 말이죠.

저는 코칭이나 컨설팅을 할 때 이런 "인간" 역엔지니어링(reverse engineering) 방법을 사용하고, 또 가르치고 있습니다. 프로그래머, 매니저, 소위 전문가가 되려는 모든 사람에게 유용한 방법입니다(미해군에서는 교육시 선생과 학생들에게 가르치는데 왜 우리나라 학교에서는 안가르칠까요).

작년에 저한테 멘토링을 받는 학생들이 "전문성을 효과적으로 뽑아내는" 방법을 가르쳐 달라고 한 적이 있었습니다. 그래서 직접 시연을 통해서 보여주겠으니 전문가를 한 분 모셔오라고 했습니다. 얼마후 S님을 모셔왔습니다. S님은 국내 오픈소스 쪽에는 널리 알려진 탁월한 프로그래머입니다.

S님의 어떤 전문성을 끌어낼까 하다가 "프로그래밍 언어를 배우는 전문성"을 하기로 했습니다. S님은 프로그래밍 언어를 빨리 또 깊이있게 습득하기로도 유명합니다.

15분 가량 분석을 했습니다. 그 광경을 지켜보던 학생들은 두 가지 면에서 크게 놀랐다고 합니다. 첫번째는 15분 동안에 구체적인 전문성을 이렇게 뽑아낼 수 있다는 사실. 그리고 두번째는 S님이 프로그래밍 언어를 익히는 방법이 자기들과 너무도 다르다는 것(물론 S님은 "다들 이렇게 하고 있지 않나요?" 반응을 보였음).

그 때 뽑아낸 S님의 새로운 언어를 배우는 "비결"(효과적으로 언어를 배우는 분들은 비슷하게 하고 계실 듯)은 여러가지가 있지만 몇 가지만 공개하자면 다음과 같습니다.


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

튜토리얼을 읽는 것은 다른 프로그래머랑 비슷해 보입니다. 차이가 있다면 읽을 때 다음 작성할 프로그램을 염두에 두고 읽습니다. 그래서 읽다가 이쯤이면 그 프로그램을 작성할 수 있겠다 싶으면 그 자리에서 멈추고 코딩을 시작합니다. 완성을 확인하고는 다시 아까의 자리로 돌아와서 읽기를 계속합니다. 이 때에는 다음 목표 프로그램을 염두에 두면서 말이죠.

이런 것을 적극적 읽기(Active Reading)라고 하며, 읽을 때 구체적인 질문이나 목적을 갖고 읽는 방법을 말하는데 교육학의 여러 연구를 통해 이 적극적 읽기가 효과적이라고 밝혀진 바 있습니다. S님은 적극적 읽기를 하고 계신 것이죠.

참고로 S님이 첫번째 목표로 종종 사용하는 프로그램은 단어 개수 세기(word count) 프로그램이라고 합니다. 이 문제는 K&R 혹은 화이트 북이라고 널리 알려진 프로그래밍의 고전 The C Programming Language에 나오는 문제입니다. 표준 입력을 읽어 줄 수, 단어 수, 글자 수를 표준 출력에 보내는 문제이죠.

이 문제를 염두에 두고 글을 읽게 되면, 이 언어에서 루프는 어떻게 해야하지?, 글자 하나는 어떻게 읽지?, 출력은 어떻게 하지? 같은 질문들을 갖고 적극적으로 읽게 되겠죠. 또, 여러 언어에서 같은 프로그램을 작성해 보면서 그 언어적 차이를 쉽게 느낄 수 있을 겁니다.

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

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

S님은 튜터리얼을 읽어나가면서 틈틈이 해당 언어의 표준 라이브러리를 찾아 읽었습니다.

표준 라이브러리는 보통 해당 언어 발명자가 직접 작성하거나 적어도 그 스타일을 따르는 소수의 사람들이 작성합니다. 가장 그 언어스러운 코드들의 뭉치이지요. Java라는 언어로 작성했지만 C언어로 작성한 코드와 별반 차이가 없는 코드도 가능합니다. Java와 C로 작성된 프로그램을 가르는 진짜 기준은 해당 언어의 키워드를 썼냐 아니냐보다, 어떤 스타일을 따르고 어떤 숙어를 사용했는가 입니다.

S님은 튜터리얼을 공부하는 것만으로 그 언어의 숙어와 패턴, 스타일을 배우기 불충분하다는 것을 알고 있는 것이죠.

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

S님은 튜터리얼을 읽어나가면서, 뭔가 실질적인 사용 예를 스스로 만들어 내는 것 같습니다. 튜터리얼에는 비교적 장난감 코드만 나오기 쉬운데, 이 방법을 통해 실제 코드의 감(읽고 쓰기)을 익히는 것이죠.

당시 SSH 클라이언트에 특정 기능이 있으면 하고 바라는 바가 있었다고 합니다. 그래서 자신이 공부하고 있던 언어로 구현된 오픈소스 SSH 클라이언트를 찾아 다운 받고, 코드를 읽어가며(앞서 표준 라이브러리 읽기와 비슷한 맥락) 새 기능을 추가했다고 합니다.

더욱 인상적인 부분은, 처음 이 언어를 공부하기 시작한 시점부터 남이 완성한 프로그램에 내가 필요한 기능 추가하기까지 걸린 시간이 길지 않았다는 점입니다(며칠 이내). 여기에서 중요한 점은 당시 시점에서 자신이 만들 수 있는 작고 간단한 추가 기능을 생각해 낼 수 있었던 점이 아닌가 싶습니다.

이런 방식을 통해 자신이 글을 통해 이해한 것을 실제로 실험하면서 피드백 받을 수 있었습니다.



이렇게 언어를 공부하는 비결을 배워서 실행에 옮긴다면 어떨까요? 제 코칭 경험에 따르면 단기간에 놀라운 효과를 냅니다.

여러분들도 주변에 전문가들을 잘 활용해 보세요. 자신의 전문성을 빨리 높일 수 있는 매우 효과적인 방법입니다. 저에게서 이 방법을 배운 분들은, 경험이 전무한 IT 분야에 도전했는데 덕분에 해당 분야 경력 5년차를 2-3개월만에 앞지를 수 있었다, 혹은 당구나 스노우보드를 빨리 배울 수 있었다 같은 무용담을 들려주시곤 합니다.

자, 그러면 여기에서 이어지는 질문은 도대체 어떻게 해야 이런 비결들을 효과적으로 뽑아내냐는 것이겠죠. 한가지 분명한 것은, S님에게 "프로그래밍 언어를 빨리 배우는 비결이 무엇인가요?"라고 묻지 않았다는 겁니다. 많은 연구를 통해 전문가들은 이런 종류의 질문에 그다지 유용하지 않은 답을 해주는 것으로 밝혀졌습니다. 너무 일반적인 답(예컨대 "연습하세요!")을 하거나, 실제 자신의 행동과는 다른 이론적인 답(일종의 pet theory)을 하거나 합니다(구체적인 예는 "인터뷰에서 진실을 들으려면" 참고).

한가지 비결은 구체적 사건에 대해 듣는 겁니다. 경찰에서 증인을 효과적으로 심문하기 위해 쓰는 기법도 이와 비슷합니다. 굉장히 구체적인 기억들을 상기하도록 합니다. 위의 S님 경우에는, 그 분이 가장 최근에 익힌 언어를 물어봤습니다. Go라고 하더군요. 그 언어를 익힌 과정을 짚어가며 질문을 던졌습니다.

자세한 내용은 다음에 기회가 되면 더 설명드리도록 하겠습니다. 참고로 AC2 과정에서 "전문가 빨리되기"는 매우 중요한 주제이며, 그 중 "전문가에게서 전문성 효과적으로 뽑아내기" 역시 중요하게 다루고 있습니다.

--김창준
by 애자일컨설팅 | 2012/06/04 18:33 | 트랙백(1) | 핑백(1) | 덧글(15)
트랙백 주소 : http://agile.egloos.com/tb/5664879
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from JDFree at 2012/06/25 01:17
Linked at 애자일 이야기 : 2015년 .. at 2014/11/12 20:07

... 서는 인지적 작업 분석(CTA)이라고 하는 방법이 있습니다. 쉽게 말해 머리 속에서 벌어지는 일을 분석하는 방법으로, 구체적 기법만 해도 백가지가 넘는데요, 프로그래밍 언어 배우기의 달인이란 글에서 소개해 드린 적이 있습니다. 사실 AC2 과정 자체가 이 CTA를 통해 탄생하게 되었습니다. 그리고 과정에서는 전문가로부터 효과적으로 배우 ... more

Commented by freki at 2012/06/04 21:08
좋은 이야기군요.
기억해 놔야 겠습니디
Commented by dongeuni at 2012/06/05 09:21
언제나 좋은 글 감사합니다. 많이 참고가 되었습니다. ^^
Commented by 아크몬드 at 2012/06/05 09:37
좋은 방법이군요!
Commented by jindog at 2012/06/05 13:51
신입 팀원을 높은 수준으로 올리는데 써봐야겠는걸요? ^^
Commented by changmin at 2012/06/06 00:09
항상 깨우치고 갑니다. 감사합니다.
Commented by joonhwan at 2012/06/07 00:47
도대체 S님이 누굴까요 .나만모르고 다들 아시는 분인가.
Commented by superman at 2012/06/20 00:37
Superman ㅋㅋㅋ
Commented by Smilk at 2012/06/16 19:56
S 님 저도 너무 궁금하네요. ㅎㅎ
Commented at 2012/06/25 01:31
비공개 덧글입니다.
Commented by 애자일컨설팅 at 2012/06/27 09:46
네. 출처 표기하시고 옮기셔도 됩니다. :)
Commented by 성지인 at 2012/07/13 11:53
아아아, 이거 너무너무 인상적인 이야기네요.
천재성에 대해서 가장 좋은 책이라고 생각하는 대니얼 코일의 <탤런트 코드>를 보면 천재성이 발휘되기 위한 조건 중 두 가지가 '제대로 된 방법을 사용할 것'과 '마스터 코치가 필요'하다는 것이었는데, 이 이야기에서 이런 것들을 어떤 방식으로 하는지 조금 엿볼 수 있네요. 좋은 이야기 감사합니다!!
Commented by 이준호 at 2014/01/15 05:13
유익한 글 담아가요~^^
Commented at 2015/08/03 01:45
비공개 덧글입니다.
Commented by 라이언 at 2015/08/05 19:01
아주 유용했습니다! 생각지 못했던 관점이었습니다.
Commented by 라이언 at 2015/08/21 12:26
최고입니다!!

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >