[ 프로젝트 BEP ] 최종장 - 엔지니어로서의 마인드셋에 대해 : 우수한 엔지니어는 누구이고, 가져야할 마인드 셋에 대해

이미지
  들어가면서 이제 2025년도 얼마 남지 않은듯 하다.  조금 길어질 수도 있기 때문에  실제로 업로드 하는 것은 새해 이후가 될 가능성도 있으나  올해는 이 글로 마무리 해보려고 한다. 이제 이 최종장을 끝으로 이 프로젝트를 다소 마무리 할 수 있을 것 같다. 물론 전체적으로 글 자체가 부족한 부분이 여려 곳 보이지만,  이는 천천히 개선하기로 하고 일단 마무리를 잘 지어보려고 한다. 이 프로젝트의 목표는 어디까지나 주니어 엔지니어(넓은 범위로서)에게  도움이 될 수 있는 부분을 정리해 놓은 것 이며, 이를 전달하는 것에 주력을 했다. 정확히는 그 사이에 몇 번이나 직장은 바뀌었지만,  내가 다니고 있는 회사에서 작게는 멘터,  크게는 주니어 교육에 활용하기 위한 초안이였다. 들어가기 앞서서 먼저 개발자는 무엇인가에서 부터 시작해서,  수학은 필요한가, 그리고 학위에 대한 이야기를 나누어보았고, 그 다음으로 컴퓨터가 무엇인가에 대해서는,  가장 첫 장인 컴퓨터 개론에서 메모리 손실과 함께 설명하였다. 다음으로는 개발 방법론과 시스템 설계,  그리고 프로그래밍 언어에 대한 이야기로 간단하고 이론적인 이야기를 하였다. 눈치가 빠른 사람은 알 수 있듯이,  현실에서 가질 수 있는 몇 가지 의문으로 시작해서  컴퓨터라는 하드웨어 부터 시작해서,  프로젝트(개발 방법론), 설계, 프로그래밍 언어 순으로  일부러 점점 컴퓨터 세계로 들어가도록 구성을 해 놓았다. 여기서 한 걸음 더 나아가자면, 알고리즘이 들어갈 수는 있겠으나  어디까지나 가볍게 전달하는대에 목적이 있기도 하고,  개인적으로는 당장은 크게 중요하지 않은 부분이 라고 생각 했기 때문이다. 먼저 이 부분에 대해서 좀 더 자세히 이야기해보도록 하자. 시작 부터 모든 지식을 쌓을 수는 없다 이는 개발 영역에서만 해당되는 이야기는 아니지만,  모든 것에는...

[ 프로젝트 BEP ] 제 1장 : 컴퓨터 개론 - 컴퓨터 아키텍처에 대해


이번 글에서는 컴퓨터 아키텍처에 대해 이야기 할 것이다.

현재에 와서는 여러가지의 컴퓨터 아키텍처가
언급될 수 있으나,
소프트웨어 개발자로서,
그 중 비전공자 주니어에게 알아야 하는 것은
폰 노이만 구조 만 알면 된다고 생각한다.

왜냐하면,
지금 존재하고 있는 컴퓨터 기기들은 모두 이런
폰 노이만 구조에 크게 벗어나지 않았다고 봐도 무방하기 때문이다.

따라서 일단 폰 노이만 구조에 대해 대략적으로 이해하기만 한다면,
다른 컴퓨터 아키텍처에 대한 것은
필요할때 마다 공부하면 된다.

이는 사실 Programmer라던가 Developer등의
다음 레벨의 개발자들에게도 마찬가지라 나는 생각하고 있다.

따라서 이번 글에서 이야기하고자 하는 것은
폰 노이만 구조 단 하나의 컴퓨터 아키텍처만 설명할 것이다.

그럼 이에 대한 이야기를 시작해보자.

폰 노이만에 대해


소프트웨어던 하드웨어던,
우리가 개발자로서 일을 할수 있는 것은
사실 이런 폰 노이만 구조와 같은 이론을
제시한 사람들이 있기 때문이다.

따라서 우리는 개발자로서 초기 컴퓨터 구조를 제시해준
폰 노이만과 그의 동료들에게
머가리를 천번 박아도 모자를 지도 모르겠다.

어쨋든 폰 노이만은 천재로서 세상에 알려져 있다.

그의 업적을 보면,
그 누구도 이에 동의하지 않는 사람은 없을 것이다.

폰 노이만은 아래와 같이 생겼다.

폰 노이만
하지만 이런 의문이 든다.

폰 노이만이 분명 천재이고,
그가 위대한 업적을 남긴것에 깊이 공감하며,
그 업적에 대해서는 찬사를 보내는 바이지만,
소프트웨어 개발자로서 그를 자세히 알 필요가 있을까?

나는 없다고 생각하기 때문에
딱히 언급하지는 않겠다.

하지만, 컴퓨터를 제외하고도 수학 등의 업적을 남긴 사람이기 때문에
어떻게 생긴 사람인지는 알아야 되며,
폰 노이만은 충분히 그럴 자격이 있는 사람이다.

혹시 알고 싶은 사람을 위해서 아래 위키백과의 링크를 남긴다.
(https://en.wikipedia.org/wiki/John_von_Neumann)

폰 노이만 구조에 대해


실제 우리들이 쓰고 있는 컴퓨터 시스템들이
이런 아키텍처로 이루어져 있기 때문에

앞서 우리는
이 폰 노이만 구조를 세상에 제시해준
폰 노이만와 그의 동료들에게 깊은 찬사를 보냈다.

또한 이 자리를 빌어
다시 한번 그에게 찬사를 보내는 바이다.

이 쯤하면 그도 충분히 만족하리라 생각된다.

그럼 이제 우리의 목표인 폰 노이만 구조를 살펴보자.



위와 같은 아키텍처를 폰 노이만 구조(Von Neumann architecture)라고 한다.

물론 이 아키텍처는 폰 노이만과 그의 동료들이
에드박(EDVAC) 보고서의 최초 초안(First Draft of a Report on the EDVAC)에서
서술된 기반으로 만들어진 아키텍처이다.

따라서 사실 폰 노이만이 혼자서 제시한 아키텍처는 아니며,
에드박의 보고서에는 수학적 논증만이 있을 뿐
위와 같은 아키텍처를 실제로 그들이 제시한 것은 아니라고 한다.

어쨋든 나는 현재(2020년)의 컴퓨터 아키텍처와
폰 노이만 아키텍처를 구분하여, 분류 할 것이다.

보기 쉽게 일단 색으로 표시해놨다.

분류는 다음과 같이 하였다.

제어 장치, 산술장치 → CPU(중앙처리장치)
메모리 → RAM, Cache, HDD(SSD)
누산기와 입력, 출력 → 프로그램(소프트웨어)

누산기와 입력, 출력에 대해 조금 오해의 소지가 있을 수 있어서
따로 언급하지만,

산술 장치 안에 있는 누산기는 물론 하드웨어로 구성되어 있다.

하지만, 좀 더 소프트웨어에 대한 이해를 돕기 위해
이런 누산기를 따로 빼서 이를 프로그램으로 취급하겠다.
물론 이를 좀 더 작은 개념에서 함수클래스와 같은 것으로 생각해도 무방하다.

그럼 분류를 하였으니 각각 살펴보자.

① 제어 장치, 산술 장치 → CPU(중앙처리장치)

이런 제어 장치와 산술 장치가 합쳐진 것이
현재 컴퓨터의 CPU라고 봐도 무방할 것이다.


따라서 우리는 위의 폰 노이만 아키텍처를 현실의 하드웨어에 대입해보면

AMD사의 RYZEN

위와 같은 AMD사의 RYZEN이라는 모델명의 CPU라고 할 수 있을 것이다.

이런 CPU에서 하는 일은 간단하다.
우리가 컴퓨터를 사용할때의 모든 명령과 계산은 이 CPU를 거친다.

우리는 컴퓨터를 부팅하면 운영체제로 진입할 탠데,
이런 운영체제와 그 운영체제 안에서 이루어지는 대부분의 명령 및 연산은
CPU에서 이루어진다.

② 메모리 → RAM, Cache, HDD(SSD)

폰 노이만 구조에서의 메모리는 모든 저장장치를 말한다.



현재 많은 사람들이 메모리라고 인식하는 것은
아마 RAM일 것이다.
RAM

하지만, 폰 노이만 구조에서의 메모리는 모든 저장장치이기 때문에
하드 디스크라고 불리우는 HDD와 SSD도 포함되며,
Cache도 마찬가지다.

Hard Disk Drive(HDD)

Soild State Drive(SSD)
Cache
심지어 Cache의 경우는 중앙처리장치인 CPU에서도 활용된다.

③ 누산기와 입력 출력 → 프로그램(소프트웨어)

다시 한번 말하지만,
설명의 편의를 위해 소프트웨어 취급 하는 것이다.


이런 소프트웨어는 크게 운영체제나

MS사의 Windows 운영체제

게임


Blizzard사의 WOW

등의 소프트웨어가 포함될 수 있으며,
작게는 단 하나의 함수와 같은 모듈도 포함된다.

그리고 이런 아키텍처의 부품들(물론 소프트웨어는 제외)은 Mother Borad라는
메인보드에 모두 장착되어져,

Mother Board(메인보드)

폰 노이만 구조 기반의
하나의 컴퓨터로서 기능을 하게 된다.

현대의 컴퓨터 기기라고 불리우는 것은
모두 이런 기반으로 만들어져있다고 해도 과언이 아니다.

현실에서 우리가 자주 볼수 있는 기기들인
데스크톱 컴퓨터, 노트북 컴퓨터와

데스크톱

노트북

그리고 최근에 패러다임인 모바일 컴퓨터의 대표 기기인

스마트폰
스마트폰까지 속 내부를 들여다보면
대개 이런 폰 노이만 구조에 크게 벗어나지 않는다.

이에 따라 우리는 폰 노이만 구조를 조금 더 확장 할 수 있다.

폰 노이만 구조의 확장

위와 같은 그림으로 확장 할 수 있으며,
소프트웨어 개발자로서 신경써야 할 부분은
보라색 박스 부분 뿐이다.

따라서 컴퓨터 개론에서 추출 할 수 있는
소프트웨어 개발자로서의 학사적 지식인 '부분적 진리'는
보라색 박스에 있다고 조심스럽게 결론지을 수 있다.

하지만, 나의 이런 논지에
어떤 사람들은 '나머지도 알고 가면 좋지 않느냐'라는 식으로
반박할지는 모르겠다.

물론 알고 가면 좋을 수 도 있다.

왜냐하면 그런 사람들은
'언젠가는 도움이 될것이다' 라는식의 논지이며,
나도 '언젠가'는 도움이 될지는 모르겠다는 의견에는 동의한다.

하지만 그 '언젠가'가 정확히 언제인지,
어느 시점인지는
그런 이야기를 하는 사람들은 모르는 척 한다.

만약 당신이 미래의 임베디드 개발자나 하드웨어 개발자로
전직한다는 계획을 가지고 있다면,
얼마나 도움이 될지는 알 수 없으나,
알고 있는 것도 괜찮을 것이라 생각한다.

하지만 그렇다고 하더라도
지금 당장 우리는 소프트웨어 개발자로서 일해야 하며,
소프트웨어 개발자로서 알아야 할 
컴퓨터 개론의 학사적 지식은 저 부분 뿐이다.

또한 설사 임베디드 개발자나 하드웨어 개발자로 전직하더라도
그 때가서 공부해도 충분히 늦지 않다.

흔히 듣는 이야기겠지만
선택과 집중을 할 필요가 있다.

어떤 사람들에게는 매우 불행한 이야기 일지는 모르겠지만
개발자는 평생 공부하는 직업이다.

자신의 가치를 증명하기 위해서
패러다임의 변화라는 큰 파도에 같이 올라 타야만
오래 살아남을 수 있다.

대게 저런 식으로 반박하는 사람들은
공부는 학생때 하고 끝이라는 생각을 가지고 있기 때문에
필요 없을지도 모르는 지식들 까지 모두 배우고
고찰과 성찰 없이 지식 만을 머리에 쑤셔 넣으려고 한다.

물론 이런 나의 이런 이야기에 그들은 손사래를 치며
그렇지 않다고 말할지는 모르겠다.

단 한번에 이해의 영역에 도달하기는 매우 힘들다.

물론 어떠한 사람들은 '난 됐는데'라며 이야기 할지는 모르겠으나

내가 됐기 때문에 다른 사람들도 될 것이라는 생각에서 
이제는 벗어날 필요가 있다.

이전과 다르게 이미 사회가 고도화 되었고 
이에 따라 고도로 분업화 되었기 때문에 
내가 할 수 있는 것을 다른 사람들은 못할 수 있다.

만약 그러한 생각이 아니라
단순히 상대를 업신여겨서 자신의 비열함을 만족시키기 위해서 라면
내가 이에 대해서 더 이상 말할 필요는 없을 것 같다.

하지만 정말로 그렇지 않다면
그런 것 들은 필요할 때 마다 탐구라는 이름의 공부하면 되는 것이다.

따라서 소프트웨어 개발자로서 일하고 싶은 우리들은
하드웨어 지식까지 알 필요는 없다고 나는 생각하고 있다.

하지만 그럼에도 더 알고 싶은 사람들은 따로 공부하면 된다.

탐구라는 이름의 공부를 해야하는 
적절한 시기는 있을지도 모르겠지만
해야만하는 시기는 존재 하지 않는다.

시중에 학문적인 컴퓨터 개론의 교과서가 많으며
거기에는 그런 사람들을 만족시킬 수 있는 지식들이 많을 것이다.

선택은 각자의 몫이다.

어쨋든 이런 폰 노이만 구조로 인해 확장된 것이
아래와 같은 아키텍쳐 구조이다.

폰 노이만 구조 기반의 현재 컴퓨터 아키텍처

혼란을 피하기 위해
폰 노이만 구조의 색을 그대로 가져왔다.

위에서 언급했던 것과 동일하게 아래와 같이 분류하겠다

제어 장치, 산술장치 → CPU(중앙처리장치)
메모리 → RAM, Cache 등
그외의 디바이스(저장 장치 등) → HDD, SSD , USB Drive ,CD Drive 등  

여기까지 해서 컴퓨터 아키텍처에 대한 이야기는 끝이다.
아키텍처에 대한 이야기는 끝났지만,

이런 아키텍처에 큰 단점이 있는데,
이는 우리 소프트웨어 개발자들에게도 매우 관련있는 이야기이다.





참고 -

폰 노이만 구조 :
https://ko.wikipedia.org/wiki/%ED%8F%B0_%EB%85%B8%EC%9D%B4%EB%A7%8C_%EA%B5%AC%EC%A1%B0

RAM 속도에 관해 :
https://www.howtogeek.com/438671/why-you-should-overclock-your-ram-its-easy/

CPU 속도에 관해 :
https://www.howtogeek.com/177790/why-you-cant-use-cpu-clock-speed-to-compare-computer-performance/

Cache Memory에 관해:
https://searchstorage.techtarget.com/definition/cache-memory




이 블로그의 인기 게시물

[ Web ] 웹 애플리케이션 아키텍처 (Web Application Architecture)

[ Web ] 서버 사이드(Sever Side) ? 클라이언트 사이드(Client Side)? 1 [서론, 클라이언트 사이드(Client Side)]

[ Web ] 웹 애플리케이션 서버 아키텍처의 정의 및 유형 ( Define and Types of Web Application Server Architecture )