소프트웨어는 쌓는 기술입니다


소프트웨어는 쌓는 기술입니다.
바닥에 기초 library를 만들고, 그 위에 상위 layer를 올리고, 그 다음에 application을 쌓는 식입니다. 1~2층짜리 집을 만들려면 기초 공사를 대충 해도 되지만, 그렇게 해서, 5층짜리 건물을 만들 수는 없을 겁니다. 운 좋게 만들더라도, 기초가 부실해서, 버그로 많은 비용을 지불해야 될 거구요.

기초 공사의 노력을 최소화 하는 방법이라면, 상용 혹은 검증된 open source를 사용하는 방법입니다. 5층짜리 engine에 1~2층 짜리 application을 올리는 방법이죠. 하지만, 가끔씩 어떤 이유로 engine을 스스로 만들어야 할 때가 있습니다. 예를 들어, SNMP 나 CORBA engine을 스스로 만드는 경우입니다.

5층짜리 engine을 쌓는 데에는 여러 가지 능력이 필요하지만, 후배를 지켜본 제 경험상, 가장 중요한 것은 한겹 한겹 완벽하게 쌓으려는 '마음자세' 인 것 같습니다. 그리고 이 마음자세는 일을 배우는 초기단계에 형성 되는 것 같고요. 규격은 그만 보고, 빨리 코딩 하라는 선배 아래에서 자란 후배와, 조급해 하지 말고 규격을 100% 이해하고 다음 단계로 넘어가라는 선배 아래에서 자란 후배와는 많은 차이가 있게 됩니다.

저도 항상 후배들에게 충분한 시간을 마련해 주지 못하는 부족한 선배지만, 그 정신만은 알려 줄 수 있을까 하고, 이런 문제를 내곤 합니다.

char *strcpy(char *s1, const char *s2);

string s2를 s1으로 복사하는 function입니다.
공부를 끝낸, 후배에게 물어보는 질문은 이런 것들입니다.

Q. s2가 NULL이면 어떻게 되는가? s1이 NULL이면?
Q. s2나 s1이 -1이면 어떻게 되는가?
Q. s2와 s1이 아래와 같이 겹치면 어떻게 되는가?









Q. 혹은 아래와 같이 겹치면?









Q. 혹시, s1과 s2가 같은 값이면?

(위의 질문들이)
Q. Compiler마다 같은 결과가 나오는가? GCC, VC++, and OS-dependent compilers
Q. Optimization level마다 같은 결과가 나오는가? Alignment option의 영향은? 1/2/4/8
Q. OS마다 같은 결과가 나오는가? Windows XP .. 98, Linux (redhat), Solaris, VxWorks, Nucleus, Spectra
Q. CPU마다 같은 결과가 나오는가? Intel/AMD (32/64), Sparc, PPC860/8270, MIPS, ARM
Q. Endian에 영향을 받지는 않는가? Big/Little endian (MIPS, ARM)
Q. s1 혹은 s2가 Read-only이면? ie. ROM/Flash/CD

적다 보니, 저도 잘 모르겠군요. 공부 좀 해야겠습니다.
결국, 전달하려고 하는 메시지는 간단합니다.
이처럼 쉬워 보이는 interface도 '100% 이해하기'가 얼마나 힘든가를 함께 생각해 보자는 것이죠.


규격, 설계, 코딩, 시험,
이렇게 완벽을 기해서, 한 단계, 한 단계씩 쌓다 보면,
결코 쌓을 수 없을 것 같았던, 높은 건물을 지으며 즐거워하고 있을 겁니다.

그렇겠죠?

by 제임스 | 2007/07/08 23:48 | 메인스토리 | 트랙백 | 핑백(1) | 덧글(15)

트랙백 주소 : http://jamestic.egloos.com/tb/1323983
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at 시지프스...영원한 줄다리기... at 2007/07/18 09:02

... 소프트웨어는 쌓는 기술이다 ... more

Commented by 구라마왕 at 2007/07/09 00:12
정말 그렇네요.. 저렇게 단순한 함수도 100% 이해하기가 참 힘든 것 같아요..
Commented by TayCleed at 2007/07/09 08:22
첫번째 질문 빼고는 죄다 생각해보지 못했던 것들이네요. 반성합니다. ㅠㅠ
Commented by 백승우 at 2007/07/09 09:42
C/C++많이 안써봐서 잘모르겠지만

어쨋든 겹치면 문제가 생길게 뻔하니까
절대로 안곂치게 만드는게
(from주소+문자열길이+1)=>to주소값의 시작위치로 강제로 지정
Commented by 레인블루 at 2007/07/09 10:23
쩝. 쉽지가 않아요..
Commented by object at 2007/07/09 11:53
아 유명한 memcpy의 overlapping 문제군요!
Commented by Paromix at 2007/07/09 13:05
특히 하드웨어에 가까운 프로그래밍을 할 수록 저렇게 깊이있게 이해하는것이 아주 중요한 것 같아요. 재미있는 모험이기두 하구요.^^
Commented by stone at 2007/07/09 13:21
헛! 간만에 quiz를... ㅎㅎㅎ

strcpy는 NULL을 만나면 끝나니까,
Q. s2가 NULL이면 어떻게 되는가? s1이 NULL이면?
--> return 되겠죠 (strcpy가 NULL check 하겠죠).
Q. s2나 s1이 -1이면 어떻게 되는가?
--> 0xffffffff를 access 하는데, invalid address range이면 crash 되거나 먹통이 되겠군요 (혹은, user mode에서 segmentation violation error).
Q. s2와 s1이 아래와 같이 겹치면 어떻게 되는가?
--> 문제가 있군요. 중간에 값도 바뀌고, 끝나는 지점도 바뀌네요. 결과를 알 수 없습니다.
Q. 혹은 아래와 같이 겹치면? Q. 혹시, s1과 s2가 같은 값이면?
--> 이 경우는 별 문제가 없어 보이네요 (from 마지막이 0이기만 하면요)

흠... 그 밑의 내용은 답하기가 쉽지 않네요.
Commented by 제임스 at 2007/07/09 21:45
구라마왕님// 그런것 같죠. 저도 반성하고 있습니다. 하하

TayCleed님// 반성은요. 시각이 약간 바뀐 것 뿐이겠죠. 그것에 제가 후배들에게 원하는 것인 것 같아요.

승우님// Precedence rule을 이해하기 어려워서, 이것을 괄호로 피해가는 것도 좋은 방법 중에 하나죠. Simple does it.
Commented by 제임스 at 2007/07/09 21:45
레인블루님// 10년차 프로그래머를 잡고 물어봐도 같은 답을 할겁니다. 전혀 기죽을 필요 없고요. 단지 시야를 좀 넓게 한다는 의미 정도로만 이해해 주시면 좋겠습니다. 화이팅입니다.

object님// 네, 듣고 보니 그러네요. memcpy에서는 자체적으로 해결이 된다는 차이일 뿐, 같은 맥락이네요. 역시 교수님답게 치밀하심이 돋보입니다. 항상 좋은 글, 잘 읽고 있습니다. object님.

Paromix님// 하하, 언제나 허를 찌르시는… 하드웨어 관련해서, 제가 가장 놀라웠던 것 이야기 해드릴까요? 지하철이 휙~하고 지나가면 1이였던 비트가 0으로 바뀔 수 있다는 사실이죠. 이런 상황에서 뭘 할 수 있을까? 하는 생각을 했다는
Commented by 제임스 at 2007/07/09 21:46
stone님// Quiz너무 좋아하시는 것 아닌가요? 하하 중요한 건 마음자세인데.
숙제를 푸셨으니 채점을 해야죠. ㅎㅎ

틀린 것만 알려드리죠. 두 가지인 것 같습니다..
A. S2가 NULL이면, 대부분의 OS에서 crash합니다.
재미있는 건 VxWorks와 같은 interface에서 * argument에 NULL을 넣으면 crash가 default입니다.
YOU KNOW WHAT YOU ARE DOING. 철학의 산물이죠.
Release때 strcpy를 safe로 바꾸는 것도 좋을 것 같죠?

A. S2가 S1보다 앞에 있는 경우에 (첫 번째 경우죠) copy를 하면서 S2부분의 맨 마지막 NULL을 지워 버리기 때문에 무한히 복사를 하게 됩니다. 그래서, 일반적으로 crash하게 됩니다.
근데, 재미있는 것은 Solaris gcc의 경우에는 strlen를 먼저하고 그만큼 복사를 하기 때문에 crash되지 않습니다. Solaris는 gcc 3.3.2 버전이었고, Linux는 3.2.2 이었습니다.

그 아래 내용은 저도 잘 모릅니다. (역시 저는 교수 체질이 아닙니다)
근데… 포인트는 '마음가짐'입니다.
Commented by stone at 2007/07/10 09:00
하하... 네 압니다.
그래서 이런 글을 올릴까 말까 잠시 고민을 했었죠.
마음가짐에 대해서는 충분히 많은 글이 올라올거라 생각했고,
기술적인 답글도 괜찮겠다 싶어서요.

채점 결과도 인상적이네요. 재미있습니다.
Commented by 저공비행사 at 2007/07/11 22:37
으아, 어렵군요. 깊게 생각하기. 참 힘든 일인듯 합니다.
저야 C/C++에 대해서는 잘 모르지만, 제임스님의 퀴즈를 보니, 참 매력적이다. 라는 생각이 듭니다. 문제를 이해할수 있어야, 문제를 풀수 있고, 문제를 이해하여도 깊게 생각하지 않으면 문제를 풀수가 없고, 문제를 깊게 생각해서 풀어도 언제나 예외는 있다라는 생각이 드니 말이죠. 하하핫.
Commented by 제임스 at 2007/07/12 12:48
샤린님이 왜 이리 반갑죠 ^^ 하하. 건강은 100% 회복 된거죠.
꿈보다 해몽이 좋다는 걸, 이럴 때 사용하는 말 같은데요 ^^
우리나라 교육에서 보완해야 될 것 중에 하나가, '세상에는 이미 답이 존재한다'는 기본 생각인 것 같아요. 세상일은 대부분의 경우 정답이 없는 것이 정상인데, 학교에서는 늘 정답만 알려주니 ^^
설계의 시작은 수많은 질문과 생각의 확장으로 시작되고, 설계의 마무리는 생각을 가지 치면서 단순한 결과만이 남는 것 같아요. 결국 쉽게 갈 수 있는데, 어렵게 가는거죠.^^ 위의 질문도 거의 그런 수준에 해당하는 생각의 확장인 것 같아요. (뭔소리죠 ㅎㅎ)
Commented by Hani at 2007/07/12 21:40
알고 있다고 믿었던 것들이 사실은 잘 알지 못하는 것일 때가 많죠.
그런 사실을 깨닫게 해주는 문제네요. 좋은 생각거리 감사드립니다.
Commented by 제임스 at 2007/07/13 12:53
하하 네. 좀 덥기는 해도 맑은 날씨가 기분을 좋게 만드네요.
이런 날은 일 그만하고, 바닷가로 떠나는 것도 좋을 것 같다는... ^^

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶