들어가며
1. 자바의 탄생
자바는 1990년대에 제임스 고슬링, 마이크 세리든, 패트릭 노트에 의해 1990년대에 썬 마이크로시스템즈에서 만들어졌다.
자바가 만들어지게 된 원인 : 메모리 자동 관리
자바는 C프로그래밍 언어를 본떠 만들어졌다. C에는 메모리 자동 관리가 없었다. 메모리 관리 오류는 당시 프로그래머에게 자주 두통을 일으키는 오류였다.(지금도 게임 업계에서는 C, C++, C#을 쓰는데메모리 누수 때문에 러스트로 바꾸고 있는 것 같음)
자바는 메모리 관리를 프로그래머가 볼 수 없게 감췄다. 이것이 자바가 초보에게 좋은 언어가 된 이유 중 하나이다.
좋은 프로그래머와 좋은 프로그램을 탄생시키려면 좋은 프로그래밍 언어 이상의 것이 필요하다.
그리고 자바로 인해, 디버깅하기 더 어려운 새로운 버그 종류가 생겨났음을 드러낸다.
메모리를 이해하는 것은 프로그래머에게 핵심 기술에 속한다.
2. 프로그래밍을 제대로 잘해야 하는 이유
컴퓨터에 대해 가르치지 않고 컴퓨터 프로그래밍을 가르치는 것이 왜 문제일까?
컴퓨터 가격은 매우 저렴해져서 이제는 뭔가를 만들 때 가장 돈이 적게 드는 방법이 컴퓨터를 사용하는 것일 정도이다.
EX. 컴퓨터를 사용해 자동차 대시보드에 아날로그 시계를 표시하는 게 실제 기계식 아날로그 시계를 넣는 것보다 더 싸게 먹힌다.
(컴퓨터 안의 개개 부품의 가격이 아니라 컴퓨터 자체의 가격)
앞으로는 컴퓨터가 들어 있지 않은 물건을 찾기가 어려운 시대가 올 것이다.
컴퓨터 프로그래밍에서 이상한 점은 의학과 달리 프로그래밍에서는 다방면의 지식을 갖추지 않아도 특정 분야의 전문가가 될 수 있는데 이 때문에 최근 안티바이러스 소프트웨어 중 일부가 심장 수술을 하는 중에 의료 기기를 중단시킨 사건도 있었 다. 보잉 737 맥스 비행기의 설계 문제로 인해 많은 사람이 사망했다
프로그래밍을 배우는 것은 시작일 뿐이다.
이런 사태가 벌어진 이유 중에는 작동하는 것처럼 보이거나, 대부분의 잘 작동하는 컴퓨터 프로그램을 작성하는 게 그리 어렵지 않다는 점이다.
1980년대 음악의 변화를 비유로 보자면, 사람들은 음악을 만들어 내기 위해서는 음악 이론, 작곡, 악기 연주범, 청음을 배우고 수없이 연습하는 것이 포함됐다. 그러나 악기 디지털 인터페이스 즉, 미디
표준이 생기면서 사람들은 컴퓨터에서 음악을 만들 수 있게 되었다.
음악은 실제 음악가에 의해 만들어진다. 요즘 프로그래밍은 미디를 사용하는 것처럼 되고 있다. 더 이상 프로그램을 작성하기 위해 여러 해 동안 연습을 하거나 이론을 배우지 않는다.
하지만 그렇다고 해서, 이런 식으로 작성된 프로그램이 좋은 프로그램이거나 신뢰할 만한 프로그램인 것은 아니다
누구나 코딩을 배우는 것은 이론적으로는 멋진 이야기이지만, 실제로는 모두가 좋은 프로그래머가 되기에 적합한 태도를 갖추는 건 아니기에 좋은 생각이 아니다. 물론 재미로 축구를 하는 것처럼 재미로 프로그램을 작성할 수 도 있다. 하지만 이런 경우 월드컵 대표팀으로 뽑히리라 기대를 해서는 안 된다.
실제 코딩하는 법을 배웠다와 프로그래밍을 배웠다는 다르다.
하부 기술 지식의 중요성
울프람은 컴퓨팅 사고를 “컴퓨터가 할 일을 지시하기 위해 충분히 명확하게, 충분히 시스템적으로 사물을 수식화하는 방법”이라고 정의했다.
이 저자는 이 정의에 대해서 동의하나 프로그램을 배우는 사람이 컴퓨팅 사고를 개발하기 위해 토대가 되는 기술을 배우는 대신, 자신이 개발한 강력한 고수준 도구 등을 사용해야 한다는 울프람의 주장에는 강하게 반대한다고 한다.
예를 들어, 미적분학보다 통계학에 대한 관심이 늘어난다는 점을 보면 ‘데이터 주무르기data wrangling’가 점점 더 중요한 분야가 되고 있음이 분명하다.
하지만 사람들이 멋진 프로그램에 엄청난 양의 데이터를 입력하는데 이 데이터를 전혀 이해하지 못한다면 어떤 일이 벌어질까?
이럴 경우 한 가지 가능성은 사람들이 재미있어 보이지만 의미가 전혀 없거나 틀린 결과를 만들어내는 것이다.
하부 기술 지식을 배워야 하는 이유
하부 기술을 잘 이해하면 무엇이 잘못되고 있는지 알아차리는 능력을 계발할 수 있다. 고수준 도구만 알면 잘못된 질문을 던지기 쉽다. 전동 공구를 사용하려면 먼저 망치 쓰는 법부터 익혀야 한다.
새로운 도구 를 만들 수 있는 능력을 가질 수 있다는 점이다.
새로운 도구를 만드는 사람은 언제나 필요하며, 도구 사용자가 늘어나면 늘어날수록 이런 사람의 중요성은 더 커진다. 컴퓨터를 잘 이해함으로 써 프로그램의 동작에 대한 수수께끼가 풀린다면, 여러분은 분명히 더 나은 코드를 작성할 수 있다.
3. 컴퓨터란 무엇인가
전자우편을 읽거나 하기 위한 가전 제품보다는 휴대 전화나 음악 플레이어 같은 하이테크 장남을 돌아가게 해주는 두뇌라는 것이 정답에 가깝다.
전자우편을 보내고 게임을 하는 등의 일은 컴퓨터에서 실행되는 프로그램에 의해 가능해진다.
컴퓨터 자체는 새로 태어난 아기와 같다. 컴퓨터는 할 줄 아는 일이 그리 많지 않다. 우리는 보통 인간을 이루는 기본적인 하드웨어에 대해서는 거의 생각해본 적이 없다.
이는 대부분의 경 우, 기본적인 하드웨어 위에서 작동되는 개인의 개성과 상호작용하기 때문이다.
이는 마치 컴퓨터가 프로그램을 실행하는 것과 같다. 예를 들어 웹 페이지를 볼 때는 컴퓨터만 쓰는 것이 아니라, 컴퓨터에서 실행되는 누군가가 미리 작성해둔 프로그램, 웹 페이지를 호스팅하는 컴퓨터, 그 리고 그 두 컴퓨터 사이에서 인터넷이 작동하도록 돕는 모든 컴퓨터를 통해 웹 페이지를 본다.
컴퓨터 프로그래밍이란 무엇인가?
프로그래밍은 컴퓨터의 선생님이 되는 것이다. 프로그래머는 컴퓨터가 프로그래머를 위 해 할 일을 하는 방법을 컴퓨터에게 가르쳐준다.
컴퓨터를 가르치는 일은 복잡하다. 하지만 사람을 가르치는 일보다는 쉽다. 우리는 컴퓨터가 어 떻게 작동하는지 잘 알고 있다.
컴퓨터 프로그래밍의 두 단계
우주를 이해한다.
3살짜리 아이에게 이해한 내용을 설명한다.
좋은 컴퓨터 프로그래머가 되기 위한 단계
모든 분야를 가능한 한 많이 배우는 것이다. 문제에 대한 해답을 종종 예기치 못한 장소에서 발견할 수 있다.
알고 있는 내용을 어린아이처럼 아주 융통성 없는 기계에게 설명하는 것이다.
아이들은 자라나면서 유연성과 추론 능력을 배운다. 하지만 컴퓨터는 피터팬 같다. 컴퓨터는 절대로 자라지 않는다.
컴퓨터는 일반화할 줄 모른다는 점에서도 어린아이와 같다.
우리가 사용하는 컴퓨터는 그림 그리는 법을 알고, 철자를 고쳐주고, 말하는 내용을 이해하고, 음악을 틀어주는 등의 일을 하기 하는것처럼 보이지만 이런 일 을 하는 건 컴퓨터가 아니라는 사실을 기억하라.
실제 일하는 것은 누군가가 컴퓨터가 이런 일 을 할 수 있도록 미리 작성해둔 프로그램이다. 컴퓨터는 컴퓨터가 실행하는 프로그램과 분리되어 있다.
자동차와 운전자가 합쳐져야 도로 위의 자동차가 될 수있다. 컴퓨 터는 자동차와 비슷하고 프로그래머는 운전자와 비슷하다.
컴퓨터 프로그래밍이란 여러분이 문제를 풀기 위해 알아야 할 필요가 있는 내용을 배우고, 이 내용을 어린아이에게 설명하는 과정이다.
문제를 푸는 방법이 여러 가지이기 때문에 프로그래밍은 과학이자 기술이다. 프로그래밍은 우아한 해법으로부터 마구잡이식으로 문제를 풀 어보는 것까지 다양한 방식을 포함한다.
인간의 두뇌의 무의식으로 인해 프로그래밍이 어려움
인간의 두뇌는 의식적으로 생각을 하는 방법을 생각하지 않아도 생각할 수 있게 해준다. 여러 분의 두뇌는 처음에는 그냥 하드웨어
로 시작했지만, 그 후 프로그래밍
이 이뤄졌다.
예를 들어 여러분은 손가락을 움직이는 방법을 먼저 배우고, 그 후 물체를 잡는 방법을 배웠다. 연습을 거 친 후에는 물체를 잡는 각 단계를 일일이 생각하지 않아도 물체를 잡을 수 있다.
인간이 무의식중에 작업을 해낼 수 있는 엄청난 능력은 프로그래밍을 하는 방법을 배우는 것을 더 힘들게 한다. 프로그래밍은 작업을 컴퓨터가 따라 할 수 있는 더 작은 단계로 분해해야 하기 때문
이 책은 우주를 이해하라의 첫 단계의 초점을 맞춤
문제를 분명히 이해하지 못했다면, 첫 단계인 ‘우주를 이해하라’가 두 번째 단계인 3살짜리 아 이에게 설명하라보다 훨씬 더 중요하다.
생각해보라. 말할 내용이 없다면 말 잘하는 방법을 배 운들 뭐가 좋겠는가? 그럼에도 현재의 교육은 두 번째 단계에 초점을 맞추고 있다. 이는 과업의 기계적인 측면을 가르치고 평가하기가 창조적인 요소를 가르치고 평가하는 것보다 훨씬 더 쉽 기 때문이다.
4. 코딩, 프로그래밍, 엔지니어링, 컴퓨터과학
1) 코딩
결론적으로, 의료 코딩은 프로그래밍과 비슷하지만 훨씬 방대한 코드 체계를 다뤄야 하는 어려운 작업이다.
코딩의 개념
‘코딩을 배우자’ 등의 슬로건으로 코딩이 널리 알려졌으며, 기계적인 변환 작업으로 볼 수 있음.
의료 코딩과 비교
환자가 진찰받은 후, 의사는 진단을 내리고 이를 ICD 표준 코드(예: ICD-10)로 변환해야 함.
의료 코딩은 방대한 코드(10만 개 이상) 중에서 적절한 것을 찾아 적용하는 과정.
예를 들어, ‘소한테 받혔음’이라는 진단은 W55.2XA 코드로 변환됨.
의료 코딩과 프로그래밍의 유사성
프로그래머가 웹 페이지에서 텍스트를 굵게 만드는 것처럼, 의료 코더도 특정 규칙에 따라 코드를 적용.
그러나 의료 코딩은 코드 개수가 많고 복잡하여 특정 영역(예: 신경계 질환, 정신 질환)에 대한 전문 인증을 받는 경우가 많음.
이는 프로그래머가 특정 언어(HTML, JavaScript 등)에 전문성을 가지는 것과 유사함.
2) 프로그래밍
프로그래밍과 의료 진단의 유사성
프로그래밍은 단순한 코딩이 아니라 문제를 분석하고 해결하는 과정.
의사가 환자를 진찰하고 적절한 진단을 내리듯, 프로그래머도 문제를 해결하기 위한 최적의 알고리즘과 시스템을 결정해야 함
프로그래머는 데이터를 정렬하고 조작하는 최적의 알고리즘을 결정하고, 웹 클라이언트와 웹 서버 사이의 통신 구조를 결정하며, 사용자 인터페이스를 결정하는 등의 작업을 수행한다.
프로그래머는 데이터를 정렬하고 조작하는 최적의 알고리즘을 결정이런 작업은 ‘코드에 끼워 넣는’ 식의 간단한 작업은 아니다
3) 엔지니어링
일반적으로 엔지니어링은 지식을 얻고, 얻은 지식을 활용해 어떤 목표를 달성하는 기술이다.
ICD 표준 개발과 엔지니어링
ICD 표준(국제 질병 코드)을 만드는 작업은 단순한 코딩이 아니라 엔지니어링 작업임.
왜냐하면, 다양한 의학 진단을 이해하고, 이를 체계적으로 정리하여 코드화해야 하기 때문.
목표: 의사의 진단을 보다 쉽게 추적하고 분석할 수 있도록 변환하는 것.
이런 복잡한 시스템이 좋은 엔지니어링인지 아닌지는 관점에 따라 다름
컴퓨터 엔지니어링 사례 (의료 모니터링 시스템 개발)
필자가 예전에 병원에서 쓰이는 저가형 의료 모니터링 시스템 개발 프로젝트에 참여한 적이 있음.
필자의 책임:
의사나 간호사가 설명서를 읽지 않고도 5분 안에 사용법을 이해할 수 있는 UI/UX 설계.
즉, 단순한 프로그래밍이 아니라 사용성을 고려한 시스템 설계가 필요함.
최종 결과:
목표를 초과 달성하여, 사용법을 익히는 데 걸리는 시간을 30초로 단축함.
이걸 통해 강조하는 점
프로그래밍 ≠ 엔지니어링
단순히 코드를 짜는 것(프로그래밍)만으로는 충분하지 않음.
사용성, 시스템 설계, 문제 해결 능력이 필요함.
엔지니어링은 문제를 효과적으로 해결하는 것
좋은 엔지니어링이란 어떤 문제를 쉽게 해결하도록 만드는 것.
의료 모니터링 시스템의 예처럼, 단순히 코드를 짜는 게 아니라 사용자가 쉽게 쓸 수 있도록 설계하는 것이 핵심
즉, 좋은 엔지니어링
이란 단순한 코딩이 아니라, 문제를 분석하고 최적의 솔루션을 만들어내는 과정
4) 코딩, 프로그래밍, 엔지니어링, 컴퓨터과학의 차이
코딩: 특정 지침을 코드로 변환하는 과정.
프로그래밍: 문제를 분석하고 해결하는 논리를 설계하는 과정.
엔지니어링: 프로그래밍을 포함하여 시스템을 구축하고 최적화하는 기술.
컴퓨터과학: 계산 이론과 알고리즘을 연구하는 학문으로, 엔지니어와 프로그래머가 이를 활용.
이들은 서로 독립적이지만 상호 연관된 분야이며, 단순히 코딩을 할 줄 안다고 좋은 프로그래머가 되는 것은 아님.
5) 컴퓨터과학과 프로그래밍의 차이
컴퓨터과학: 계산과 알고리즘을 연구하는 학문.
프로그래밍: 컴퓨터과학의 연구 결과를 활용하여 실제 프로그램을 만드는 과정.
많은 컴퓨터과학자들이 코드를 작성하지만, 대부분의 프로그래머는 컴퓨터과학자가 아님.
6) 정리
이 글은 코딩, 프로그래밍, 엔지니어링, 컴퓨터과학의 차이점과 관계를 설명하면서, 단순한 지식 습득만으로 좋은 프로그래머가 될 수 없음을 강조한다.
코딩, 프로그래밍, 엔지니어링, 컴퓨터과학은 독립적이지만 연관된 분야
각 분야는 필요한 지식의 유형과 깊이가 다름.
예를 들어,
코딩
은 단순한 코드 작성,프로그래밍
은 문제 해결 과정, 엔지니어링은 시스템 설계, 컴퓨터과학은 이론 연구에 초점.
좋은 프로그래머가 되는 것은 자동적인 과정이 아님
컴퓨터과학자, 엔지니어, 코더가 된다고 해서 자동으로 뛰어난 프로그래머가 되지는 않음.
실무적인 경험과 문제 해결 능력이 중요함.
책을 읽는 것만으로 전문가가 될 수 없음
이 책은 컴퓨터과학자나 엔지니어의 사고방식을 이해하는 데 도움을 주지만, 단순히 읽는 것만으로 전문가가 될 수 없음.
엔지니어링과 프로그래밍은 기술이자 예술
음악이나 그림처럼, 일부는 기술적 접근이지만, 창의적인 사고와 문제 해결 능력도 필요함.
이 책의 목표
프로그래밍 기술을 발전시키는 데 도움을 주는 것.
단순한 코드 작성이 아니라, 문제 해결과 사고방식을 배우는 것이 중요함.
좋은 프로그래머가 되려면 단순한 지식 습득이 아니라 실무 경험과 문제 해결 능력이 중요하며, 프로그래밍이 단순한 기술이 아니라 창의적인 과정임을 강조
7) 컴퓨터 과학의 개요
그림 1은 단순화한 그림이며, 여러 계층을 나누는 선이 실제로는 명확하지 않다는 사실을 염두에 두자.
이 글은 컴퓨터 시스템의 다양한 계층과 역할, 시스템 프로그래밍의 중요성, 그리고 역사적 지식의 필요성을 설명한다.
1. 사용자와 관리자
대부분의 사람은 단순한 사용자이며, 시스템 관리자는 컴퓨터 시스템을 유지·관리하는 역할을 한다.
시스템 관리자는 소프트웨어 설치, 계정 관리, 백업 등의 작업을 담당하며, 일반 사용자보다 더 많은 권한을 가진다.
2. 애플리케이션 프로그래밍과 시스템 프로그래밍
애플리케이션 프로그래머는 웹, 모바일 앱, 음악 플레이어 등 사용자가 직접 사용하는 프로그램을 만든다. 이들은 기존에 만들어진 요소들을 활용해 프로그램을 작성하며, 이를 효과적으로 사용하는 능력이 중요하다.
애플리케이션 프로그램 개발은 다른 사람이 만든 기본 요소를 임포트import하는 방법과 이 기본 요소들을 서로 붙이는 방법일 뿐이다.
이 런 기술만 사용해도 오랫동안 직업을 유지할 수 있지만, 각 블록과 블록을 붙이는 풀을 실제로 이해하면 훨씬 더 좋을 것이다.(그래서 오픈 소스나 라이브러리를 뜯어보는게 좋다고 하는 듯)
시스템 프로그래머는 애플리케이션 프로그래머가 사용하는 기본 요소를 개발한다. 시스템 프로그래밍은 하드웨어와 직접 상호작용해야 하므로 하드웨어에 대한 지식이 필요하다.
3. 컴퓨터 시스템의 구조와 논리
컴퓨터 하드웨어는 계산뿐만 아니라 외부와 연결하기 위한 다양한 요소로 구성된다. 컴퓨터 동작을 이해하는 핵심 개념은 논리
이며, 논리는 전자 회로를 통해 구현된다.
회로 설계는 이 책에서 다루지 않지만, 전자공학을 공부하면 더 깊이 이해할 수 있다.
물론 기초 과학이 맨 아래를 받쳐준다. 기초 과학은 전기에 대한 이해로 시작해서 칩을 만들기 위해 필요한 화학에 이르기까지 모든 것을 제공한다.
그림 1에서 보는 것처럼, 각 계층은 자신의 아래 계층으로부터 만들어진다. 이 말은 아래 계층에 서 설계 시 잘못된 선택을 하면 그 위의 모든 계층에 영향을 끼치게 된다는 뜻이다.
4. 시스템 프로그래밍의 중요성
그런 의미에서 시스템 프로그래밍은 소프트웨어 계층에서 가장 기초적인 부분으로, 사회 기반 시설과 같은 역할을 한다.
좋은 시스템 프로그래머가 되어야 하는 이유는 다른 프로그래머들이 시스템 프로그래밍의 결과물에 의존하기 때문이다. 시스템 프로그래머는 하드웨어와 소프트웨어를 모두 이해해야 하며, 이를 통합하는 역할을 한다.
5. 핵심 기술과 역사적 지식
시스템 프로그래밍을 배우지 않아도 특정 계층에서 일할 수 있지만, 도메인을 벗어난 문제를 직접 해결하는 능력은 부족할 수 있다.
핵심 기술을 이해하면 높은 수준의 더 나은 해결책을 생각해낼 수 있다. 많은 프로그래머들은 기술의 발전 역사를 배우지 않으며, 그 결과 동일한 실수를 반복하게 된다.
역사적 지식을 갖추면 과거의 실수를 피하고 새로운 방식으로 접근할 수 있다. 기술과 이를 개발한 인물에 대해 배우는 것은 가치가 있으며, 그들의 문제 해결 방식을 이해하는 것이 중요하다.
6. 문제 해결 능력의 중요성
위키피디아나 스택 오버플로 같은 자료를 찾는 것보다 근본적인 문제 해결 능력을 키우는 것이 중요하다.
어느 누구도 해결하지 못한 문제를 푸는 방법을 배우는 것이 가장 중요한 기술이다.
이 책의 예제들은 16비트 컴퓨터와 같은 오래된 기술을 기반으로 하지만, 이를 통해 본질적인 개념을 쉽게 배울 수 있다.
5. 이 책의 구성
이 책은 개념적으로 세 부분으로 나뉜다. 첫 번째 부분은 컴퓨터 하드웨어를 탐구한다. 하드웨어가 무엇이고 하드웨어를 어떻게 만드는지 살펴본다. 두 번째 부분은 하드웨어에서 소프트웨어가 어떻게 작동하는지 살펴본다. 마지막 부분은 프로그래밍 기술, 즉 다른 사람들과 협력해 더 나은 프로그램을 만드는 방법에 대한 것이다.
Last updated