대부분의개발자들은자신이만든프로그램을움직이는하부기술에대해잘알지못한다.코드가잘도는데구태여근원적인하부기술에신경을써야할까?그렇다.하부기술을밑바닥부터이해하면,프로그램이잘작동하게만들수있고찾기어려운버그에당황하지않게된다.자신이작성한코드가보안문제로인해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프로그램을통해맛보여주며,보안,인공지능,알고리즘등의내용까지거의모든것을다루는컴퓨터공학개론서라할수있다.이책을쭉훑어보면서컴퓨터공학에대해전체적으로감을잡고,각분야를좀더자세히다룬책이나인터넷강의등을찾아보면서지식을넓히는작업을꾸준히하면어느순간내공이쌓이고좋은프로그래머가된자기자신을발견하게될것이다.아무쪼록컴퓨터에관심을가지는일반독자나,컴퓨터공학을간략히살펴보고싶은개발자동료들에게이책이도움이되길바란다.
-호주브리즈번에서,오현석