생각외로 많은 이공계 학생들이 프로그래밍을 못한다. CS가 아니면 대부분.. 특히 시뮬레이션 위주의 과학계산 연구를 하는 사람들도 알고리즘 자체는 복잡하지만 코드 아키텍처는 간단한 프로그래밍을 주로 한다. OOP니 FP니 없어도 Init - Read - Compute - Write 구조의 코드로 수십년동안 시뮬레이션 하는 경우도 있다. 오랫동안 대학원 생활을 하면서 이런 비 CS출신 이공계학생들을 보니 다음과 같은 특징이 있다는 걸 알게 되었다.

  • 그 전에는 코딩경험이 전무하거나, C/Fortran, 혹은 Matlab 문법 정도만을 안다.
  • 리눅스는 물론이고 CLI환경에 대해 익숙하지 않다.
  • 대부분 개발자 툴에 대해 모르거나 필요성을 느끼지 못한다.
  • 그렇다고 새로운 툴을 적극적으로 배우려고 하지 않는데, 그 이유는 지금쓰고 있는 정도로도 결과가 잘 나오기 때문이다. 즉, 필요성을 느끼지 못한다.
  • 레거시(Legacy) 코드가 존재하는데 연식이 십년단위인 것도 존재하며, 버전관리 및 리팩토링은 이루어지지 않고, 연구주제에 따라 고쳐쓰다보니 파편화가 심각하다. 이에 따른 버그들이 실재하지만, 버그 존재 자체를 인지하지 못하거나 회피한다.
  • 레거시 코드 중에서 문서가 남겨지는 코드들은 극소수이며, 대부분 도제방식으로 코드 사용법을 알려준다. 따라서 시간이 지날수록 누락되는 부분이 있고, 이 부분은 블랙박스처럼 여겨지며 코드 개선을 더욱 어렵게 한다.
  • 디버깅은 화면 출력(print문 등등)을 사용함. 디버거를 사용할 줄 알는 사람이 매우 적다.
  • 수치해석 코드의 경우 대부분의 코드가 Init-Read-Loop-Write형식의 구조이며, 실수(real number, floating point number)로 출력된 결과물을 눈으로 보고 사람이 판단해야하는 경우가 많기 때문에 테스트를 작성하기가 쉽지 않음.

이를 개선하기 위한 각종 툴들이 존재하나, 이를 정리한 문서가 별로 없었는데 마침 얼마전에 The Missing Semester of Your CS Education 라는 과목을 알게 되었다. (한글 번역)

위 강의에서 대상은 “Your CS Education” 이라고 되어있지만, 실제로는 비전공자 포함 모든 프로그래머를 대상으로 하는 것이 아닌가 하는 생각이 들었다.

CS에서도 코드가 잘 관리되지 않는 경우가 많지만, 그래도 많은 사람들이 이를 쉽게 해결하기 위해 여러가지 툴을 개발하였고, 이 툴들을 많이 쓰고 또 잘 쓰고자 노력한다. 그렇기에 자연스럽게 배울 수 있는 기회도 많고, 배울 수 밖에 없는 상황이 만들어지기도 한다. 하지만, 과학계산 분야는 위에서 언급하다시피 툴이 있는지도 모르고, 안다 하더라도 배울 필요성을 잘 못 느낄 뿐더러, 배운다고 하더라도 문서로 배우기보단 누군가 강의하고 이를 받아들이기를 매우 선호한다. (물론 내 선입견일수도 있지만, 내 경험상 그렇다는 얘기. 물론 잘 관리되는 곳도 있다.) 수업을 따로 만들지 않는 이상 이런 걸 찾아보는 사람은 드물고 배우는 것도 힘겨워하는 것 같았다.

여튼, 위에서 언급한 MIT강의가 딱 이런 사람들을 위한 강의가 아닌가 싶다. 이런 툴들이 강의를 듣거나 설명을 듣는다고 한번에 해결될 문제는 아니지만, 그래도 툴의 존재도 모르는 것보다는 낫지 않은가. 한국의 Top-down 선호 정서상 교수님들이 이런 툴들을 알고 쓰기를 장려한다면 내가 다른 학생들에게 추천하는 것보다 훨씬 쉽게 해결될 문제이지만, 사실 교수님들도 이런걸 잘 아시는 분들을 본 적이 드물다. 당장 연구실적이 급하긴 하니깐 이해는 하지만 장기적으로 볼때는 모두가 이런 툴들을 쓰는게 낫지 않겠는가. 나도 툴을 잘 쓴다고는 어디가서 이야기하진 못하지만, 그래도 안쓰는것보단 낫다고 생각한다. 그동안 여러번 연구실에 이런 툴들을 소개하고 추천해줬지만 대부분 연구 결과가 급하기에 강제적으로 쓰게 하지 않는 이상 쉽지 않다. 그런 사실을 잘 알기에 이 강의를 더욱 추천하고, 학교에서 수업형태로 가르쳤으면 좋겠다.

또한, 이 강의에서 설명하지 못한 부분도 몇 가지가 있는데, 그 중 중요한 걸 뽑자면

  1. (영어로 쓰여진) 개발 문서를 읽고 이해하는 방법
  2. 검색하는 법

정도가 있다. 1,2번이 된다면 위의 강의가 그렇게 필수적인게 아니다. 이게 된다면 툴 이름만 알려줘도 알아서 찾아서 쓸 수 있기 때문. 그러나 1,2번은 그동안 경험적으로 체득한 결과라 생각해서 쉽게 설명하기 어려웠는데 마침 최근에 개발자를 위한 정보 검색 팁 이라는 글을 알게 되었다. 이 글이야 말로 내가 고민하던 문제를 완벽하게 설명해준 글이다. 이걸 미리 알았다면 난 그동안 고생을 덜 해도 되지 않았을까 하는 생각이 들 정도로 퀄리티도 훌륭하고 체계적으로 잘 설명해주신 포스트다.

지금까지 소개한 두 링크를 잘 숙지한다면 비개발자도 충분히 일의 효율성을 높일 수 있을 것이라 생각한다. 강추!