버그를 찾아내는 묘수가 있나요?

geekforum의 이미지

http://www.devpia.com 게시판에 lssb3란 분이 올린 글중 일부입니다. 공감이 좀 가는군요.

"일을 시작한게 2월인데, LE판을 6월까지 마쳐야 된다고 했는데, 좀 늦어져서 9월에 끝내구 보냈습니다. 저희쪽에서는 끝냈다고 생각을 하고, 풀버전을 들어 갔습니다. 그런데, 구매자인 일본쪽에서 테스트를 하면서 안되는 부분이 있다고 계속 연락이 왔고, 우리 회사쪽에서 다시 만들고 테스트 해서 보내고 이런식으로 하면서 지금까지 완결이 안되고 있습니다.

12월에 팀장님이 일본에 가서 그쪽에서 테스트를 해서 버그 수정을 마치고, 최종적으로 1월달에 한번 더 일본에 가서 마무리를 짓는다는 하는데, 풀버전을 만들면서, 이런식으로 계속 진행하다보니 일의 진척은 안되고, 테스트하는데 시간 뺏기고 하다보니..(회사에서 하는 일이 LAN상에서 작동하는 교육용 프로그램이라 테스트를 하게 되면 회사내의 거의 모든 컴으로 테스트를 하게되서 컴퓨터를 거의 못씁니다.) 연말이 되서 되돌아보니 거의 1년동안 일하면서, 해 놓은건 별로 없고, 시간은 시간대로 가고 답답하더군요.

4월부터 9월까지는 일주일에 3일은 밤새면서 일했는데, 그때도 6월까지 완성시키는게 목적이어서 5월달 부터는 일:테스트의 비율이 6:4은 되는거 같더군여. 그 뒤에는 야간 작업을 별로 없었지만 프로그래밍하는 시간이 반이면, 테스트하고 고치는데 걸린 시간이 반인것 같네요.

회사측에 테스트하는 사람을 따로 두고 하자는 말을 해 봤는데, 다른 회사에서도 프로그래머가 테스트까지 같이 한다더군여.

지금 프로그램을 보면 첨에 제대로만 설계를 하고 만들었으면, 이렇게 시간이 많이 걸리지 않았을 거라는 생각이 자꾸드는데, 모듈별로 각자 따로 만들다보니 생기는 문제도 많구. 이런게 앞으로 개선이야 되겠지만, 그때까지 기다리기도 짜증이 나는군요. 풀버전 끝나고 회사를 옮길까 생각을 해 봤는데, 이런식으로 했을때 풀버전이 언제 끝날지 기약도 안보이고, 지금 회사를 옮기는 것도 그렇게 모습이 좋아 보이진...."

저희도 지금 만들고 있는 프로그램이 테스트가 제대로 안돼서 테스트할때마다 버그가 나오고, 그러다 보니 고치다가 또 버그 나오고.... 이런 식으로 개발일정이 계속 밀리고 있습니다. 프로그램 개발할때 테스트는 어떤 식으로 해야 할런지, 버그는 찾아내는 묘수가 따로 있는 것인지 궁금합니다.

댓글

익명 사용자의 이미지

항상 단위테스트가 최고지여

익명 사용자의 이미지

주석을 꼼꼼이 다는것도 중요하다고 생각합니다.

가장 중요한건 기획과 사양서겠지만 여건이 그러하지 못하는 경우가 많으니까요..

제 경우에는 리뷰를 통한 소스 프리젠테이션도 상당히 큰 도움이 되었습니다.(하지만 막상 하면 죽을맛이죠.. ㅡㅡ;)

익명 사용자의 이미지

구조적언어가 디버깅은 쉽더군여..
전 단순 무식하게.
step1..
step2..
찍어보면 대충 문제파악이 되는데..
oop에서는 문제가 틀려집디다..
상속받고 구현하고하면..
정말 눈알 튀어나옵니다.

쿠크다스의 이미지

OOP언어에 적합한 디버깅 요령이 있지 않을까요?
혹시 누구 아시는 분 계시면, 전체에 답글 좀...

전 OOP 언어를 legacy 언어 쓰듯이 써서
아직 그런 못 겪어 봐서...

버그..bug wrote...
> 구조적언어가 디버깅은 쉽더군여..
> 전 단순 무식하게.
> step1..
> step2..
> 찍어보면 대충 문제파악이 되는데..
> oop에서는 문제가 틀려집디다..
> 상속받고 구현하고하면..
> 정말 눈알 튀어나옵니다.

과자가 아닙니다.
cuckoo dozen, 즉.12마리의 뻐꾸기란 뜻입니다.

익명 사용자의 이미지

저두 동감.
oop 손톱에 때만큼만 해봤는데도
무지 어렵데요.
그래두 요령은 있을것 같은디..

익명 사용자의 이미지

Writing Solid Code 와 The Elements of programming style, 그리고 XP 시리즈를 참고해 보십시오.

참, 버그없는 코딩이 아니라 버그찾기 묘수였던가요? ;)

김성진의 이미지

저는 시스템 프로그램을 만들고 있는 개발자 입니다.
다른 프로그램도 마찬가지일 테지만, 특히 시스템 프로그램의 경우는 고신뢰도를 보장해 주어야 합니다.

이런 프로그램의 예로는 미들웨어나 데이타베이스 등이 있겠죠.

사실 버그없는 프로그램은 없지만, 가능하면 버그없는 놈을 만들어서 편한 유지보수 하는 게 개발자의 소원이죠.

결국 Quality Assurance와 관계가있는 내용인데, 이쪽에는 제가 저문가가가 아니라서 말씀드리기 뭣하고,
개발자로서 절실히 느꼈던 것과 해결방법을 적을까 합니다.
(설계기법 등에 대해서는 건너뛰고... )

우선 버그의 발생전에 잡을 수있는 방법으로서 저희들은 Code Review를 수행합니다.

2인 이상의 개발자가 모여서 해당 위치의 소스코드를 line by line으로 따라가면서 버그를 찾는 것이죠.

대부분의 경우에는 개발사의 Coding Convention을 따르지 않아 생긴 문제가 대부분이고, 로직이 샌다든가 하는 문제가 나오더군요.

일차적으로 절반이상의 버그는 적절하게 정의된 코딩규칙으로 예방할 수 있을 것 같습니다.

다음에 이런 과정에서 걸러지지 않은 버그의 경우에는 디버거를 통해서 잡게 되는데, 수개월 이상 안정적으로 동작해야 하는 소프트웨어의 경우
나중에야 버그가 발견되거나 이상동작을 하게 됩니다.
이런 경우는 사실상 재현이 거의 불가능하거나, 나자빠지는(?) 상황인데, 원인을 찾아가다 보면 한심합니다.

메모리를 적절하게 해제를 하지 않았다거나, 메모리 복사시 한바이트 더 혹은 덜 했다거나, 열린 화일디스크립터를 그대로 놓아두었다거나..등등의 문제죠.

저희회사에서는 메모리관리 툴을 이용해서 이런 극악(?)한 버그를 잡고 있습니다. 아마 이런 툴을 사용하고
있지 않는 회사에서 주종으로 밀고있는 제품을 테스트 해 보면 놀랄만한 결과가 있을 수도...^^

어쨌든 버그는 개발자의 동거동락하는 운명인 것 같군요.

from gamestar

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

익명 사용자의 이미지

일본이 괜히 선진국이 아니군요..

제가 가지고 있는 원칙 : 초급수준의 코딩.. 쉽게 남들보기 쉽게 짭니다. 절대 workaround 나 나만의 비법 이런거 안쓰죠. 덕택에 버그가 줄긴 하지만 주위에서 튜닝하라고 난리칠때 문제가 ㅜ.ㅜ

익명 사용자의 이미지

프로그램은 4번의 코딩으로 하나의 프로그램이 만들어 진다고 봅니다.

1. 문제분석시 한번 전체 프로그램 동작 구상
2. 기본설계에서 다시한번
3. 상세설계에서 더욱 깊이 한번
4. 그리구 코딩에서 세밀한 곳 까지....

근데 알면서두 나는 그러지 못하네여....

회사가 까라면 까야죠.... ㅜ.ㅜ

그리구 코딩의 잔잔한 잡기 몇가지는 프로그램의 디버깅을
쉽게 합니다.

1. 가능한 각각의 기능은 프로세스로 분리 한다.
- 이는 디버깅의 범위를 좁혀 줍니다.
- 쓰레드는 편하지만 무쟈게 디버깅을 어렵게하져

2. 각 정보 또는 에러에 대한 로그를 남긴다. 이때 로그 프로세스는 별도가 좋죠
- 사람의 머리는 생각하고, 컴터는 사람의 생각을 표출하죠. 절대 당신의 머리만 믿지 마시고, 잔인할 정도로 각각의 정보및 에러를 출력하세여 ( 화일 또는 프린터로... )

3. 이건 고생스러워, 이런 방식은 안쓰겠지.... 라는 생각은 금물입니다.
- 실제 구동되는 로직의 80% 이상은 프로그램의 안전성을 보장하기 위한 방어로직이라 생각하시구 마구 노가다 하십쇼.
- 한순간의 게으름이 몇개월, 몇년동안 당신을 괴롭힙니다.

익명 사용자의 이미지

3번에 대해 공감이 가는군요.
컴파일 에러
링크 에러
런타임 에러

요 위에 것들을 해결했어도

예외사항(exception) 해결못하면 꽝이죠...

익명 사용자의 이미지

XP 방식으로 개발하나 보져^^

1. 기본 적인 슈도 코드를 만든다.
2. 사용자에게 보여준다.
3. 피드백에 따른 수정을 가한다.
4. 다시 보여준다.
5. 만족할때 까지 3, 4를 반복한다.

근데 중요한 것은 항상 빠져..
* 개발자가 충분히 쉴 수 있고, 충분한 보수를 받을 수 있는 환경을 구축한다.

익명 사용자의 이미지

XP 방식이라는게 먼가요?? fㅡㅡ

혹시 XP windows와 관계된.. 쩝.. 거럼..

익명 사용자의 이미지

익명 사용자의 이미지

맞는 말이네여.... ㅜ.ㅜ

근데, 파도를 타듯 가끔은 날밤을 까면 그럭저럭 갱기지만....

맨날맨날 거센 파도가 몰아치는 지금은 돌 던지고 싶져... ㅋㅋㅋㅋ

배성남의 이미지

버그를 안맹그는게 젤루 중요하겠죠
그럴려면 설계가 중요하다 봅니다..

Large-Scale C++ Software Design

http://www.amazon.com/exec/obidos/tg/stores/detail/-/books/0201633620/customer-reviews/ref=pm_dp_ln_b_7/002-2671622-4482433

익명 사용자의 이미지

내공이 안따라주는데 상승무공을 연마하려고 하면 주화입마에 빠지게 됩니다...

익명 사용자의 이미지

전 무협지를 보지 못해서 님의 용어를 잘모르겠는데

보통쓰는 '초식', '내공', '주화입마' 등등을 풀이 좀 해주십시오. 부탁입니다.

익명 사용자의 이미지

초식 => 스킬
내공 => 경험 또는 훈련을 통해 축적된 능력? 정도...
주화입마 => 망가지다... -_-;

정말 궁금해서 물으신거죠??? ;;;

익명 사용자의 이미지

각각의 분야에 전문가는 있습니다.

최근에 안 사실이지만 필드 테스트만 전문적으로 해주는 업체가 있더군요. 물론 얼마나 정확히 버그를 찾아줄지는 저도 의뢰해보지는 못해서 정확하게 말씀 드리기 어렵겠지만...
이런 업체를 이용하는것도 한가지 방법이라 생각 됩니다.

며칠전 통화를 해보았는데 한건에 100만원 이랍니다.

익명 사용자의 이미지

불안정한 OS기반에서 개발된것들이 다 똑같지 뭐..

버미.의 이미지

정말 동감이 팍팍 가네요.
저같은 경우도 회사에서 만들던 프로그램 테스트랑 버그수정만, 6개월 넘게 한 경우가 있었습니다.
결국 팀장님 몇분이 도망치듯 회사를 나갔고,
후에 들어온 신입분들이 결국 모든 코드를 새로작성하는
초유의 사건이 터졌었습니다.
사실 지켜 보면서 많은 생각을 했습니다. 사실 저도 이껀 때문에 하루죙일 매달리다보면, 내가 이회사에 버그리포트작성하러 온것 같은 착각에 잠도 재대로 못잔적이 많았습니다.

버그 테스트 하다가 느낀건,

1. 절대로 믿지마라입니다.
2. 그리고 절대로 손대지 말고 기록하라!!!

믿지말라는 것은 사람을 믿지 못해서도 아니고 컴퓨터를 믿지 못해서도 아닙니다. 다만, 코딩다해놓고 자체 테스트해보면, 전혀 버그는 커녕 최적의 상태로 동작합니다.
물론 몇일 못가죠.. 그때의 허탈감과 배신감은 이루 말할 수 없더군여.

그리고, 정말 완벽한 상태가 됐다고 판단되면, 되도록 암것도 모르는 영업직이나 관리직한테 테스트 시켜 보십시요.
저희 회사에서 가장 버그 리포트가 훌륭했던건 사장님였습니다. ^^;

2. 절대로 손대지 말고 기록하라!!!!
다들 아시겠지만, 흔희 접하는 런타임 오류같은건 걍 그자리에서 고칠수도 있습니다.
하지만, 이것도 한계가 있더군여.
여기서 중요한 것은 기록입니다. 무심코 수정코딩한 한줄때문에, 전체 소스를 살펴봐야 하는 경우가 있었습니다.

조기태의 이미지

자세한 건 적용하는 방법론이나 언어, 혹은 프로그래머의 습관에 따라 다르겠지만 몇 가지 중요한 원칙은 있는 것 같습니다. 생각나는 대로만 적는다면,

(1) 코딩 전에 설계를...

당연한 이야기 같지만 실제로는 안지켜지는 경우가 의외로 많습니다. 원인은 대부분 무리한 일정에 쫓겨 대충 개념만 잡고 코딩에 들어간다던지, 아예 제대로된 설계를 할만한 개발자가 없는 경우로 나뉘어 집니다. 특히 OOP기반의 언어로 어느 정도 이상 규모의 시스템을 개발한다면 설계없이 개발에 들어간다는 건 거의 100% 유지보수가 불가능한 상황을 불러옵니다.

다만 어떤 방식으로 문서화를 할 것인지, 또 설계와 개발을 어떻게 병행할 것인지는 방법론과 습관에 따라 달라집니다.

(2) 체계적인 디버깅...

어느 분도 말씀하셨지만 가능하면 개발자가 직접 테스팅을 하기 보다는 따로 QA를 두는 것이 좋습니다. 또한 처음부터 버그질라와 같은 트래킹 시스템을 두고 확실한 버그 리포팅 가이드라인을 만들어 두는 것이 중요합니다. 테스트 항목도 무작위로 정하기 보다는 어떤 원칙을 두고 테스트 케이스를 뽑아내야 합니다. 적용하는 방법론을 정확히 이해하고 이에 따라 적절한 설계를 했다면 테스트 케이스를 보고 원래의 요구사항이나 유즈케이스를 뽑아낼 수 있습니다. (이를 traceabillity라고 하지요...)

(3) logging과 unit test...
어느 프로그램 언어를 사용하건 버그를 잡기 위해서는 적절한 디버그 정보를 출력해야 합니다. 이때 무조건 임시로 콘솔 출력을 하기 보다는 적절한 로깅 프레임워크를 사용하는 것이 좋습니다. 자바언어를 쓴다면 1.4의 로깅 API나 Log4J와 같이 카테고리별로 서로 다른 레벨을 적용할 수 있고 다양한 방법으로 결과를 출력/보존하는 기능을 지원하는 프레임워크를 활용할 수 있습니다. 요즘 웹 개발의 비중이 늘어나는 추세이지만 프로덕션 환경에서 조차 콘솔에 디버그 정보를 잔뜩 쏟아내는 프로그램을 자주 접하게 됩니다. 이 경우 성능의 심각한 저하는 물론 버그 발생시 적절한 대응이 어려운 경우가 많습니다.

한편 시간 여유가 있다면 개발 단계에서 부터 Unit 테스트 코드를 함께 작성하는 것도 개발이 진행되면서 종종 생기는 regression을 사전에 예방하는데 도움을 줍니다.

......

이런 모든 부분을 고려에 넣고 개발을 한다면 그렇지 않은 경우보다 훨씬 테스트/디버그에 들이는 노력을 줄일 수 있고 결과적으로 높은 품질의 소프트웨어를 제작할 수 있다고 생각합니다. 이를 위해서는 단순한 코더 수준의 프로그래머들 이외에 어느 정도 소프트웨어 공학을 이해할 수 있는 아키텍트/개발자가 필요합니다. 솔직히 저도 SE 적인 면에서 많이 부족하지만 그래도 조금씩 배워갈 수록 그 중요성을 실감하게 되는 군요.

참고가 되셨으면 합니다.

그럼...

익명 사용자의 이미지

원칙 하나, 절대 만든 사람이 테스트 하지 않는다.

어렵지만, 지켜야만 할 것

익명 사용자의 이미지

저도 수업시간에 들은 내용인데요...
제 생각으로는 아마 자신이 만든 프로그램은 본인의 생각으로 일어날 수 있다고 생각되는 버그들에 대해서만 염두해서 프로그램을 작성 할 것입니다. 결국 나중에 테스트를 한다고 하더라도 그 이상의 버그가 발생할 수 있는 다른 상황을 생각해 내기는 무리일 것입니다. 또한 자기가 작성한 것에 대해서는 그렇게 비판적이지도 않을 것이구요.
그래서 아마 이런 말이 나왔으리라 생각합니다.

lovehis의 이미지

만든 사람은 자기 코드에 대해서... 냉정해 질수 없죠.

자기 자신에게 지독히 냉정하지 않으면....
자기 코드에 대해 지독한 태스트가 어렵다고 생각해요.. ^^*

익명 사용자의 이미지

냉정해지지 않는 것이 아니라 생각하지 못하는 것입니다. 그런 상황을 생각했다면 당연히 고려해서 개발했겠죠. 생각못한 방향으로 프로그램이 실행될 때 로직은 새는 것입니다.

그래서 폐기될 때까지 발견되지 않는 버그도 있는 것이져 ㅡ,.ㅡ;

쿠크다스의 이미지

순간 의아해했지만,
조금만 생각해보면, 공감이 가는군요.

그런 명제를 제시하고 있는 곳을 알고 싶군요.

과자가 아닙니다.
cuckoo dozen, 즉.12마리의 뻐꾸기란 뜻입니다.

익명 사용자의 이미지

우리나라 s/w개발업체들 심지어 한컴도 설계가 매끄럽지 못해 항상 잦은 버그를 일으킨다고 하더군요 ㅡㅡ; 우리나라 it업체들 개발자 데려다 놓고 촉박한 시간에 구현위주로 개발방향이나 스케쥴을 맞추다 보니 정착 중요한 버그를 신경도 안쓰는듯합니다. 그리고 윗글에서 일본의 경우를 예로 들으셨는데 저정도의 반, 아니 1/3도 하지 않는 업체들이 태반입니다. s/w개발에 대한 인식도 없는 그런 사장, 팀장, 개발자가 모이면 버그 투성이인 제품만 만들겟죠! 우수운 이야기죠! 분명히 s/w개발을 한다는 업체에서 버그에 대한 인식이 부족하다는건... 그러면 결국 그걸 사용하는 사용자들이 피해를 입게 됩니다. 그렇다면 MS사의 윈도우를 말안할수 없겠네요 윈도우는 상당히 버그가 많습니다. 그 버그가 너무 많아서 사용자들이 많이 싫어했쬬 사실 리눅스가 어느정도 퍼진것도 윈도우의 버그의 영향도 많다고 볼수 있습니다. 그러나 MS사는 윈도우의 버그를 교묘히 이용해서 시장을 지배햇쬬!(-_-+) 프로그램을 만드는 것도 기술이지만 버그를 수정하는 것도 기술입니다. 또한 프로그램을 만드는것보다 버그를 잡는게 더욱 중요합니다. 국내에는 아직 버그잡는 tip/tech 사이트가 없는게 좀 아쉬울 따름입니다. 저도 it업체에 종사하는 사람으로써 저만의 방법을 얘기해보겠습니다.

일단 어떤 프로그램 개발하기 전에 작은 몇개의 모듈로 나눕니다. 그리고 모듈 하나씩 개발하는 거죠! 쉽게 테스트 프로그램이죠! 이미 만들어진 라이브러리 함수를 호출하거나 다ㅡ른 개발자의 소스를 참고하기도 합니다. 알고리즘도 적절히 변경해가면서 테스트 프로그램에서 충분히 테스트 합니다. 디버거를 이용해서 메모리 유출문제가 일어나지 않은가 체크도 하고 변수에 값이 제대로 들어가는지 원하는 결과가 나오는지 기타등등... 그런 모듈이 완성되면 본 프로그램 소스와 통합합니다. 그리고 다시 테스트하죠 -- 모듈 제작시 어느정도 테스트를 맞췄기 때문에 크게 이상이 있지 않는한 잘동작합니다. 그런식으로 작은 모듈 일단 만들고 본 프로그램 소스와 통합하고 계속 그 작업을 반복합니다. 결국 모든 모듈을 완성했으면 통합 테스트하죠 ^^;
어찌보면 구조적 프로그래밍 기법과 비슷한 개발방식입니다.
아무리 복잡하고 큰 프로그램도 결국 하나 이상의 명령어의 집합이므로 작은 모듈이 모여서 하나의 큰 프로그램이 되는거죠! 결론을 말씀드리자면 가장 일반적이고 무식한 방법이 가장 좋은 방식입니다.

tloen의 이미지

메인 글을 쓰신 분의 문제는 버그잡기라기보다는 빠듯한 스케쥴 등으로 인한 설계의 미비로 보이는군요.

MS의 예에서 보듯이, 컴퓨터 프로그램의 버그에는 모든 사람들이 다른 분야에 비해 보다 관대한 입장을 취해왔지만, 이를 악용하여 (건드리면 에러나 버그가 발생할 수 밖에 없을정도로 시한폭탄인) 엉망인 설계나, (스케줄 상의 또는 개인적 사정으로) 미구현된 기능을 버그라고 우기는 비양심적인 개발자들도 꽤 있더군요.

익명 사용자의 이미지

테스트하는 사람 따로 없다고 하는데 왠만한 회사에서는
QA, QC라고 불리우는 사람들이 테스트를 하고 타부처나 고객,
타사에 전달하는데 추후 발생하는 문제에 대한 책임이나 처리도
도맡아 합니다.

월급주고 키울만한 가치가 있느냐고 생각하실지 모르지만 제가
다니는 회사의 경우에는 지대한 역할을 합니다. 온갖 버그들을
빠짐없이 정리하고 히스토리를 관리하고 스케줄에 맞춰 해결해
내도록 귀찮게 하는 것이 잔일이면서도 아무나 못합니다. :)

개발자분들이야 누가 그런 일을 하고 싶어하냐라고 생각하실지도
모르지만 의외로 그런 일을 좋아하고 자랑스럽게 생각하는 사람도
많습니다.

스카리의 이미지

버그없는 프로그램을 만들기 위한 지침서가 많이 있는걸로
알고 있습니다.

책에서 설명한데로만 해서 100% 버그가 없어질리는 없지만
수많은 버그중에서 단 1%라도 줄일수 있다면
손해보는 투자는 아니라고 생각합니다.

로직이나 개발환경과 구동환경의 차이점 때문에 생기는
버그는 둘째치고,
나중에 발견되면 황당한, 어이없는 프로그래머의 실수로
발생되는 버그는 코딩습관을 바꿈으로써 어느정도
줄일수 있습니다.

C 프로그래밍을 하신다면 Writing Solid Code 란 책과
..또 한 권이 더 있는데 갑자기 책제목이 생각이 안나는군요;;
아마존에서 Writing Solid Code 를 검색하면 관련도서에
아마 뜰겁니다.

프로그램의 버그는 분명히 프로그래머의 책임이지만,
테스팅환경이 열악한 우리나라의 경우에는
좀 억울하군요... :(

익명 사용자의 이미지

'높이깊이'란 출판사에서 '버그안녕'이란 번역서가 나왔습니다.
나온지가 오래되어서 아직까지 있을런지는 모르겠습니다.

익명 사용자의 이미지

제판이 나왔습니다. 참 인상깊죠.
code complete도 좋은거 같은데..

익명 사용자의 이미지

모듈별로 테스트가 제대로 이루어 졌는지 냉정하게 생각해 보시길...

또한 모듈별로 테스트를 하면서 작성한다고 해도, 가능하면 자주 통합테스트를 실시해야 합니다. 작성도 다 안된모듈로 어떻게 테스트를 하냐고 물으실 테지만, 가능은 합니다. 그럼 이만.

익명 사용자의 이미지

디버깅이라... 정말 징그럽죠.
사실 버그를 찾아내는 묘수가 따로 있는 것이라고는 생각되지 않습니다.
묘수라는 것은 그저 프로그램 개발을 하다보니 대체로 이런 곳에서 실수를 잘 하더라...
라는 경험이 쌓이다 보니, 남보다 좀더 빨리 잘못된 코드를 찾아낸다는거 정도로 생각하면 될것 같습니다.

허나,
그것도 자신이나 남이 작성한 단위 모듈의 디버깅에나 해당되는 이야기지요.
여러명이 모여서 커다란 프로젝트를 하는 경우에는 정말로 묘수란건 없더군요.
그저 공들여 설계하고,
설계한 것을 여러 각도에서 검토하고,
머리로 또는 S/W를 사용하여 시뮬레이션 하고,
모든 설계 자료를 문서로 만들어 산출물로 등록하고,
발생할수 있는 모든 경우를 포함한 테스트 시나리오를 작성하는것.
이모든 과정이 끝난 후에 실제 코딩에 들어가는 것.
이러한 개발 과정을 잘 도와줄수 있는 개발 방법론을 채택하는 것.

(개인적으로 이러한 개발 방법론은... 프로그래머를 자동화 조립 라인의 한 로봇 정도로
전락시키는 듯한 느낌이 들어서 달갑지는 않습니다만,
어쩌겠습니까 ^^ 대세가 그런데...)

익명 사용자의 이미지

일본 회사에 취업해 있는 사람으로 결론 부터 내리자면... 애플리케이션이라면 회사가 매뉴얼(이른바 사양서)를 제대로 만들지 않아서 그렇습니다. 일을 하면서 버그 체크는 안됩니다. 10줄을 짜면 평균 1줄은 또 버그가 나옵니다.

네트웍 개발도 해본 얼치기 경험자로서 네트웍은 언제라도 예상외의 동작을 할 수 있으므로 넉넉한 개발 기간과 테스트 기간은 필수입니다. 아니면 섣불리 일을 맡으면 안됩니다. 세팅이 정확하다고 tcp/ip가 언제나 데이터가 제대로 날라가는게 아니란거 아시죠?

한국에서는 버그가 생긱면 개발자의 잘못으로 돌립니다만, 일본에서는 매뉴얼(사양서)에 이런 내용이 있는지 확인해보고 빠져있으면 다시 회의해서 개발스케쥴을 조정해주거나, 아니면 해당부분을 대타 불러서 처리해 줍니다. 일본쪽 회사에서는 당연히 그렇게 일처리를 하리라고 믿고 있을겁니다.

제가 일했던 모 회사는 개발자 200명이 크로스 체크를 했습니다. 저의 경우에 매일 평균 20여건씩 버그가 올라오더군요. 2달을 성능 개선없이 버그만 잡고 테스트 하길 반복했습니다. 버그를 그만큼 잡은 덕분에 나중에 크레임없이 잘 넘어갈 수 있었습니다. 지독하게 깐깐한 것이 결론적으로는 도움이 되죠. 당시 팀장이 핵심 업무중 하나가 버그 관리였습니다.

그리고 <다른 회사에서도 프로그래머가 테스트까지 같이 한다>고 하셨는데 개발자가 몇분이지는 잘 모르겠지만, 테스트 시간과 비용까지 일본회사에서 다 받았을텐데... 일본쪽 사정을 모르니까 하는 얘깁니다. 아니면 회사가 처음부터 덤핑을 친 모양인데 바람직해 보이지 않는군요. SI성 사업은 회사나 사람이나 골병이 드는 사업인데, 기술적인 문제까지 걸려 있다면 정말 어려워 보이는군요.

스케쥴관리는 기본적으로 칼퇴근이 가능한 상태에서 추가로 융통이 가능합니다. 다시말해 매일 야근하기 시작했다 싶으면 개발 스케쥴 관리는 물건너 갔다고 보면 됩니다. 야근을 한다는 것은 팀장이 스케쥴 관리를 잘못하고 있는 겁니다. 최소한 제가 일본에서 배운바에 의하면 그렇습니다.

일본인들 버그 잡아내는 기술은 한국은 아직 못따라갑니다. 일제가 좋다라는 얘기가 성능이 좋은 것도 있지만 오동작을 절대 하기 않기 때문이기도 합니다. 잔고장이 없다는 거지요.
그만큼 깐깐합니다. 현재 작업을 잠시 멈추시고 뭐가 문제인지 전체 버그 리스트를 뽑고 다시 스케줄을 잡아 보시가 바랍니다.

글틀양의 이미지

일단 가장 간단하고 무식하면서, 최초로 해야하는 테스팅 방법:

마우스나 키보드로 누를 수 있는 것은 모두 눌러 보아 메모리 덤프나,
기타 문법적 오류 발생이 나는 것을 모두 찾아서 거른다.

그다음 전체적인 업무 흐름 혹은 서비스 흐름을 작성하고
(사실 이건 프로그램을 만들기 전에 만들어서 코딩전에 확정지으면 아주 와땀다..0^^0;;;
물론 중간에 많이 고쳐지긴 하겟지만.)
그 흐름대로 사용해보는 것입니다.
그 집합이 크면 클수록 높은 품질을 제공해주지요.그럴 수록 시간도 많이 잡아 먹어요...

여기까지가 대부분 알파 테스트라고 부르는 경우며, 일반적인 사용에 대한 오류를 잡을 수
있습니다.

그후부터는 프로그램을 모르는 사람들에게 배포하여 이상 사용에 대한 부분을 검증받으면
좋습니다. (이런 것을 베타 테스트라고 부르져...)

일단 대부분의 알파 테스트는 개발자가 하는 경우가 대부분이져.
하지만 프로젝트의 단위가 크고, 모듈이 복잡하게 얽혀 있는 경우,
별도의 테스터를 두는 경우도 있고,
PM이 테스트를 진행하는 경우도 있습니다. ^^;;;

하지만 잘짜인 설계를 가지고 코딩하는 경우, 테스트도 역시 쉽고,
하기가 쉬워집니다. ^^;;;

오늘의 명언 : "잘 짜인 설계 하나 열 테스터 부럽지 않다"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.