[잡담] 나는 초급 프로그래머 .
프로그래밍 2007/10/17 19:05 |
며칠 전 친구에게서 강의 부탁을 받았다.
친구가 삼성소프트웨어 멤버쉽 운영자로 있는데, 그 회원들을 대상으로 특강을 해 달라고 했다.
물론 나에게는 좋은 기회이다.
공식적인 자리에서 사람들 앞에서 나의 이야기를 할 수 있는 것도 그렇고
적지 않은 강의료도 나에겐 매우 과분한 것이기도 하다.
학부 3, 4학년 학생들을 대상으로 몇 가지 알려 줄 만한 것들을 정리 하다가
과연 내가 그네들 보다 더 많은 지식이나 경험을 갖고 있고
그들에게 도움되는 이야기를 잘 해 줄 수 있을 지에 대한 의문이 들었다.
자신감이 없는 것일까 ^^;
몇 년 전에 파트타임 개발을 하면서 프로젝트를 같이 하던 친구가 소스를 보여준 적이 있었는데
정확하지는 않지만 대략 다음과 같았다.
코드는 간단하다. 16진수 코드가 들어오면 변경해서 10진수를 반환하는 함수이다.
잘 기억은 안 나지만, 실제로 누군가 이런 코드를 만들었고,
군수 관련 제품의 펌웨어로 포함되어 있다고 했다.
실제인 지 확인은 못 하지만, 이런 류의 어의 없는 코드를 만들어 내는 사람이 많은 것 같다.
물론 대단히 극단적인 예라고 할 수 있다.
그렇다면 다음 것은 어떨까 ?
이건 그 유명한 '조엘 온 소프트웨어(joel on software)'라는 책의 앞 부분에서 읽은 것인데,
C 언어에서 문자열 다루는 방식과 관련된 것이다.
C 에서 문자열은 마지막이 0(zero)으로 끝나는 바이트 배열로 설계 되었다.
문자열 2개를 연결하는 함수이다. 나름 깔끔해 보이는 이 함수에는 문제가 있는데,
자, 심호흡을 하고 집중해서 읽어보자. 뭐가 문제일까 ?
중요한 결함은 문자열의 끝을 알아내는 데는 문자열 길이 만큼 시간이 소요된다는 것이다.
따라서 그와 관련된 모든 연산들은 문자열 길이 만큼 노력을 소모하게 된다.
첫 번째 while 문이 바로 그것이다.
만약 문자열을 잇기 위해 strcat 함수를 계속해서 호출해야 하는 경우라면
쓸 데 없이 많은 시간을 사용하여야 한다.
파스칼에서는 문자열을 설계할 때, 그 길이를 첫 바이트에 기록하도록 하였다.
문자열 길이가 255자로 제한되는 문제가 있기는 하지만
위와 같은 연산에서는 매우 효율적으로 작동할 것이다.
잘 못 된 소프트웨어 작성이나 설계는 여러 사람에게 피해를 주게 된다.
혹시 라도 나의 어설픈 지식으로 인해서 내가 누군가에게 피해를 주고 있지 않을런 지
첫 번째 코드와 같이 그냥 내 지식이 모자라 웃음 거리가 될 수도 있고,
두 번째 경우와 같이 실제적으로 다른 사람의 많은 비용을 앗아갈 수 있는 것이다.
프로그래머로서, 혹은 사회 생활을 하는 사회인으로서
양심적으로(?) 행동하고 항상 조심해야 하는 것이다.
나중에 특강 때 위의 이야기를 해 볼 생각이다 : )
친구가 삼성소프트웨어 멤버쉽 운영자로 있는데, 그 회원들을 대상으로 특강을 해 달라고 했다.
물론 나에게는 좋은 기회이다.
공식적인 자리에서 사람들 앞에서 나의 이야기를 할 수 있는 것도 그렇고
적지 않은 강의료도 나에겐 매우 과분한 것이기도 하다.
학부 3, 4학년 학생들을 대상으로 몇 가지 알려 줄 만한 것들을 정리 하다가
과연 내가 그네들 보다 더 많은 지식이나 경험을 갖고 있고
그들에게 도움되는 이야기를 잘 해 줄 수 있을 지에 대한 의문이 들었다.
자신감이 없는 것일까 ^^;
몇 년 전에 파트타임 개발을 하면서 프로젝트를 같이 하던 친구가 소스를 보여준 적이 있었는데
정확하지는 않지만 대략 다음과 같았다.
int hexaToDecimal(char in)
{
switch(in)
{
case '0' : return 0;
case '1' : return 1;
case '2' : return 2;
// 중략 ...
case 'd' : return 13;
case 'e' : return 14;
case 'f' : return 15;
default : return 0;
}
}
{
switch(in)
{
case '0' : return 0;
case '1' : return 1;
case '2' : return 2;
// 중략 ...
case 'd' : return 13;
case 'e' : return 14;
case 'f' : return 15;
default : return 0;
}
}
코드는 간단하다. 16진수 코드가 들어오면 변경해서 10진수를 반환하는 함수이다.
잘 기억은 안 나지만, 실제로 누군가 이런 코드를 만들었고,
군수 관련 제품의 펌웨어로 포함되어 있다고 했다.
실제인 지 확인은 못 하지만, 이런 류의 어의 없는 코드를 만들어 내는 사람이 많은 것 같다.
물론 대단히 극단적인 예라고 할 수 있다.
그렇다면 다음 것은 어떨까 ?
이건 그 유명한 '조엘 온 소프트웨어(joel on software)'라는 책의 앞 부분에서 읽은 것인데,
C 언어에서 문자열 다루는 방식과 관련된 것이다.
C 에서 문자열은 마지막이 0(zero)으로 끝나는 바이트 배열로 설계 되었다.
void strcat(char* dest, char* src)
{
while(*dest) dest++;
while(*dest++ = *src++);
}
{
while(*dest) dest++;
while(*dest++ = *src++);
}
문자열 2개를 연결하는 함수이다. 나름 깔끔해 보이는 이 함수에는 문제가 있는데,
자, 심호흡을 하고 집중해서 읽어보자. 뭐가 문제일까 ?
중요한 결함은 문자열의 끝을 알아내는 데는 문자열 길이 만큼 시간이 소요된다는 것이다.
따라서 그와 관련된 모든 연산들은 문자열 길이 만큼 노력을 소모하게 된다.
첫 번째 while 문이 바로 그것이다.
만약 문자열을 잇기 위해 strcat 함수를 계속해서 호출해야 하는 경우라면
쓸 데 없이 많은 시간을 사용하여야 한다.
파스칼에서는 문자열을 설계할 때, 그 길이를 첫 바이트에 기록하도록 하였다.
문자열 길이가 255자로 제한되는 문제가 있기는 하지만
위와 같은 연산에서는 매우 효율적으로 작동할 것이다.
잘 못 된 소프트웨어 작성이나 설계는 여러 사람에게 피해를 주게 된다.
혹시 라도 나의 어설픈 지식으로 인해서 내가 누군가에게 피해를 주고 있지 않을런 지
첫 번째 코드와 같이 그냥 내 지식이 모자라 웃음 거리가 될 수도 있고,
두 번째 경우와 같이 실제적으로 다른 사람의 많은 비용을 앗아갈 수 있는 것이다.
프로그래머로서, 혹은 사회 생활을 하는 사회인으로서
양심적으로(?) 행동하고 항상 조심해야 하는 것이다.
나중에 특강 때 위의 이야기를 해 볼 생각이다 : )
댓글을 달아 주세요