한 권으로 읽는 컴퓨터 구조와 프로그래밍 (더 나은 소프트웨어 개발을 위한 하드웨어 | 자료구조, 필수 알고리즘 등 프로그래머의 비밀 노트)

한 권으로 읽는 컴퓨터 구조와 프로그래밍 (더 나은 소프트웨어 개발을 위한 하드웨어 | 자료구조, 필수 알고리즘 등 프로그래머의 비밀 노트)

$37.91
Description
컴퓨터는 어떻게 동작하며, 컴퓨터 프로그래밍이란 무엇인가? 개발자가 되기 위해 프로그래밍을 배우는 것은 단지 시작일 뿐이다! 뛰어난 프로그래머가 되려는 개발자는 물론, 비전공자도 재미있게 읽을 수 있는 컴퓨터공학 핵심 강의!

하드웨어의 토대가 되는 기초 전자회로, 게이트부터 시작해서 메모리, CPU, I/O, 컴퓨터 아키텍처 전반을 설명하고, 그 위에서 소프트웨어를 작성하는 방법을 웹과 C 프로그램으로 직접 만들어보며, 보안, 인공지능, 알고리즘 등의 내용에 이르기까지 개발자라면 반드시 알아야 할 커튼 뒤에 감춰진 컴퓨터 구조와 프로그래밍에 대한 거의 모든 것을 다루는 컴퓨터공학 개론서!
저자

조너선스타인하트

JonathanE.Steinhart
1960년대부터엔지니어링을해왔다.중학교때하드웨어설계를시작했고,고등학교때소프트웨어설계를해본경험덕분에여름단기아르바이트로벨전화연구소에서일하는기회를얻을수있었다.클라크슨대학교에서1977년전자공학및컴퓨터과학학사(BSEE)를취득했으며,졸업후텍트로닉스(Tektronix)에서일하다가스타트업을창업했다.그래픽스하드웨어와소프트웨어를설계하고,CAD시스템,그래픽스워크스테이션,회로시뮬레이터,발전소,IC설계용언어등을만들었으며,1987년에는안전이중요한크리티컬시스템엔지니어링에초점을맞춘컨설턴트가되어애플,인텔,썬,웰치알린,룰루등의기업을컨설팅했다.
1990년대부터는전업을조금줄이고,포윈즈비냐드(FourWindsVineyard)라는와인농장경영도겸업하고있다.

목차

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처리
CSS
XML등의마크업언어
자바스크립트
jQuery
SVG
HTML5
JSON
정리

10장.애플리케이션프로그래밍과시스템프로그래밍
▶고수준언어와저수준언어프로그래밍방식비교◀

동물추측프로그램버전1:HTML과자바스크립트프로그램
___애플리케이션수준의뼈대
___웹페이지본문
___자바스크립트
___CSS
동물추측게임버전2:C프로그램
___터미널과명령줄
___프로그램빌드
___터미널과장치드라이버
___문맥전환
___표준I/O
___원형버퍼
___추상화를활용한코드개선
___런타임라이브러리와표준입출력
___버퍼오버플로
___C프로그램
___훈련
정리

11장.성능향상을위한알고리즘기법
▶계산을간소화하는프로그래밍트릭◀

표찾기
___변환
___텍스처매핑
___문자종류판별
정수를사용한계산방법
___직선
___곡선다루기
___다항식
재귀적분할
___나선
___구성적인기하
___시프트와마스크
계산을회피하는그밖의수학적기법들
___멱급수근삿값계산
___CORDIC알고리즘
무작위성과관련있는예제들
___공간을채우는곡선
___L시스템
___스토캐스틱기법
___양자화
정리

12장.병렬성과비동기성
▶컴퓨터는어떻게한번에많은일을하는가◀

경합조건이란무엇인가
공유자원
프로세스와스레드

___트랜잭션과작업크기
___락대기
___교착상태
___단기락구현
___장기락구현
브라우저자바스크립트
비동기함수와프로미스
정리

13장.컴퓨터보안
▶컴퓨터는어떻게데이터를안전하게지키는가◀

보안과프라이버시개요
___위협모델
___신뢰
___물리적보안
___통신보안
___모던타임즈
___메타데이터와감시
___사회적맥락
___인증과권한부여
크립토그래피
___스테가노그래피
___치환암호
___전치암호
___더복잡한암호
___일회용패드
___키교환문제
___공개키암호
___전방향안전성
___암호학적해시함수
___디지털서명
___공개키인프라
___블록체인
___패스워드관리
보안을위한소프트웨어예방조치
___올바른대상을보호하라
___로직은세번체크하라
___오류를검사하라
___공격표면을최소화하라
___경계내부에머물러라
___좋은난수를생성하기는힘들다
___네코드를알라
___극단적인영리함은여러분의적이다
___눈에보이는것을이해하라
___과다수집하지마라
___모아두지마라
___동적메모리할당은여러분의친구가아니다
___가비지컬렉션도여러분의친구가아니다
___코드역할을하는데이터
정리

14장.세상을바꾸는기계지능
▶미래를열어가는인공지능,머신러닝,빅데이터◀

개요
머신러닝
___베이즈
___가우스
___소벨
___캐니
___특성추출
___인공신경망
___머신러닝데이터의활용
인공지능
빅데이터
정리

15장.훌륭한프로그래머가되기위한팁과경험담
▶알아두면좋은실무상식과조언◀

가치제안
소프트웨어개발의발자취
___간추린역사
___오픈소스소프트웨어
___크리에이티브커먼즈
___이식성의발전
___패키지관리
___컨테이너
___자바
___노드
___클라우드컴퓨팅
___가상머신
___이동식장치
프로그래밍환경
___초보프로그래머도경험을얻는방법
___추정하는방법배우기
___프로젝트스케줄링
___의사결정
___성향이다른사람들과함께일하기
___직장내문화다루기
___정보를얻은상태에서선택하기
개발방법론
프로젝트설계
___생각을글로써보자
___빠른프로토타이핑
___인터페이스설계
___코드를재활용할것인가,직접작성할것인가
프로젝트개발
___나이든개발자의잡설
___이식성이있는코드
___소스코드제어
___테스트
___버그보고와추적
___리팩토링
___유지보수
스타일을지켜라
기존프로젝트를활용하라
정리

출판사 서평

대부분의개발자들은자신이만든프로그램을움직이는하부기술에대해잘알지못한다.코드가잘도는데구태여근원적인하부기술에신경을써야할까?그렇다.하부기술을밑바닥부터이해하면,프로그램이잘작동하게만들수있고찾기어려운버그에당황하지않게된다.자신이작성한코드가보안문제로인해9시뉴스에나오기를원하는사람은없을것이다.
수많은기술에대한상세자료가이미온라인에존재한다.하지만대부분이런자료들은잘정리되어있지않으며,한꺼번에정리해모아둔곳을찾기도어렵다.
백전노장엔지니어인조너선스타인하트가쓴이책은컴퓨터의토대가되는개념을밀도있게탐구한다.또한컴퓨터하드웨어의내부구조는물론,하드웨어위에서소프트웨어가작동하는원리,그리고소프트웨어기술발전과함께역사속에서사람들은기술을사용해어떻게문제를풀어왔는지등의다양하고도심도있는내용을다룬다.
저자는컴퓨터라는기계에서프로그램코드가실행될때벌어지는지일들에대해여러분이미처몰랐던,혹은잊었던이야기들을들려준다.더나은소프트웨어와효율적인코드를작성하는법을깨우치는데필요한탄탄한기초를다질수있는책이다.

|이책에서다루는내용|
●실제세계를컴퓨터가이해할수있는형태인비트,논리,숫자,텍스트,색등으로변환하는원리와방법
●논리게이트,가산기,디코더,레지스터,메모리등컴퓨터를이루는기본블록
●성능향상의관점에서컴퓨터하드웨어,특히메모리를고려해프로그램을설계해야하는이유
●프로그램이컴퓨터가이해할수있는기계어로변환되는과정
●소프트웨어구성요소를조합해웹브라우저같은프로그램을만드는방법
●루프불변조건,강도감소,재귀적분할등,프로그램을더효율적으로만들기위한알고리즘과프로그래밍트릭
●컴퓨터보안과인공지능,머신러닝,빅데이터의이해
●프로젝트설계,문서화,스케줄링,이식성,유지보수등현장에서벌어지는프로그래밍실무에관한경험담과조언

|이책의구성|
이책은개념적으로세부분으로나뉜다.첫번째부분은컴퓨터하드웨어를탐구한다.하드웨어가무엇이고하드웨어를어떻게만드는지살펴본다.두번째부분은하드웨어에서소프트웨어가어떻게작동하는지살펴본다.마지막부분은프로그래밍기술,즉다른사람들과협력해더나은프로그램을만드는방법에대한것이다.

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장은실제세계에서프로그래밍을할때생기는문제중일부를다룬다.

|이책의독자대상|
이책은좋은프로그래머가되고싶은사람을위한책이다.좋은프로그래머는어떤프로그래머일까?첫번째이자가장중요한것으로,좋은프로그래머는좋은비판적사고와분석기술을지녀야한다.복잡한문제를해결하기위해프로그래머는프로그램이올바른문제를제대로해결하는지판단할능력을갖춰야한다.이는생각보다어렵다.경험이많은프로그래머가다른사람의코드를보고짜증을내면서“아이고,이프로그램은별다르지않은간단한문제에대해정답도아닌복잡한해법을구현해놓은것뿐이네요.”라는주석을다는경우도드물지않다.
마법사가사물의진짜이름을배우면서점점사물을지배하는힘을얻는고전적인판타지에익숙할것이다.세부사항을잊어버리는마법사에게화가미칠진저!좋은프로그래머는이런마법사처럼사물의핵심을파악하면서세부사항을잊어버리지않는사람이다.
좋은프로그래머는마치숙련된장인처럼예술성을갖추기도한다.마치영어원어민들에게도난해하기로소문난제임스조이스의소설『피네간의경야』영어원문처럼전혀해독할수없는코드를보게되는경우도드물지않다.
모름지기좋은프로그래머란작동할뿐만아니라다른사람들이이해하고유지보수하기쉬운코드를작성한다.
마지막으로,좋은프로그래머는컴퓨터작동을잘이해해야한다.기반지식이얕으면복잡한문제를잘풀수없다.이책은프로그래밍을배우고있지만깊이부족으로인해불만족스러워하는사람을위한책이다.그리고이미프로그래밍을배웠지만프로그래밍과컴퓨터에대해더잘알고싶어하는사람을위한책이기도하다.

[옮긴이의글]
누구나프로그래머가될수있지만누구나좋은프로그래머가될수있는것은아니다.자동차를잘운전하기위해꼭차를조립할수있어야하는것은아니지만,최상위클래스F1드라이버가되려면드라이빙에필요한신체나정신적인능력은물론레이스에적합하게차를설정하기위한다양한공학적지식도필요한것처럼,좋은프로그래머가되기위해서는도메인지식은물론컴퓨터의동작원리나컴퓨터공학전반에대해잘이해할필요가있다.
운이좋게도나를포함한40대이상개발자들은자라나면서자연스럽게컴퓨터산업의발달과정에맞춰기술의지평을넓힐수있었지만,요즘컴퓨터에입문하는사람들은지식생산속도나프레임워크와프로그래밍언어변화가너무나빨라서실무에사용하는프레임워크와프로그래밍언어의변화나새로운기술트렌드를좇아가기도힘들다.하지만그렇다고근본적인컴퓨터공학에대한공부를포기해서는안된다.컴퓨터가어떻게작동하고프로그래밍의기초원리가무엇인지이해하면,직접작성한프로그램이잘작동하지않을때조금더쉽게문제를해결할수있으며새로운기술을배우고익힐때도훨씬더수월할수있다.
누군가좋은스승이있어서하드웨어,소프트웨어등의여러내용을잘알려준다면가장좋겠지만,쉽게기초를설명해주면서컴퓨터공학에대한지식을넓혀나갈토대를마련해줄수있는책을통해컴퓨터전반을이해하는것도그에못지않게좋은방법이다.
이책은저자가자원봉사로학생들을가르치며다뤘던내용을정리한책이다.하드웨어의토대가되는기초전자회로,게이트로부터시작해서메모리,CPU,I/O,컴퓨터아키텍처전반을설명하고,그위에서소프트웨어를작성하는방법을웹과C프로그램을통해맛보여주며,보안,인공지능,알고리즘등의내용까지거의모든것을다루는컴퓨터공학개론서라할수있다.이책을쭉훑어보면서컴퓨터공학에대해전체적으로감을잡고,각분야를좀더자세히다룬책이나인터넷강의등을찾아보면서지식을넓히는작업을꾸준히하면어느순간내공이쌓이고좋은프로그래머가된자기자신을발견하게될것이다.아무쪼록컴퓨터에관심을가지는일반독자나,컴퓨터공학을간략히살펴보고싶은개발자동료들에게이책이도움이되길바란다.
-호주브리즈번에서,오현석