2009년 04월 02일
어떻게 해야하는지 모르겠어요 ㅠㅠ
종종 프로그래밍 게시판에 올라오는 질문글을 보면 어떻게 해야하는지 모르겟어요ㅠㅠ 도와주세요ㅠㅠ 와 같은 글들이 상당히 많이 올라옵니다.
뭐.. 누군들 초보가 아니었고.. 누군들 태교로 프로그래밍을 배워서 태어났겠습니까..... 마는... 프로그래밍에 대해 공부하면 할수록.. 웹이나 책, 주변 사람들한테 구할 수 있는 정보가 있다 하지만.. 결국에는 혼자서 배워나가는 부분이 크다는 생각이 많이 듭니다.
얼마전에도 어떤 분이 특정 시간에 프로그램이 수행되게 하는 방법을 물었을 때,
제가 아는 얼마 안되는 지식으로 '저라면 gettimeofady 를 사용해서 초단위로 현재 시간을 확인해서 동작하는 방법으로 하겠습니다.'하고 덧글을 달면, 그분은 또 다른 덧글이 달리지 않는 한 그 방법에 대해 '아.. 이건 이렇게 하는거구나..'로 끝납니다.
반면.. 답변을 달아준 저는 '뭔가 더 나은 방법이 있지 않나?'하는 생각으로 관련 내용을 man page section에서 뒤져봅니다.
그리고 다른 방법도 있다는 걸 알게 되고.. 몇가지 사항을 추가적으로 고려를 해보고 시뮬레이션을 해봅니다.. -_-; 시간적 여유가 있는 경우에는 직접 짜서 수행도 해보고 하게 되지요..
결국.. 게시판에 질문을 올릴때는 덧글이 올라올때까지 F5만 클릭하지 말고 스스로도 여러가지 방법을 고민하는 것만이 자신의 실력을 키우는 것이라는 겁니다.. -_-;
신입사원이 들어오고 교육을 하다보면 대부분이 일단 짜고 보는 경우가 대부분인데, 그런 경우 하다가 뭔가 안되면 어떻게 해야할지 몰라서 우왕좌왕하기 마련이죠.. 그래서 다음과 같은 방법으로 코딩을 하라고 가르칩니다.
* 일단 코딩할 내용을 문서로 만들지는 않더라도 연필로라도 대략적인 그림을 그려라.. 그렇게 하기도 정 귀찮다면 다음과 같은 순서로 코딩을 해라.
1. 주석을 먼저 만들어라
2. 조금씩 구성하며 테스트해라
3. 반드시 return value를 체크해라
4. 중복되는 코드가 있다면 하나로 묶어라.
뭐.. 별거는 아닙니다... 예를 들어 lotto 프로그램을 짠다면..
1. 주석을 먼저 만들어라 (프로그램에 필요한 내용의 큰 그림을 그리는 작업이 됩니다. 또한 나중에 볼때, 해당 부분의 역할에 대해 금방 이해할 수 있게 됩니다.단, 규모가 크고 호출관계가 다양한 경우에는 문서가 필수입니다... -_-)
/*
* Title: lotto program
*
* Description: 45개의 숫자중 6개의 숫자를 임의로 추출한다.
* 단, 숫자가 중복되면 안된다.
*/
#include <stdio.h>
int main()
{
/* 1. 입력을 받을것인지 자동으로 생성할지 묻는다. */
/* 1-1. 입력을 받을 경우 */
/* 1-2. 일부만 입력을 받을 경우 */
/* 1-3. 전부를 임의 생성하는 경우 */
/* 2. 결과를 출력한다. */
/* 3. 한번더 실행할지의 여부를 묻는다. */
/* 3-1. 처음의 과정으로 돌아간다. */
/* 3-2. 종료한다. */
}
개인적인 생각으로.. 이 부분의 구성이 쉽게 이루어지고 나중에 수정하는 횟수가 줄어든다면, 어떤 식으로 해야할지 모르겠다는 질문은 더이상 나오지 않는다고 생각합니다.. 중간중간에 bug가 생겨서 해결 못하는건 별개의 문제라는 거죠..
2. 조금씩 구성하며 테스트해라
/*
* Title: lotto program
*
* Description: 45개의 숫자중 6개의 숫자를 임의로 추출한다.
* 단, 숫자가 중복되면 안된다.
*/
#include <stdio.h>
void manual_input(int *number)
{
}
void partial_generate(int *number)
{
}
void auto_generate(int *number)
{
}
int main()
{
char ans[4];
int number[6];
REQ:
/* 1. 입력을 받을것인지 자동으로 생성할지 묻는다. */
printf("수동/자동/일부만 입력하시겠습니까? (M/A/P): ");
fgets(ans, sizeof(ans), stdin);
switch(ans[0])
{
/* 1-1. 입력을 받을 경우 */
case 'M':
manual_input(number);
break;
/* 1-2. 일부만 입력을 받을 경우 */
case 'P':
partial_generate(number);
break;
/* 1-3. 전부를 임의 생성하는 경우 */
case 'A':
auto_generate(number);
break;
default :
printf("입력을 잘못 하셨습니다. 다시 입력해주세요\n");
goto REQ;
}
/* 2. 결과를 출력한다. */
/* 3. 한번더 실행할지의 여부를 묻는다. */
/* 3-1. 처음의 과정으로 돌아간다. */
/* 3-2. 종료한다. */
}
위의 예에서는 일단 입력 받는 부분을 먼저 구성하고 확인합니다. 물론 어느 정도 숙련이 되어 있는 상태에서는 저런 작은 부분에 대해서는 일일이 테스트 하지 않고 넘어가기도 합니다.. (예를 드는거고 글이 길어지는 관계로 나머지 부분은 패스.. -_-;)
3. 반드시 return value를 체크해라
나중에 어느정도 경력이 되어도 습관이 되지 않으면 힘든 부분 중에 하나가 return 값 체크 하는 걸 까먹어서 어디서 문제가 생기는지 모르는 겁니다.
아래의 코드는 일반적으로 read와 관련되서 error 체크하는 것과 관련하여 많이들 사용하는 예입니다.
if(read(fp, buf, sizeof(buf)) == -1)
{
printf("error occured!!!\n");
exit(1);
}
memcpy(dst, buf, sizeof(buf));
보통의 경우에는 문제가 '안 생길 수도' 있습니다. 하지만 read의 return 값은 0과 1이 아닙니다. 실제로 몇 바이트를 읽었는지를 return 하는거죠.. read 해야 하는 크기가 한번에 읽어들일 수 있는 값의 크기를 벗어났다거나 하는 경우 저 부분의 return 값 확인이 제대로 이루어지지 않게 되어 dst 값에 garbage가 생겨서 왜 이런가 하고 한참 고민하는 일이 벌어질 수도 있는겁니다...
4. 중복되는 코드가 있다면 하나로 묶어라.
이건 코드 관리 측면에서 반드시 필요하다고 생각되는 부분중 하나입니다. 작성한지 얼마 안된 코드라면 모르겠지만.. 한참 시간이 지나고 난 이후에 다시 보게 되는 경우, 혹은 다른 사람이 볼 때에 비슷비슷한 함수가 여러개라던지.. 같은 코드가 계속해서 반복됨으로 인해 코드가 길어지면서 가독성이 떨어지게 되어버리는거죠.. 더 큰 문제는 함수 하나를 고쳤는데 비슷한 함수가 또 있어서 그곳도 수정해야 함에도 불구하고, 하나 수정한 것에서 끝나버리게 되면... 점점 안드로메다로.. -_-;; 다른 사람이 보면 이건.. 하나는 고치고 하나는 왜 안 고쳤지? 하면서 뭔가 이유가 있나? 하고 불필요한 시간 낭비를 하기 쉽상이죠.. ;;
뭐.. 주저리주저리 평소에 가지고 있던 생각들을 대충 끄적이긴 했는데.. 처음 프로그래밍 할 때에는 막막한게 사실입니다.. 그렇다고 해서 주위 사람들한테 물어보는 버릇을 들이는건 그다지 좋지 않다고 생각되네요.. 뭐.. 혼자서 끙끙 앓으면서 해결 못하는것도 그닥.. 좋은 버릇은 아닙니다.. 자신의 능력을 파악하는게 가장 먼저 이루어져야 않나.. 그리고 기초를 튼튼하게 하고 가야하지 않나하고.. 산으로 올라가며 급정리 해봅니다. -_-;;
# by | 2009/04/02 12:04 | IT Life | 트랙백 | 덧글(0)








☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]