글쓴이 보관물: plusha

서버의 Docker 컨테이너에서 실행한 jupyter, tensorboard에 접속하기

Docker와 GitHub를 이용한 소프트웨어 연구 환경 구축에서 Docker 프로젝트 템플릿에 대해 소개해드렸습니다. 리눅스 서버에서 프로젝트 템플릿을 이용해 만든 Docker 컨테이너를 실행하고, 컨테이너 내에서 Jupyter lab/notebook 또는 tensorboard를 실행한 후 데스크탑 PC의 웹브라우저를 이용해 접속하는 방법을 살펴보겠습니다. 아래 명령들을 실행하기 전에 먼저 컨테이너를 만들고(build.sh) 실행해주세요(run.sh).

Jupyter lab/notebook

서버의 프로젝트 내 docker 디렉토리에서 다음 명령을 실행합니다.

$ ./exec.sh lab (또는 ./exec.sh notebook)

위 명령을 실행하면 jupyter lab/notebook이 background로 실행됩니다. 실제로는 다음 명령이 실행됩니다.

$ jupyter lab[notebook] --no-browser --ip=0.0.0.0 --NotebookApp.token=****

위에서 ****는 접속 비밀번호로, Env.sh 파일에서 지정해줍니다.

컨테이너의 jupyter port, tensorboard port와 서버의 해당 port는 컨테이너 실행시 연결된 상태이므로 이제 데스크탑 PC의 port를 서버의 해당 port로 연결하면 됩니다. 참고로, Port 번호는 Env.sh 파일에서 바꿀 수 있습니다. 데스크탑 PC에서 서버로 연결하기 위해 다음 ssh tunneling 명령을 실행합니다. 리눅스나 MacOS의 경우 터미널에서, 윈도우즈의 경우 PowerShell에서 실행하면 됩니다.

$ ssh -N -L 8888:localhost:8888 your_id@server_ip

위 명령을 통해 서버와 데스크탑 PC의 port를 연결했다면 데스크탑 웹브라우저에서 localhost:8888 주소로 서버 컨테이너의 jupyter lab/notebook에 접속하여 사용할 수 있습니다.

TensorBoard

텐서보드도 사용할 수 있습니다. 텐서보드 파일이 src/logs 디렉토리에 있을 경우 docker 컨테이너 내에서 src 디렉토리로 이동한 후 tensorboard를 실행합니다.

$ ./exec.sh # 컨테이너 내 터미널 접속
$ cd src
$ tensorboard --bind_all --logdir=logs

위 명령을 실행한 후에는 tensorboard port를 이용하여 앞에서와 같이 ssh tunneling 명령을 실행합니다.

$ ssh -N -L 6006:localhost:6006 your_id@server_ip

이제 데스크탑 웹브라우저에서 localhost:6006 주소로 서버 컨테이너에서 실행한 tensborboard에 접속할 수 있습니다.

참고로, Jupyter lab/notebook과 TensorBoard를 동시에 사용한다면 다음과 같이 한 번에 연결할 수도 있습니다.

$ ssh -N -L 8888:localhost:8888 -L 6006:localhost:6006 your_id@server_ip

열정과 의지력

그릿

앤절라 더크워스는 “그릿”이라는 책에서 성공하는 사람들의 열정과 끈기에 대해 이야기합니다. 그릿에서 말하는 열정과 끈기는 다음과 같습니다.

  • 열정: 멀리 목표를 두고 일함, 단순한 변덕으로 과제를 포기하지 않음
  • 끈기: 의지력, 인내심, 결단력, 장애물 앞에서 과업을 포기하지 않는 성향, 집요함, 완강함

성숙한 그릿의 사람들은 다음과 같은 특징이 있다고 합니다.

  1. 관심: 자신이 하는 일 진정으로 즐김
  2. 연습: 의식적인 연습 활용
  3. 목적: 자신의 일이 중요하다는 확신이 있음, 개인적으로 흥미로운 동시에 타인의 안녕과 밀접한 관련이 있는 일을 함
  4. 희망: 위기에 대처하게 해주는 끈기가 있음

그릿이 높은 사람일수록 건강한 정서적 삶을 즐길 가능성이 높다고 합니다. 여러분은 그릿이 높은, 열정과 끈기가 있는 사람인가요? 그렇다면, 축하합니다. 아닌가요? 걱정할 필요는 없습니다. 의지력(끈기)과 열정에 관한 다른 책들을 살펴보죠.

의지력의 재발견

로이 바우마이스터, 존 티어니는 “의지력의 재발견”에서 자기 절제를 위해 필요한 의지력은 고갈되는 자원임을 알려줍니다. 의지력에는 생각 조절, 감정 조절, 충동 조절, 수행 조절(인내심)과 같은 범주가 있는데, 감정 통제, 유혹 참기, 스트레스, 반복된 결정(선택)으로 인해 의지력을 사용하게 되면 결국 고갈된다고 합니다. 의지력을 충전하기 위해서는 식사(포도당 흡수), 휴식, 잠이 필요합니다.

의지력은 충전, 고갈을 반복하는 자원이지만 장기간의 훈련으로 강화할 수 있다고 합니다. 의지력을 강화하기 위한 훈련들은 다음과 같습니다.

  • 매일 곧은 자세 연습
  • 정돈하는 습관
  • 체력 단련
  • 작은 성취

의지력이 강해지면 고갈되는 속도가 느려지고, 의지력이 필요한 어떤 행동이 습관이 되면 더이상 의지력을 소진할 필요가 없습니다. 아직 의지력이 약하다 하더라도 사용할 수 있는 전략들이 있습니다.

  • 중요한 일이나 결정은 아침 또는 점심 식후에 진행하기
  • 유혹 피하기
  • 유혹에 대한 선제적 예방조치 (세이렌 앞에서 몸을 묶은 오디세우스처럼; 예를 들면, 시간을 낭비하는 특정 웹사이트 접근 차단하기)
  • 일을 미루지 않기
  • 모니터링하기
  • 대안을 남기지 않기 (한 가지 일을 위해 시간을 정해놓고 작업하기, 해당 작업을 하기 싫다면 다른 일도 하지 않기)
  • 동기 부여를 위해 스스로에게 사소한 보상 자주 하기
  • 고귀한 생각(목표)에 집중하기
  • 습관화하기

결국 좋은 습관을 들이는 것이 중요합니다. 좋은 습관을 만들면 의지력 고갈 없이 중요한 일들(대학원생의 경우 공부, 연구, 논문 쓰기 등)을 할 수 있습니다. Robert Boice도 “Professors as Writers”에서 꾸준한 논문 쓰기 습관이 학자에게 매우 중요하다고 강조하였습니다. 좋은 습관을 통해 의지력을 아껴 쓰면 스스로 절제할 수 있게 됩니다. 내면의 절제는 타인에 대한 친절함으로 이어지기에 의지력이 강한 사람은 이타적이라고 합니다. 여러분도 대학원에서 좋은 습관을 만들고 의지력을 키워가시길 바랍니다. 이번엔 열정에 대해 알아보겠습니다.

열정의 배신

칼 뉴포트는 “열정의 배신 (So good they can’t ignore you)”에서 열정을 따르지 말라고 합니다. 열정보다 일이 먼저입니다. 일에 대한 열정은 흔하지 않습니다. 열정을 갖는 데는 시간이 걸리죠. 따라서 열정이 없는 상태에서 열정을 따르려 하지 말고 먼저 다양한 일을 접해보는 것이 중요합니다. 일을 잘하면 열정은 부수적으로 생긴다고 합니다.

이 때 실력이 중요하다고 강조합니다. 영문 제목에 나온 것처럼 아무도 여러분을 무시하지 못하게 실력으로 승부하라고 합니다. 세상이 자신에게 무엇을 해줄 것인지가 아니라 자신이 세상에 무엇을 줄 것인지 고민하는 장인 마인드를 가지시기 바랍니다. 이는 무엇을 줄까 고민하라는 빅터 프랭클의 글과도 일치합니다. 애덤 그랜트도 “기브 앤 테이크”에서 지혜롭게 주는 사람이 성공한다고 했습니다. 승진보다는 자율성을 추구하시기 바랍니다. 자율성이 커지면 행복도와 참여도, 성취감이 높아지고, 따라서 열정도 커진다고 합니다. 또한 가치있는 소명을 가지고 일할 때 행복하다고 합니다. 실력, 자율성, 소명 – 결국 내적 동기 부여를 위한 자율성, 숙련, 목적과 동일한 내용입니다. 저자는 창의성을 발휘할 수 있고 영향력있고 자율성이 높은, 희소하고 가치 있는 기술과 관련된 직업이 좋은 직업이라고 합니다.

정리

정리해보면, 열정과 의지력이 중요하지만, 열정은 처음부터 가지고 있는 것이 아니라 실력이 향상되면 생기는 것이고, 의지력은 고갈되는 자원으로 강화하려면 장기간의 훈련이 필요합니다. 학부 공부를 통해 몇 가지 세부 전공을 탐색해본 후 대학원 연구실을 결정했다면 해당 분야에서 의식적인 연습을 통해 실력을 키워가는 것이 바람직합니다. 실력이 향상되어 전문가에 가까워짐에 따라 자율성과 열정도 커지게 됩니다. 자신의 돈벌이를 위해서만 일할 것이 아니라 세상에 좋은 영향을 끼치기 위해, 가치있는 것을 주기 위해 연구하고 일하는 사람이 되시길 바랍니다.

포트란과 런타임 다형성 (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)하는 과정을 반복해야 합니다.

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

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