-
Notifications
You must be signed in to change notification settings - Fork 0
[ISSU] Computer Science Contents
IT학회 일원인 여러분이 컴퓨터에 대해서 많이들 알고 계실 내용이라고 생각하지만, 간단히 내용을 정리해봤습니다.
1. 튜링 머신과 계산기로서의 컴퓨터
컴퓨터의 어원은 Compute, 즉 계산기에서 출발합니다. 오늘날 컴퓨터를 이론적으로 구상했던 사람은 수학자 '앨런 튜링'으로, 당시 수학적 난제를 증명하기 위해 상상의 기계를 가정하고 논문을 썼는데요. 그 기계를 '튜링 머신'이라고 부르고, 오늘날 컴퓨터의 이론적인 조상입니다. 튜링이 이런 기계를 상상했던 이유는 지식과 정보처리의 과정을 수학적으로 표현하기 위해서였습니다. 이 기계는 매우 단순한 연산만을 반복해서 복잡한 계산을 처리할 수 있었습니다. 어느 정도로 단순하냐면, 0과 1만 가지고도 온갖 계산을 수행할 수 있는데요. 우리는 On-OFF를 0과 1로 표현하는 스위치를 모아서 이런 컴퓨터를 만들 수 있을 정도입니다.
이 '스위치' 컴퓨터는 세계 2차 대전 시기 전쟁과 함께 본격적으로 발전했습니다. 당시의 컴퓨터는 핵무기를 만들던 과학자들이 귀찮은 계산을 자동으로 처리하기 위해 사용됐습니다. 이때의 컴퓨터는 '스위치'를 진공관으로 구현했는데요. 때문에 엄청난 무게를 자랑했습니다. 뿐만 아니라, 계산을 위해서는 이 스위치를 일일이 손으로 조정해줘야만 한다는 번거로움이 있었습니다.
이러한 방식을 개선하고자 불세출의 천재 폰 노이만이 '프로그램 내장 방식의 컴퓨터'를 제안합니다. 이 컴퓨터는 CPU와 메모리를 분리합니다. 회로를 직접 조절해서 바꿀 필요 없이, 계산할 값과 계산 방식에 대한 정보를 전부를 모아 프로그램으로 미리 만들어놓고, 메모리에 넣은 다음에 CPU가 이를 읽고 실행하는 방식입니다. 어떤 '스위치를 끌지 켤지' 자체에 대한 정보를 하나의 프로그램으로 만든다는 것인데요. 이러면 필요한 계산에 따른 프로그램을 교체해주는 것 만으로 다양한 기능을 수행할 수 있습니다. 이 프로그램을 오늘날에는 소프트웨어라고 부릅니다.
더해서 진공관 스위치는 너무 컸기 때문에, 반도체 트랜지스터와 전자 회로로 금방 교체되고 마는데요. 전자를 통제하는 트랜지스터와, 폰 노이만 구조를 채택한 '스위치' 컴퓨터가 등장한 이후, 오늘날의 컴퓨터는 대부분 이러한 방식을 따르게 됩니다. 이 컴퓨터는 앨런 튜링이 최초로 상상한 기계의 원리를 전부 구현하고 있습니다.
다만 여전히 문제가 남아있었는데요. 당시의 컴퓨터는 오늘날의 PC와 달리 국가 기관 정도나 보유할 수 있는 고급 장비였습니다. 그래서 각 기관별로 기계를 개발해놓고, 기계를 제어하는 프로그램(소프트웨어)의 구조나 명령어가 제각각이었습니다. 컴퓨터 기계가 알아들을 수 있는 언어를 저급 언어(low-level language)라고 하는데요. 이 저급 언어 프로그램이 난립해서, A라는 기관에서 저급언어로 만든 프로그램이 B기관의 컴퓨터에는 무용지물이 되는 상황이었습니다.
저급 언어에 대한 통일된 기준과, 그러한 저급 언어를 통제하며 다른 컴퓨터로 이식될 수 있는 프로그램이 절실한 상황이었습니다. 이러한 상황에서 등장한 것이 C언어입니다. C언어는 사람이 알아들을 수 있는 '절차 지향형 프로그래밍 언어'이면서도, 컴퓨터 기계를 통제하는 언어입니다. 때문에 컴퓨터가 정보를 처리하는 방식에 아주 가깝다는 특징이 있습니다.
C언어가 개발된 이후, C언어로 만들어진 프로그램들은 여러 컴퓨터로 이식될 수 있었습니다. 이제 컴퓨터 세계는 기계에서 벗어나, 독자적인 소프트웨어의 발전을 꿈꿀 수 있게 됐습니다.
그렇지만 근본은 여전합니다. 튜링이 상상했던 '자동화된 계산을 수행하여 지식과 정보를 처리하는 기계'가 이제 좀 그럴듯한 형태로 현실에서 구현됐을 뿐입니다. 여전히 이 기계는 '지식과 정보를 처리하기' 위해 더 효율적으로 동작해야 하겠습니다.
2. 운영체제의 등장과 응용 프로그램의 활성화
C언어로 만든 프로그램만으로 컴퓨터를 사용한다고 상상하면, 여전히 컴퓨터는 진입장벽이 너무 높은 기계일 것입니다. 오늘날의 PC는 우리가 컴퓨터를 쉽게 제어할 수 있도록 설계됐는데요. 터치나 클릭만으로 프로그램을 실행할 수 있습니다.
이러한 일을 가능케 하는 것은 운영체제입니다. 운영체제란 사용자가 컴퓨터를 더 편하게 사용할 수 있도록, 컴퓨터 하드웨어를 밑에서 통제하고 입출력을 통제하는 소프트웨어입니다. 초기의 운영체제는 CLI(Command-line interface)라는 명령어 입력 방식을 사용했는데요. 이후 직관적이고 편리한 운영체제가 등장해 PC 시장을 차지하기 위한 전쟁이 펼쳐지기도 했습니다. 가장 유명한 것은 과거 스티브 잡스가 있던 애플의 '맥킨토시'와 마이크로소프트의 '윈도우즈'의 대결일 것입니다.
오늘날의 PC 시장은 대부분 마이크로소프트의 윈도우즈 운영체제가 점령하고 있으나...이외에도 컴퓨터의 목적에 따른 매우 다양한 운영체제가 있습니다. 컴퓨터는 '지식과 정보'를 처리하는 기계라는 점을 상기하시면, PC외에도 다양한 형태의 컴퓨터가 있음을 유추하실 수 있을겁니다. 동전을 인식하고 버튼을 누르면 음료를 주는 자판기, 버튼을 누르면 신호를 인지하고 냉난방을 조절하는 에어컨 등에도 운영체제가 있습니다. 이들을 '임베디드 운영체제'라고 부릅니다. 이외에도 서버 정보를 관리하고 처리하는 컴퓨터에는 '리눅스'라는 운영체제가 압도적으로 점유하고 있습니다. 사실 안드로이드 스마트폰에 사용되는 운영체제도 이 리눅스 기반입니다.
운영체제의 발전과 PC의 보급으로, 운영체제의 도움을 받아 우리는 다양한 응용프로그램을 만들 수 있게 됐습니다. 응용 프로그램이란 운영체제 위에서 동작하는, 운영체제와는 구별된 모든 프로그램을 말합니다. 컴퓨터 하드웨어를 통제하기 위해 C언어와 운영체제가 개발된 것처럼, 응용프로그램이 이 운영체제를 통제하기 위해서도 수많은 프로그래밍 언어들이 등장하고 유행하며 쇠퇴하는 것이 현재의 상황입니다. 우리가 들어본 언어인 자바, 파이썬 등은 바로 이러한 배경에서 사용되는 언어입니다.
그리고 그 중에서도, 오늘날 기준 가장 유행하는 언어를 셋 뽑으라면, 자바와 파이썬, 그리고 자바스크립트입니다. 그렇지만 잊지 말아야할 것은, 응용 프로그램 밑의 운영체제에는 여전히 C언어가 사용되고 있다는 것입니다. 응용 프로그램의 폭발적인 성장으로, 수적으로 자바, 파이썬 등의 언어가 많이 사용되지만, 여전히 C언어의 위상은 견고합니다.
자바와 파이썬, 자바스크립트를 비교하고 정리하기 전에 마지막으로 자바스크립트라는 언어와 그 기반에 대해서 조금만 더 살펴보겠습니다.
3. 인터넷, 웹과 네트워크 통신
우리는 지금까지의 내용에서 컴퓨터에 대해 중요한 한 가지를 빼먹었습니다. 컴퓨터로 점점 연산을 더 편하고, 쉽게 할 수 있다는 것은 확실한데, 그럼 도대체 인터넷의 이 무한한 공간은 어디로부터 오는 것일지가 의문입니다. 전 사실 옛날에 인터넷을 하면서도 그게 궁금했는데요. 제가 보고 있는 이 사이트는 도대체 어디에 존재하는 것이며, 지금 다운받고 있는 게임 파일을 복사해서 보내는 컴퓨터는 그럼 항상 켜져있는 것인지...?
컴퓨터의 발전 초기부터, 한 컴퓨터와 다른 컴퓨터를 이어주는 통신은 군사적 목적 때문에 중요한 것으로 인식됐습니다. 냉전 시대에는 이것이 '인트라넷'의 형태로 발전했습니다. 인트라넷이란, 외부 사용자는 정보에 접근할 수 없지만, 내부 사용자끼리는 정보를 교환할 수 있는 체계를 의미합니다. 냉전 때는 국가간의 긴장 상태였으니까 그럴 수 밖에 없었을 것 같습니다.
오늘날 우리가 인터넷이라고 부르는 대부분은 '월드 와이드 웹(웹)'인데요. 이 웹은 냉전의 붕괴와 함께 유행하게 됐습니다. 웹을 최초 개발한 것은 유럽 물리학 연구소의 팀 버너스리입니다. 당시 물리학 실험 연구는 대용량 실험 데이터를 처리해야만 했는데요. 이 과정에서 전 세계의 물리학자들이 협업하는 경우가 많아서 서로 통신하고 공통의 데이터베이스를 구축할 필요가 있었습니다.
버너스리는 데이터베이스를 구축해 정보를 저장하고, 정보를 요청하는 컴퓨터에 자원을 전달하기 위한 서버를 만들게 됩니다. 요청 받은 정보를 전달하기 위한 목적으로 존재하는 컴퓨터가 바로 서버인 셈인데요. 저는 이 서버 컴퓨터가 항상 켜져있는 것임을 알게 된지 그렇게 오래되지 않았습니다. 버너스리는 이 웹 서버에 대한 접근 권한을 모두에게 공개하고, 대신에 자신의 컴퓨터로 만든 웹 사이트를 공유하기 위한 '규약'을 정하게 됩니다. 이를 우리는 HTTP라고 부릅니다. HTTP란 하이퍼텍스트 프로토콜로, 웹 사이트가 다른 웹 사이트로 연결된 '하이퍼텍스트'이기 때문에 이런 이름이 붙었습니다. 이 통신 규약을 따르는 사이트들은 모두 'HTTP://' 를 도메인 주소 앞에 붙여 사용합니다. 또 이러한 웹 사이트에 접근하기 위해 특화된 응용프로그램이 있는데요. 그것이 바로 우리가 모두 사용하는 '브라우저'입니다. 한동안 마이크로소프트 윈도우즈 운영체제에 끼워팔던 익스플로러가 유행했다가, 지금은 크롬이 유행하고 있는 것을 보실텐데요. 이 '브라우저' 시장을 차지하기 위한 경쟁은 현재 진행형입니다.
웹사이트를 만들기 위한 언어는 HTML과 CSS, 그리고 자바스크립트입니다. 각각 웹사이트의 구조, 디자인, 그리고 동작을 처리합니다. 이들 셋을 통틀어 프론트엔드라고 부릅니다. (프론트엔드와 반대되는 개념인 백엔드는 프론트엔드를 제외한 모든 영역을 말합니다.) 우리가 보는 웹사이트의 논리적 구조, 디자인을 HTML과 CSS가 담당한다면, 클릭이나 스크롤 등 우리의 동작에 맞게 웹사이트가 반응하는 것은 모두 자바스크립트 언어로 처리됩니다. 미리 정의된 동작을 처리하는 경우도 있고, 새로 서버로부터 정보를 가져와서 동작을 처리하는 경우도 있습니다. 이를테면 로그인을 하는 경우, 우리는 로그인 정보를 입력해 '로그인 버튼'을 누르는데요. 이를 처리하는 자바스크립트는 로그인 정보를 확인하기 위해 데이터베이스에 접근하게 됩니다. 즉, 단순한 로그인 행동에도 프론트엔드와 백엔드가 상호작용하는 복잡한 원리가 숨어있습니다.
결국 통신 과정에서 우리는 다른 컴퓨터에 접근해 정보를 가져와야한다는 것인데요. 그럼 도대체 어떻게 두 컴퓨터가 연결돼 있는 것일까요? 한 컴퓨터가 다른 컴퓨터로 정보를 전달하기 위한 과정에는 무선 통신과 물리적인 라인 둘다 필요합니다. 우리는 랜선을 연결하거나 와이파이에 연결돼야만 인터넷에 연결되는데요.'랜선과 와이파이'가 있으면 이를 관리하는 사업자(SKT, KT 등)를 통해서 다른 컴퓨터와 통신할 수 있기 때문입니다. 저 멀리 떨어져 있는 다른 나라의 컴퓨터와 통신이 가능한 것은, 이들 사업자들이 정보를 받고, 대륙과 대륙을 잇는 광통신 케이블이 열일해서 빛의 속도로 정보를 전달하고 있어서입니다.
4. 헥,헥..그래서 컴퓨터 전공에서 배우는 것이 뭔데!
지금까지의 내용이 컴퓨터 전공자가 배우는 내용입니다. 앞서 말씀드린 내용을 토대로, 컴퓨터과학(혹은 공학)과에서는 크게 두 분류로 과목을 나눠서 배우는데요. 지식과 정보를 효율적으로 처리하기 위한 추상적 이론과, 그것을 구현하는 현대 컴퓨터의 구조입니다. 전자는 '자료구조와 알고리즘'이라는 과목이고, 후자는 지금까지 우리가 읽은 컴퓨터 구조, 운영체제, 네트워크, 웹 등에 해당합니다. 그렇지만 가장 근본적인 것을 하나 고르라면, 바로 전자입니다. 추상적인 정보를 처리하는 이론, 자료구조와 알고리즘은 일반적인 이론이라, 구체적인 대상인 후자의 각 영역에도 적용되기 때문입니다. 컴퓨터가 근본적으로 '튜링 머신'임을 상기하시면 됩니다.
그리고 그 자료구조와 알고리즘을 통해 실제 컴퓨터가 효율적으로 동작하도록 시키는 방법이 바로 '프로그래밍 언어'입니다. 언어가 없이는 자료구조와 알고리즘이 탁상공론에 불과하게 되겠죠. 프로그래밍 언어는 엄청나게 많아서, 자료구조와 알고리즘이 구현될 때 언어의 특성이 반영되기도 합니다.
여기까지 읽으셨다면 왜 개발자가 되는 것이 컴퓨터과학을 전공하는 것과 그다지 관련이 없는지, 왜 비전공자도 개발자가 될 수 있는지 느낌이 오실 겁니다. 컴퓨터과학과에서는 컴퓨터에 대한 이론, 그리고 그 구조와 환경을 배웁니다. 그런데 이 지식은 당장 우리가 아는 앱을 만드는 방법으로 이어지는 것이 아닙니다. 개발은 응용프로그램을 만드는 과정이고, 그 과정에서 필요한 지식은 따로 배워야합니다. 마치 그림을 잘 그리는 사람이 포토샵이나 일러스트레이터를 잘다루는 것과는 별개인 상황과 유사합니다. 물론 전공 지식에서 배운 내용 덕분에 좀 더 유리하기는 할 것입니다.
5. 코딩 세션이 필요한 이유
개발 툴을 그때그때 배워서 코딩하는 것은, '자료구조와 알고리즘'에 비하면 근본적이지 않은 지식이라고 저는 생각합니다. 왜냐하면 오늘날에도 프로그래밍 언어와 새 버전은 쏟아지고 있고, 수많은 개발 툴들이 난립하고 바뀌는 과정에서 이런 것들은 필요할 때마다 닥치는대로 배우면 되기 때문입니다. 반대로 말하면, 굳이 자료구조와 알고리즘을 배우지 않았다고 할지라도, 개발에 필요한 것들은 그때그때 배워서 충분히 만들 수 있는 환경입니다. 많이들 사용하는 사이트나 앱 개발에 대한 툴들은 이미 복붙으로 가져다 쓸 수 있는 상황입니다.
ISSU에서는 자료구조나 알고리즘 이론에 딱히 관심있는 사람도 없을 것이고, 있다고 할지라도 학회 목적에 부합하지 않는다고 생각합니다. 그렇지만 우리가 흔히 인식하는 '프로그래밍은' 이런 개발 정도로 충분할 겁니다. 이런 개발을 위해서 필요한, 최소한의 지식이 바로 '언어'라고 저는 생각합니다. 일단 언어에 익숙해지고 나면, 그때 자료구조를 배우든 구현을 하든 선택지가 생깁니다.
그러면 어떤 언어를 배우는 것이 좋을까요? 앞서 언급드린대로, 프로그래밍 언어는 너무 많이 생기고 있고, 또 언젠가는 사라질지도 모릅니다. 그렇기 때문에 투입대비 제일 오래갈만 한 언어를 고르는 것이 좋을텐데요. 제 생각에 1순위는 자바스크립트입니다. 자바스크립트는 웹이 없어지지 않는한 최소 10년은 갈 것 같습니다. 요새는 앱 개발 툴들도 자바스크립트 기반(웹 기반)으로 만들어져서, 웹을 만들 수 있으면 앱도 만들 수 있는 환경이 도래하고 있습니다. 무엇보다 쉽습니다.
다음은 파이썬입니다. 파이썬은 요새 유행하고 있을 뿐 아니라, 사용자의 상승세가 가파르며, 미리 만들어진 모듈이 많아서 온갖 기능의 프로그램을 만들어볼 수 있습니다. 저 개인적으로는 자바스크립트가 좀 더 좋은 것 같긴 하지만, 목적에 따라서 약간 사용 상황이 다른 것 같습니다. 난이도는 둘 다 비슷한 정도로, 프로그래밍 언어 중에서는 매우 쉬운 축에 속합니다. 둘 다 배우면 베스트라고 생각합니다.
코딩 세션(혹은 스터디)의 목적은 이를 통해 언어가 익숙해져서, 코딩이나 개발에 대한 마음 속의 부담감과 진입장벽이 낮아지는 것입니다. 일단 언어를 알고 나면, 필요한 지식은 구글링해서 그때 그때 찾아 누구나 개발할 수 있다고 생각합니다. 조금만 하면 신기한 것을 만드는 것도 가능해요.
6. 세 줄 요약
- 전공자가 배우는 것들 중 자료구조와 알고리즘이 근본
- 언어만 배우면 비전공자도 개발이든 자료구조든 프로그램 만들기든 가능
- 언어를 배운다면 자바스크립트, 파이썬...그니까 스터디!