Friday, June 17, 2016

생명정보학 엔지니어 vs. 생명정보학 과학자

학교, 연구소, 스타트업 창업, 회사 등 나름 다양한 환경을 겪어오면서 느낀 점. '생명정보학 인력'에 대한 정의와 기대 수준은 정말 천차만별 이라는 점.  오늘 이 혼란을 좀 정리해 보고자 한다.

크게 '생명정보학 인력'은 생명정보학 과학자와 생명정보학 엔지니어로 구분해 볼 수 있을 것 같다. 간략하게 정리해 보면, 아래와 같다. ( 각각의 기준에서의 최소 요건 )



생명정보학 과학자( Bioinformatics scientist )

  • 생명과학을 연구하는 과학자. 
  • wet-lab 보다는 large scale data 를 기반으로 한 dry-lab work을 중심으로 연구를 진행 
  • 매우 광범위한 topic 을 포괄. 
    • 전통 생명과학, 의약학 전분야
    • 순수 Computer science나 Statistics 연구이나 topic 만 생명과학인 경우도 포함될 수 있음
  • 엔지니어가 아님
    • 과학자로서 discovery 가 가장 중요. 막코딩 ok, 일회용 프로그램 ok. 알고리즘 몰라도 ok
    • 심지어 코딩 능력이 없어도 ok. 남들이 만든 소프트웨어를 써도 discovery 하고 publish 할 수 있으면 ok.
  • 최소 기준 : 생명정보학 User ( 만들어진 각종 소프트웨어를 활용하기만 해서 생명과학을 연구하는 과학자)가 이 생명정보학 과학자로서 최소 기준. 
  • 권장 기준 : 아래 생명정보학 엔지니어로서 역량


생명정보학 엔지니어( Bioinformatics engineer ) 

  • Large scale 생명과학 big data 를 활용한 '제품 개발자' 
  • 시스템 개발, 웹 개발, 데이터 과학 등 제품 개발에 필요한 모든 분야를 포괄할 수 있음. 일상적인 task는 IT 개발자와 거의 일치
  • 과학자가 아닐 수도 있음 
    • 생명정보학 과학자는 효율 보다는 과학자로서 discovery 가 훨씬 중요하지만, 생명정보학 엔지니어는 효율적인 시스템과 알고리즘을 바탕으로 고품질의 제품을 만들어 내는 것이 중요
    • 논문 안 써도 ok. 막코딩 no, 일회용 프로그램 no
    • 알고리즘 필수 
      • 알고리즘은 시간과 메모리의 함수, '좋은 아이디어' 내기 경쟁이 아님.
      • 모르면 효율적인 시스템에 대한 개념 자체를 가질 수 없음.
      • 생명정보학 기반 제품의 quality 를 결정.



생명정보학 엔지니어로서 역량의 필요성 

학자로 생명 현상에 대한 연구를 하는 생명정보학 과학자라면 생명정보학 엔지니어로서 역량을 갖추지 못해도 괜찮다. 하지만,  시스템을 구축하고, 제품을 개발하는 역할이라면 생명정보학 엔지니어로서 역량이 필수적이다. 

즉, 학교를 떠나 산업계에 종사하게 되는 순간, '생명정보학 엔지니어'로서 역량은 필수가 된다. 생명과학 계열 학과에서 급조한 생명정보학 프로그램이나 생명과학 연구랩에 소속되어 large scale data를 생산해 소프트웨어를 다루며 연구를 수행한 '생명정보학 user' 수준의 생명정보학자는 산업계에서 요구하는 생명정보학 엔지니어로서 역량을 충분히 갖추지 못했기 때문에, job 을 구하는데 있어 문제를 겪을 공산이 크다. 

현재 속한 회사에서 생명정보학 인력 채용에 코딩테스트를 도입해 진행하고 있는데, 알고리즘 풀이도 아닌 수학으로 치자면 더하기 빼기 수준의  파일 입출력, 문자열에서 패턴 개수 세기 등의 문제 몇문제에 대한 통과율은 20% 정도. 생명정보학 석박사 학위를 받은 분들의 결과다.  

개인적으로 회사에서 생명정보학 관련된 그룹의 관리자 급 이라면, '생명정보학 엔지니어'로서 역량을 충분히 갖추어야 한다고 본다. 관리자 급은 시스템 구축에서 부터 결정 권한을 가지는데  시스템에 대한 이해, 알고리즘에 대한 이해가 없이는 어떤 컴퓨터를 어떤 사양으로 ( 특히 메모리, HDD) 갖추어야 하는지에서 부터 그저 '비싸고 좋은 것'을 선택하는 수준을 벗어나지 못한다.  

DB를 구축해서 쓸 시스템이라면, 전체 DB의 구조를 고려하고, 일상적인 query 의 time complexity를 고려할 수 있어야 하고, 이에 기반한 계산을 통해 용량과 cpu power 를 결정해야 효율적인 시스템을 구축할 수 있다. 

Genome analysis pipeline을 구축했다면, 각 단계에서 time complexity를 꾸준히 개선해 내는 작업을 해야 한다. 그렇게 꾸준히 효율적인 시스템으로 update 하면서, 제품의 성능이 올라가고 경쟁력이 생긴다. 마치, 구글이 초기 pagerank 알고리즘을 cloud 기반의 거대 시스템으로 확장하며 효율을 올린 것 처럼. 그렇게 해서 어떻게 품질이 올라가느냐? 구글 검색 속도가 빨라지고, 검색 정확도가 높아졌고, 결과로 구글은 검색에서 경쟁력을 더욱 공고히 다질 수 있었다. 

O(n2) 에 만족하지 않고 O(n), O(logN) 으로 개선하려는 노력을 꾸준히 해 나가야 한다. 그런 엔지니어가 생명정보학 연구/개발 팀 리더가 되어야 한다. 



나는 생명정보학 과학자일까 생명정보학 엔지니어일까?

아래 항목들 중 yes 가 5-6 개 이상이라면 생명정보학 엔지니어 능력을 갖추었다고 할 수 있을 것 같다. 
산업계에서 생명정보학 연구개발팀 리더라면 적어도 10개 이상은 yes 가 되어야 한다고 본다.
( 학교/연구소에서 생명정보학 연구 그룹 리더 마찬가지  )
  1. Git / Github 로 코드 관리를 한다. 
  2. Amazon AWS( or MS azure ) 를 능숙하게 쓴다.
  3. DB 에서 indexing 을 걸어 쓰는 이유를 time complexity로 설명할 수 있다.
  4. 재귀와 다이내믹 프로그래밍의 차이를 설명할 수 있다. 
  5. 웹서버를 구현해 본 경험이 있다.
  6. data API 서비스를 구현해 본 경험이 있다.
  7. 기타 누군가가 사용하는 소프트웨어/웹서비스를 구축해 본 경험이 있다. 
  8. Pairwise alignment 를 구현하고, time complexity와 메모리 사용량을 계산할 수 있다.
  9. 반복되는 function들은  모듈을 구축해 활용한다. ( 동료에게 자신있게 권할 수 있는 자신이 구축한  library가 있다 )
  10. "불규칙한 시간에 특정 서버에 data file 이 꾸준히 생성되고, 이 파일을 서버에서 원격으로 가져와 처리를 한 후 다시 특정 서버로 전송한 후, 이를 해당 서버의 DB에 저장한다" => 이 일을 완전히 자동화 할 수 있다
  11. 확률 Distribution을 2개 이상 수식과 함께 설명할 수 있다
  12. Rare disease에 대한 유전자 검사를 고위험군에서만 해야 하는 이유를 확률적으로 설명할 수 있다.
  13. Multiple testing 문제를 설명할 수 있고, 문제를 해결하는 방법을 설명할 수 있다. 
  14. 적어도 하나의 Machine learning 방법론과 이 방법론의 성능 측정 방법을 설명할 수 있다. 
  15. Linear regression과 logstic regression 을 각각 어떤 상황에서 사용하는지 설명할 수 있다. 

P.S. 사실 생명정보학자나 엔지니어를 구분하지 않고 위의 요건들을 갖춘 사람을 '생명정보학 인력'으로 보는 것이 맞다고 생각함. 다만 국내에서  생명정보학 인력에 대한 기대 수준이 천차만별이다 보니, 최소 요건을 구분해 정리를 해 보고 싶어 '생명정보학 user'( 만들어진 소프트웨어를 활용해 생명과학 연구를 하는 연구자)를 생명정보학자로서 최소 기준으로 정리를 해 본 것. 원칙적으로 생명정보학에 몸담고 있는 사람이라면 위의 요건들은 '최소자격요건' 수준으로 보는 것이 맞다고 봄.