이 상품은 구매 후 지원 기기에서 예스24 eBook앱 설치 후 바로 이용 가능한 상품입니다.
1장. 컴퓨터 내부의 언어 체계 컴퓨터는 어떤 말을 사용할까 언어란 무엇인가문자 언어비트논리 연산___불리언 대수___드모르간의 법칙정수를 비트로 표현하는 방법___양의 정수 표현___2진수 덧셈___음수 표현실수를 표현하는 방법___고정소수점 표현법___부동소수점 표현법___IEEE 부동소수점 수 표준2진 코드화한 10진수 시스템2진수를 다루는 쉬운 방법___8진 표현법___16진 표현법___프로그래밍 언어의 진법 표기법비트 그룹의 이름텍스트 표현___아스키 코드___다른 표준의 진화___유니코드 변환 형식 8비트문자를 사용한 수 표현___출력 가능하게 변경한 인코딩___베이스64 인코딩___URL 인코딩색을 표현하는 방법___투명도 추가___색 인코딩정리2장. 전자 회로의 조합 논리컴퓨터는 어떤 논리로 비트를 다루는가디지털 컴퓨터의 사례___아날로그와 디지털의 차이___하드웨어에서 크기가 중요한 이유___디지털을 사용하면 더 안정적인 장치를 만들 수 있다___아날로그 세계에서 디지털 만들기___10진 숫자 대신 비트를 사용하는 이유간단한 전기 이론 가이드___전기는 수도 배관과 유사하다___전기 스위치비트를 처리하기 위한 하드웨어___릴레이___진공관___트랜지스터___집적 회로논리 게이트___이력 현상을 활용한 잡음 내성 향상___차동 신호___전파 지연___출력 유형게이트를 조합한 복잡한 회로___가산기___디코더___디멀티플렉서___셀렉터정리3장. 메모리와 디스크의 핵심: 순차 논리컴퓨터는 비트를 어떻게 기억하는가시간 표현과 상태 기억___발진자___클록___래치___게이트가 있는 래치___플립플롭___카운터___레지스터메모리 조직과 주소 지정___임의 접근 메모리___읽기 전용 메모리블록 장치플래시 메모리와 SSD오류 감지와 정정하드웨어와 소프트웨어 비교정리4장. 컴퓨터 내부 구조컴퓨터 하드웨어는 어떻게 구성되는가메모리입력과 출력중앙 처리 장치___산술 논리 장치___시프트___실행 장치명령어 집합___명령어___주소 지정 모드___조건 코드 명령어___분기 명령어___최종 명령어 집합 구성마지막 설계___명령어 레지스터___데이터 경로와 제어 신호___데이터 흐름 제어RISC와 CISC 명령어 집합GPU정리5장. 컴퓨터 아키텍처와 운영체제컴퓨터는 어떻게 프로그램과 메모리를 조직적으로 관리할까기본적인 구조 요소들___프로세서 코어___마이크로프로세서와 마이크로컴퓨터프로시저, 서브루틴, 함수스택인터럽트상대 주소 지정메모리 관리 장치가상 메모리시스템 공간과 사용자 공간메모리 계층과 성능코프로세서메모리상의 데이터 배치프로그램 실행메모리 전력 소비정리6장. 입출력과 네트워킹 컴퓨터는 외부와 어떻게 상호작용하는가 저수준 I/O___I/O 포트___버튼을 눌러라___빛이 있으라___빛, 동작, 그리고 상호 연동___밝기 조절___그레이의 2n가지 그림자___쿼드러처___병렬 통신___직렬 통신___파동에 올라타라___범용 직렬 버스네트워킹___최근의 LAN들___인터넷아날로그 처리 방법___디지털을 아날로그로 변환___아날로그를 디지털로 변환___디지털 오디오___디지털 이미지___비디오휴먼 인터페이스 장치___터미널___그래픽 터미널___벡터 그래픽___래스터 그래픽___키보드와 마우스정리7장. 데이터 구조와 처리어떻게 해야 프로그램에서 데이터를 잘 구성하고 처리할까 기본 데이터 타입배열비트맵문자열복합 데이터 타입단일 연결 리스트동적 메모리 할당더 효율적인 메모리 할당가비지 컬렉션이중 연결 리스트계층적인 데이터 구조대용량 저장장치데이터베이스인덱스데이터 이동벡터를 사용한 I/O객체 지향의 함정정렬해시효율성과 성능정리8장. 프로그래밍 언어 처리컴퓨터는 프로그램을 어떻게 해석하고 변환하는가어셈블리 언어 고수준 언어구조적 프로그래밍어휘 분석___상태 기계___정규식단어에서 문장으로누구나 프로그래밍 언어를 만들 수 있는 시대파스 트리인터프리터컴파일러최적화하드웨어를 다룰 때 주의하라정리9장. 웹 브라우저추상적인 컴퓨터를 이해하기 위한 가상 머신마크업 언어균일 자원 위치 지정자HTML 문서DOM: 문서 객체 모델___트리 관련 용어___DOM 처리CSSXML 등의 마크업 언어자바스크립트jQuerySVGHTML5JSON정리10장. 애플리케이션 프로그래밍과 시스템 프로그래밍고수준 언어와 저수준 언어 프로그래밍 방식 비교동물 추측 프로그램 버전 1: HTML과 자바스크립트 프로그램___애플리케이션 수준의 뼈대___웹 페이지 본문___자바스크립트___CSS동물 추측 게임 버전 2: C 프로그램___터미널과 명령줄___프로그램 빌드___터미널과 장치 드라이버___문맥 전환___표준 I/O___원형 버퍼___추상화를 활용한 코드 개선___런타임 라이브러리와 표준 입출력___버퍼 오버플로___C 프로그램___훈련정리11장. 성능 향상을 위한 알고리즘 기법계산을 간소화하는 프로그래밍 트릭표 찾기___변환___텍스처 매핑___문자 종류 판별정수를 사용한 계산 방법___직선___곡선 다루기___다항식재귀적 분할___나선___구성적인 기하___시프트와 마스크계산을 회피하는 그 밖의 수학적 기법들___멱급수 근삿값 계산___CORDIC 알고리즘무작위성과 관련 있는 예제들___공간을 채우는 곡선___L 시스템___스토캐스틱 기법___양자화정리12장. 병렬성과 비동기성 컴퓨터는 어떻게 한 번에 많은 일을 하는가 경합 조건이란 무엇인가공유 자원프로세스와 스레드락___트랜잭션과 작업 크기___락 대기___교착 상태___단기 락 구현___장기 락 구현브라우저 자바스크립트비동기 함수와 프로미스정리13장. 컴퓨터 보안 컴퓨터는 어떻게 데이터를 안전하게 지키는가 보안과 프라이버시 개요___위협 모델___신뢰___물리적 보안___통신 보안___모던 타임즈___메타데이터와 감시___사회적 맥락___인증과 권한부여크립토그래피___스테가노그래피___치환 암호___전치 암호___더 복잡한 암호___일회용 패드___키 교환 문제___공개키 암호___전방향 안전성___암호학적 해시 함수___디지털 서명___공개키 인프라___블록체인___패스워드 관리보안을 위한 소프트웨어 예방 조치___올바른 대상을 보호하라___로직은 세 번 체크하라___오류를 검사하라___공격 표면을 최소화하라___경계 내부에 머물러라___좋은 난수를 생성하기는 힘들다___네 코드를 알라___극단적인 영리함은 여러분의 적이다___눈에 보이는 것을 이해하라___과다수집하지 마라___모아두지 마라___동적 메모리 할당은 여러분의 친구가 아니다___가비지 컬렉션도 여러분의 친구가 아니다___코드 역할을 하는 데이터정리14장. 세상을 바꾸는 기계 지능 미래를 열어가는 인공지능, 머신러닝, 빅데이터 개요머신러닝___베이즈___가우스___소벨___캐니___특성 추출___인공 신경망___머신러닝 데이터의 활용인공지능빅데이터정리15장. 훌륭한 프로그래머가 되기 위한 팁과 경험담알아두면 좋은 실무 상식과 조언 가치 제안소프트웨어 개발의 발자취___간추린 역사___오픈소스 소프트웨어___크리에이티브 커먼즈___이식성의 발전___패키지 관리___컨테이너___자바___노드___클라우드 컴퓨팅___가상 머신___이동식 장치프로그래밍 환경___초보 프로그래머도 경험을 얻는 방법___추정하는 방법 배우기___프로젝트 스케줄링___의사결정___성향이 다른 사람들과 함께 일하기___직장 내 문화 다루기___정보를 얻은 상태에서 선택하기개발 방법론프로젝트 설계___생각을 글로 써보자___빠른 프로토타이핑___인터페이스 설계___코드를 재활용할 것인가, 직접 작성할 것인가프로젝트 개발___나이 든 개발자의 잡설___이식성이 있는 코드___소스 코드 제어___테스트___버그 보고와 추적___리팩토링___유지보수스타일을 지켜라기존 프로젝트를 활용하라정리
|
저조너선 스타인하트
관심작가 알림신청Jonathan E. Steinhart
역오현석
관심작가 알림신청오현석의 다른 상품
컴퓨터는 어떻게 동작하며, 컴퓨터 프로그래밍이란 무엇인가? 개발자가 되기 위해 프로그래밍을 배우는 것은 단지 시작일 뿐이다! 뛰어난 프로그래머가 되려는 개발자는 물론, 비전공자도 재미있게 읽을 수 있는 컴퓨터공학 핵심 강의!하드웨어의 토대가 되는 기초 전자회로, 게이트부터 시작해서 메모리, CPU, I/O, 컴퓨터 아키텍처 전반을 설명하고, 그 위에서 소프트웨어를 작성하는 방법을 웹과 C 프로그램으로 직접 만들어보며, 보안, 인공지능, 알고리즘 등의 내용에 이르기까지 개발자라면 반드시 알아야 할 커튼 뒤에 감춰진 컴퓨터 구조와 프로그래밍에 대한 거의 모든 것을 다루는 컴퓨터공학 개론서!이 책에서 다루는 내용- 실제 세계를 컴퓨터가 이해할 수 있는 형태인 비트, 논리, 숫자, 텍스트, 색 등으로 변환하는 원리와 방법- 논리 게이트, 가산기, 디코더, 레지스터, 메모리 등 컴퓨터를 이루는 기본 블록- 성능 향상의 관점에서 컴퓨터 하드웨어, 특히 메모리를 고려해 프로그램을 설계해야 하는 이유 - 프로그램이 컴퓨터가 이해할 수 있는 기계어로 변환되는 과정- 소프트웨어 구성 요소를 조합해 웹 브라우저 같은 프로그램을 만드는 방법- 루프 불변 조건, 강도 감소, 재귀적 분할 등, 프로그램을 더 효율적으로 만들기 위한 알고리즘과 프로그래밍 트릭- 컴퓨터 보안과 인공지능, 머신러닝, 빅데이터의 이해- 프로젝트 설계, 문서화, 스케줄링, 이식성, 유지보수 등 현장에서 벌어지는 프로그래밍 실무에 관한 경험담과 조언 이 책의 구성 이 책은 개념적으로 세 부분으로 나뉜다. 첫 번째 부분은 컴퓨터 하드웨어를 탐구한다. 하드웨어가 무엇이고 하드웨어를 어떻게 만드는지 살펴본다. 두 번째 부분은 하드웨어에서 소프트웨어가 어떻게 작동하는지 살펴본다. 마지막 부분은 프로그래밍 기술, 즉 다른 사람들과 협력해 더 나은 프로그램을 만드는 방법에 대한 것이다. 1장, “컴퓨터 내부의 언어 체계”1장은 3살짜리 아이의 마음을 탐구하는 것부터 시작한다. 컴퓨터는 비트(bit)를 가지고 노는 기계다. 컴퓨터는 비트를 모아서 먹고 산다. 여러분은 비트가 무엇인지 배우고 비트로 무엇을 할 수 있는지에 대해 배운다. 우리는 비트나 비트 모음에 의미를 부여하기 위해 ‘있다고 치고’ 놀이를 할 것이다. 2장, “전자 회로의 조합 논리” 이번 장은 숫자 대신 비트를 사용하는 게 합리적인 이유를 보여주고, 이 합리성을 디지털 컴퓨터에서 찾아본다. 이 과정에서 요즘 우리가 사용 중인 기술에 이르는 길을 만들어준 오래된 기술을 살펴본다. 2장에서는 조합 논리의 기본을 설명하고, 더 복잡한 기능을 비트와 논리를 사용해 만드는 방법을 배운다. 3장, “메모리와 디스크의 핵심: 순차 논리” 여기서는 논리를 사용해 메모리를 만드는 방법을 배운다. 그리고 메모리는 시간이 지나도 유지되는 상태에 불과하므로, 어떻게 시간을 생성하는지 살펴본다. 3장에서는 순차 논리의 기본을 설명하고, 여러 가지 메모리 기술에 대해 논의한다. 4장, “컴퓨터 내부 구조” 이 장은 앞에서 소개한 논리와 메모리를 사용해 컴퓨터를 구성하는 방법을 보여준다. 여러 가지 구현 방법론을 살펴본다. 5장, “컴퓨터 아키텍처와 운영체제” 5장에서는 4장에서 살펴본 기본 컴퓨터에 몇 가지 장치를 추가한다. 필수적인 기능과 효율성을 어떻게 컴퓨터에 제공할 수 있는지 배운다. 6장, “입출력과 네트워킹”컴퓨터는 바깥 세상과 상호작용할 필요가 있다. 6장에서는 입력과 출력(I/O)을 다룬다. 그리고 디지털과 아날로그의 차이를 살펴보고, 어떻게 디지털인 컴퓨터가 아날로그인 세상과 함께 일할 수 있는지 알아본다. 7장, “데이터 구조와 처리”이제 컴퓨터의 동작을 배웠으므로, 컴퓨터를 더 효율적으로 사용하는 방법을 배워야 한다. 컴퓨터 프로그램은 메모리에 있는 데이터를 조작한다. 따라서 해결하려는 문제에 따라 프로그램이 메모리를 사용하는 방식을 적절히 매핑하는 것이 중요하다. 8장, “프로그래밍 언어 처리”사람들이 컴퓨터를 더 쉽게 프로그램하기 위해 언어를 발명했다. 8장에서는 언어를 컴퓨터가 실제로 실행할 수 있는 어떤 것으로 변환하는 과정을 보여준다. 9장, “웹 브라우저” 웹 브라우저에서 사용하기 위한 프로그램이 많이 작성된다. 9장에서는 웹 브라우저가 어떻게 작동하는지 살펴보고, 웹 브라우저를 이루는 주요 구성요소에 대해 알아본다. 10장, “애플리케이션 프로그래밍과 시스템 프로그래밍”애플리케이션 계층과 시스템 계층에서 실행되는 두 가지 버전의 프로그램을 작성하며, 애플리케이션과 시스템 수준 프로그래밍의 여러 가지 차이점을 보여준다. 11장, “성능 향상을 위한 알고리즘 기법”프로그램을 효율적으로 만드는 것이 중요하다. 11장에서는 프로그램이 불필요한 작업을 하지 않게 해서 프로그램을 더 효율적으로 만들고 성능을 향상하는 방법을 살펴본다. 12장, “병렬성과 비동기성”하나 이상의 컴퓨터가 들어 있는 시스템이 아주 많다. 12장에서는 여러 컴퓨터가 서로 협력하면서 문제를 해결하려고 하는 경우에 생기는 여러 가지 문제를 살펴본다. 13장, “컴퓨터 보안”컴퓨터 보안은 고급 주제다. 13장에서는 보안의 기본을 소개하면서 보안에 필요한 고급 수학을 잠깐 시도해본다. 14장, “세상을 바꾸는 기계 지능”14장도 고급 주제를 다룬다. 빅데이터, 인공지능, 머신러닝을 조합한 결과로 나타난 새로운 응용에 대해(자율주행부터 광고로 여러분을 미치게 하는 방법에 이르기까지) 다룬다. 15장, “훌륭한 프로그래머가 되기 위한 팁과 경험담”프로그래밍은 아주 체계적이고 논리적인 과정이다. 하지만 프로그램을 왜 하고 어떻게 할지 결정할 때 사람이 연관되는데, 사람은 논리가 부족할 때가 자주 있다. 15장은 실제 세계에서 프로그래밍을 할 때 생기는 문제 중 일부를 다룬다. 이 책의 독자 대상 이 책은 좋은 프로그래머가 되고 싶은 사람을 위한 책이다. 좋은 프로그래머는 어떤 프로그래머일까? 첫 번째이자 가장 중요한 것으로, 좋은 프로그래머는 좋은 비판적 사고와 분석 기술을 지녀야 한다. 복잡한 문제를 해결하기 위해 프로그래머는 프로그램이 올바른 문제를 제대로 해결하는지 판단할 능력을 갖춰야 한다. 이는 생각보다 어렵다. 경험이 많은 프로그래머가 다른 사람의 코드를 보고 짜증을 내면서 “아이고, 이 프로그램은 별다르지 않은 간단한 문제에 대해 정답도 아닌 복잡한 해법을 구현해놓은 것뿐이네요.”라는 주석을 다는 경우도 드물지 않다. 마법사가 사물의 진짜 이름을 배우면서 점점 사물을 지배하는 힘을 얻는 고전적인 판타지에 익숙할 것이다. 세부 사항을 잊어버리는 마법사에게 화가 미칠진저! 좋은 프로그래머는 이런 마법사처럼 사물의 핵심을 파악하면서 세부 사항을 잊어버리지 않는 사람이다. 좋은 프로그래머는 마치 숙련된 장인처럼 예술성을 갖추기도 한다. 마치 영어 원어민들에게도 난해하기로 소문난 제임스 조이스의 소설 『피네간의 경야』 영어 원문처럼 전혀 해독할 수 없는 코드를 보게 되는 경우도 드물지 않다. 모름지기 좋은 프로그래머란 작동할 뿐만 아니라 다른 사람들이 이해하고 유지보수하기 쉬운 코드를 작성한다. 마지막으로, 좋은 프로그래머는 컴퓨터 작동을 잘 이해해야 한다. 기반 지식이 얕으면 복잡한 문제를 잘 풀 수 없다. 이 책은 프로그래밍을 배우고 있지만 깊이 부족으로 인해 불만족스러워 하는 사람을 위한 책이다. 그리고 이미 프로그래밍을 배웠지만 프로그래밍과 컴퓨터에 대해 더 잘 알고 싶어 하는 사람을 위한 책이기도 하다.[지은이의 글]매스매티카(Mathematica)와 울프람(Wolfram) 언어를 만든 스티븐 울프람(Stephen Wolfram)이 쓴 ‘어떻게 컴퓨팅 사고를 가르칠까?(How to Teach Computational Thinking)’라는 블로그 글에는 프로그래밍을 가르치는 방법에 대한 흥미롭지만 상당히 반대되는 관점이 들어 있다. 울프람은 컴퓨팅 사고를 “컴퓨터가 할 일을 지시하기 위해 충분히 명확하게, 충분히 시스템적으로 사물을 수식화하는 방법”이라고 정의했다. 나도 이 정의에 완전히 동의한다. 사실 이 주장은 내가 이 책을 쓰게 된 계기 중 큰 부분을 차지한다. 하지만 프로그램을 배우는 사람이 컴퓨팅 사고를 개발하기 위해 토대가 되는 기술을 배우는 대신, 자신이 개발한 강력한 고수준 도구 등을 사용해야 한다는 울프람의 주장에는 강하게 반대한다. 예를 들어, 미적분학보다 통계학에 대한 관심이 늘어난다는 점을 보면 ‘데이터 주무르기(data wrangling)’가 점점 더 중요한 분야가 되고 있음이 분명하다. 하지만 사람들이 멋진 프로그램에 엄청난 양의 데이터를 입력하는데 이 데이터를 전혀 이해하지 못한다면 어떤 일이 벌어질까? 이럴 경우 한 가지 가능성은 사람들이 재미있어 보이지만 의미가 전혀 없거나 틀린 결과를 만들어내는 것이다. 예를 들어, 마크 지만, 요탐 에렌, 아쌈 엘오스타가 발표한 최근의 연구(「과학 문헌에 유전자 이름 오류가 널리 퍼져 있다(Gene Name Errors Are Widespread in the Scientific Literature)」)에 따르면, 유전학 논문 중 5분의 1가량에 스프레드시트를 잘못 사용해서 생긴 오류가 있다는 사실이 밝혀졌다. 이런 종류의 오류를 생각해보고, 더 강력한 도구가 더 많은 사람들 손에 들어갔을 때 생길 결과를 생각해보라! 사람의 생명에 영향을 끼치는 경우라면 이런 일을 바로잡는 일은 더욱 중요해질 것이다. 하부 기술을 잘 이해하면 무엇이 잘못되고 있는지 알아차리는 능력을 계발할 수 있다. 고수준 도구만 알면 잘못된 질문을 던지기 쉽다. 전동 공구를 사용하려면 먼저 망치 쓰는 법부터 익혀야 한다. 하부 시스템과 도구를 배워둬야 하는 또 다른 이유는 이를 통해 여러분이 새로운 도구를 만들 수 있는 능력을 가질 수 있다는 점이다. 새로운 도구를 만드는 사람은 언제나 필요하며, 도구 사용자가 늘어나면 늘어날수록 이런 사람의 중요성은 더 커진다. 컴퓨터를 잘 이해함으로써 프로그램의 동작에 대한 수수께끼가 풀린다면, 여러분은 분명히 더 나은 코드를 작성할 수 있다. [옮긴이의 글]누구나 프로그래머가 될 수 있지만 누구나 좋은 프로그래머가 될 수 있는 것은 아니다. 자동차를 잘 운전하기 위해 꼭 차를 조립할 수 있어야 하는 것은 아니지만, 최상위 클래스 F1 드라이버가 되려면 드라이빙에 필요한 신체나 정신적인 능력은 물론 레이스에 적합하게 차를 설정하기 위한 다양한 공학적 지식도 필요한 것처럼, 좋은 프로그래머가 되기 위해서는 도메인 지식은 물론 컴퓨터의 동작 원리나 컴퓨터공학 전반에 대해 잘 이해할 필요가 있다. 운이 좋게도 나를 포함한 40대 이상 개발자들은 자라나면서 자연스럽게 컴퓨터 산업의 발달 과정에 맞춰 기술의 지평을 넓힐 수 있었지만, 요즘 컴퓨터에 입문하는 사람들은 지식 생산 속도나 프레임워크와 프로그래밍 언어 변화가 너무나 빨라서 실무에 사용하는 프레임워크와 프로그래밍 언어의 변화나 새로운 기술 트렌드를 좇아가기도 힘들다. 하지만 그렇다고 근본적인 컴퓨터공학에 대한 공부를 포기해서는 안 된다. 컴퓨터가 어떻게 작동하고 프로그래밍의 기초 원리가 무엇인지 이해하면, 직접 작성한 프로그램이 잘 작동하지 않을 때 조금 더 쉽게 문제를 해결할 수 있으며 새로운 기술을 배우고 익힐 때도 훨씬 더 수월할 수 있다. 누군가 좋은 스승이 있어서 하드웨어, 소프트웨어 등의 여러 내용을 잘 알려준다면 가장 좋겠지만, 쉽게 기초를 설명해주면서 컴퓨터공학에 대한 지식을 넓혀나갈 토대를 마련해줄 수 있는 책을 통해 컴퓨터 전반을 이해하는 것도 그에 못지않게 좋은 방법이다. 이 책은 저자가 자원봉사로 학생들을 가르치며 다뤘던 내용을 정리한 책이다. 하드웨어의 토대가 되는 기초 전자회로, 게이트로부터 시작해서 메모리, CPU, I/O, 컴퓨터 아키텍처 전반을 설명하고, 그 위에서 소프트웨어를 작성하는 방법을 웹과 C 프로그램을 통해 맛보여주며, 보안, 인공지능, 알고리즘 등의 내용까지 거의 모든 것을 다루는 컴퓨터공학 개론서라 할 수 있다. 이 책을 쭉 훑어보면서 컴퓨터공학에 대해 전체적으로 감을 잡고, 각 분야를 좀 더 자세히 다룬 책이 나 인터넷 강의 등을 찾아보면서 지식을 넓히는 작업을 꾸준히 하면 어느 순간 내공이 쌓이고 좋은 프로그래머가 된 자기 자신을 발견하게 될 것이다. 아무쪼록 컴퓨터에 관심을 가지는 일반 독자나, 컴퓨터공학을 간략히 살펴보고 싶은 개발자 동료들에게 이 책이 도움이 되길 바란다. - 호주 브리즈번에서, 오현석
|