포트란과 런타임 다형성 (runtime polymorphism)

포트란에서의 객체지향프로그래밍 다형성과 관련하여 함수 오버로딩연산자 오버로딩에 대해 글을 올린 적이 있습니다. 함수 오버로딩은 다른 함수를 같은 이름으로 사용하는 것으로, 이를 통해 하나의 함수 이름으로 다른 인수(argument)를 사용하는 것과 같은 효과를 나타낼 수 있습니다. 연산자 오버로딩은 함수를 이용해 기존 연산자의 기능을 재정의하거나 새로운 연산자를 만드는 기능이었죠. 런타임 다형성은 하나의 함수에 서로 다른 인수를 사용하는 기능으로, 상속 및 오버라이딩과 관련이 있습니다.

함수 오버로딩에서도 하나의 함수 이름으로 다른 인수를 사용하는 것과 같은 효과를 낼 수 있다고 하였는데, 실제로는 인수에 따라 다른 함수들을 정의하고 같은 이름으로 사용한 것인 반면에, 런타임 다형성을 이용하면 하나의 함수만 정의하고 서로 다른 인수를 사용할 수 있습니다. 이 때 인수들은 아무 인수나 되는 것은 아니고 서로 상속 관계에 있어야 합니다. 코드를 살펴보겠습니다.

module m_hero
    type:: hero_t
    contains
        procedure::speak => speak_hero
    end type 

    type,extends(hero_t):: ironman_t
    contains
        procedure:: speak => speak_ironman
    end type

    type,extends(hero_t):: spiderman_t
    contains
        procedure:: speak => speak_spiderman
    end type

contains

    subroutine speak_hero(hero)
    class(hero_t):: hero
    print*,'I am a hero.'
    end subroutine

    subroutine speak_ironman(hero)
    class(ironman_t):: hero
    print*,'I am Iron Man.'
    end subroutine

    subroutine speak_spiderman(hero)
    class(spiderman_t):: hero
    print*,"I'm Peter."
    end subroutine

    subroutine who_are_you(hero)
    class(hero_t):: hero
    call hero%speak()
    end subroutine

end module

위 코드에서 ironman_tspiderman_thero_t를 상속합니다. 모두 각자의 speak 메소드를 가지고 있는데, 서로 다른 type이지만 다음과 같이 who_are_you 서브루틴의 인수로 사용할 수 있습니다.

program test_runtime_polymorphism1
    use m_hero
    type(hero_t):: hero
    type(ironman_t):: ironman
    type(spiderman_t):: spiderman

    call who_are_you(hero)
    call who_are_you(ironman)
    call who_are_you(spiderman)
end program

실행 결과는 예상대로 다음과 같습니다.

I am a hero.
I am Iron Man.
I’m Peter.

이번에는 ihero라는 변수 값에 따라 hero들 중 한 명이 달려가 사람들을 구해야 한다고 생각해봅시다(모두 run, save_people 메소드를 가지고 있다고 합시다). 아래와 같이 구현할 수 있습니다.

program test_runtime_polymorphism2_not_good
    use m_hero
    type(ironman_t):: ironman
    type(spiderman_t):: spiderman
    integer:: ihero = 1

    select case (ihero)
    case (1)
        call who_are_you(ironman)
        !call ironman%run()
        !call ironman%save_people()
    case (2)
        call who_are_you(spiderman)
        !call spiderman%run()
        !call spiderman%save_people()
    end select
end program

그러나 위 코드는 중복이 많습니다. Hulk, Black Widow, Thor 등 새로운 avenger가 올 때마다 코드가 여러 줄씩 늘어나게 됩니다. 아름답지 않습니다! 포인터를 이용하면 hero_t 클래스 변수가 자식 type을 가리키도록 할 수 있습니다.

program test_runtime_polymorphism2_better
    use m_hero
    class(hero_t),pointer:: hero
    type(ironman_t),target:: ironman
    type(spiderman_t),target:: spiderman
    integer:: ihero = 1

    select case (ihero)
    case (1)
        hero => ironman
    case (2)
        hero => spiderman
    end select

    call who_are_you(hero)
    !call hero%run()
    !call hero%save_people()
end program

아름답습니다! 유지 보수하기 훨씬 좋아졌습니다.

Stack overflow로 인한 Segmentation fault 해결하기

포트란, C와 같은 컴파일 언어 사용시 함수나 서브루틴 내에서 선언하는 변수는 기본적으로 메모리의 stack이라는 정적 할당 영역에 저장하게 됩니다. 만약 함수나 서브루틴 내에서 선언한 배열의 크기가 커지면 시스템의 stack 크기를 넘어갈 수 있고(stack overflow) 이 경우 잘못된 메모리 주소를 참조하는 segmentation fault 에러가 발생하게 됩니다. Stack overflow를 방지하는 세 가지 방법을 살펴보겠습니다.

  1. 직접 allocate: 배열을 필요에 따라 함수나 서브루틴 내에서 할당하고 해제하는 방식으로 코드를 수정해줍니다. 이 경우 stack 대신 heap이라는 동적 할당 영역을 사용하므로 stack overflow가 발생하지 않습니다. 그러나 코드를 수정해야 하므로 제 경우 2번이나 3번 방식을 선호합니다.
  2. 시스템 stack 크기 증가: 리눅스에서 ulimit -s unlimited 명령을 이용해 stack 크기를 무한히 크게 만들 수 있습니다.
  3. 컴파일 옵션: 컴파일시 크기가 큰 배열은 stack 대신 heap 공간을 사용하도록 옵션을 추가합니다. ifort에는 -heap-arrays [size], gfortran에는 -fmax-stack-var-size=n 옵션이 있습니다.

디지털 미디어와 깊이 읽기

니콜라스 카는 “생각하지 않는 사람들(The Shallows)”에서 인터넷 사용으로 인한 두뇌 변화에 대해 이야기합니다. 인터넷에서는 빠르게 움직이는 작은 정보 조각들이 흘러다닙니다. 이러한 환경은 많은 주제를 폭넓게 탐구하는데에는 적합하지만 주제를 피상적인 수준에서만 탐구하게 만듭니다. 인터넷 사용으로 인해 뇌는 더 산만해지도록 훈련받습니다. 정보를 빨리 효율적으로 처리하기는 하지만 지속적인 집중은 어려워집니다. 인터넷 사용 시간 증가로 출판물을 읽는 시간은 감소하고, 그에 따라 기존의 인쇄 매체를 읽는데 필요한 선형적 사고, 깊이 생각하는 능력이 사라지고 있습니다. 웹을 많이 이용할수록 긴 글에 집중하기 어려워집니다. ‘스압(스크롤 압박) 주의’, ‘tl;dr (too long; didn’t read)’ 같은 단어들은 긴 글에 대한 거부감을 나타내죠. 마셜 매클루언은 “미디어의 이해“에서 우리가 사용하는 도구가 증폭시키는 우리의 기능(능력)은 결국 마비된다고 했습니다. 소프트웨어가 더 똑똑해질수록 사용자는 더 멍청해지게 됩니다.

매리언 울프도 “다시, 책으로(Reader, Come Home)”에서 디지털 미디어 사용으로 인한 깊이 읽기 능력 상실에 대해 이야기합니다. 깊이 읽기는 “독서의 기술“에서 이야기하는 분석 독서와 관련이 있습니다. 인쇄 미디어를 깊이 읽기 위해서는 진실을 분별하고 분석적, 비판적으로 생각하고 공감하고 이해하기 위해 인지적 인내가 필요합니다. 반면에, 디지털 미디어는 즉각성, 빠른 전환, 끊임 없는 주의 환기, 몰입 보다는 정보 얻기, 공감 쇠퇴와 같은 특성을 가집니다. 너무 많은 정보로 인지 과부하가 발생하게 되고 우리는 단순화, 압축, 선별과 같이 심층 처리 없이 정보를 처리하게 됩니다.

어떤 미디어에 노출된 시간이 길수록 미디어의 행동 유도 특성이 이용자에게 더 큰 영향을 미치게 되는데, 요즘 사람들이 가장 많이 사용하는 미디어들은 스마트폰, 인터넷과 같은 디지털 미디어들이죠. 많은 아날로그 미디어들이 디지털로 증발되어가는 시대에 디지털 미디어를 잘 다루는 능력도 중요합니다. 하지만, 대학원에서 연구하는 학생들의 입장에서 집중하고, 깊이 읽고, 생각하는 능력의 쇠퇴는 치명적일 수 있습니다. 인터넷이 널리 사용되기 시작한지 20년 정도 되었고, 스마트폰은 널리 사용되기 시작한지 10년 정도 되었으므로 이 문제는 앞으로 더 심각해질 수 있습니다. 니콜라스 카는 깊이 읽는 능력이 소수 엘리트만의 능력이 될 가능성이 크다고 했습니다.

해결책은 마셜 매클루언이 이야기한 것처럼 디지털 미디어 사용 시간을 줄이고 인쇄 미디어를 읽는 시간을 늘리는 것입니다. 유사한 내용을 칼 뉴포트는 “디지털 미니멀리즘”, 매리언 울프는 ‘양손잡이 뇌’라고 표현했습니다. 책을 읽되 전자책이 아닌, 아날로그 책을 읽고, 논문을 읽을 때도 스크린 상에서 읽는 것이 아니라 인쇄된 논문을 읽읍시다. 종이 사용과 환경 보호의 관점에서는 안 좋지만 전문가는 자신의 정신적 기술을 연마할 책임이 있습니다.

미디어의 이해 – 인간의 확장

마셜 매클루언은 “미디어의 이해”에서 미디어가 인간에게 미치는 영향에 대해 이야기하고 있습니다. 이 때 미디어는 인간 감각을 확장한 모든 것을 의미합니다. 일반적으로 생각하는 라디오, 텔레비전, 영화 뿐 아니라 피부를 확장한 의복과 집, 다리를 확장한 바퀴, 자동차, 비행기, 말을 확장한 문자 등 다양한 기술들을 모두 미디어라 할 수 있습니다.

미디어를 이용해 자신을 확장하게 되면 인간의 감각 비율에 변화가 생기게 되고 확장된 감각은 ‘마비’ 또는 절단 됩니다. 연못에 비친 자신의 모습을 보고 지각이 마비되었던 나르시스처럼 자신을 확장한 미디어에 사로잡혀 마비되는 것이지요. 길을 잘 찾기 위해 네이게이션을 사용하며 길 찾기 능력이 사라지고, 전화번호를 잊지 않기 위해 핸드폰을 사용하며 전화번호를 기억하는 능력이 사라지고, 멀리 가기 위해 자동차를 타면서 장거리를 걷고 뛰는 능력이 사라집니다.

미디어에는 주어진 경험 패턴에 순응하게 만들고 사람들에게 자신의 전제 조건들을 주입시키는 힘을 가지고 있습니다. ‘미디어가 메시지다’라고 할 때 메시지는 이러한 미디어로 인한 인간 변화를 의미합니다. 진지한 예술가는 자신의 감각 변화에 예민하기에 이러한 미디어의 영향을 피할 수 있지만, 일반적인 사람들은 미디어의 힘을 이해해도 미디어 사용으로 인한 감각 변화를 막을 수 없습니다. 유일한 해결책은 다른 미디어입니다. 예를 들어, 텔레비전에 대항하려면 인쇄물을 해독제로 사용해야 합니다.

대학원에서 연구를 통해 전문가가 되고자 하는 학생들은 미디어와 관련하여 다음 두 가지 측면에 주의를 기울일 필요가 있다고 생각합니다.
1. 현재 디지털 미디어로 인해 자신이 어떠한 영향을 받고 있는지
2. 미래 자신이 개발할 기술(미디어)이 다른 사람들에게 어떠한 영향을 끼칠 것인지

독서의 기술과 논문 읽기

모티머 애들러는 “How to read a book” (번역본 “독서의 기술”, “생각을 넓혀주는 독서법”)에서 독서의 네 가지 수준에 대해 알려줍니다.

  1. 초급 독서
    초급 독서는 단순히 글자를 읽는 수준입니다.
  2. 점검 독서
    빠르게 책의 내용을 파악하는 수준으로 골라 읽기, 표면 읽기라고 할 수 있습니다.
  3. 분석 독서
    철저하게 깊이 읽기입니다.
  4. 신토피칼 독서
    하나의 주제에 대한 여러 권의 책을 관련지어 읽습니다.

모든 책을 이렇게 읽을 필요는 없습니다. 자신에게 중요한 책만 분석해가면서 읽으면 됩니다.

분석 독서는 다시 3단계로 나눌 수 있습니다. 1단계는 구조 파악 단계입니다.
1. 책을 분류
2. 구상과 플롯 – 전체를 몇 문장으로 요약합니다.
3. 개요 파악
4. 저자의 의도 파악 – 해결하려는 문제를 분명히 합니다.

2단계는 내용 해석 단계입니다.
5. 저자와 타협 – 키워드를 이해하고 저자가 사용하고 있는 용어의 의미를 파악합니다.
6. 저자가 전달하고 싶은 것은 무엇인가? – 저자의 명제와 중요 문장을 파악합니다.
7. 저자의 논증 발견 – 귀납법, 연역법 등 논증 방법과 가정 및 전제를 파악합니다.
8. 저자의 해결 검토 – 저자가 해결한 문제와 해결하지 않은 문제를 판별합니다.

3단계는 저자에게 찬성하거나 반론을 제시하는 단계입니다. 이 때 어떤 점이 부족한지 분명히 합니다. 예를 들면, 저자의 지식이 부족한지, 지식에 오류가 있는지, 논리성이 결여된 것은 아닌지, 분석이나 설명이 불완전한 것은 아닌지 분명히 합니다.

신토피칼 독서도 단계를 나눌 수 있습니다.
0. 먼저 준비 작업으로 연구 분야를 조사하여 읽고자 하는 문헌표를 작성하고 문헌표의 문헌들을 점검합니다.
1. 1단계에서는 문헌들 사이에서 관련 깊은 곳을 발견합니다.
2. 저자들마다 같은 용어를 다른 방식으로 사용했을 수 있으므로 자신의 용어 사용 방식을 정합니다.
3. 명제를 세우고 여러 가지 질문을 던집니다.
4. 질문에 대한 저자들의 대답을 정리하고 논점을 명확히 합니다.
5. 질문과 논점을 정리하고 논고를 분석합니다.

논문을 읽을 때에도 위의 수준들을 적용할 수 있습니다.

점검 독서: 여러 논문들 중 자신에게 필요한 논문을 찾을 때 사용하게 됩니다. 제목과 초록, 그림 등을 보면서 자신이 읽을만한 논문인지 파악합니다.
분석 독서: 자신의 연구에 중요한 논문을 찾았다면 분석 독서의 방법을 적용할 수 있습니다. 과학 기술 논문의 구조는 정해져 있고 초록에 핵심 내용이 요약되어 있으므로 분석 독서의 1단계는 금방 넘어갈 수 있고, 2단계와 3단계에 집중합니다. 논문을 심사할 때에는 3단계에서 파악한 내용을 바탕으로 심사 의견을 남길 수 있습니다.
신토피칼 독서: 자신의 연구 주제를 정했다면 해당 주제와 관련된 논문들을 모아서 신토피칼 독서 방법을 적용하게 됩니다. 문헌표 작성시 인터넷 검색을 이용할 수도 있는데, 보통 관련 논문의 서론과 참고 문헌 목록에서 필요한 논문들을 찾을 수 있습니다.

삶의 의미

빅터 프랭클은 “죽음의 수용소에서”라는 책에서 유대인 강제 수용소 경험과 삶의 의미에 대해 들려줍니다. 자신의 삶의 의미를 찾는다면 강제 수용소 생활도 견딜 수 있다고 합니다. 우리는 가치 있는 목표를 추구함으로써 자신의 삶에 보다 깊은 의미를 부여할 수 있습니다. 이 때 중요한 것은 ‘우리가 삶으로부터 무엇을 기대하는가’가 아니라 ‘삶이 우리로부터 무엇을 기대하는가’입니다. ‘무엇을 받을까’가 아니라 ‘무엇을 줄까’를 고민하라는 것이지요. 우리는 자신의 삶에 대해 책임을 짐으로써만 삶의 질문에 대답할 수 있다고 합니다. 빅터 프랭클이 제안하는 삶의 의미를 찾는 세 가지 방식은 다음과 같습니다.

  • 무엇인가를 창조하거나 어떤 일을 함으로써
  • 어떤 일을 경험하거나 어떤 사람을 만남으로써(사랑)
  • 피할 수 없는 시련에 대해 어떤 태도를 취하기로 결정함으로써

전문가, 장인은 무엇인가를 창조하거나 어떤 일을 함으로써 삶의 의미를 찾을 수 있을 것입니다. 전문가가 되기 위해 대학원에 진학한 여러분, 장차 사회에 무엇을 줄 수 있을지 고민해보세요. 가치 있는 목적은 내적 동기의 필수 요소이기도 합니다.

봉사나 타인 사랑으로 자신을 잊을수록 우리는 더 인간다워지며 자신을 더 잘 실현하게 된다고 합니다. 성공과 행복, 쾌락을 목표로 삼지 말라고 합니다. 이런 것들은 어떤 행위의 부산물로 찾아오는 것이지 그 자체가 목적이 아닙니다. 먼 미래의 행복을 위해 현재 대학원에서의 시간을 희생한다고 생각하지 말고, 지금 배우고 성장해가는 과정 중에 행복하시길 바랍니다. 소유하는 삶이 아닌, 존재하는 삶을 살아가시길 바랍니다.

자율성, 숙련, 목적

다니엘 핑크는 “드라이브”라는 책에서 전문가에게 필요한 내적 동기, 내재적 보상에 대해 알려줍니다. 당근과 채찍이라는 외적 보상은 보통 창의성에 해가 되는 반면에, 내재 동기는 창의성을 유도한다고 합니다. 내적 동기를 위한 필수 3요소는 다음과 같습니다.

  • 자율성: 자기 주도적 동기 부여로, 자신의 삶을 주도하겠다는 욕구입니다. 무엇을(업무) 언제(시간) 어떻게(기술) 누구와 함께(팀) 할 것인지 선택할 수 있다면 자율성이 높다고 할 수 있습니다. 드라이퍼스 모델에서 볼 수 있는 것처럼 초보자는 규칙을 따라야 하기 때문에 자율성이 거의 없지만 보통 실력이 향상될수록 자율성이 증가하게 됩니다. 물론 자유에는 책임도 따릅니다.
  • 숙련: 중요한 무언가를 더욱 잘하고 싶다는 욕구로, 몰입에 이르는 길입니다. 일의 즐거움 자체가 보상이 됩니다. 숙련을 위해서는 성장형 마음가짐이 필요하고 의식적인 연습이라는 힘든 과정을 견디기 위한 투지, 의지가 필요합니다. 점근선과 같이 완전한 숙련에 도달하는 것은 불가능하지만 숙련을 추구하는 데 즐거움이 존재합니다.
  • 목적: 의미있는 삶을 위한 욕구, 자신보다 더 큰 무언가를 위해 일을 하고 싶다는 욕구입니다. 자신보다 위대하고 영원한 무언가에 속해 있다는 느낌이 들지 않는다면 진정으로 탁월한 삶을 이끌 수 없다고 합니다(미하이 칙센트미하이).

이 책에서 외재 동기에 의해 일하는 사람은 X 유형, 내재 동기로 일하는 사람은 I 유형으로 분류합니다. “소유냐 존재냐”에 나오는 소유형 인간, 존재형 인간과 통한다고 볼 수 있겠습니다.

(꽤 소박한) 일정 수준을 넘긴 후에는 돈이 많다고 더 행복해지지 않습니다. 자신에게 중요한 무언가를 하고, 그 무언가를 잘하고, 또 자신보다 큰 대의를 위해 노력할 때 우리는 가장 풍요롭다고 합니다.

의식적인 연습 deliberate practice

안데르스 에릭슨은 “1만 시간의 재발견 (Peak)”이라는 책에서 의식적인 연습(deliberate practice)에 대해 설명하고 있습니다. 의식적인 연습은 특정 기술의 전문성을 획득하기 위한 연습으로, 단순한 연습에 비해 훨씬 목적 의식이 강하고 용의주도하며 집중적인 연습입니다. 의식적인 연습은 다음과 같은 특성들이 있습니다.

  • 다른 사람들이 이미 방법을 알고 있고, 효과적 훈련 기법이 수립되어 있는 기술을 연마하는데 사용합니다.
  • 편하게 여기는 컴포트존을 벗어난 지점에서 진행됩니다. 현재의 능력을 살짝 넘어서는 작업을 지속적으로 시도합니다.
  • 명확하고 구체적인 목표가 있고, 훈련 성과를 가시적으로 확인할 수 있습니다.
  • 신중하고 계획적입니다. 온전히 집중하고 의식적으로 행동합니다.
  • 피드백이 존재하고 그에 따라 행동을 바꿉니다.
  • 효과적인 심적 표상(mental model)을 만들어내고 심적 표상에 의존합니다.
  • 기존에 습득한 기술의 특정 부분을 집중적으로 개선합니다. 이를 위해서는 교사나 코치가 초보자에게 정확한 기본 기술을 가르쳐주는 것이 중요합니다.

실력 향상을 위해서는 올바른 연습을 충분한 기간에 걸쳐 수행해야 하며 시간을 단축시켜주는 지름길은 없습니다. 의식적인 연습에서는 지식보다 행동, 기술에 집중합니다. ‘무엇을 아는가’보다 ‘무엇을 할 수 있는가’에 초점을 맞추는거죠. 지식은 기술을 익히며 자연스럽게 얻게 됩니다. 노력의 대부분은 교사가 내준 과제를 하며 혼자 하는 연습에 들어갑니다. 만약 교사 없이 연습하려면 집중(Focus)하고 피드백(Feedback)을 받아 수정(Fix)하는 과정을 반복해야 합니다.

대학원 생활에 의식적인 연습을 적용한다면, 전공 지식 쌓기, 논문 쓰기, 프로그래밍, 특정 프로그램 다루기 등 각 전공에서 필요한 기술별로 적용해야겠죠. 연구 능력이나 창의성 향상과 같이 목표가 모호한 경우에는 구체적으로 성과를 확인할 수 있도록 다른 접근이 필요할 듯 합니다.
의식적인 연습에는 빠른 피드백이 중요한데, 현실적으로 학생들이 지도교수님께 각각의 기술들에 대해 매번 빠르게 피드백을 받기는 어렵습니다. 지도교수님께도 피드백을 받되, 스스로도 피드백을 받고 수정할 수 있는 환경을 구축하는 것이 좋습니다.
전공 지식 쌓기 같은 경우 전공 서적에 연습 문제가 있다면 풀어보며 스스로 피드백을 얻을 수 있습니다.
논문 쓰기의 경우 자신의 글과 출판된 논문의 글을 비교하며 피드백을 받을 수 있습니다. 학술지에 자주 논문을 제출하면 그만큼 자주 피드백을 받을 수 있겠죠. 단, 피드백이 기분 좋지 않은 경우도 많을겁니다.
프로그래밍의 경우에는 애자일 방법론에서 사용하는 테스트주도 개발이 유용할 듯 합니다.
전공 연구에 필요한 특정 프로그램을 다룰 경우에는 프로그램의 기능을 하나씩 이용해 필요한 작업을 실행해가며 피드백을 얻을 수 있습니다.
이렇게 피드백을 통해 하나씩 수정해가는 과정을 꾸준히 반복하다보면 어느새 실력이 향상되어 있을 것입니다. 조급해하지 맙시다. 천재도 전문가 수준에 도달하기 위해서는 많은 연습이 필요다하고 합니다.

대학원을 졸업하고 전문가가 된다고 해서 의식적인 연습이 끝나는 것은 아닙니다. 전문가는 끊임없이 연습하고 기술을 연마할 방법을 모색하는 사람입니다. 훈련을 멈추면 능력이 사라지기 시작하기 때문이죠. 많은 경우 어떤 기술이나 능력을 비범한 수준으로 발전시킨 사람들은 다른 영역에서는 오히려 뒤쳐지는 모습을 보인다고 합니다. 여러분의 교수님이 전공 외의 다른 부분에서 좀 모자라보여도 이해해주세요^^

전문가에 이르는 길

앤디 헌트는 프로그래머를 위한 “실용주의 사고와 학습”이라는 책에서 드라이퍼스 모델이라는, 기술 습득과 통달에 관한 연구를 소개하고 있습니다. 드라이퍼스 모델에 따르면 초보자에서 전문가에 이르는 과정은 다음과 같습니다.

  • 초보자
  • 고급입문자
  • 중급자
  • 숙련자
  • 전문가

초보자는 해당 기술 영역에서 사전 경험이 거의 없는 사람으로, 일하기 위해서는 정해진 규칙이 필요한 사람을 말합니다.
고급 입문자는 고정된 규칙에서 조금씩 벗어나기 시작하지만, 문제 해결에 어려움을 느끼고 아직 큰 그림은 잘 모르는 사람입니다.
중급자는 문제 영역에서 개념적 모델을 만들고 활용할 수 있습니다. 문제를 스스로 해결하고 새로운 문제를 해결할 방법을 찾아내기도 하죠. 그러나 자신을 돌아보고 잘못을 스스로 교정할 수 있는 능력은 아직 부족한 상태입니다.
숙련자는 이전에 잘못했던 일을 스스로 교정할 수 있습니다. 다른 사람의 경험으로부터 배울 수도 있습니다. 경험이 풍부하고 뭔가가 잘 안 될 때 무엇을 바꿔야 해결할 수 있는지도 압니다. 중급자보다는 전문가에 가깝습니다.
전문가는 어떤 분야든 지식과 정보의 근원으로 늘 더 나은 방법과 수단을 찾습니다. 적절한 맥락에서 써먹을 수 있을만큼 방대한 경험을 가지고 있고, 직관적으로 세부사항 중에서 중요한 것과 그렇지 않은 것을 가려낼 수 있습니다.

이 모델은 기술 및 분야별로 적용되는 모델로, 한 분야에서 전문가가 된다고 해서 다른 분야에서도 전문가가 되는 것은 아닙니다. 하지만, 한 분야에서 전문가가 되고 나면 다른 분야에서 전문성을 얻기가 훨씬 쉬워집니다.

무술 수련에서도 수, 파, 리라고 유사한 개념이 있습니다. ‘수’는 가르침을 받은대로 따라하는 단계, ‘파’는 수련의 의미와 목적을 되새겨보고 더 깊이 이해하고 흡수하는 단계입니다. ‘리’는 가르침을 넘어서고 경험을 초월하는 단계로, 더이상 학생이 아니며 새로운 방법을 창출해낼 수 있습니다.

박사과정에 진학한 학생은 전문가가 되기 위한 길에 들어섰다고 생각할 수 있습니다. 석사과정을 초보자에서 고급 입문자가 되기 위한 단계(수)라고 한다면 박사과정은 중급자를 거쳐 숙련자가 되기 위한 단계(파)라고 할 수 있겠네요. 전문가(리)가 되기 위해서는 박사 졸업후에도 몇 년의 경험이 더 필요합니다. 1만 시간의 법칙을 적용해보자면 1년에 250일씩, 하루 4시간의 의식적인 연습을 한다고 했을 때 10년의 기간이 필요합니다(물론 1만 시간이 절대적인 값은 아닙니다).

의식적인 연습은 쉽지 않지만 이를 통해 일을 잘 하게 되면 자율성이 커지고 일 자체로부터 내적인 보상도 얻을 수 있습니다. 자신이 잘 하는 일에 몰입하며 행복감을 느끼게 됩니다. 꾸준히 노력하여 자신의 전문 기술로 사회를 더 좋게 만드는데 기여하는 훌륭한 전문가가 되시길 바랍니다(자율성, 숙련, 목적).

연구실 도커 기본 이미지 pkgpl_base

탄성파탐사 연구실에서 연구할 때 많이 사용하는 라이브러리들을 설치해놓은 도커 이미지를 공개해두었습니다. 도커 허브에서 이미지를 받거나, 깃허브에서 도커 파일을 받을 수도 있지만, Docker와 GitHub를 이용한 소프트웨어 연구 환경 구축에서 설명한 연구 프로젝트 템플릿을 통해 이용하는 것을 추천합니다.

설치된 주요 라이브러리들은 다음과 같습니다.

  • 탄성파 자료 처리 관련
    • Seismic Unix
    • Madagascar
  • 수치 연산 관련
    • nvcc
    • gcc/gfortran
    • python
    • numpy
    • numba
    • mpi4py
    • mkl
  • 딥러닝 관련 (horovod 도커 이미지 사용)
    • pytorch
    • tensorflow
    • mxnet
    • horovod
  • 기타 머신러닝 관련
    • scikit-learn
    • pandas
    • jupyterlab
    • matplotlib
    • bokeh