본문 바로가기

개발 개발

소프트웨어 제작의 기본

출처 : http://zedoul.tistory.com/411


소프트웨어 제작의 기본이란 어떤 것이 있을까? 흔히 말하는 소프트웨어 제작의 기본이란 왠만한 책을 보면 당연하다는 듯이 나와 있는 것들이다. 딱 봤을 때 에이 당연히 지켜야 하는 거지라고 말하기 쉽다. 하지만 그렇게 알고만 있으면 역시 머리에 남지 않는다. 모두 지킬 수 있도록 노력해봐야 한다. 내가 가진 실력에 비해 무척 과한 주제긴 하지만 요즘 시간도 많이 남는 덕분에 개발 과정에서 느낀 점 위주로 적어보자 한다.


1. 언제든지 실행할 수 있는 최신의 바이너리 확보
자신이 책임지는 바이너리는 최신의 기능으로 모든 순간에서 실행할 수 있어야 한다. 이건 간단한 말처럼 보이지만 이걸 할 수 있는 수준의 개발자는 많지 않다. 실력이 문제가 아니라 다음과 같은 시스템을 구축하고 있고 유지하고 있다는 소리이기 때문이다.

- 코딩하고 있는 버전과 릴리즈 한 버전을 분리하여 관리할 수 있는 시스템을 이해하고 사용하고 있다. (git)
- 최신의 릴리즈 코드를 통해 최신의 바이너리를 일정 주기 간격으로 빌드해낼 수 있는 시스템을 유지하고 있다. (buildbot)
- 빌드 브레이크를 유발할 수 있는 commit 혹은 수준이 떨어지는 코드는 애초에 받아들이지 않는다. (gerrit)
- 소프트웨어 실행 바이너리는 위와 같이 확보하고, 데이터 바이너리 (sql data 등)은 주기적으로 백업하도록 한다. (replication)
- 팀이 릴리즈 버전과 코딩 버전의 차이를 이해하고 있고, 빌드 브레이크 및 런타임에러를 유발하는 기능을 함부로 릴리즈 버전에 포함시키지 않고 충분한 의사소통을 거쳐서 포함시킬 수 있을 정도로 성숙해있다.



2. 어디서든 원하는 수준의 빌드 환경 구축하기
이것도 간단해 보이지만, 역시 위의 수준에서 생각해보면 다르다. 하지만 좋은 도구들이 많이 나와있어서 단순히 사용하는 것만으로도 기본 수준을 만족할 수 있게 된다.

- 어디서든 빌드 환경을 쉽게 다운받고 쉽게 구축하고 쉽게 빌드할 수 있다. (scratchbox)
- 빌드시 필요한 라이브러리들을 서버에서 자동으로 내려받을 수 있는 시스템을 가지고 있고, 패키지 단위로 이를 관리하고 있다. (apt) 
- 빌드할 소스 또한 어디서든지 쉽게 다운받을 수 있고 원하는 구현에 맞추어 버전을 달리할 수 있고 그 변경과 합치기가 자유롭다. (git, git-flow)
- 패키지 관리자가 빌드 환경에 필요한 패키지들만 받도록 하고 어디서든 빌드가 가능하도록 빌드 스크립트를 짤 수 있을 정도의 역량을 가지고 있다. (debian, cmake)


3. 문제가 생겼을 때 디버깅 잘하고 문제가 일어나지 않도록 잘 대처하기
그냥 printf 만 찍는다고 디버깅하는 것이 아니다. 로그를 잘 찍는 것도 물론 어려운 일이지만, 해당 문제가 발생한 상황으로 되돌아가는 기능 및 기타 디버그 도구를 다루는 것은 때때로 운영체제의 핵심 지식을 요구한다. 그리고 문제가 발생하지 않도록 예방하는 것 또한 경험이 많이 요구되는 부분이다.

- 시스템 성능 저하를 유발하지 않으면서 분류별 - 정상, 경고, 에러 등등 - 로그 저장 및 출력(syslog)
- 문제가 일어나지 않은 특정 시간의 빌드/실행 환경으로 이동하기 (scratchbox, apt, git tagging)
- 개발자가 기본 디버깅 툴 및 기타 도구들을 이해하고 사용할 수 있을 정도로 성숙해있다. (gdb, objdump, trace32, ltrace, strace, valgrind, memprof, klocwork)
- 애초에 디버깅을 해야하는 상황인지 잘 알 수 있도록 정적 분석 도구 활용 및 빌드시 기본 테스트 코드 삽입 (git post-commit)
- 자동 테스트 프로그램 만들기, 기본 테스트, 스트레스 테스트 등 시도.


4. 사람들과 정보 공유 및 의논 잘하기
위의 주제에 비해 언뜻 가장 쉬워보이는 부분이 정보 공유이랑 의논이지만, 가장 어려운 부분이다. 이는 도구 하나 쓴다고해서 될 일도 아니고 애초에 사람들이 도구들에 대한 거부감도 엄청나다. 오픈소스 커뮤니티들이 의외로 메일링리스트만으로도 잘 굴러가지만 이는 하루에 수십 통의 메일에 답장을 해야하는 메인테이너들의 풍부한 이해력과 높은 수준의 헌신이 없이는 불가능하다. 팀의 수준과 현재 프로젝트의 수준에 따라 창의적인 접근 방법이 요구된다.

- 올라간 자기 코드 공유하기 및 커밋한 자기 코드 공유하기 (gitweb, gerrit)
- 위키를 통해 백과 사전 식으로 정보 공유하기 (mediawiki)
- 상대방이 띄워주거나 깔본다고 해서 동요하지 않고 차분하게 자신이 할 수 있는 일과 손대서는 안될 일 파악을 잘 하여 의논하기 (난이도 하)
- 상대방이 버릇없다고 해서 같이 개가 되지 않고 예의바르고 정중하게 정보 공유 및 의논에 집중하는 자세 (난이도 중)
- 상대방이 자꾸 누구 탓이니 남 탓 지껄일 때 차분하게 문제를 분석하고 사람이 아니라 모듈에 핵심을 맞추어 정보 공유 및 의논할 수 있는 자세 (난이도 상)



소프트웨어 개발의 기본이라고 생각되는 부분 중에서 내가 알고 있는 부분은 이와 같다. 아마 3년 정도 지난 뒤에 안부끄러우면 성공이고, 그 뒤에 내가 몇 가지를 더 붙일 수 있다면 대 성공이겠지.

* 팀 문화 이야기 : http://blog.naver.com/bo0wy19/80143714046
* 나눔의 감동 :  http://blog.naver.com/bo0wy19/80144778079
* git 관련 scm 도구 관련 사이트 : http://book.git-scm.com/

'개발 개발' 카테고리의 다른 글

C++ 카사블랑카 라이브러리  (0) 2012.11.06
Common keyboard shortcuts  (0) 2012.07.23
[OpenSSL 프로그래밍]  (0) 2012.05.11
HG ( Mercurial ) 한글 파일 문제 해결  (0) 2012.02.07
Yum httpd 에 mod_jk 설치 하기  (0) 2012.01.04