SW 개발을 위한 SW들

SW 개발을 위한 SW들

지난 해 몇 년간 있던 팀을 떠나 다른 업무를 하는 팀으로 옮겼습니다. 전에 있던 팀에서 이것저것 새로운 도구들(Redmine, Jenkins, SVN, Maven..)을 도입해서 개발과 운영을 편하게 만들려고 많은 애를 썼습니다. 그런데 팀을 옮기고 새로 맡은 시스템을 보자니 대략 10년 전이 떠올랐습니다. EJB로 되어 있고 Java는 1.5를 사용하며 CVS에 프로젝트 패키지는 20개 가량, 문서화는 거의 되어있지 않고 대부분의 비즈니스 로직은 SQL에 들어가 있습니다. 바닥부터 새로 시작하는 느낌이랄까요.. 다시 하려니 좀..그렇습니다. 그런 면에서 SW를 개발하는데 도움을 주는 SW들을 단계별로 정리해보려고 합니다. 이 목록들은 SW 개발의 도구이고 인프라라고 볼 수 있습니다.

1단계

SW 개발을 할 수 있는 단계입니다. 없으면 할 수 없어요.

  • 컴퓨터 : 하드웨어 뿐인 컴퓨터는 뭘까요. 고철과 PCB일 뿐입니다. 컴퓨터 자신의 동작을 위해서 이미 많은 SW가 동작을 해야 합니다. BIOS, CPU의 커널, 메인보드의 노스/사우스브릿지 모두 SW로 볼 수 있습니다. 그러니 버그도 있는 것이죠. 게다가 컴퓨터가 없는 SW 개발은 (거의) 불가능합니다. 종이에 가상의 코드로 끄적이는 것도 아주 넓게 봐서 SW 개발이긴 하지만요.
  • 프로그래밍 언어(컴파일러/인터프리터) : 기계어로도 프로그래밍을 할 수 있긴 합니다. 하지만 너무 저수준이죠. 프로그래밍의 재미를 느끼기도 전에 지쳐 떨어지고 말 겁니다. 고수준 언어의 컴파일러와 인터프리터도 SW입니다. 내가 하려고 하는 것에 적당한 프로그래밍 언어를 선택해야 합니다.
  • 프로그래머 : 프로그래밍 행위를 하는 프로그래머의 뇌도 일종의 SW가 아닐까요? 인간이 사고하는 것도 폭넓게 보면 정보의 인식과 처리라는 면에서 SW가 하는 것과 유사합니다.

2단계

컴퓨터의 도움으로 좀 더 쉽게 개발을 할 수 있습니다.

  • 통합개발환경(IDE) : 세상에는 많고 많은 프로그래밍 언어가 있고 각 언어에 최적화된 그보다 많은(아마도) 통합개발환경이 존재합니다. IDE들은 좀 더 쉬운 프로그래밍을 위해 존재합니다. 문법을 체크해주고 변수와 함수, 클래스 이름들을 기억해야 하는 부담을 덜어주죠. 컴파일도 자동으로 해주고 실행과 디버깅도 편하게 할 수 있습니다. SW 개발을 위한 프로그래밍 언어를 선택했다면 적당한 IDE를 하나 골라서 사용해 보는게 좋습니다.

3단계

SW의 공유와 관리가 가능한 단계입니다.

  • 버전관리도구 : SW는 계속 변합니다. 어디가 언제 변했는지 기록되어 있다면 문제가 생겨도 대처하기 쉽습니다. 한참 진행했는데 뭔가 아니다 싶으면 돌려놓을 수도 있구요. 버전관리도구는 SW 개발 뿐만 아니라 컴퓨터 파일 이 있는 모든 곳에서 유용합니다. 파일 뒤에 최종판, 진짜최종, 최종final, 최종final_v1 … 붙여가며 어떤게 마지막껀지 혼란한 상태로 있다면 버전관리도구가 도움을 줄 수 있습니다.
  • 백업 : 중요한 자산(차, 집, 몸…)에 보험을 걸어놓습니다. 마찬가지로 만들어진 SW가 중요하다면 백업을 해두는게 좋습니다.
  • 이슈 트래커 : 이슈 트래커는 SW 제품 자체와는 별 상관이 없습니다. 이슈 트래커란 지식, 협업에 관한 것이죠. SW 개발의 다이어리 혹은 플래너 같은 역할을 하기도 합니다. 누가 무슨 일을 하는지, 언제까지 하는지 공유하고 관리하고 관련된 지식들을 문서화(주로 위키)할 수 있도록 도와주는 것이 이슈 트래커의 역할입니다. 개발팀이 커질수록 서로 다른 곳에서 일할수록 이슈 트래커를 통한 협업은 중요해집니다. 버전관리도구와 마찬가지로 SW 개발 이외의 분야에서도 사용하면 큰 도움이 될 수 있습니다.
  • 메시지 : 공유하고 협업하려면 의사소통이 필요합니다. 바로 옆에 있으면 말을 해도 되지만 그보다는 글로 남기는게 좋습니다. 메신저가 될 수도 있고 이메일도 됩니다.

4단계

반복적인 작업들의 자동화가 이루어지는 단계입니다.

  • 빌드와 배포 : 요즘의 SW 개발은 점점 복잡해지고 있습니다. 예전에는 웹 개발을 할 때 그냥 수정된 HTML과 CSS, JavaScript 파일을 서버에 올리기만 하면 되었는데 요즘엔 축약된 표기법으로 쓰고 컴파일을 하는 과정을 거치기도 합니다. java에서 컴파일, jar 패키징을 하는 과정이 필요합니다. 개발자의 컴퓨터에서 실행되는게 아니라면 서버에 완성된 SW를 배포하는 과정도 필요합니다. SW 개발이 복잡해질수록 이런 빌드와 배포 과정도 복잡해집니다. 이런 것들을 도와주기 위해 빌드툴과 [배포툴]들이 있습니다. 빌드툴은 프로그래밍 언어마다 거의 표준으로 사용되는 것들이 있죠. 반면 배포툴은 보다 일반적인 것 같습니다. 빌드와 배포를 자동화해두면 반복적인 작업의 부담을 덜고 SW 개발 본연의 일에 집중할 수 있게 됩니다.

5단계

품질과 안정화의 단계

  • 테스트 : 만들어진 SW는 항상 테스트를 거쳐야 합니다. SW가 커지면 커질수록 테스트도 증가합니다. 게다가 테스트는 그 특성상 반복적입니다. 이런 반복적인 일들은 컴퓨터가 할 수 있도록 단위 테스트와 같은 자동화가 필요합니다. 4단계에서 설명한 빌드 자동화와 결합하면 SW를 항상 실행 가능한 상태로 유지할 수 있게 됩니다. 문제가 생겨도 금방 알 수 있게 되죠.
  • 모니터링/추적 : 개발된 SW의 실행이 이루어지는 컴퓨터와 실행 중인 SW의 처리량을 측정하는 것도 중요합니다. 잘 돌아가고 있는 서비스도 항상 관찰이 필요합니다. 종종 생각치도 못한 문제가 발생하기도 하니까요. 갑자기 서비스가 멈춰서 찾아보니 작업 디렉토리가 꽉 차있다거나 하는 황당한 문제를 겪지 않으려면 말이죠.

정리

성숙한 SW 개발의 모습을 상상해 봅니다. 각 단계가 물 흐르듯 자연스럽고 부품들이 유기적으로 맞물려 돌아가는 상황말이죠. 계속되는 변경 속에서도 안정적으로 서비스(운영)가 가능합니다. 예측 가능하고 성취 가능한 계획을 세울 수 있는 단계죠. 이런 성숙한 단계에 이르기 위해서는 많은 도구들을 다루고 배워야 합니다. 하지만 한 단계씩 밟아가면 그리 어렵지 않은 여행이 될 것입니다.

참조

이 글에 영감을 준 책들입니다. 인터넷에 자료가 엄청나게 많지만 체계적으로 정리된 책으로 시작하는것도 좋습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다