연구실 도커 기본 이미지 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

Docker와 GitHub를 이용한 소프트웨어 연구 환경 구축

소프트웨어를 이용한 연구와 수업을 위해 도커와 깃허브를 이용한 연구 프로젝트 템플릿을 만들어서 공개했습니다. 도커를 이용하면 소프트웨어와 관련된 라이브러리를 설치하고 환경을 설정하는 과정을 쉽게 만들 수 있고, 깃과 깃허브를 이용하면 도커 설정 파일과 프로그래밍 소스 코드를 안전하게 관리할 수 있습니다. 도커 사용 경험이 없는 연구자들이 도커를 쉽게 사용할 수 있도록 프로젝트 템플릿에 도커 관련 리눅스 스크립트들을 추가하였습니다.

프로젝트 템플릿은 깃허브 계정을 만들고 Fork하면 됩니다.

사용 방법은 리눅스 컨테이너와 버전 관리 시스템을 이용한 소프트웨어 연구 환경 구축 논문이나 유튜브에서 확인할 수 있습니다.

소프트웨어 기술 발달에 따라 점점 더 많은 과학자와 공학자들이 연구를 위해 컴퓨터 소프트웨어와 프로그래밍 도구들을 사용하고 있다. 소프트웨어를 이용한 연구에서는 환경 설정, 재현성 및 소스 코드 손실과 같은 문제들이 발생할 수 있다. 이 해설에서는 리눅스 컨테이너와 버전 관리 시스템을 사용하여 이러한 문제를 방지하는 방법에 대해 조사하였다. 연구 프로젝트 단위로 클라우드 저장소를 통해 코드를 관리하고 리눅스 컨테이너에 연구 환경을 구축하면 위의 문제들을 방지하고 협동 연구를 더 쉽게 만들 수 있다. 리눅스 컨테이너 사용경험이 없는 연구자들을 위해 컨테이너 생성과 실행에 필요한 스크립트를 포함한 연구 프로젝트 템플릿 저장소를 공개하였다.

//리눅스 컨테이너와 버전 관리 시스템을 이용한 소프트웨어 연구 환경 구축 – 초록

Git과 GitHub를 이용한 소스 코드 버전 관리

대학원에서 연구를 위해 또는 수업을 위해 프로그래밍을 사용하는 경우가 있습니다. 프로그래밍 언어를 이용해 직접 프로그램을 개발할 경우 소스 코드를 관리해주는 프로그램을 버전 관리 시스템이라고 합니다. 버전 관리 시스템을 이용하면 소스 코드 변경 사항을 기록하여 필요할 경우 이전 상태로 되돌릴 수 있고, 실수로 코드를 지워도 복구가 가능합니다. 대학원생들에게 다양한 버전 관리 시스템들 중 깃(Git)을 추천합니다.

주요 Git 명령어들

Git에서 주로 사용하는 명령줄(Command line) 명령어들은 아래와 같습니다. 명령줄이 익숙하지 않은 학생들은 GUI 프로그램을 이용해도 됩니다.

  • git init: 현재 디렉토리를 git 저장소로 만들어줍니다.
  • git add <files>: 파일들(새 파일 또는 수정한 파일)의 변경 사항을 추적하겠다고 git에게 알려줍니다.
  • git commit: 앞에서 추적하기로 한 변경 사항들을 실제로 기록합니다.
  • git status: 현재 저장소 상황을 보여줍니다. 추적 중인 파일들 중 어떤 파일들이 변경되었는지 알 수 있습니다.
  • git diff: 어떤 내용들이 변경되었는지 확인합니다.
  • git log: 그동안의 commit 내역을 확인합니다.
  • git clone <remote>: 원격 저장소가 있을 경우 원격 저장소를 현재 컴퓨터에 복사합니다.
  • git pull: 원격 저장소에서 최신 변경 사항을 가지고 옵니다.
  • git push: 현재 저장소에서 commit한 변경 사항을 원격 저장소에 기록합니다.

소스 코드에 주요 변경 사항이 있을 때마다 git add, git commit 명령을 실행합니다. 위의 명령어들은 일단 변경 사항을 저장하기 위한 명령어들이고 문제가 생겼을 때 복구하기 위한 명령어들이나 branch(가지 치기) 기능과 관련된 명령어들도 여러 가지가 있습니다. 평소에는 add, commit 명령으로 소스 코드 변경 사항을 잘 기록해두고 다른 명령어들은 필요할 때 찾아서 사용하면 됩니다(한글판 Pro Git 책).

GitHub

원격 저장소가 필수는 아니지만 사용중인 컴퓨터 전체에 문제가 생겼을 경우에는 git으로도 소스 코드를 복구할 수 없기 때문에 중요한 코드라면 별도의 컴퓨터에 원격 저장소를 만들어두는 것이 좋습니다. 원격 저장소로 사용하기 좋은 클라우드 서비스들이 몇 가지 있는데 그중 깃허브(GitHub)를 가장 많이 사용합니다. GitHub를 사용하면 다른 사람과 공동으로 작업하기도 좋습니다.

GitHub에 저장소를 만들고 작업중인 컴퓨터에서 clone하면 GitHub 저장소가 자동으로 원격 저장소로 등록되기 때문에 컴퓨터에서 코드를 수정하고 add, commit한 후 push해서 GitHub 저장소를 업데이트할 수 있습니다. 이미 컴퓨터에 git 저장소가 있을 경우에는 GitHub에 새로운 저장소를 만들고 작업중인 컴퓨터에서 GitHub 저장소를 원격 저장소로 등록해주면 됩니다. 이 때 필요한 명령은 GitHub에서 새로운 저장소를 만들면 자세히 설명해줍니다.

GitHub를 이용하면 작업중인 컴퓨터와 GitHub 두 군데에 소스 코드를 백업하는 셈입니다. 여러 대의 컴퓨터에서 작업하더라도 GitHub를 통해 소스 코드를 쉽게 동기화할 수 있습니다. 프로그래밍이 본인의 연구에서 중요하다면 꼭 버전 관리 시스템을 사용합시다. git add/commit/push를 기억합시다.

GPU를 이용한 병렬 처리/전산 유체 역학 시뮬레이션 성능 향상

본 연구실에서는 파동 전파 모델링을 위해 병렬 프로그래밍을 사용하고 있습니다. 최근 GPU 성능 향상에 따라 GPU를 이용한 파동 전파 모델링과 완전 파형 역산도 진행하고 있습니다. 그동안 진행해 왔던 GPU 관련 과제들은 다음과 같습니다.

  • 2014-2019 자원개발특성화대학사업 – 산학협력 연구단 석유가스 물리탐사
  • 2015-2016 한국지질자원연구원 – GPU를 이용한 파동 전파 모델링 기술 개발, GPU를 이용한 속도 모델링 기술 개발
  • 2016 부산과학기술기획평가원 – 범용 그래픽 처리장치와 OpenACC를 이용한 병렬 컴퓨팅 성능 향상
  • 2017-2019 한국지질자원연구원 – 다중 GPU 기반 고성능 역시간 구조보정 성능 비교 연구
  • 2019-2020 국방과학연구소 – 저주파 수중음향 전달특성 및 고속화 성능 분석

병렬 프로그래밍 기술은 탄성파 탐사 분야 뿐 아니라 물리학, 기계, 조선이나 화학 공학의 전산 유체 시뮬레이션 분야에서도 중요하게 사용되는 기술입니다. 특히 GPU 계산은 CPU를 이용한 계산보다 빠르고 효율적이기 때문에 대학/연구소/기업 등에서 연산 성능 향상 및 비용 절감을 위해 수요가 점점 증가하고 있습니다. 그러나 안타깝게도 부산 지역에 GPU 프로그래밍을 하는 사람이 많지 않기 때문에 GPU 병렬 프로그래밍 도입에 어려움을 겪는 사례들이 있습니다.

올해 여름에 부산대학교 조선해양공학과 교수님으로부터 쇄빙선에 가해지는 빙하중을 시뮬레이션하는 프로그램을 GPU에서 빠르게 돌아가도록 만들어달라는 제안을 받고 방학 기간 동안 작업을 진행했습니다. 부산대에서 OpenMP와 MPI를 이용해 클러스터 컴퓨터에서 돌아가도록 개발한 프로그램을 자체적으로 GPU용으로 바꿨는데 성능이 안 나와서 본 연구실에서 GPU 프로그램의 성능을 향상시키는 작업을 수행했습니다. 그 결과 클러스터 컴퓨터에서 CPU 56 코어를 사용해 8시간 30분 정도 걸리던 벤치마킹 모델 시뮬레이션 작업이 GPU 최적화를 통해 Nvidia Tesla V100 GPU 카드 한 장을 사용했을 때 30분 정도로 단축되었습니다. 여러 장의 GPU를 사용할 수 있도록 개선하여 GPU 카드 네 장을 사용하면 10분 정도에 결과를 얻을 수 있습니다. 해당 연구는 최근 대한조선학회에 발표했습니다.

현재 대학원 수업에서 병렬 프로그래밍을 다루기는 하지만 컴퓨터 관련 학과가 아니다보니 GPU 성능 최적화에 대해 깊이 다루지는 않습니다. 평소 컴퓨터와 프로그래밍에 관심이 있고 고성능 병렬 프로그래밍에 대해 배우고 싶다면, 본 연구실에 들어와서 병렬 연산 쪽으로 연구하는 것도 좋겠네요. 병렬 프로그래밍에서 주로 다루는 언어는 Fortran/C/C++/CUDA 이니 해당 언어 사용 경험이 있다면 더 좋습니다.

Tip: 리눅스 환경(Centos 7)에서 SSH Terminal + Docker + Jupyter Notebook을 이용한 Tensorflow GPU 버전 사용

리눅스 환경(Centos 7 기준)에서 Nvidia Docker를 이용하여 Tensorflow GPU 버전을 사용하는 방법에 대해 알아보겠습니다.

먼저 리눅스 환경에서 Docker를 설치합니다.
Docker 설치 방법은 아래 링크를 참고해주세요.
https://github.com/NVIDIA/nvidia-docker
https://docs.docker.com/install/linux/docker-ce/centos/

Docker 설치 후 일반 계정에서 Docker를 사용할 수 있도록 권한을 부여해줍니다.
root 계정으로 로그인 한 다음, shell에서 usermod -aG docker <id> 를 입력해줍니다.
입력 후 다시 로그인합니다.

Nvidia Docker를 사용하면 CUDA, CUDNN 등 CUDA 프로그래밍에 필요한 파일들을 설치하지 않아도 됩니다. Graphic Driver만 설치되어 있으면 사용이 가능합니다.
shell에서 nvidia-smi 명령어를 사용하여 Graphic Driver가 설치되어있는지 확인합니다.
만약 드라이버가 설치되어 있지 않다면 설치합니다.
https://www.nvidia.com/Download/index.aspx

드라이버가 설치되었으면, Nvidia tensorflow gpu 버전 docker 이미지를 다운받습니다.
docker pull 명령어를 통해 docker image를 다운받는데, 이 때 다양한 태그를 통해 여러 버전의 이미지를 받을 수 있습니다.
(참고 : https://www.tensorflow.org/install/docker )
이번에는 Tensorflow GPU, Python3, Jupyter notebook 환경을 사용할 것이기 때문에, 아래와 같이 shell에 명령어를 입력합니다.
docker pull tensorflow/tensorflow:latest-gpu-py3-jupyter

다운로드가 완료됐으면 docker images 명령어를 통해 이미지를 확인해줍니다.

그 다음 docker container를 만듭니다. container를 만드는 명령어는 다음과 같습니다.

docker run –runtime=nvidia –name=<name> -v </home/ID/directory:/directory -it –entrypoint=bash -p 8888:8888 -p 6006:6006 tensorflow/tensorflow:latest-gpu-py3-jupyter

위의 명령어를 실행하기 전에 위에서 사용된 docker 명령어에 대해 알아봅시다.
1) –name=<name> 도커 컨테이너의 이름을 지정해주는 명령어입니다. 컨테이너를 다시 시작할 때, 복잡한 컨테이너 ID를 사용하기 번거로우므로, 별명을 지정해줘서 사용하기 편하게 해줍니다. <name> 부분에 본인이 원하는 이름을 적어주면 됩니다.

2) -v 호스트의 디렉토리를 도커 컨테이너에 마운트 하는 명령어입니다. 호스트에 있는 파일을 작업하기 편하도록 마운트 해줍니다. 마운트하기 원하는 디렉토리의 주소(pwd 명령어로 확인)를 </home/ID/directory:/directory> 형식으로 입력합니다.

3) -it 명령어로 shell에 입출력이 가능해집니다.

4) –entrypoint=bash 컨테이너 시작시에 수행할 명령어입니다. 위의 예시의 경우 Jupyter notebook이 자동으로 실행되지 않게 하기 위해 입력한 것입니다.

5) -p 8888:8888 -p 6006:6006 Jupyter notebook (8888)과 tensorboard (6006)를 사용하기 위해 포트 설정을 해주는 옵션입니다.

사용 예시) 만약, test라는 계정의 works 디렉토리를 컨테이너에 works 디렉토리로 만들고 컨테이너 이름을 hello로 만들고 싶다면, 다음과 같이 입력하면 됩니다. (v, it, p 앞에는 – 1개, runtime, name, entrypoint 앞에는 – 2개)
docker run –runtime=nvidia –name=hello -v /home/test/works:/works -it –entrypoint=bash -p 8888:8888 -p 6006:6006 tensorflow/tensorflow:latest-gpu-py3-jupyter

성공적으로 컨테이너가 만들어 졌다면 아래와 같은 화면이 출력됩니다.

호스트의 디렉토리가 마운트 된 것도 확인할 수 있습니다.

이어서 사용환경 setting에 대해 알아보겠습니다.
nvidia docker 이미지는 ubuntu os가 설치되어 있습니다. 하지만 기본적인 프로그램 설치가 되어있지 않기 때문에 필요한 프로그램을 설치해줍니다.
저는 우선 vim 편집기를 설치했습니다
shell에 apt-get install vim 입력하고 설치합니다.

그 다음 jupyter notebook을 실행합니다.
그러면 아래와 같은 에러 메시지가 출력됩니다.

해당 에러를 해결하기 위해, jupyter notebook configuration 파일을 생성해줍니다.
shell에 jupyter notebook –generate-config 명령어를 입력합니다. (generate 앞에 – 2개, config 앞에 – 1개)

그 다음 vim 편집기를 이용해 config 파일을 수정해줍니다.
shell에 vi /root/.jupyter/jupyter_notebook_config.py 를 입력해줍니다.

vim 편집기 에서 / 를 사용하여 notebook_dir, NotebookApp.ip, NotebookApp.port, allow_root, 를 각각 검색합니다.
notebook_dir는 노트북 시작시 홈 디렉토리를 설정하는 파라미터입니다. 마운트 한 디렉토리로 바꾸는것이 사용에 편리할 것입니다.
ip 는 ‘0.0.0.0’ 으로 수정합니다.
port 는 8888로 수정합니다.
allow_root는 True로 바꿔줍니다.

(수정할 때 앞의 주석처리 #을 지워주는것을 잊지 마세요!)

위와 같이 수정했다면 :wq 를 입력하여 수정한 파일을 저장합니다. 그 다음 다시 jupyter notebook을 실행합니다.

이렇게 된 상태에서 터미널을 하나 더 실행하여 host 계정으로 접속합니다. host에서 웹 브라우저를 실행합니다. 저는 firefox를 사용하겠습니다.

웹브라우저 주소창에 127.0.0.1:8888 을 입력합니다.

아래와 같은 창이 뜨면, 도커 컨테이너에서 token 값을 복사하여 입력합니다.
그리고 필요에 따라 password를 설정해서 사용할 수 있습니다.

토큰을 입력하면 다음과 같이 실행됨을 알 수 있습니다.

수고하셨습니다. 연구에 도움이 되길 바랍니다.

책: 국가란 무엇인가(유시민 작가)

“국가란 무엇인가”라는 다소 식상하고 지루할 수 있는 주제를 유시민 작가만의 독특한 화법으로 이해하기 쉽게 설명해줍니다. 앞 장에서는 ‘국가란 무엇인가’ , ‘누가 다스려야 하는가’ 라는 주제로 동서고금 철학자들의 생각을 시대순으로 언급하면서 국가관의 발전상을 보여주었고, 제 5장 ‘애국심은 고귀한 감정인가’ 라는 의문사 형태로 질문하면서 애국심이란 국가라는 특수한 집단에 의해 생겨난 상호 배타적인 감정이라고 말합니다. 그런 다음, 제 6장 ‘혁명이냐 개량이냐’에서는 혁명은 개량의 길이 봉쇄되었을 때 즉, 점진적 공학이 더 이상 소용이 없을 때 일어난다고 하였으며 제 7장 ‘진보정치란 무엇인가’에서부터 작가가 원하는 정의로운 국가의 모습이 어떠한 형태인지 나타나게 됩니다. 마지막 장에는 우리나라 정치와 국가 방향에 대한 솔직한 생각을 피력하면서 마무리합니다.

작가가 꿈꾸는 훌륭한 국가는 고대 그리스 목적론적 국가론처럼 사람들 사이에 정의를 실현하는 국가라고 합니다. 국민 한 사람 한 사람을 수단이 아니라 목적으로 대하고(칸트의 도덕법), 국민을 인간으로 존중하고 책임지고 보호해주는 그런 국가(진보자유주의, 복지국가)를 말합니다. 그는 촛불집회를 보면서 “이게 나라냐” , “이것이 국가란 말인가?”라는 구호를 듣게 되었고 2011년에 출판한 이 책이 개정신판으로 다시 세상에 나오게 되었습니다.

저는 아직까지 모두가 훌륭하다고 할 수 있는 그런 국가를 경험해보지 못 한 것 같습니다. 그러나 불행 중 다행인 점은 우리나라는 악을 최소화할 수 있는 제도가 있는 민주주의 사회에 살고 있으며 모든 시민들이 국정에 관심을 가지고 훌륭한 국가를 만들려고 노력한다면 마냥 불가능한 이야기는 아닐 것이라고 생각합니다.

‘국가’라는 정의는 다양하고 여러가지 국가론이 있지만 현재 우리나라의 경우 훌륭한 국가를 만든다고 하면 남녀노소 누구든지 책임윤리를 가지고 정치인의 말과 행동에 관심을 가져야 한다고 생각합니다. 민주주의 정치제도의 핵심은 국민의 참여와 소통인데 만약 이 부분이 결여된다면 국민을 속이고 사리사욕만 챙기는 악인이 민주적 절차를 통해 당선되는 경우가 발생할 수 있으며, 또는 국가와 국민을 위해 일하는 선인을 온갖 권모술수로 방해할 수도 있습니다. 정치에 염증을 느껴 떠난 사람들, 하루 먹고 살기 바쁜 사람들, 정치에 관심이 없는 사람들이 점점 사회에 많아질수록 민주주의는 고대 그리스 때처럼 중우정치에 빠질 확률이 높아질 것입니다. 따라서 본인의 행동에 책임윤리를 가지고 자신이 국가의 주인이라는 인식을 가진다면 예를 들어 적어도 투표는 선택이 아닌 권리이자 의무로 임할 것이라고 생각합니다.

유시민 작가는 우리나라 민주주의를 후불제 민주주의라고 표현하였습니다. 충분히 일리가 있는 표현이라고 생각합니다. 4·19 혁명 때 거리에 쓰러졌던 청년과 학생들, 유신시대에 목숨을 잃거나 고문을 당했던 대학생과 종교 지식인들, 5·18광주민중항쟁 희생자들, 6월민주항쟁 때 최루탄과 경찰과 맞섰던 시민들, 광우병 촛불시위와 박근혜 대통령 탄핵 요구 촛불시위 등 민주공화국을 세울 때 미리 치르지 않았던 비용을 후불하였다는 이야기입니다. 안타깝게도 저는 개인적으로 노무현 참여정부 이후 진보정치의 무능력 및 책임회피과 시민들의 정치 무관심이 민주주의 국가시스템의 근본이 위협받는 상황까지 가게 만들었고 결국 촛불시위가 일어난 것이 아닌가?라고 생각합니다.

앞서 언급한 것처럼 민주주의 제도 하에서 훌륭한 국가로 나아가기 위해서는 모든 시민들이 국정에 관심을 가지고 적극적으로 참여해야 하는 것이 중요하다고 생각합니다. 그 결과, 정치인이 국민을 두려워하고 국민의 요구를 파악하면서 의지를 대표할 수 있도록 노력할 것입니다. 마지막으로 이 책에서 언급한 아리스토텔레스의 인용구로 끝맺도록 하겠습니다. “훌륭한 국가는 우연과 행운이 아니라 지혜와 윤리적 결단의 산물이다. 국가가 훌륭해지려면 국정에 참여하는 시민이 훌륭해야 한다. 따라서 시민 각자가 어떻게 해야 스스로가 훌륭해질 수 있는지 고민해야 한다.”

책: 여행의 이유(김영하 산문)

소설가 김영하의 여행, 그리고 여행을 바라보는 아홉 가지 이야기.

1장 추방과 멀미

첫 번째 이야기는 2005년 당시, 작가가 집필을 위해 중국으로 떠났지만 입국을 거부당하고 추방당했던 일화로 시작합니다. 매우 불운한 일로 생각할 수 있지만 이러한 흔치 않은 경험이 결국 좋은 이야기 소재가 되었다고 말하면서 ‘여행의 의미가 무엇인가?”라는 본질적인 질문으로 이어집니다. 그는 여행이란 “여행을 떠난 주인공이 여러 시련을 겪다가 원래 성취하고자 했던 것과 다른 어떤 것을 얻고 오는 것”이라고 말합니다. 여러가지 이야기로 예시를 보여주는데, 여행을 떠난 많은 이들이 여행을 마쳤을 때 본인이 원하던 외면적 목적 달성 여부와 관계없이 평소에 인식하지 못 했던 내면적 목표를 달성하는 경우가 많다고 합니다. 그러나 한편, 여행의 어원이 travail(고역)에서 유래된 점을 보면 20세기 이전의 사람들은 여행이란 고향에서 머물지 못 하고 타지를 떠돌아 다니는 고통스럽고 힘든 시련이라고 여겼을 것이라 생각합니다. 즉, 현재 우리는 지루한 일상을 떠나 새로운 것을 얻고 싶은 마음과 안정적이고 통제된 삶에서 위험한 변수를 피하고 싶은 마음이 서로 상존하고 있을지도 모릅니다.

2장 상처를 몽땅 흡수한 물건들로부터 달아나기

작가는 서두에 “나는 호텔이 좋다.”라고 말하면서 운을 뗍니다. 결론부터 말하자면 호텔에 머무는 동안에는 일상과 가족, 인간관계로부터 받는 상처와 피로로부터 벗어날 수 있기 때문입니다. 실제로 삶이 부과하는 문제가 크면 클수록 작가는 여행을 더욱 갈망하였다고 합니다. 필자도 일상에서 주어지는 문제에 도피하고 싶을 때 소설이나 영화 속 이야기를 상상하곤 하는데 아마도 비슷한 감정이지 않을까 싶습니다.

3장 오직 현재

사람들은 대개 과거를 후회하고 다가올 미래에 대해 불안감을 느끼며 살아갑니다. 여행은 그런 우리를 과거와 미래로부터 끌어내 현재에 집중하게 만든다고 합니다. 그 경험들 중 의미있는 것들을 생각으로 바꿔 저장하고 이로부터 영감을 얻습니다. 그래서 작가는 언제나 그 순간에 있었던 여행지보다는 집에 누워있을 때 영감을 얻는다고 합니다.

4장 여행하는 인간, 호모 비아토르

철학자 가브리엘 마르셀은 인류를 호모 비아토르(여행하는 인간)으로 정의하기도 했는데 인간은 끝없이 이동해왔고 그런 본능이 우리 몸에 새겨져 있다고 합니다. 1995년 전에는 전 세계적으로 여행 인구가 5억 2천만 명이었으나 인터넷 시대가 도래하면서 2016년에는 12억 4천만 명으로 두 배가 넘게 증가하였습니다. 여행은 피곤하고 위험하면서 비용도 많이 들지만 인류의 본능이 여행을 포기하지 않고 기술이 발전하면 할수록 더 많이 이동하는 것을 통계가 보여주고 있습니다. 어쩌면 인류가 여행이 선택이 아닌 필수라고 생각하는 날이 올지도 모르는 일입니다.

5장 알아두면 쓸데없는 신비한 여행

다섯 번째 이야기는 “알아두면 쓸데없는 신비한 잡학사전”에 출연한 김영하 작가가 독특한 화법으로 방송 경험을 풀어내는데 특히 프로그램 편집에 대해 바라보는 관점이 놀라웠습니다. 출연자들이 뿔뿔히 흩어져 각자의 여행을 다니고 저녁 식사 때 모여 본인들이 겪은 여행 이야기를 들려주는 방식인데, 편집하는 제작진들도 모든 여행을 리뷰할 수 없어 최종 영상을 통해 간접적으로 경험하게 된다고 합니다. 작가도 최종 편집본을 통해 간접적으로 다른 여행들을 체험하게 되는데 심지어 본인이 직접 다녀온 여행지조차 편집하는 사람의 느낌과 색깔에 영향을 받아 좀 더 깊이 있고 색다른 여행을 경험한다고 합니다. 즉, 최종 영상은 타인이 보여주고 싶은 여행의 정수만 골라서 체험할 수 있으면서 본인은 여행 과정에 수반되는 고통과 비용을 지불하지 않아도 됩니다. 이를 “방구석 여행자”라고 표현했는데 모두가 어느정도는 방구석 여행자이며 일인칭 시점으로 수행한 이 ‘진짜’ 여행은 다른 사람들의 경험과 생각이 함께 숙성되면서 우리의 여행이 좀 더 명료해진다고 합니다.

6장 그림자를 판 사나이

아델베르트 폰 샤미소의 “그림자를 판 사나이” 소설을 보면 주인공은 자신의 그림자를 신비한 인물(악마)한테 파는 대가로 무엇이든 꺼낼 수 있는 ‘행운의 자루’를 얻게 됩니다. 그림자라는 평소에는 신경도 쓰지 않는 것을 파는 대신 엄청난 부를 얻었지만 주인공은 곧 그림자가 인간에게 매우 중요하다는 사실을 알게 됩니다. 그림자가 없는 인간은 사회에 환대받지 못 하였고 결국 혼자가 되었지만, 우연히 어디든지 갈 수 있는 마법의 장화를 얻게 되면서 여행자로 살아가게 됩니다. 즉, 현실에서 여행자는 그림자가 없는 존재이기 때문에 타지에서 어떤 의무와 책임도 또한 어떤 소속감도 가지지 않습니다.

7장 아폴로 8호에서 보내온 사진

일곱 번째 이야기는 여섯 번째 이야기의 반전을 담아냈는데, 여행을 통해 얻는 또다른 기쁨은 타지에서 경험하는 환대라고 합니다. 지구라는 작은 행성에 같이 탑승하고 있는 승객으로서 모두가 동료이고 소중한 존재라는 관점에서 보면 곤란한 여행자를 도와주는 것은 선순환을 유발합니다. 인류는 오랜 세월동안 서로를 적대하고 살육해왔지만 한편으로 낯선 이들을 손님으로 맞이하고 절실한 것들을 제공하면서 떠나보내기도 하였습니다. 거의 모든 문명에, 특히 유목민들에게는 손님을 잘 대접하라는 계율이 남아있다고 합니다.

8장 노바디의 여행

실뱅 테송은 “여행의 기쁨”에서 괴테를 인용하는데 ‘여행은 여행자가 외부 세계에 감행하는 습격이며 , 여행자는 언젠가 노획물을 잔뜩 짊어지고 집으로 돌아가는 약탈자다’라고 언급합니다. 반면에 식사와 잠자리를 제공하면 고마워하며 소식이나 정보 및 선물 등을 주고 떠나는 이들도 있으므로 외부인은 위험하면서도 동시에 매력적이라고 표현합니다. 성숙한 여행자라면 자신을 타지의 상황에 따라 “섬바디(특별한 사람)” 혹은 “노바디(현지인 코스프레)” 중 하나를 선택해서 현명하게 대처하게 되는데 이는 인생을 지혜롭게 살아가는 방법이기도 합니다.

9장 여행으로 돌아가다

일상과 여행의 관계는 마치 현실과 소설의 관계와 같다고 합니다. 현실은 어지럽고 복잡하고 무질서합니다. 그러나 소설은 현실과 비슷한 일이 일어나지만 질서가 있고 통제가 가능합니다. 여행은 우리를 집중시키고 한 도시의 정수만을 맛보길 원하며 여행에서 보고 듣는 모든 것들이 유기적으로 연결되어 있다는 느낌을 받습니다. 여행은 시작과 끝이 분명하다는 점에서 소설과 닮았으며 설렘과 흥분 속에서 낯선 세계를 탐험하고 안전하게 출발점에 돌아옵니다. 작가는 자신의 정체성을 여행자로 규정할 수 밖에 없는 최종적인 이유가 여기서 두드러지는데 지루한 일상을 벗어나 세상을 다시 느끼고 정신이 한껏 고양된 상태로 돌아오면서 다시 일상을 여행할 수 있는 힘을 얻는다고 합니다.

한 마디로 말하라 – Mini Goss

우리는 전달하고자 하는 메시지를 언어를 이용한 문장을 통해 의사소통을 합니다. 우리는 이러한 메시지를 하루에도 수백, 수천 개씩 처리해야 하고, 서로의 메시지를 제대로 이해하지 못하면 오해, 논쟁, 결렬 등이 발생할 수 있습니다. 따라서 우리는 전달하고자 하는 메시지를 정확하게 파악하고 간결한 문장으로 전달하는 것이 중요합니다. 저자는 이 간결한 문장을 ‘결정적 한 마디’라고 말하고 있습니다. 결정적 한 마디는 맥락과 무관하거나 지나치게 복잡한 정보를 제거하여 우리와 청중이 중요한 메시지에 집중할 수 있도록 만들어 줍니다. 이러한 결정적 한 마디는 면접, 발표, 연설, 협상 등 공적인 자리뿐만 아니라, 일상적인 대화나 유머, 심지어 술자리 건배사 같은 사적인 자리에서도 효과적인 기술입니다. 이 책에서 설명하는 힘 있고 인상적인 결정적 한 마디를 만들기 위한 방법과 우리에게 도움이 될 수 있는 활용법을 설명하겠습니다.

힘 있고 인상적인 결정적 한 마디를 만들기 위해서는 우리가 전달하고자 하는 메시지를 사람(1~5), 행동(6~8), 드라마(9~11)으로 나누고, 다음과 같은 항목에 대한 정보를 체크합니다.

  1. 주제와 관계있는 사람은 누구인가?
  2. 메시지를 듣는 사람은 누구인가?
  3. 그들에게서 알고자 하는 것은 무엇인가?
  4. 그들은 당신에 대해 무엇을 알고 있는가?
  5. 그것을 묘사하는 방직은 어떠한가”?
  6. 전달하고자 하는 정확한 내용이 무엇인가?
  7. 당신에게 가장 중요한 행동은 무엇인가?
  8. 청중에게 가장 중요한 행동은 무엇인가?
  9. 메시지에서 가장 흥미로운 극적 요소는 무엇인가?
  10. 그 요소로 어떤 대화를 시작할 수 있는가?
  11. 서로의 목표를 함께 달성할 수 있도록 청중을 사로잡을 수 있는가?

체크했다면, 각 항목에서 가장 중요하다고 생각하는 단어들을 표시합니다. 이 단어들이 결정적 한 마디에 들어가야 할 핵심 단어들입니다. 그리고 자신의 목표와 청중의 목표 중 중복되는 것에 기반을 두고 핵심 단어들을 활용하여 결정적 한 마디를 구성합니다. 결정적 한 마디를 구성했다면, 구상한 문장을 직접 읽어봅니다. 만약 자신이 읽었을 때 어색하게 들린다면, 대화체로 바꿔주는 것이 좋습니다. 또한 가능한 청중들이 마음속으로 메시지를 그릴 수 있도록 구체적이고 시각적인 표현을 사용하고, 쉽게 이해하고 기억할 수 있도록 쉽고 매력적인 단어들을 사용하는 것이 효과적입니다.

이러한 과정을 통해서 결정적 한 마디하는 활용해서, 우리가 전달하고자 하는 생각을 효과적으로 전달하는 방법도 존재합니다.

<빙산분석법>
빙산 분석법은 청중들이 듣기 원하는 메시지를 찾아서 전달하는 것으로, 우리가 청중에게 전달하고자 하는 전체 내용을 바다에 떠 있는 빙산에 비유한 방법입니다. 우리는 빙산 전체를 알고 있지만, 청중은 수면위로 드러난 빙산의 꼭대기만 볼 수 있습니다. 따라서 우리는 빙산의 꼭대기를 결정적 한 마디를 활용하여 채우고, 수면 아래는 뒷받침하는 내용들을 중요도에 따라서 채워야 합니다.
빙산 분석법은 언론 기자들이 효과적으로 독자의 관심을 끌고, 정보를 신속하게 파악할 수 있도록 기사나 보도를 편집할 때 사용하는 방법입니다. 언론 기자들은 독자들에게 전달할 중요 내용을 빙산 꼭대기에 배치하고, 뒷받침하는 내용들을 중요도에 따라 배치합니다. 그리고 주어진 기사나 보도의 길이에 맞추기 위해, 중요도가 낮은 내용부터 잘라냅니다.

<5분 미팅법>
5분 미팅법은 짧은 시간 내에 결정적 한 마디에 집중 할 수 있도록 도와주는 훈련법으로, 상대가 5분 동안 자신의 생각을 설명하라고 요구했다고 가정하는 방법입니다. 우리는 상대가 집중할 수 있도록 상대가 원하는 내용을 세심하게 고려하고 열정적으로 이야기할 수 있도록, 상대의 의견을 반영할 수 있도록 결정적 한 마디를 수정해야 합니다. 결정적 한 마디를 수정하면서, 결정적 한 마디를 뒷받침 하는 2~3가지의 정보와 현실성을 부여할 수 있는 흥미로운 통계수치나 사례를 함께 준비하는 것이 좋습니다. 또한 우리는 항상 상대의 생각이 우리와 같지 않을 수 있다는 것을 명심하고, 그들이 제시하는 핵심적인 반론을 신중하게 경청하는 자세를 유지해야 합니다.

우리는 때때로 면접이나 발표, 논문의 초록 등 짧은 시간 동안 상대방의 관심을 집중 시켜 중요한 메시지를 전달해야 하는 상황을 마주하게 됩니다. 이러한 상황에서 우리는 결정적 한 마디를 활용하여 청중들에게 효과적으로 우리의 생각을 전달할 수 있다고 생각합니다.

영화: 미스트(The Mist, 2007)

당신이 알던 세상은 안개 속으로 사라진다.

소설이 원작인 SF 영화 ‘미스트’는 다소 식상?하고 근본 없는 SF 소재를 사용했지만 초점은 위기 상황에 직면했을 때, 고립된 사회에서 나타나는 인간의 다양한 모습들을 보여주는 철학적인 내용을 담았습니다.

어느 날 강력한 비바람이 몰아친 다음 날, 사람들은 이러한 재난을 대비하고 극복하기 위해 마트에서 생필품을 구입하고 있었습니다. 기이한 안개는 점차 마을을 향해 몰려오고 있었고 심지어 군인과 소방관, 경찰관들이 출동하는 사태가 발생하게 됩니다. 안개 속에서 도망친 한 노인이 피를 흘리면서 “안개 속에 무언가가 있다!” 라고 소리치면서 마트 안에 들어오게 되고 마트 밖은 앞이 아무것도 보이지 않는 안개 속에 갇히게 됩니다.

‘미스트’의 이야기는 안개 속에 갇힌 마트 안의 사람들이 문제를 어떻게 접근하고 해결하려는 부분에서 시작됩니다. 먼저 안개 속의 ‘괴물’의 존재를 믿지 않는 사람들(주: 변호사 브렌트 노턴)은 이성적으로 생각하라면서 마트 밖에 나갑니다. 그 후 돌아오거나 살아남았다는 장면은 나오지 않습니다. 군인들이 구출해주길 기다리는 남은 사람들은 주인공 데이빗의 말을 따라 마트 유리벽에 장벽을 쌓게 됩니다. 하지만 시간이 흐르면서 고립된 사람들은 점점 불안해지고 데이빗의 아이를 돌보시던 할머니 한 분이 수면제를 먹고 죽음을 택하는 경우도 발생합니다. 이러한 절망적인 상황에서 카모디 부인은 성경의 말씀을 악용하면서 선동을 일으켜 추종자들을 끌어들입니다. 주인공 일행은 카모디 부인 일행과 마찰을 일으키게 되고 결국 주인공 일행은 마트에서 빠져 나가기로 결정합니다. 마트에서 탈출한 후 차를 타고 안개에서 벗어나려고 시도했지만 차 연료가 다 떨어지자 데이빗은 최후의 선택을 합니다. 차 안에 남아 있는 인원들은 전부 데이빗 손에 죽게 되고 본인은 총알이 부족해 혼자 살아남아 차에서 내립니다. 그 순간 데이빗은 사람들을 구출한 군인들을 만나게 되고 마지막 장면 1분을 위해 이 영화가 존재한다는 말이 있을 정도로 현실?적이고 씁쓸한 결말로 막을 내립니다.

재난 또는 한 치 앞도 알 수 없는 상황을 상징하는 ‘안개’, 모든 종류의 인간을 반영한 하나의 고립된 사회를 상징하는 ‘마트’, 안개 속에 존재하는 위험요소인 ‘괴물’. 이 영화의 SF 요소는 단지 고립된 사회를 형성하기 위한 하나의 장치라고 생각되고 본질은 이러한 위기상황에 나타날 수 있는 인간의 선한 면과 악한 면 그리고 이성적인 면과 감성적인 면 등을 관람객의 입장, 즉 최대한 객관적인 입장에서 바라보라는 의미가 아닐까?라는 생각을 하였습니다.

화살촉 프로젝트나 마트에 고립된 군인 병사 한 명이 마녀사냥 당하는 장면 등 언급하지 않은 내용들이 많습니다. 이런 부분들은 영화를 보신 후 직접 판단해보시는 것을 권유합니다. 저는 영화 ‘미스트’에서 작가나 감독이 말하고 싶은 내용은 진짜 위기는 외부에 있지 않고 내부에 있다는 것과 어느 순간에도 ‘희망’을 잃지 말라는 것이 아닐까?라고 생각합니다. 비록 요즘 시대에 비해 조금 허술할 수 있는 SF 요소라는 점이 있지만 스토리텔링만큼은 전혀 식상하지 않고 현실적인 폭로를 담아낸 명작이라고 생각합니다.

책: 실용주의 프로그래머 – 앤드류 헌트, 데이비드 토머스

‘실용주의 프로그래머’는 전문 프로그래머들을 위한 조언들이 담긴 책입니다. 제가 대학원생 때 읽고 책의 조언들 중 몇 가지를 직접 실천해보면서 많은 도움을 얻었습니다. 총 70가지의 조언들이 담겨 있는데 제가 실천했던 조언들 중 몇 가지만 살펴보겠습니다.

  • 11. DRY (Don’t Repeat Yourself) – 반복하지 마라.
  • 12. 재사용하기 쉽게 만들라.
  • 21. 명령어 셸의 힘을 사용하라.

연구하면서 반복적으로 하는 작업들이 있습니다. 대학원생 때 반복적으로 하던 작업들 중 이진 파일로 된 탄성파 자료나 속도모델 등에서 trace나 profile을 추출하는 작업, 지하 영상에 미분이나 라플라시안 필터를 적용하는 작업, 깊이에 따라 속도가 선형으로 증가하는 속도모델을 만드는 작업 등이 있었습니다. 그때 그때 코드를 새로 작성하거나 예전에 사용했던 코드를 수정해서 작업했었는데 이러한 반복 작업을 없애기 위해 명령어 셸에서 옵션만 바꿔가며 쉽게 재사용할 수 있는 프로그램들을 작성했었습니다. 그리고 그런 프로그램들을 모아 gpl 라이브러리라고 이름을 붙였죠. 주로 당시 사용하던 포트란 프로그래밍 언어로 프로그램들을 작성했는데, 명령어 셸에서 사용할 수 있도록 option parser도 만들고 파일 입출력도 많이 다루면서 프로그래밍 연습을 할 수 있었습니다.

  • 22. 하나의 에디터를 잘 사용하라.

리눅스 Command line 상에서 프로그래밍을 했기 때문에 당시 사용할 수 있는 에디터로 VimEmacs가 있었습니다. 둘 중 어느 것을 사용할까 비교해보다가 결국 어디에나 설치되어 있는 Vi(Vim)를 사용하기로 했고, 각종 명령어와 plugin들을 이용해 Vim 고급 사용법을 익혔습니다.

  • 23. 언제나 소스코드 관리 시스템을 사용하라.

당시에는 Mercurial을 선택해서 사용하다가 몇 년 전부터는 Git만 사용하고 있습니다.

  • 28. 텍스트 처리 언어를 하나 익혀라.

당시 포트란과 C 언어만 사용하고 있었는데, 이 책을 읽은 후 Ruby, Perl, Python 중 프로그래머를 행복하게 하자는 철학을 내세웠던 Ruby를 선택해서 공부하고 사용했었습니다. Ruby를 배워놓았던 것이 도움이 돼서 나중에 Ruby와 Seismic Unix를 이용해 Muting/Interpolation 스크립트도 작성할 수 있었습니다. 참고로 지금은 Ruby는 사용하지 않고, 과학/공학 라이브러리가 많은 Python을 주로 사용합니다.

위의 조언들 외에도

  • 20. 지식을 일반 텍스트로 저장하라.
  • 29. 코드를 작성하는 코드를 작성하라.
  • 36. 모듈간의 결합도를 최소화하라.
  • 49. 소프트웨어를 테스트하라.
  • 61. 수작업 절차를 사용하지 말라.
  • 68. 문서가 애초부터 전체의 일부가 되게 하고, 나중에 집어넣으려고 하지 말라.

등 다양한 조언들을 실천해보면서 프로그래밍 실력을 향상시킬 수 있었습니다. 우리가 전문 프로그래머는 아니지만 주로 프로그래밍을 이용해 연구를 수행하고 있으니 프로그래밍에 대해 공부하는 것도 많은 도움이 됩니다. 단, 이것 자체가 연구는 아니니 연구하는 중에 틈틈이 연습해보는 것이 좋겠죠.