오늘은 컴퓨터 구조에 대해 본격적으로 알아보는 시간을 가지기 전, 컴퓨터 구조를 왜 알아야 하는지부터에 대해 알아보는 시간을 가져보자. 해당 포스팅에서는 어려운 내용에 대해선 다루지 않을 예정이므로, 편한 마음으로 읽어주었으면 한다.
처음 프로그래밍을 배우면 무엇부터 배울까?
처음 개발을 배우게 된다면 우리는 무엇부터 배울까? 보통은 "프로그래밍 언어의 문법부터 학습한다"라는 대답이 나올 것이다. 왜냐면 프로그래밍을 한다는 것은 코드를 적는 것이다. 그렇다면 개발자는 당연히 코드만 잘 작성하면 되는 거 아닌가?라는 생각을 하기 때문이다. 따라서 컴퓨터 구조를 굳이 왜 알아야 할까?라는 생각을 가질 수도 있다.
하지만 좋은 개발자가 되기 위해서는 프로그래밍 실력과 컴퓨터의 근간을 알아야 한다고 필자는 생각한다. 여기서 필자가 말하는 컴퓨터의 근간이라고 하면 컴퓨터 구조, 운영체제와 같은 것들을 의미한다.
컴퓨터 구조를 알아야 하는 이유 2가지
따라서 필자가 생각하는 컴퓨터 구조를 알아야 하는 가장 큰 이유 2가지는 다음과 같다고 생각한다.
문제 해결 능력
성능,용량, 비용을 고려한 개발이 가능
문제 해결 능력
미지의 대상에서 분석의 대상으로
우리가 학교에서나 학원에서 혹은 어떠한 단체에서 프로그래밍을 한 번이라도 배워본 경험이 있다면 한 번쯤 이런 경험을 해본 적이 있을 것이다. 분명히 선생님께서 적으시는 코드를 따라 적었을 뿐인데 "왜 내 코드는 동작을 안 하지?" 혹은 이러한 학생을 본 적이 있을 것이다.
현재 현업 개발자라면 경험하고 싶지 않은 경험도 있을 수도 있다. 내가 개발한 환경에서는 분명히 아무런 문제 없이 잘 동작하던 코드가 실제로 사용자들한테 릴리즈를 했는데 동작이 안 되는 경우도 있을 수도 있다.
그럼 누구나 생각할 것이다. 이런 경우엔 프로그래밍 언어의 문법상 오류는 절대 아니다 .분명 프로그래밍 언어 외의 개발 환경 같은 것이 문제가 되겠지만 여기서 해결법을 찾지 못하는 사람들이 있을 수 있고, "왜 안 되는 거지?"라는 질문과 함께 컴퓨터를 분석하는 사람들이 있다.
"코드를 분명히 맞게 입력했는데 왜 안되지?" 하고 여기서 손을 놓아버리는 사람들의 경우는 필자 개인적인 생각으로 컴퓨터 자체를 미지의 대상으로 인식하거나 거부감이 있어서라고 생각한다. 반대로 개발 환경이나 컴퓨터 내부를 들여다보는 사람들은 컴퓨터를 미지의 대상이 아니라 분석의 대상으로 생각한다.
성능, 용량, 비용
다음으로는 성능, 용량, 비용에 관한 것이다. 컴퓨터 구조를 학습하게 될 경우 이 3가지를 고려한 프로그래밍을 할 수 있게 된다. 성능, 용량, 비용을 전혀 고려하지 않은 프로그래밍은 개발자로서의 자질이 부족하다고 생각한다. 하지만 프로그래밍을 배울 때 이 3가지를 간과하고 넘어가는 경우가 있다. 기본적인 컴퓨터 지식을 바탕으로 프로그래밍을 배우는 것과 무작정 프로그래밍을 배우기 시작하는 것에는 큰 차이가 있다고 생각한다.
실제로 우리가 흔히 아는 빅테크 기업(메타, 아마존, 애플, 구글 등)에서 성능, 용량, 비용을 고려하지 않고 프로그래밍을 하는 곳은 단언컨대 단 한곳도 없다고 봐도 무방하다.
그럼 왜 이 3가지가 중요한지 한 가지 예를 들어 설명해보겠다. 우리가 웹 사이트를 개발해야 한다고 한 번 해보자. 우리가 만드는 웹 사이트 또한 컴퓨터가 실행해야 하는 프로그램이기 때문에 이 프로그램을 사용자들에게 제공하려면 서버 컴퓨터가 필요하다.
서버 컴퓨터를 지금 인터넷에 검색해보아도 가격, 성능별로 천차만별일 텐데 이럴 때 과연 어떤 걸 골라야 할까? 만약 무조건 저렴한 컴퓨터를 고른다면 우리가 만든 웹 사이트의 성능을 컴퓨터가 따라가지 못할 경우가 발생할 수 있고 그렇다고 무조건 좋은 컴퓨터를 고르기엔 100만원으로도 충분히 해결할 수 있는 서비스를 200만원을 주고 서비스하는 경우가 발생할 수 있다.
그렇기 때문에 현재 우리가 개발한 코드가 어느정도의 성능을 요구하는지 개발자 스스로 판단할 수 있어야 한다. 클라우드서비스를 이용한다고 하더라도, 어떤 종류의 CPU, 메모리, 저장 용량을 선택하지를 개발자가 직접 선택해야 하기 때문에 스스로 판단할 수 있는 능력이 필요하다.
따라서 컴퓨터 구조를 잘 이해하고 있다면 프로그래밍 언어의 문법만으로는 해결하기 어려운 문제들을 해결하면서 또는 고려하면서 개발을 할 수 있다.