제가 주로 프로그래밍하던 서버는 Ubuntu였습니다. Computer Network의 Server-Client에 관한 코드를 작성했고 프로그램을 만들었습니다. 이제 다른 IP를 가진 호스트와도 작동을 하는지 확인하기 위해 CentOS로 동작하는 서버에 이전에 만들었던 C코드를 scp로 가져와서 컴파일을 시도했습니다.
그런데 이게 웬걸? 에러가 와장창창 나는 겁니다. 이게 OS 문제라고 인식하기까지는 시간이 좀 걸렸기에 에러가 막 나왔을 때는 너무 황당했습니다. 똑같은 코드인데 여기서는 컴파일이 안되는게 말이 돼? 이건 억까야;;
아무튼 왜 이런 문제가 발생했을까 고민해봤을 때 OS문제 밖에 없다고 판단했습니다. 제 뇌피셜이긴하지만, 들어보십쇼.
각 OS는 지원하는 정책이 다릅니다. 가벼운 예시로 어떤 OS는 Bufferoverflow를 매우 강력하게 제재하는 반면, 어떤 OS는 Bufferoverflow를 warning으로 처리하고 버퍼 너머의 값에 접근하려고하면 가장 가까운 값까지만 머물도록 처리하는 정책을 택해서 프로그램이 돌아가게끔하는 OS도 있을 것입니다. 이처럼, 각 OS는 지원하는 정책이 다르기 때문에 Ubuntu에서 정상 작동하던 코드라도 CentOS에서는 OS 정책상 안되는 코드일 수 있다는 것입니다.
그런데 왜 이 글의 제목이 컴파일을 많이 하지마라인가? 물으신다면, 결국 컴파일 후 발생하는 에러를 보고 고치는 횟수가 많아지면 많아질수록 OS-specialized code가 될 것이기 때문입니다. 그 Code는 보편적으로 작동하는 코드가 아닌 특정 어느 OS에서만 동작하는 코드가 될 수 있습니다.
그럼 해결책은 무엇이냐? 내 머리로 처음부터 끝까지 짜는 겁니다. 이게 말이 되냐구요? 컴공생인데 해야죠. 아니 적어도 모듈 단위는 스스로 완성시켜야죠.
앞으로의 프로그래밍의 방향성은 최대한 컴파일 횟수를 줄이는 쪽으로 가려고합니다. 컴파일 할 때는 모듈 단위의 코드를 완성시켰을 때, 그 때 컴파일 할 수 있게 하겠습니다. 그렇다고 너무 컴파일 안해버리면 Human-complexity가 기하급수적으로 상승할 수 있기 때문입니다.