본문 바로가기
IT 공부/이런 저런 생각들..

유연하고 기민하게 공부하기

by exdus3156 2023. 12. 27.

공학은 자연과학이 아니다. 

이 말을 어디선가 들은 적이 있는데, 요즘 들어 조금 와닿기 시작했다.

난 성격 상 무언가를 명확하게 정의하고 분류하는 것을 선호하는지라 불분명하고 경계가 흐릿한 개념들을 잘 받아들이지 못한다.

처음엔 공부하기 좋은 성격이라 생각했는데, 이제보니 개발 공부에 있어서는 단점인 것 같다는 생각이 든다.

예를 들어, 운영체제 공부를 할 때 프로세스(process)와 스레드(thread)를 공부하게 되는데, 이 둘은 엄밀히 구분되는 개념이고, 이 둘의 차이점에 대해 면접에서도 자주 질문이 들어온다고 들었다.

하지만 깊이 파고들다보면 결국 이 개념을 각각의 운영체제가 어떻게 구현하는지 들여다봐야 하는 순간이 오는데, 이게 의외로 OS마다 접근과 구현이 미묘하게 차이가 난다.

리눅스의 경우 프로세스와 스레드 간 구분이 불명확한 편이고, 리누스 토르발즈는 프로세스와 스레드의 차이에 대해 다음과 같이 말했다.

"프로세스와 스레드를 별개의 것으로 구분할 이유가 없다. (중략..) 프로세스와 스레드는 그냥 "실행 문맥"일 뿐이다."

 

결국 학부 전공 시험을 볼 때, 자격증을 딸 때, 혹은 면접에서 엄밀하게 구분하기를 원할 때는 공부를 치열하게 하는 것이 맞지만, 한편으로는 컴퓨터 과학의 많은 개념들이 현실에서 이리저리 충돌하면서 다듬어진 인공적인 개념이라고 생각하는 것도 중요한 것 같다.

공학은 자연과학이 아니라는 말은 공학적 개념에 대해 자연과학의 현상을 다루는 것 마냥 엄밀하게 정의하려고 시도하는 것이 (틀린 것은 아니지만) 현실적으로 실용이 없다는 뜻이라고 생각한다.

개념을 공부하지 말라는 말이 아니라, 자연과학과는 달리 소프트웨어 공학 개념은 인간이 만들어낸 컴퓨터를 다루기 위한 인공적이고 추상적인 개념에 불과하니, 현실의 상황에 따라 개념의 적용이 유연하게 변경될 수 있음을 알아야 한다는 뜻이다. 특히 소프트(soft)웨어는 더더욱 부드럽고 유연하게 변경되기 십상이다.

 

프로세스와 스레드의 경우도, 프로세스와 스레드는 분명한 개념적 차이가 존재하고 이 본질적 차이를 구분하는 것은 필수적이지만, "프로세스는 무조건 ~~한 의미이고, 스레드는 무조건 ~~한 개념이다!!" 라고 확정짓는 대신, 필요한 상황에서 특정 기계나 소프트웨어가 이 둘을 어떻게 구분하고 사용하는지 알 정도면 충분할 것이다.

윈도우즈 프로그램을 만들 때 프로세스와 스레드를 다루는 방식을 보면서 이해할 정도면 충분하고, 리눅스를 다룰 때 리눅스가 프로세스와 스레드 개념을 다루는 방식을 보면서 그 차이를 이해하고 사용할 수 있는 정도면 될 것이다.

즉, 어떻게 동작하는지 이해할 수 있을 정도로 공부만 해두고, 나머지는 현실 속의 소프트웨어와 이리저리 충돌해보면서 그때가 되면 기계 레벨에서의 작동 방식을 이해하고 사용할 수 있는 것이 좋지 않을까?

공학이 자연과학이 아닌 만큼, 그것을 공부하는 태도도 이것을 자연과학이나 수학, 철학이라고 여기고 개념의 엄밀한 구분과 정의에 집착하지 말고 적당한 수준에서 유연하고 기민하게 대응해나가는 것이 좋을 것 같다는 생각이 든다.