brunch

아 DNA로 코딩 그렇게 하는 거 아닌데;

by honggsungg labnote


생명체의 DNA는 컴퓨터 코드같다는 생각을 한다.


DNA는 그냥 코드가 아니라 코딩 초보가 덕지덕지 짜놓은 코드.


완벽하게 척척 돌아가는 코드가 아니라 어딘가 이상하고 안 들어맞는데 아무튼 돌아가는 코드. 깃허브와 여러 블로그를 전전하며 작성한 코드. 분명 더 개선될 여지가 있지만 그냥 여기서 관둔 코드.




공부를 위해서 생명과학 교과서를 읽고 있었다.


유전자 전사 과정에서 enhancer - promoter specificity 에 관한 논문을 읽고 있었다. enhancer는 유전자 조절부분이고 promoter 는 유전자 시작부분이다. 유전자 발현을 할지 안 할지는 유전자 시작부분(promoter)이 결정하지 않고 유전자 조절부분(enhancer)이 결정한다. 유전자가 올바른 자리에서 올바른 타이밍에 발현시키는 조절은 중요하다. 유전자 발현조절에 이상이 생기면 손가락이 6개가 되는 다지증이 나타나기도 한다. (예를 들어, 어니스트 헤밍웨이의 고양이는 유전자 조절 문제 때문에 손가락이 정상보다 많다.)


사진 출처. Wikipedia. Polydactyl cat


그런데 이상한 점은 유전자 조절부분(enhancer)이 유전자 시작부분(promoter)에서 멀리 떨어진 곳에 위치한다. 세포는 DNA 굽힘 단백질을 사용해서 3차원 상에서 멀리 떨어진 '유전자 조절부분' 과 '유전자 시작부분' 을 가까워지도록 굽혀서 유전자 발현을 조절한다. 과학자들은 굽힘이 중요하다고 생각해서, 굽힘단백질이 없으면 유전자 발현이 망가질 것이라 예상했다. 근데 굽힘단백질이 없더라도 어찌 저찌 유전자는 잘 발현한다.


도대체 왜 조절부분은 시작부분에서 멀리 떨어져있을까?


떨어져있는 두 부분이 가까워져야 유전자가 발현이 되면 그냥 처음부터 두 부분이 가까이 있으면 편할텐데 말이다.


이 때 DNA가 코드같다는 생각이 문득 들었다.


최근에 파이썬 코드를 짤 일이 있었다. 내가 코딩을 매일하는 사람도 아니고 함수를 외우지 않으니까 깃허브, 스택오버플로, 공식배포문서를 찾아가면서 복붙해서 코드를 짜고 있었다. 이 함수 넣었다가 저 함수 넣었다가 잘 맞는 함수가 뭔지 찾아보다가. 어 변수가 어디갔지? 뭐야 내가 변수를 왜 저 앞에다가 놨지? 근데 어차피 바꿀 일이 크게 없으니까 그냥 저기다가 두고 계속 코딩해야겠다. 했던 일이 떠올랐다.


노련한 개발자는 함수 바로 앞에, 또는 보기 좋은 위치에 그 변수들을 정의한다. 그런데 생각없이 코딩한 나같은 초보 개발자는 보이지도 않는 곳에 변수를 지정해 놓는다. 자연(또는 신)은 그런 초보 개발자같다.


흐음... 도대체 왜 조절부분은 시작부분에서 멀리 떨어져서 위치한 걸까.




사실은 자연이 규칙없이 DNA 코드를 막 만들어 놨는데 생명과학자들은 그것도 모르고 열심히 규칙을 찾고 있는게 아닐까?


연구자: 이 때는 DNA 코드를 이렇게 짜면 함수 조절이 힘든데요. 왜 이렇게 짰죠?
자연: 에... 어찌됐든 코드가 돌아가니까요. 하하... 생명체가 잘 살아있면 됐죠!


현재 내가 연구해서 알아내고 싶은 구체적인 질문은 이게 아니기는 하지만, 거시적으로 봤을 때는 나도 이 질문에 대한 답을 알고 싶다. 근데 선행 논문들을 읽어봐도 잘 모르겠다. 답이 없는 질문에 답하려고 발버둥치는 것 같기도 하다.




DNA를 genetic code, 유전코드로 부르는 예시는 많다.


DNA는 복사-붙여넣기를 한다. 저거 괜찮아보이는데 하면 복붙해서 조금만 바꾼다음에 비슷하지만 다른 기능을 한다. 피에서 산소를 운반하는 헤모글로빈 단백질과 근육에서 산소를 저장하는 미오글로빈 단백질은 굉장히 유사하다. 이 때, 헤모글로빈은 미오글로빈 4개를 ctrl c, ctrl v 한 후에 4개의 함수를 1개의 함수로 모아서 코드 수정을 해놓았다.


유전체의 많은 부분은 실제로 기능을 하지 않는 부분이다. 이런 부분은 일종의 주석 같은게 아닐까 싶다. 원래 잘 만들고 복잡한 코드일수록 프로그램에는 함수보다 주석이 더 길다. 그리고 예전에는 작동을 했지만 이제는 필요가 없어진 유전자도 있다. 그런 경우에는 유전자를 전체 삭제하기 보다는 앞에 주석표시를 ## 붙여서 더 간편하게 기능을 지울 수 있다.


코드를 수정해서 제대로 작동하는지 알려면 디버깅을 해야한다. 디버깅하면 대부분은 처음에는 실패한다.제대로 작동하면 이게 왜 되지...? 라는 말이 나온다. 그니까 돌연변이를 일으켜서 DNA 코드를 수정하면 제대로 작동할 리가 없고, 죽는 게 당연한 일이다. 그래서 몇 번의 돌연변이가 있은 후에야 제대로 작동하는 생명체 기능을 만들 수 있다. 만약에 엉뚱한 돌연변이가 안 죽고 살아있으면 그럼 그건 에러가 아니라 그 환경에 적응한 새로운 기능이다.




덧1.

글로벌 변수가 여러 함수에서 작용되는 것처럼 조절부분이 여러 시작부분에 작용하기를 원했나? 라는 반박이 들었다. 하지만 많은 3C, 4C 실험 논문에서는 조절부분 하나와 시작부분 하나만 쓰이는 경우가 더 많았던 것 같다.



덧2.

지금은 DNA와 유전자라는 코드를 살펴보면 이상하고 비효율적으로 코드를 짰다고 여겨진다. 하지만 시간이 지나서 생명체의 비밀을 더 풀어낸다면 그 때가 되어서야 신이시여...! 이런 디테일까지 코딩해놓으셨단 말입니까! 하며 놀라워할 수도 있지 않을까.



덧3.

내 메모 한 구탱이를 차지하던 글감이었는데, 인스타그램에서 개발자툰을 그리는 경수님이 개발자의 입장에서 굉장히 똑같은 생각을 하고 있길래, 나도 얼른 글을 마무리해서 업로드한다.

keyword
매거진의 이전글ISTP 과학자, 홍성랩노트입니다. (4)