2015년 7월 9일 목요일

[하루에 한 R] ANI 매트릭스로 덴드로그램 그리기

오늘 작성하는 글에서 다루는 내용은 기술적으로 정확하지 않을 수도 있음을 사전에 밝히는 바이다.

다양성 측면에서 미생물 유전체를 다루는 사람이라면 서열 정보를 가지고서 두 스트레인이 동일한 종에 속하는지 혹은 그렇지 않은지를 판단해야 하는 상황에 종종 직면하게 된다. 복잡한 이론은 다 잊어버리고, 다음과 같이 4줄로 요약해 보겠다.

  • 16S rRNA gene의 similarity가 97% 미만이면, 두 균주는 서로 다른 종에 속한다. 역은 성립하지 않는다(무슨 말이냐 하면 97% 혹은 그 이상일 경우 같은 종일 수도 있고 아닐 수도 있다는 말이다).
  • 97% 16S rRNA gene similarity는 70% DDH(DNA-DNA Hybridization)에 해당한다.
  • 70% DDH에 해당하는 ANI(Average Nucleotide Identity) 값은 95~96%이다.
  • 일반적인 경우라면 동일 종에 속하는 균주는 TETRA > 0.99를 만족시켜야 한다.
종 구분을 위한 도구 중에 specI라는 것도 있다. 이는 40개의 phylogenetic marker gene을 사용하는 도구이다. annotation이 필요하지만 genome 수준의 ANI 계산이 없어서 빠르다. Nature Methods(2013)에 실린 논문은 너무 함축적이라서 읽기가 힘들다. 웬만한 것은 supplementary material을 보라고 해 놓으니...(국립국어원: '웬만해서'가 옳은 표기입니다).

ANI 값을 계산하여 행렬 형태로 만들어 주는 대단히 편리한 소프트웨어로서 JSpecies라는 것이 있다. 이 프로그램을 돌리면 다음 그림과 같은 매트릭스가 나온다. 대각선은 자기 자신에 대한 계산이므로 '---'표시되는데, 이를 100(단위는 퍼센트)으로 치환하여 보았다. 컬럼 라벨과 행(row) 라벨이 동일하다. 이 자료를 가지고 덴드로그램을 그리는 것이 오늘의 학습 목표이다.


덴드로그램(dendrogram)이란 계층적 클러스터링 결과를 가지가 달린 나무와 같은 그림으로 표현하는 것이다. 

위 그림에서 보인 데이터가 data.txt하는 파일에 저장되어 있다고 가정하자. 각 값의 구분자는 탭이다. 아무런 생각 없이 그림을 그리려면 다음과 같이 하면 된다.

> data = read.table("data.txt", sep="\t", header=TRUE, row.names=1)
> plot(hclust(dist(data)))


설정을 전혀 변경하지 않았으므로, complete agglomeration 방법이 사용되었다. hclust() 함수 안에서 method="average"라고 지정하면 UPGMA(Unweighted Pair Group with Arithmetic Mean) 방법으로 클러스터링이 된다. 이상의 경우는 대칭 매트릭스라서 상당히 간편하게 클러스터링이 되었다(엄밀히 말하면 대각선을 중심으로 각 쌍의 값이 완벽하게 같지는 않다. blast 혹은 mummer 계산을 하면서 어느 것을 query로 하느냐에 따라서 결과 수치가 매우 근소하게 차이가 나기 때문이다). 여기서 조심할 것은 각 데이터는 row를 기준으로 클러스터링을 했다는 것이다. 만약 expression data와 같이 각 데이터가 컬럼 단위로 차곡차곡 쌓인 경우라는 t() 함수로 트랜스포즈를 해야 된다. 덴드로그램은 'column dendrogram'이지만 사용되는 데이터는 row 단위임을 명심하자. mtcars라는 내장 데이터셋을 가지고 시험해 보라.

제목과 설명이 마음에 들지 않으면 plot() 함수의 매개변수를 적절히 조절하면 된다.

> plot(hclust(dist(data), method="average"), main="Title", xlab="X-label", ylab="Y-label", sub="subtitle")

UPGMA에 의한 클러스터링을 그림으로 쉽게 설명한 사이트가 있어서 링크를 소개한다. 같은 사이트 내에 distance matrix를 이용한 클러스터링 서비스 페이지가 있다. 혹은 좀 더 심오해 보이는 웹 서비스를 이용하고 싶다면 DendroUPGMA를 방문해 보라.

자, 여기서 궁금증이 생겼다. 모든 궁금증이 오늘의 포스팅 내에서 해결되지는 않을 것이다.
  1. 세로축 "Height"의 단위는 무엇인가? 공부해!
  2. 이미 대칭인 매트릭스에 dist() 함수를 적용하는 것은 중복이 아닐까? 즉, row1 = (a, b, c...)와 같은 일반적인 형태의 "비대칭" 데이터가 더 적합한 것이 아닐까?
  3. data 매트릭스를 이루는 수치는 percent identity이다. 만약 100 - data를 하면 이는 자연스럽게 dissimilarity matrix와 비슷한 것이 된다. 이것을 가지고 직접 클러스터링하면 안되나?
  4. 세로축의 단위를 실제의 difference로 나타나게 할 수는 없을까?
3을 해결해 보자. 그저 R에서 100 - data라고 하여 새로운 오브젝트에 지정하면 된다. R은 이럴 때 참으로 편리하다.


논문을 찾아보면 100 - (ANI)를 한 매트릭스를 가지고서 덴드로그램을 그렸다는 글귀가 보인다. 그렇다고 해서 무턱대로 plot(hclust(data.2))를 하면 안된다. hclust() 함수가 받는 인자는 아무 매트릭스나 되는 것이 아니라 "a dissimilarity structure as produced by 'dist'"라고 명시되어 있기 때문이다. 만약 R에서 dist() 함수를 쓴다면 인자로 data를 주든 100-data를 주든 똑같은 트리가 나온다.  백문이 불여일견이다.. 플롯 2개를 동시에 그려보자.

> par(mfrow=c(1,2))

> plot(hclust(dist(data)))
> plot(hclust(dist(data.2)))



data.2 그 자체는 dissimilarity matrix(또는 distance matrix)가 아니다. dist()함수로 넘길 것이라면 data(=ANI)면 어떻고 data.2(100-ANI)면 어떤가?

그러면 구체적인 사례로서 논문을 직접 찾아보자.

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC4154481/ 

100% - ANI를 ANI divergence로 정의하고 이를 hcluster Python package를 사용한 스크립트에 투입하였다고 한다. 이 논문의 Supplementary Data 2에 데이터와 파이썬 코드가 있다. 다음은 코드 전체이다. 결과 그림은 여기에 있다. 생각보다 그림이 예쁘다. 아마도 identity level에 따라 색깔이 입혀지도록 만든 것 같다.

# coding: utf-8
import pylab
import matplotlib.pyplot as plt
from pylab import loadtxt
from hcluster import *
from pylab import xlabel
X = loadtxt('SD2_ani_data.txt')
lab = open('SD2_ani_names.txt').read().splitlines()
Y = pdist(X)
Z = complete(Y)
dendrogram(Z,orientation='right',labels=lab,distance_sort='ascending',leaf_font_size=8,color_threshold=0)
xlabel('Euclidean Distance')
plt.savefig('ani_plot.svg')

입력물을 distance matrix로 전환한 다음 클러스터링하였다. 그렇다면 100 - ANI를 하지 않아도 상관이 없었을 것이다. 도대체 무엇이 정답일까? 구글신에게 뭐라고 여쭈어야 내가 원하는 대답이 나올까?

그렇다. Use own Distance Matrix in HCLUST? 완벽한 질문이다. 이 한 문장에 답이 들어있다. "Try to cast you distance matrix before using it in hclust()"

> data.3 = as.dist(data.2)
> par(mfrow=c(1,2))
> plot(hclust(dist(data.2)),main="Using dist() function")
> plot(hclust(data.3),main="Using as.dist() function")


100% 확신할 수는 없지만, 이제 height는 data.3 매트릭스에 실린 숫자와 동등한 것으로 보면 될 것이다. 마지막으로 원본 매트릭스와 dist()로 만들어진 distance matrix의 모양이 어떻게 다른지 확인해 보자. 아래 그림에서 data.2는 9x9 크기의 원본 매트릭스이고, data.3은 8x8로 줄어든 distance matrix이다. 원본에서 대각선에 위치한 자료는 distance = 0이므로 이를 제거한 조작이 가해진 것이다.


오늘도 예상외로 많은 지식을 쌓았다. 휴!






2015년 7월 7일 화요일

원핵생물(prokaryote) 유전체에 대한 NCBI의 RefSeq 정책이 어떻게 변해가고 있는가

RefSeq, 즉 Reference Sequence database는 공개된 염기서열과 그 단백질 산물의 curated collection이다. 새로운 미생물 유전체를 해독하여 나름대로 주석화를 하여 NCBI에 올리면 GenBank로 등록이 된다. 이 중에서 "major organism"에 해당하는 것이 RefSeq로 옮겨가는 영광(?)을 누린다.

NGS의 발달로 워낙 많은 수의 미생물 유전체가 완성 수준으로 만들어지게 되었고, 이에 따라서 RefSeq의 정책도 변하게 되었다. 원래 RefSeq에서는 GenBank에 등록된 유전자 정보를 기반으로 하여 재 주석화를 거쳐서 RefSeq에 수록하는 것으로 알고 있었는데, 요즘은 그렇지만도 않은 것 같다. 아주 뛰어난 기술을 지닌 컨소시엄에서 주석화를 한 것이 아니라면 몇 몇 중요한 유전자가 자동 주석화 과정에서 누락되는 경우가 발생하기 때문이다. 나 역시 그런 경험을 자주 겪었다.

2009년에 등록한 대장균 B 스트레인을 재주석화할 것인가, 혹은 NCBI가 자동으로 새로 주석화한 것을 그대로 쓸 것인가를 고민하다가 NCBI의 최근 정책이 어떤지 찾아보기로 하였다. 아래에 쓴 내용은 Prokaryotic RefSeq Genomes 페이지와 여기에 딸린 문서들을 세심하게 읽어보고 정리한 것임을 미리 밝힌다.

RefSeq의 모든 고세균 및 세균 유전체는 122개의 selected reference genome을 제외하면 전부 NCBI의 prokaryotic genome annotation pipeline으로 주석화가 이루어진다.

1. Reference genomes
NCBI의 스탭진과 공동연구자들의 참여에 의해 만들어진 가장 고품질의 데이터이다. 의학적 중요성(중요한 감염병 원인세균), 어셈블리와 주석화의 품질, 실험적 증거의 유무 등이 reference genome이 되는 자격 요건이 된다. 단백질 정보는 YP_ 혹은 NP_로 시작하는 accession을 갖는다. Reference genome 정보는 다음의 사이트에서 얻을 수 있다.


2. Representative genomes
이외의 중요한 유전체들은 클러스터링을 거친 뒤 종 수준의 분류(예: type strain)나 어셈블리의 품질(완성본 유전체를 선호)이라는 측면에서 주안점을 두어 선별하게 된다. 이렇게 만들어진 representative genome에서 유래한 단백질 정보는 WP_로 시작하는 accession을 갖는다. Representative genome의 정보는 다음 사이트에서 얻을 수 있다.

3. Variant genomes: 나머지 대부분의 것들
Reference나 representative는 되지 못하지만 여전히 많은 유전체이 RefSeq에 존재한다. 이들은 분류학적으로 다양한 균주를 나타내거나 혹은 조립 상태가 약간 미흡한 것들이다. 단백질 역시 WP_로 시작하는 accession을 갖는다.


RefSeq non-redundant proteins
WP_로 시작하는 단백질은 전부 non-redundant protein accession에 해당한다. 이는 2013년 중반쯤 새로 도입된 RefSeq protein record의 유형이다. 서로 밀접하게 연관된 미생물의 유전체 해독이 잦아지면서 단백질 수준에서 100% 동일한 것들이 급증하게 되었고, 이를 하나의 엔트리로 저장하기 위해 이러한 방식을 도입한 것이라 한다. 서열이 바뀔 가능성이 없으므로 버전 번호는 항상 1이다.

Prokaryotic RefSeq Genome Re-annotation Project (원문 링크)

RefSeq에 수록된 미생물 유전체는 지속적으로 NCBI의 annotation pipeline에 의해 재주석화가 이루어진다. 최고 수준의 주석화 정보를 가진 소수의 유전체를 제외하면 전부 이 과정 하에 놓여 있다고 보아도 된다. 따라서 최초에 유전체 정보를 제출한 사람이 매번 업데이트를 하지 않아도 되는 것이다. 더욱 반가운 소식은 자체적인 gene prediction을 수행하므로 GenBank 등록 당시에 누락된 유전자가 있다 하더라도 re-annotation 과정을 통해 예측될 수 있다. RefSeq의 유전자와 GenBank 유전자의 연결 고리는 바로 locus tag이다. 예전의 locus ta은 'old_locus_tag' qualifier로 확인 가능하고, RefSeq에서 새로 부여한 locus tag은 _RS<숫자>의 형식을 취한다.

2015년 7월 6일 월요일

오디오 앰프 볼륨의 잡음 제거

사무실용 앰프(Breeze TPA3116 class D amplifier)의 볼륨 조절기에서 잡음이 난다는 것을 핑계로 새로운 앰프를 하나 더 구입할까 하는 생각을 아주 잠깐 한 적이 있다. 그렇지만 새 물건을 사기 전에 직접 고쳐보려는 시늉이라도 해 보는 것이 인간이 된 도리라 생각해서 집에서 가져온 공구와 약품을 사용하여 약간의 수작업을 해 보았다.


다들 잘 아시겠지만 이런 목적으로 사용할 약품은 방청윤활제인 WD-40이 아니라 접점 개선제(contact cleaner)인 BW-100이다. 원래 분사구에 긴 빨대모양의 관을 꽂아서 좁은 영역에 뿌리게 되어있는데, 몇 번 쓰다보면 이 관을 늘 잃어버린다...

BW-100을 듬뿍 뿌리고 볼륨 놉을 여러차례 좌우로 돌렸다. 잡음이 완벽하게 사라졌다. 그러면 그렇지...

현재의 음악 감상 환경이 어떤 부족함이 있는 것은 전혀 아니다. 다만 써 보지 않은 것에 대한 호기심이 늘 있을 뿐이다. 사실은 게인클론 앰프에 늘 관심을 갖고는 있다. 손바닥만한 class D 앰프의 편리함(책상 위 앰프에게는 자리를 적게 차지하고 발열이 적으며 전기를 덜 쓴다는 것이 대단히 큰 매력이다)에 상당 부분이 가려져 있을 뿐...

2015년 7월 5일 일요일

심심풀이 오디오 구경

인터넷 시대가 참으로 좋은 것은 힘들여 발품을 팔지 않아도 마음에 두고 있는 물건들을 자유롭게 둘러볼 수 있다는 것이다. 비록 현실 세계에서 물건을 접하는 경험에 비교할 수준의 일은 아니지만 말이다.

브리즈라는 상표를 달고 있는 TPA3116 class D 앰프는 현재 내가 사무실에서 쓰고 있는 물건이다. 딱 가격만큼의 음질(혹은 그보다 조금 나은 수준?)을 들려준다. 몇가지 잘 알려진 단점이 있다.


  1. 게인이 다소 높다.
  2. 볼륨 중간 쯤에서 '쉿-'하는 잡음이 매우 높다.
  3. 볼륨 놉에 손을 대면 '웅-'하는 잡음이 유도된다. 2와 3의 문제는 제품마타 편차가 있다.


구입 초기의 상태는 내 블로그에 올린 포스팅에 나온 사진과 같다. 지금은 색상이 많이 바랬다. 2의 문제는 저항을 교체하여 게인을 내리면 완벽하지는 않지만 어느 정도 해결이 된다. 이에 대하여 내가 쓴 글들이 있다.

포스팅 1 포스팅 2

요즘은 새로운 문제가 발생하였다. 볼륨을 돌리면 오른쪽 채널에서 '치직'거리는 잡음이 들리기 시작한 것이다. 아마도 볼륨의 품질이 그다지 좋지 않은 것에서 기인한 것으로 생각된다. BW-100과 같은 접점 부활제를 뿌리거나, 그럴만한 정성이 있다면 조금 더 품질이 좋은 4각 볼륨으로 바꾸면 될 것이다. 실제로 미니 볼륨을 기판에서 떼어내는 것은 결코 쉽지가 않다. 그리고 좋은 품질의 미니 볼륨을 국내에서 구하는 것도 쉽지 않다. 아니, 정확히 말하면 서울이 아닌 곳에서 구하는 것이 어렵다고 하는 것이 맞겠다. 세운상가 근처 어디를 가면 알프스 볼륨을 판다는 글을 본 적이 있으니 말이다.

아니면 이 앰프를 대체할 새로운 장난감을 웹에서 찾아보는 것도 즐거운 소일거리가 된다.

Class D 앰프에 대한 불신이 있다면, 전력은 조금 더 소모하더라도 LM1875칩을 사용한 칩앰프가 좋은 대안이 될 것이다. 앰프 보드만 구입하면 당장은 돈이 덜 들지만, 결국은 섀시를 꾸미는 일이 너무 큰 숙제가 되고 만다.

좀 더 고상한 것을 원하는가? 그러면 채널당 3와트 조금 넘는 출력이 나오는 진공관 앰프는 어떨까?

진공관 앰프를 사게 되면 현재 갖고 있는 구 소련제 6N2P를 교체용으로 쓸 수 있다는 얄팍한 생각이 든다. 그러나 이는 갖고 있는 50원짜리 물건을 쓰기 위해 5천원을 추가로 지출하겠다는 것에 다름아니다. 

아직까지는 아무것도 지르지 않았다. 다행이다...



2015년 7월 4일 토요일

유전체 염기 서열 교정하기

1) NGS에서 유래한 짧은 read를 참조 서열 위에 정렬하는 것,
2) 이를 바탕으로 변이를 찾는 것(variant calling),
3) 그리고 최종적으로 변이 정보를 사용하여 참조 서열을 교정하는 것.

이 세가지는 모두 다른 활동이다. 만약 인간 유전체를 대상으로 연구를 한다면 3)은 그다지 접할 일이 없을 것이다. 인간 유전체 정보를 교정한다면 거창한 일을 한다면 모를까? 반면 미생물 유전체 연구를 하는 사람이라면 꽤 많이 접하게 되는 일이다.

가끔 실험 진화를 거친 미생물 균주로부터 어떤 염기서열이 바뀌었는지를 착기 위해 resequencing analysis를 할 때가 많다. 1) + 2)가 이때 필요한 작업이다.

예전에 일루미나를 이용해여 대충(?) 유전체 서열을 얻어 놓고 최근에 PacBio로 완성 수준의 유전체를 새로 얻게 되는 일이 많다. 물론 미생물의 경우이다. 결과만 놓고 보면 분명히 개선이지만 일루미나 데이터가 잘못하면 사장될 수도 있다는 것이 나의 고민이다. 일루미나의 sequencing coverage가 훨씬 높다는 것을 감안하면 쓸데가 전혀 없지는 않다. PacBio assembly에 일루미나 read를 얹어 놓고 variant를 찾으면 많게는 수십개의 염기서열 차이가 검출된다. 이를 3)번 과정을 이용하여 교정하면 된다.

이것 말고도 일루미나 데이터를 쓸 곳은 좀 더 있다. 너무 주절주절 여기에 기록하면 최근에 투고를 앞두고 있는 간단한 논문에서 다루는 내용을 미리 누설(?)하는 셈이 되니 일단은 자제력을 발휘하겠다.

나는 거의 전적으로 모든 NGS 관련 작업을 CLC Genomics Workbench에서 한다. 아직도 workflow를 다루는 방법을 제대로 배우지 못해서 마우스 클릭만으로 대량의 데이터를 하나씩 처리하려면 조금 번거로운 면이 없지는 않다. CLC에서는 2)의 기능이 최근 1-2년 사이에 많이 향상되었다.

그런데 내가 아는 바로는 3)에 해당하는 기능이 없다. 만약 국내에서 CLC Genomics Workbench를 보급하고 있는 (주)인실리코젠에서 내가 잘못 알고 있는 것이 있다면 알려 주시기를! 그동안은 consensus sequence를 추출하는 기능을 대충 사용하여 왔다. 엄밀히 말하면 다양한 방법으로 variant calling을 할 수 있지만(CLC에서는 version 8.0.x를 기준으로 quality-based variant detection과 fixed ploidy variant detection 및 low frequency variant detection 등 세가지 방법을 제공한다) consensus extraction은 특정 위치에 align된 read에서 가장 많이 나타는 염기를 기준으로 최종 서열을 뽑아주는 간단한 방법을 쓰게 된다.

가장 바람직하게는 CLC에서 찾은 variant를 VCF로 전환한 뒤 다른 프로그램을 써서 reference를 교정하면 될 것이다. 그런데 아직도 CLC에서 VCF 파일을 제대로 뽑는 방법을 찾지 못했다. 분명히 메뉴에 기능이 있는데, 이를 클릭하여 따라가다 보면 'reference track'을 설정하는 단계가 나오면서 여기에서 막히고 만다. 인간 유전체를 다루는 사람에게 친숙할 GATK 패키지를 사용하면 되겠지만 호미로 막을 것을 가래로 막는다는 기분이 든다.

그래서 어제는 아주 '무식한' 방법을 동원하고 말았다. CLC의 variant table을 텍스트 파일로 출력한 뒤, 간단한 Perl 스크립트를 작성하여 reference를 고치게 하는 것이었다. 사실 이러한 일을 이미 몇년 전에 한 적이 있었고 당시에 만든 스크립트를 다시 꺼내 쓰면 되는 간단한 일이었지만, 스크립트에 항상 충분한 설명을 달지 않는 나쁜 버릇 때문에 이를 들여다보느니 새로 짜는게 더 나은 상황이 늘 벌어진다. 아마 자기 혼자 쓸 목적으로(주로 연구자들) 스크립트를 작성하는 사람들은 전부 비슷할 것이다.

CLC가 만들어 주는 variant table이 보여주는 reference 기준의 위치는 substitution에 대해서는 매우 명백하지만 insertion이면 고민이 필요하다. Sample은 이 위치 다음에 삽입이 되어 있다는 것일까, 혹은 그 뒤에 삽입이 되어 있다는 것일까? VCF의 specification 정보를 찾아보았다. 그 이벤트가 일어난 바로 앞의 위치를 기록한다고 되어 있다.

이를 참조하여 reference를 고친 뒤 다시 read mapping을 하여 variant를 찾아 보았다. 더 이상 variant는 나타나지 않는다. 실수는 없었다.

site.genoglobe.com 사이트 관리가 어려운 이유

(이 블로그 주소는 blog.genoglobe.com이다)

내가 갖고 있는 지식을 체계적으로 정리하는 웹사이트로서 blog.genoglobe.com을 갖고 있다. 그런데 도무지 사이트의 업데이트를 하기가 어렵다. 직장에서는 로그인이 차단되어 있기 때문이다. 이 블로그는 다행히 그렇지 않다. 단순한 '놀이터'가 아니라 업무와 관련하여 세상과 나눌 지식을 올리고도 싶은데 이를 퇴근하고 집에 돌아와서만 해야 된다면 어디 능률이 오르겠는가.

잔 기술과 Perl 스크립트 조각들을 무수히 만들어 왔는데 어디 두었는지 찾기가 너무 어렵다. 가장 크게 의존하는 것은 연구노트삼아서 기록하는 문서 파일이다. 그러나 이나마도 수십개가 넘으니 작성 이후 시간이 좀 지난 다음에 찾으려면 이만저만 불편한 것이 아니다.

도메인 관리, 웹사이트 관리, 지식 관리.

이 세마리 토끼를 어떻게 잡아야 할까?

2015년 7월 1일 수요일

직업과 취미, 그리고 고객 만족

국립과천과학관에서 중학교 1학년 학생들을 대상으로 하는 진로탐구프로그램에 초빙되어 강연을 하고 돌아왔다. 생명과학자로서 내가 걸어온 길을 약 40분에 걸쳐서 이야기하였다. 주최측이 사전에 당부한 바대로 내가 종사하는 전문 분야에 대한 단순한 설명은 최대한 배제하였다. 평소에 직업에 대해서 갖고 있는 바를 즐거이 이야기해 주고 왔는데 어린 학생들에게 잘 전달이 되었는지는 모르겠다.

정말 좋아하는 일은 직업으로 하게 되면 더 이상 즐겁지 않을 수도 있다는 것이 이야기를 풀어나가는 시작점이었다. 왜냐하면 직업에는 책임이 따르기 때문이다. 취미로 하는 사람과 직업으로 하는 사람 간에 전문성에서 별로 차이가 나지 않는 분야가 분명히 있기는 하다. 나는 이렇게 생각한다. 어떤 일을 직업으로 하려면, 다음의 4가지가 갖추어져 있는지를 따져야 한다. 여기에는 내가 갖추어야 하는 요건도 있고 외부적인 조건도 있다.

- 열정 가장 기초적인 요건이다.
- 책임감 이것이 없으면 취미가 된다.
- 전문성 이것은 자기가 힘들여 갈고 닦아야 하는 것.
- 보상(혹은 보수) 그 일을 함으로써 생계를 유지할 수 없다면 올바른 직업이 아니다.

자기가 관심을 갖고 있는 일을 이 네가지 기준으로 평가한다면 그것을 직업으로 해야 하는지 혹은 취미로 해야 하는지가 분명하게 드러날 것이다.

다음으로 강조한 것은 건전한 자본주의 정신을 가지라는 것이었다. '시장'은 인류가 만든 것 중에 가장 완벽한 것은 아니지만(도처에서 시장 실패를 목도하게 되므로), 꽤 잘 만든 장치임은 틀림이 없다. 이를 통해서 많은 사람들이 풍요로운 삶을 누리게 되었고, 발전하는 기회를 마련하기도 하였다.

그 다음으로 이야기한 것은 고객 지향적인 삶의 태도이다. 고객은 재화나 서비스를 사기 위해 돈을 들고 오는 사람으로만 좁게 정의할 필요가 없다. 나는 이렇게 생각한다. 내가 일을 함으로 인해서 만족을 얻는 사람이 바로 고객이다! 그렇다면 어떤 면에서는 나 자신도 가장 중요한 고객이다. 고객이 누구인지 알 때 비로소 일을 대하는 태도가 달라지게 된다.

학생 신분의 자녀 입장에서 생각해 보자. 부모와 자녀 사이에 고객을 정의할 수 있는가? 엄마가 맛있는 요리를 하면 자녀가 만족하고 먹는다. 그러면 자녀가 부모의 고객인가? 또한 부모는 용돈을 자녀에게 주고 자녀가 좋은 성적을 내면 기뻐한다. 그러면 부모가 자녀의 고객인가? 이에 대해서는 나중에 좀 더 생각을 정리하여 별도의 글로 정리해 보련다. 간단히 중간 결론을 내려보겠다. 고객은 더 좋은 서비스, 더 낮은 가격을 제공하는 공급자가 있다면 기존의 공급자에게는 가차없이 등을 돌린다. 시장에서 신뢰가 중요한 미덕이기는 하나 결코 영원하지 않다. 따라서 모종의 거래가 오고가는 시장 개념이 먹히는 곳에서 고객을 정의하는 것이 옳다고 본다.

그리고 생명 존중과 환경 보전에 각별히 관심을 가지고, 질풍노도의 시기를 지나서 어떤 길에 들어서기로 작정했다면 그 길을 끝까지 가 보라고 당부하였다. 왜냐하면 세상이 바로 여러분을 간절히 원하고 있으므로. 이 마지막 당부는 최근 읽은 에드워드 O. 윌슨의 책에서 인용한 것이다.

프로페셔널은 돈을 받아야 일하는 사람이고,
아마츄어는 돈을 내고서라도 일하는 사람이다. 이는 내가 평소에 늘 갖고 있는 생각이다. 다른 사람이 이미 한 말, 혹은 책에서 읽은 것을 내가 재생산한 것은 아닌지 모르겠으나.

만약 이 '일'에 해당되는 것을 사고파는 사업을 시작한다고 치자. 단지 중개만 하는 사업을 해도 좋다. 역설적이게도 나는 후자를 공략하는 것이 더 큰 성공을 거두리라고 생각한다. 돈을 받아야 일하는 프로페셔널은 딱 그만큼만 일을 하기 마련이다. 또한 이윤을 생각하지 않을 수 없다. 그러나 열정적인 아마츄어는 그렇지가 않다. 앞으로 이 문제에 대해서도 탐구해 봐야 되겠다.