컴퓨터 과학 이야기
컴퓨터과학을 공부하기 위해서 ‘한 권으로 읽는 컴퓨터 구조와 프로그래밍’ 이라는 책을 구매했다. 서점에 들러 마음에 드는 제목과 훑어봤을 때 느낌이 좋은 책으로 골랐다.
하부기술 지식의 중요성
스티븐 울프람(Stephen Wolfram)님의 블로그 포스팅 “How to Teach Computational Thinking”에서 컴퓨팅 사고란 컴퓨터가 할 일을 지시하기 위해 충분히 명확하게, 충분히 시스템적으로 사물을 수식화하는 방법이라고 정의했다. 그리고 컴퓨팅 사고를 개발하기 위해 토대가 되는 기술을 배우는 대신 자신이 개발한 고수준의 도구를 사용해야 한다고 했지만 공부하고 있는 책의 저자와 마찬가지로 이 부분은 이해가 가질 않았다. 이 책에 따르면 유전학 논문 중 5분의 1가량이 스프레드시트를 잘못 사용해서 유전학 논문의 유전자 이름 표기가 잘못되어있다고 하는데 만약 이것이 의료시스템이었다면? 심각한 문제를 초래했을 수 있다. 강력한 도구를 사용하는 것이 물론 시간을 단축하고 좀 더 보안성 있고 안정적인 프로그래밍을 할 수 있게 만든다고 생각하지만, 모든 공부에 ‘토대’가 가장 중요하다고 생각하는 나로서는 토대가 우선시되어야 한다고 생각한다. 하부 기술을 이해하면 시스템이 무엇이 잘못되고 있는지 알아차리는 능력이 계발될 수 있고(전동 공구를 쓰려면 망치 쓰는 법을 알아야 하는 것처럼), 또 강력한 고수준의 도구를 만들 수 있는 능력을 갖출 수 있다고 생각한다.
컴퓨터란 무엇인가
컴퓨터 자체로는 아기와 같다. 할 줄 아는 일이 그리 많지 않다. 인간과 같이 기본적인 하드웨어 위에서 작동되는 개인의 개성과 상호작용한다. 컴퓨터와 프로그램처럼. 프로그래밍은 컴퓨터의 선생님이 되는 것이다. 프로그래머는 컴퓨터가 우리들을 위해 할 일을 하는 방법을 컴퓨터에 가르친다. 컴퓨터를 가르치는 일은 복잡하지만, 사람을 가르치는 일보다는 쉽다. 컴퓨터가 어떻게 작동하는지 알고 있으며, 우리들에게 정말 아기처럼 토하지도 않는다. 프로그래밍의 방법은 2단계로 이루어진다고한다.
- 우주를 이해한다
- 가르친 걸 이해시킨다
선생님들이 학생들을 가르치기 위해 생명공학, 수학, 영어를 전공하는 것처럼 프로그래머도 컴퓨터에 할 일을 가르치기 위해 물리학 프로그램을 만든다면 물리학을, 통계 프로그램을 만든다면 통계학을 배워야 한다는 것이다. 학문을 공부할 때 자신이 얼마나 공부했음을 가장 잘 아는 방법은 누군가에게 공부한 정보를 가르쳐보는 일이다. 또 얼마나 쉽게 설명하냐에 따라 얼마나 이해를 잘했는가도 알 수 있다. 1시간에 걸려서 공부한 내용을 5시간 동안 가르칠 수도, 20분 만에 가르칠 수도 있는 것처럼, 어느 사이트를 몇백만 줄의 코드로 만들 수도 있지만, 몇천 줄의 코드로도 만들 수 있는 것이다.
다른 의미, 다른 뜻
코딩
코딩은 어느 정도의 기계적인 변환 작업이라고 생각할 수 있다. 컴퓨터 코딩 작업을 의료계의 코딩 작업과 비교해 보면, 의사에게 진찰받는 것은 쉬운 일이지만 어려운 부분은 진단을 10만가지가 넘는 ICD 표준 질병 분류 코드로 변환해야 한다는 것이다. 예를 들어 소한테 받혔다는 코드는 W55.2XA라고 한다. 코드 개수가 많기 때문에 이 과정은 실제로 여러 프로그래밍 작업보다 힘든 작업일 것이다. 하지만 처리 과정 자체는 웹 페이지를 ‘굵은 글씨로 바꿔주세요’라는 지시를 받았을 때 하는 일과 비슷하다고 한다. 질병 코드 표준은 아주 복잡해서 이 표준을 모두 아는 코더는 드물고, ‘신경계 질환’ 이나 ‘심리적 장애’등의 영역에서 인증을 받는다고 한다. 이것은 코더가 HTML이나 JS 등 어느 한 언어에만 능숙한 것과 같다고 한다.
프로그래밍
프로그래밍은 코딩과 달리 한 전문 분야 이상을 알고 있다는 뜻이다. 의료 시나리오에서는 의사가 프로그래머에 해당한다. 환자가 화상이 있고 몸이 땀으로 젖어있다면 ‘기괴한 외관’인지 ‘워터 스키로 인한 화상’인지 진단을 내려야 하고, 진단을 내리면 치료 계획을 세울 수 있다. 또 이 계획은 효과적이어야 하고 의사는 해당 환자가 악성인 ‘부모의 과보호’를 겪지 않길 바란다. 프로그래머도 의사와 마찬가지로 데이터를 정렬하고 조작하는 최적의 알고리즘을 조작하고, 웹 클라이언트-서버 사이의 통신 구조를 결정하고, UI를 결정하는 등의 작업을 수행하는 것이다. 이런 작업은 ‘코드를 끼워놓는’식의 간단한 작업과는 다르다.
엔지니어링
엔지니어링은 복잡도 순으로 다음 순서이다. 일반적으로 지식을 얻고, 그 지식을 활용해 어떤 목표를 달성하는 기술을 엔지니어링이라고 한다. ICD표준을 만드는 작업을 엔지니어링이라고 할 수 있다. 다양한 의학 분야를 알고 이 지식을 줄여서 의사의 진단 기록보다 더 쉽게 추적하고 분석할 수 있는 코드 집합으로 만드는 것이다(이런 복잡한 시스템이 ‘좋은’ 엔지니어링인지는 모르겠다)
컴퓨터과학
프로그래밍은 컴퓨터과학과는 다르다. 컴퓨터과학자들은 프로그램을 작성하지만 대부분의 프로그래머들은 컴퓨터과학자가 아니다. 컴퓨터과학은 계산(컴퓨팅과학)을 연구하는 학문이다. 컴퓨터과학에서 발견한 내용을 엔지니어와 프로그래머가 사용한다.
컴퓨터과학 개요
사용자
애플리케이션 프로그래밍
시스템 프로그래밍컴퓨터 하드웨어
논리 설계
회로 설계
기초 과학
컴퓨터 과학의 시각화, 여러 계층을 나누는 선이 실제로 명확하지는 않다.
사람들의 대부분은 컴퓨터 시스템을 사용하는 사용자(User) 다.
사용자 중에는 시스템 관리자(System administrator) 라는 특별한 사용자가 있다. 이들은 시스템을 관리하고 소프트웨어를 설치하고, 백업을 진행하는 등의 일을 한다.
웹 페이지, 어플 등의 프로그램을 만드는 사람을 애플리케이션 프로그래머(Application programmer) 라고 한다. 이들은 컴퓨터와 사용자 간에 상호작용을 하기 위한 프로그램을 다른 사람들이 만든 기본 요소들을 활용해서 작성한다. 애플리케이션은 컴퓨터 하드웨어와 직접 이야기 하지 않고, 시스템 프로그래밍(System programming) 이 개입해 이야기한다. 시스템 프로그래머(System programmer) 는 애플리케이션 프로그래머가 사용하는 기본 요소를 만든다. 시스템 프로그래머는 하드웨어와 자신이 만든 프로그램이 상호작용해야 하기 때문에 하드웨어에 대해 알아야 한다. 컴퓨터 하드웨어는 논리(Logic) 로 표현되고, 논리는 여러 전자 회로(Circuit) 로 만들어진다. 기초 과학이 맨 아래를 받쳐준다. 전기에 대한 이해부터 칩을 만드는 공정을 위해 필요한 화학에 이르기까지 모든 것을 제공한다.
각 계층은 자신의 아래 계층으로부터 만들어진다. 이 말은 아래 계층은 위의 계층에 영향을 준다는 뜻이고, 실제로 Intel에서 1994년 회로 설계에 잘못 설계된 내용이 일부 나눗셈 연산에 영향을 주어 잘못된 결과를 만들어냈다고 한다.
시스템 프로그래머는 하드웨어와 소프트웨어의 합일을 추구하는 테크노 요기(yogi, 요가 수행자)다.
컴퓨터 과학을 시각화한 것을 보았을 때, 시스템 프로그래밍은 애플리케이션 프로그래밍과 컴퓨터 하드웨어의 중간에 샌드위치처럼 끼어있다. 요가 수행자들이 마음과 몸의 합일을 추구하듯이, 시스템 프로그래밍은 애플리케이션 프로그래밍과 하드웨어사이의 합일을 추구해야 한다는 것을 말하는 것 같다.
댓글남기기