메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

자바스크립트로 배우는 SICP

컴퓨터 프로그램의 구조와 해석

한빛미디어

번역서

판매중

  • 저자 : 해럴드 에이블슨 , 제럴드 제이 서스먼 , 마틴 헨즈 , 토비아스 브릭스타드 , 줄리 서스먼
  • 번역 : 류광
  • 출간 : 2022-12-30
  • 페이지 : 884 쪽
  • ISBN : 9791169210621
  • eISBN : 9791169216548
  • 물류코드 :11062
  • 초급 초중급 중급 중고급 고급
4.9점 (29명)
좋아요 : 19

모든 프로그래머는 마법사다

 

난해한 프로그래밍 언어로 만들어진 컴퓨터 프로그램. 프로그램은 일정한 패턴을 따라 주어진 과제를 해결해 나간다. 즉, 프로그래머는 프로그램이라는 주문을 외워 컴퓨터에 깃든 영혼을 부리는 마법사인 셈이다. 여기 모든 마법사를 위한 마법사 책이 찾아왔다. 이 책은 모든 프로그래밍 언어에서 유용한 사고법과 그 표현법을 소개해 프로그램을 효율적으로 조직화하는 법을 알려준다. 이제 뛰어난 마법사의 비법을 알아보자.

 

 

700px_자바스크립트로 배우는 SICP.jpg

해럴드 에이블슨 저자

해럴드 에이블슨

MIT 컴퓨터 과학 및 공학 학부 클래스 오브 1922 교수(Class of 1922 Professor of Computer Science and Engineering)

제럴드 제이 서스먼 저자

제럴드 제이 서스먼

MIT 전기공학부 파나소닉 교수(Panasonic Professor of Electrical Engineering)

 

마틴 헨즈 저자

마틴 헨즈

싱가포르 국립대학교 컴퓨터 과학 부교수(Associate Professor of Computer Science)

토비아스 브릭스타드 저자

토비아스 브릭스타드

웁살라 대학교의 컴퓨터 과학 교수

줄리 서스먼 저자

줄리 서스먼

프로그래머 출신 편집자 겸 작가

류광 역자

류광

25년 이상의 번역 경력을 가진 전문 번역가로, 『컴퓨터 프로그래밍의 예술』(The Art of Computer Programming) 시리즈와 『UNIX 고급 프로그래밍』(Advanced Programming in UNIX Environment ) 제2판 및 제3판, 『인공지능: 현대적 접근방식』(Artificial Intelligence: A Modern Approach) 제3판 및 제4판, 『Game Programming Gems』 시리즈를 비롯해 80권 이상의 다양한 IT 전문서를 번역했다. 본서와 관련이 깊은 번역서로는 『유연한 소프트웨어를 만드는 설계 원칙』(한빛미디어, 2020)이 있다.

 

개인 웹사이트 류광의 번역 이야기(https://occamsrazr.net)와 게임 개발 웹사이트 Gpg Study(https://gpgstudy.com)를 운영한다. 

 

 

제1장 함수를 이용한 추상화

1.1 프로그래밍의 기본 요소

1.1.1 표현식

1.1.2 이름 붙이기와 환경

1.1.3 연산자 조합의 평가

1.1.4 복합 함수

1.1.5 함수 적용의 치환 모형

1.1.6 조건부 표현식과 술어

1.1.7 예제: 뉴턴 방법으로 제곱근 구하기

1.1.8 블랙박스 추상으로서의 함수

1.2 함수와 과정(함수가 생성하는)

1.2.1 선형 재귀와 반복

1.2.2 트리 재귀

1.2.3 증가 차수

1.2.4 거듭제곱

1.2.5 최대공약수

1.2.6 예제: 소수 판정

1.3 고차 함수를 이용한 추상의 정식화

1.3.1 함수를 받는 함수

1.3.2 람다 표현식을 이용한 함수 구축

1.3.3 일반적 방법으로서의 함수

1.3.4 함수를 돌려주는 함수

 

제2장 데이터를 이용한 추상화

2.1 데이터 추상화

2.1.1 예제: 유리수 산술 연산

2.1.2 추상화 장벽

2.1.3 데이터란 무엇인가?

2.1.4 심화 연습문제: 구간 산술

2.2 위계적 데이터와 닫힘 성질

2.2.1 순차열의 표현

2.2.2 위계적 구조

2.2.3 합의된 인터페이스로서의 순차열

2.2.4 예제: 그림 언어

2.3 기호 데이터

2.3.1 문자열

2.3.2 예제: 기호 미분

2.3.3 예제: 집합의 표현

2.3.4 허프먼 부호화 트리

2.4 추상 데이터의 다중 표현

2.4.1 복소수의 여러 표현

2.4.2 태그된 데이터

2.4.3 데이터 지향적 프로그래밍과 가산성

2.5 일반적 연산을 갖춘 시스템

2.5.1 일반적 산술 연산

2.5.2 형식이 서로 다른 데이터 객체들의 결합

2.5.3 예제: 기호 대수

 

제3장 모듈성, 객체, 상태

3.1 배정과 지역 상태

3.1.1 지역 상태 변수

3.1.2 배정 도입의 이득

3.1.3 배정 도입의 비용

3.2 평가의 환경 모형

3.2.1 평가 규칙들

3.2.2 간단한 함수 적용의 예

3.2.3 지역 상태 저장소로서의 프레임

3.2.4 내부 선언

3.3 변경 가능 데이터를 이용한 모형화

3.3.1 변경 가능 목록 구조

3.3.2 대기열의 표현

3.3.3 테이블의 표현

3.3.4 디지털 회로 시뮬레이터

3.3.5 제약의 전파

3.4 동시성: 시간은 필수요건이다

3.4.1 동시적 시스템에서 시간의 본질

3.4.2 동시성 제어 메커니즘

3.5 스트림

3.5.1 지연 평가를 이용한 스트림 표현

3.5.2 무한 스트림

3.5.3 스트림 패러다임의 활용

3.5.4 스트림과 지연 평가

3.5.5 함수형 프로그램의 모듈성과 객체의 모듈성

 

제4장 메타언어적 추상화

4.1 메타순환적 평가기

4.1.1 평가기의 핵심부

4.1.2 구성요소의 표현

4.1.3 평가기의 자료 구조들

4.1.4 평가기의 실행

4.1.5 프로그램으로서의 데이터

4.1.6 내부 선언들

4.1.7 구문 분석과 실행의 분리

4.2 느긋한 평가

4.2.1 정상 순서와 적용적 순서

4.2.2 느긋한 평가를 이용하는 해석기

4.2.3 느긋한 목록으로서의 스트림

4.3 비결정론적 컴퓨팅

4.3.1 검색과 amb

4.3.2 비결정론적 프로그램의 예 몇 가지

4.3.3 amb 평가기의 구현

4.4 논리 프로그래밍

4.4.1 연역적 정보 검색

4.4.2 질의 시스템의 작동 방식

4.4.3 논리 프로그래밍과 수리논리학의 관계

4.4.4 질의 시스템의 구현

 

제5장 레지스터 기계를 이용한 계산

5.1 레지스터 기계의 설계

5.1.1 레지스터 기계의 서술을 위한 언어

5.1.2 기계 설계의 추상들

5.1.3 서브루틴

5.1.4 스택을 이용한 재귀 구현

5.1.5 명령 요약

5.2 레지스터 기계 시뮬레이터

5.2.1 기계 모형

5.2.2 어셈블러

5.2.3 명령과 명령 실행 함수

5.2.4 기계 성능의 감시와 측정

5.3 저장소 할당과 쓰레기 수거

5.3.1 벡터 구조로 표현된 메모리

5.3.2 무한 메모리라는 환상의 유지

5.4 명시적 제어 평가기

5.4.1 디스패처와 기본 평가 서브루틴

5.4.2 함수 적용의 평가

5.4.3 블록, 배정, 선언

5.4.4 평가기의 실행

5.5 컴파일

5.5.1 컴파일러의 구조

5.5.2 구성요소들 컴파일

5.5.3 함수 적용과 반환문의 컴파일

5.5.4 명령렬들의 조합

5.5.5 컴파일된 코드의 예

5.5.6 어휘순 주소 접근

5.5.7 컴파일된 코드와 평가기의 연동

SICP, 자바스크립트를 만나다 

 

프로그래밍의 바이블 『컴퓨터 프로그램의 구조와 해석』(SICP)이 자바스크립트를 만났다. 1985년부터 지금까지 전 세계 수많은 교육기관에서 교과서로 채택되며 컴퓨터 과학 교과과정에 영향을 미친 이 책은 프로그래머 사이에서 마법사 책(Wizard Book)이라는 별명으로 유명하다. SICP는 사실 모든 프로그래밍 언어에서 사용하기 유용하고 강력한 프로그램 조직화 방법을 소개하지만 스킴(Scheme)이라는 언어를 사용해 진입 장벽이 있었다. 이 책은 그런 SICP를 많은 개발자들에게 친숙한 언어인 자바스크립트로 옮긴 책이다. 여러분의 사고법을 바꿔줄 설명과 이를 적용해보는 연습문제를 통해 마법 능력을 한껏 키워보자.

 

 

대상 독자

  • 프로그래밍적인 사고법을 배우고 싶은 학생
  • 효율적인 프로그램을 만들려는 개발자
  • 스킴이라는 생소한 언어 때문에 SICP에 엄두를 내지 못했던 독자

 

배우는 내용

  • 고수준 프로그래밍 언어에 공통으로 적용되는 프로그래밍 개념
  • 다른 언어를 사용해 새 언어를 확립하는 기술
  • 하드웨어 설계자의 관점에서 프로그래밍 요소를 구현하는 법

 

추천사

 

“‘더 나은 프로그래머가 되려면 어떻게 해야 하나요?’라고 묻는 이에게 이 책을 추천한다.”

_더글러스 크락포드, 『자바스크립트는 왜 그 모양일까?』의 저자

 

“뛰어난 재능과 탁월한 교수법, 새로운 내용으로 세심하게 개정하고 현대화한 고전.”

_올리비에 댄비, 예일-NUS 대학

 

“프로그래밍 서적은 프로그래밍 언어에 얼마나 많은 영향을 받을까? 이 책은 SICP를 자바스크립트로 훌륭하게 옮겼다. 오늘날의 프로그래머에게 탁월한 선택이다.”

_피터 판 로이, 루뱅 카톨릭 대학교

이 책은 기본적으로 컴퓨터 위에서 동작하는 프로그램을 어떻게 만들고, 해당 프로그램이 어떻게 동작되는지 알려주기 때문에

컴파일러부터 앱까지 굉장히 방대한 부분을 전반적으로 다룬다. 근데 본인은 수학적인 내용이 너무 어렵게 느껴졌다...

2022년 12월 말에 출간된 <자바스크립트로 배우는 SICP>를 소개합니다. 이 책의 부제는 <컴퓨터 프로그램의 구조와 해석>입니다. 개인적으로 이 책의 제목을 매우 잘 정의한 것 같습니다. 'Structure and Interpretation of Computer Programs'는 마법사 책이라고도 하고, 컴퓨터 사이언스 세계의 바이블 중 하나라고 불리기도 합니다. MIT 컴퓨터 과학 입문 교과 과정에서 사용한 교과서였습니다. 

 

이 책은 어렵기로 소문이 나 있습니다. 기본적으로 책 내용도 어렵고 난해하지만, 이 책에서 사용한 프로그래밍 언어가 스킴(Scheme)을 사용하는 부분이 큰 영향을 주었습니다. 그 부분을 자바스크립트로 바꾸어 출간한 책이 바로 이 책입니다. 

 

이 책의 저자는 기존 SICP의 저자인 헤럴드 에이블슨(Harold Abelson) 교수님과 제럴드 제이 서스먼(Gerald Jay Sussman) 교수님 외 3분이 더 있습니다. 그리고 역자는 류광 님으로 이름만 들어도 누군지 대부분 아실 것으로 생각합니다. 

 

이 책의 원서는 아마존에서 5점 만점에 4.5 점을 받고 있으며, 원서는 2022년 4월 초에 출간되었습니다.  

 

<자바스크립트로 배우는 SICP>는 약 880페이지로 구성되어 있어 휴대하면서 읽기는 어렵습니다. 분철하거나 전자책으로도 출간되어 있으므로 전자책 뷰어가 있으면 전자책으로 만나보는 것도 좋을 것 같습니다. 참고로 필자도 전자책으로 봤습니다. 

 

한빛미디어 평가단에 참가하여 작성한 글이며, 한빛미디어에서 제공해준 책을 읽고 작성했음을 밝힙니다. 

 

이 책의 매력은?

<자바스크립트로 배우는 SICP>는 5장으로 구성되어 있습니다. 1장 함수를 이용한 추상화부터 5장 레지스터 기계를 이용한 계산으로 구성되어 있는데, 1부터 3장까지는 모든 고수준 프로그래밍 언어에 공통인 프로그램 개념들을 다루고 있습니다. 1~4장은 개발자라면 누구나 한 번쯤 읽어보는 것을 추천합니다만, 5장은 해당 분야에 관심이 있는 분이라면 재미있게 읽으실 수 있을 것입니다. 필자는 전 챕터가 마음에 들어 정독으로 완독할 생각입니다. 여러 번 봐야 할 책 목록에 저장해야 할 것 같습니다. 그만큼 매력적인 요소가 많은 부분에 담긴 책입니다.

 

처음에는 어렵고 불친절하게 느껴질 수 있습니다. 이 책은 교과서 목적으로 만들어지고, 단순히 따라 하기 책이 아니기 때문에  최근에 출간된 책들에 익숙하신 분들은 흥미롭지 않을 수 있습니다. 하지만 마음을 가다듬고 차분히 읽어 나간다면 다른 책에서 느낄 수 없는 이 책의 고유 매력을 느끼실 수 있을 것입니다. 예전에 느꼈던 이 감정을 이 책을 읽으면서 다시 한번 느끼고 있습니다. 속도를 생각하지 않고, 꾸준하게 읽어 나가면 생각보다  어려운 책은 아닙니다. 이 책은 교과서답게 설명이 매우 친절하게 잘 되어 있고, 번역도 만족스럽습니다. 차분하게 예제와 연습 문제를 풀이해 나가면 이 책이 가진 고유의 매력에 흠뻑 빠질 수 있을 것입니다. 

 

예전에는 생소한 언어인 스킴으로 작성되어 이 책을 접하기 어려웠는데, 자바스크립트로 다시 쓰여서 많은 부분에서 이해도가 높아진 것 같습니다. 물론 스킴이 가진 고유 장점을 자바스크립트로 표현하기 어려워서 더 복잡해진 코드도 있습니다만, 전체적으로 많은 독자가 이해하기에는 기존 방법보다 이 접근법이 더 나은 접근법이라는 생각이 듭니다. 

 

마치면서

짧은 리뷰 기간에 이 책을 모두 읽고 리뷰하는 것은 불가능했습니다. 예전에 이 책의 전 작품을 한 번 봤었음에도 다시금 어려움을 느끼면서 이 책을 읽고 있습니다. 책의 내용을 모두 읽고 리뷰를 하는 것이 원칙이지만, 책의 분량으로 말미암아 제게는 매우 어려운 일이었습니다. 

 

혹자는 이 책이 현재 컴퓨터 사이언스에서 다루기에는 너무 동떨어진 내용을 이야기한다고도 하지만, 저는 그렇게 생각하지 않습니다. 이 책이 지닌 고유하고 특수한 매력은 또 다른 감동을 줍니다. 아마도 이 책을 완독하기에는 오래 걸릴 것 같습니다만, 완독하고 싶은 재미있는 책입니다. 예전에 읽었던 좋은 느낌을 안고 다시 읽고 있습니다. 좋은 책을 출간해 주셔서 감사합니다. 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

이번에 SICP 책도 아직 안보긴 했는데, 이 책의 자바스크립트 버전으로 나와서 한번 신청해서 봤다. 이번에 특이하게 EBook으로도 신청할 수 있어서 신청했다. EBook으로 신청하니 구글북스로 주더라.

 

 

이 책은 약간 프로그래밍 자체에 대해서 다루면서 어떻게 하면 조직적인 코드를 짤 수 있을까 하면서 방법론을 제시하고 그에 해당하는 예시와 연습문제로 구성되어 있다.

 

 

확실히 자바스크립트 버전으로 나와서인지 책이나 예제, 연습문제를 시도하는데 큰 무리가 없어졌다. 근데 코딩 스타일은 여전히 스킴 스타일로 되어 있기도 하고, 자바스크립트 적인 코드는 없다.

 

 

이 책을 아직 다 읽어보진 못했지만, 많은 부분에서 인사이트를 얻을 수 있었다. 단순한 개념으로 가져갔던 표현식에 대해서도, 먼저 개념과 원리를 살피고, 그것에 대한 구현방법을 생각하고, 그것이 프로그래밍 언어로는 어떤것이다 하면서 그것에 대한 예제 코드와 연습문제가 주어지는 방식이었다. 확실히, 가볍게 생각하고 있던 많은 부분들을 다시금 생각하게 되어서 유익했다.

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

sicp.png

 

 

SICP 약자는 생소했지만 영어로 풀어 쓰면 Structure and Interpretation of Computer Programs 이다. 즉 컴퓨터 프로그램의 구조와 해석인데

 

이걸 자바스크립트 버전으로 책이 쓰여졌다는 것이다. 항상 이런 분류의 책들은 Scheme으로 다룬 책들이 대부분이라는데, 자바스크립트에 익숙한 

 

나에게는 반가운 책이 아니였나 싶다. 기본이자 근간을 이루는 원리는 이해하고 응용을 하는 것이 가장 효과적이지 않나 싶다. 요새는 편리한 라이브러리들을 많이 사용하고 있지만, 근본은 가장 기본적인 것부터 제대로 다루어야 할 줄 알기 때문이다. 그런점에 이 책은 많은 자바스크립트 개발자들이 친숙하게 볼 수 있는 책이지 않나 싶다.

 

특히, 1장부터 함수를 다루고 있기 때문에 요새 고차원 함수를 다루기 어려웠던 분들이라면 기본기를 제대로 쌓을 수 있을 것 같다. 또한 외국의 유수 대학들이

 

교과서로 쓰기 위해서 만든 책이기 때문에 내용이 탄탄하고, 중간중간 문제들이 나와있어 이런 문제들을 하나 둘씩 풀다보면 알고리즘 시험을 준비하는데도

 

분명 도움이 될 것이라고 생각된다. 아직 다 읽진 못했지만, 내가 대학교 다닐 때 이런 책으로 기본을 다졌다면 좋았을텐데라는 생각이 저절로 들었다.

 

그만큼 기본서로 꼭 읽어볼만한 책인 것 같다. 또한 자바스크립트로 쓰여졌지만, 자바스크립트를 배우기 위한 책이 아니라는 것도 분명히 알아야 한다.

 

제목 그대로 프로그램의 구조와 해석을 자바스크립트로 다가가기 쉽게 한 것이지 근본은 그 원리를 배우는 것이기 때문이다. 하지만 어려운 코드는 거의

 

없기 때문에 자바스크립트를 조금이라도 써 본 사람들은 이론을 이해하면 예제는 어렵지 않게 볼 수 있게 되어 있는 것 같다. 그런 점이 특히 더 마음에

 

들었던 것 같다. 

 

책 분량도 883페이지에 달해 분량이 어마어마하지만, 자바스크립트 개발자로 기본을 튼실히 하고 싶은 개발자라면 꼭 한 번 읽어보길 추천하는 책이다. 

 

마지막으로 번역을 하신 류광님도 IT분야에서 웍낙 유명한 책들을 많이 번역하셔서, 믿고 볼 수 있는 책이라고 생각한다.  

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

IMG_8150.jpg

 


자바스크립트로 배우는 SICP

자바스크립트로 배우는 SICP는 "마법사책"으로 불리우던 책으로 원래 이름은 컴퓨터 프로그램의 구조와 해석이다(Structure and Interprctation of Computer Programs)

 

첫 판이 나온 게 1984년이니 책이 나온 지도 40여년이 되는 샘이다. 그간 2판이 한번 나오고 이번에 한빛미디어에서 나온 판은 2판까지 Scheme을 기반으로 했던 것을 Javascript로 변경해서 내놓은 Javascript edtion의 번역서가 되겠다.

책에서 기반으로 하는 언어는 Javascript로 변경되었어도 표지 에서도 보이듯이 Scheme의 로고는 빠지지 않고 자리하고 있다. 마법사의 모자도 함께.

 

책을 받아 들고 옮긴이 소개와 옮긴이의 말 부분 부터 읽어 나갔는데 추천사 10페이지, 머리말 8페이지, 감사의 글 6페이지에서 알 수 있듯이 전체 페이지가 무척이나 많다 (883페이지) 책이 오래전에 나와서 인 것인지, 수업을 위한 내용으로 나와서 그런 것인지 철학서 느낌을 받았다. 그리고 이미 알고 있던 표기가 아닌 다른 표기로 번역된 부분이 있어 이 부분에 대한 적응이 좀 필요하다.

 

Javascript edition이라고 해서 Javascript기초 학습을 해야 이해 할 수 있는 것은 아니다. Javascript기반의 개발을 학습 하는 것이 아니라 컴퓨터가 어떻게 구문을 해석하고 작동 시키는 지를 Javascript 기반으로 설명하고 있어 전혀 모르고 책을 읽어 나갈 수 있다. Javascript를 이해하고 있다면 조금 더 빠르게 읽어 나갈 수 있을 것이다. 하지만 속도가 중요한 것은 아니다. 차근차근 읽어 나가면 어느 순간 마지막에 다다르지 않을까 한다. 또 중간중간 연습 문제들이 있는데 이들 문제 푸는 것이 요세 대학생들, 취업 준비생들 사이에 유행하는 코딩 테스트보다 더 유용하지 않을까 한다.

 

컴퓨터 과학계 도서 고전 중에 하나인 공룡책(Operating System Concepts)도 1983년 처음 나오고 현재 까지 10판에 걸쳐 업데이트 되어 나오고 있는데, 컴퓨터 프로그램의 구조와 해석도 Javascript edition 말고 python 이나 다른 edition으로의 출판도 나오지 않을까 생각이 든다.

서문 중에 너무도 인상 깊던 몇 줄로 마무리 하고자 한다.

 

이 과목에 대한 우리의 접근 방식에는 '컴퓨터 과학'이 사실은 과학이 아니며, 컴퓨터 과학의 중요성은 컴퓨터와 별로 관련이 없다는 우리의 신념이 깔려있다. 컴퓨터 혁명이 혁신적으로 바꾸는 것은 우리가 생각하는 방식과 그 생각을 표현하는 방식이다. 그러한 변화의 핵심은 절차적 인식론(procedural epistemology)이라고 부를 만한 분야의 탄생이다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

0.jpeg

 

 

 

웹 개발에 관심 있으신 분들이라면 자바스크립트를 다들 알고 계실 것 같습니다!

이 책은 자바스크립트 언어를 기반으로 컴퓨터 프로그램의 구조를 알려주는 자료구조와 관련된 책이기도 합니다!!

 

 

1.jpeg undefined undefined 4.jpeg 5.jpeg

 

 

 

 

책의 차례를 보시면 아시겠지만 단순히 자바스크립트를 설명하거나

자료구조를 설명하는 내용이 아니라 상세하게 풀어서 설명해주시고

코드와 예시 문제를 통해 자바스크립트를 통해 짜는 자료구조 코드를 체화할 수 있도록 만들어졌습니다!!

 

 

 

6.jpeg

 

KakaoTalk_Photo_2023-02-26-23-44-28 008.jpeg

 

 

 

 

이렇게 예시 문제가 있어서 보면서 공부할 수 있더라고요!!

 

컴공 관련 학과를 진학해서 자료구조를 필수로 배워야하고 자료구조에 기본이 잘 되어 있어야

알고리즘을 배울 때 쉽다고 하더라고요!!

 

마침 이번학기에 자료구조를 배우고 파이썬을 통해 코드를 짤 거 같은데

자바스크립트에도 관심이 있기 때문에 이 책을 보면서 자바스크립트로 짠 자료구조 코드와 파이썬으로 짠 코드를 비교해볼 수도 있을 것 같습니다!!

 

자료구조 공부 다들 화이팅하고 알고리즘까지 전진합시다!!

 

 

 

...

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

"프로그래머 필독서"라고 하면 꼭 목록에 포함되는 책 중에 하나입니다. 이전에도 몇 번 원서 읽기를 시도한 경험이 있는데 책이 워낙 내용이 어렵고 양도 많아 번번히 실패하다가 올 초에 자바스크립트 버전이 새로 출간된 걸 서점에서 보고 다시 도전했습니다.

완독을 목표로 하지만 양이 어마무시해서 시간이 오래 걸리더라도 내용을 이해하면서 읽고 싶었습니다. 'SICP 효과적으로 읽는 법'을 찾아보니 꼭 예제를 풀어보라고 해서 예제를 풀면서 읽었습니다.

결과적으로 일단 완독은 아직 멀었고 이제 1장 <함수를 이용한 추상화>을 겨우 다 훑어보았습니다. 함수의 재귀적 과정, 반복적 과정을 비교하는 부분 같이 처음 프로그래밍을 공부할 때 바로 이해하기 어려운 부분은 전체 과정을 시각화해서 풀어서 보여주고 있어서 이해에 도움이 됩니다. 예제를 전부 다 풀지는 못했고 어느 정도 혼자 문제를 풀어보고 정 모르겠는 문제들은 솔루션을 찾아보면서 읽었습니다.

일단 1장을 끝냈으니 2, 3장을 이어서 읽고 다시 1~3장을 읽고 4, 5장은 앞부분을 좀 이해하고 넘어갈 계획입니다.

프로그램이 어떻게 동작하는지 딥다이브해서 공부하는데 큰 도움이 되는 책이라고 생각합니다.

자바스크립트로 배우는 SICP. SICP란 무엇일까? 단어 뜻 그대로 풀어보면 Structure and Interpretation of Computer Programs. 즉 컴퓨터 프로그램의 구조와 해석이란 뜻이다.

해당 책은 MIT에서 CS 입문 과목을 기반으로 쓰여진 책으로 초기에는 스킴이란 언어로 쓰였으나 최근 자바스크립트 기반으로 다시 출판되었다고 한다.

스킴이란 언어가 생소하고 낯설어서 보다 익숙한 자바스크립트로 나왔지만 그럼에도 책의 두께와 내용에 압도되어 쉽게 쉽게 읽히지는 않았다.

 

이 책을 선택했던 이유는 그저 프로그래밍이 돌아가게끔 코드를 짜는데만 고민을 하였지 프로그래밍의 동작 원리와 어떻게 구조가 되어있는지는 크게 관심을 가지지 않았다.

이런 나를 반성하면서 책을 읽기 시작했는데 예상대로 쉽지는 않았지만 많은 부분을 얻고 생각할 수 있었다.

 

 

목차

 

 

함수, 데이터, 메타언어의 추상화, 레지스터 등 평소 깊게 생각하지 않았던 내용들을 다루고 있어서 오랜만에 CS를 제대로 공부한다는 느낌이 들어서 좋았다.

 

책의 두께와 내용의 깊이와 난이도 때문에 쉽게 읽히지는 않지만 읽으면서 진지하게 주변 사람들에게 꼭 읽어보면 좋을 것 같다고 추천해야 할 생각이 들었다.

[선정 이유]
별명이란 그 대상에 대한 애정이 있어야 생길 수 있다. '마법사 책(Wizard Book)'이라는 멋진 별명이 붙은 책이라면 제대로 소화를 못 할지라도 시도할 가치가 있다고 생각했다. 이러한 별명이 붙은 이유는 원서의 표지 때문이기도 하지만 저자들이 프로그램을 마법으로 프로그래머를 마법사로 바라보기 때문이기도 하다.
또 다른 이유는 1984년 초판이 나올 때 사용된 Scheme이라는 언어가 아니라 JavaScript로 다시 쓰였기 때문이다. 프론트엔드 개발자로서 매일 자바스크립트를 다루기 때문에 익숙한 언어로 예제를 볼 수 있다는 점이 메리트로 느껴졌다.

[구성 및 주제]
이 책은 계산적 과정 다시 말해 프로그래밍의 원리에 대한 이해를 돕기 위해 추상화, 데이터, 모듈, 시간, 동시성, 비결정론 등 중요한 주제들을 포괄적으로 다룬다. 단순한 함수부터 작성하기 시작해 차근차근 복잡도를 높여가며 마침내 컴파일러까지 구현하는 과정을 따라가게 되는데 현실 세계의 복잡한 현상들을 프로그래밍하기 위해 사고방식이 어떻게 변화하는지 고민해볼 수 있다.

1장부터 5장까지 계산적 과정에 대한 모형이 변화하고 발전하는 모습을 소개하는데 이는 각 모형이 현실 세계의 복잡한 개념을 표현하기에 한계를 가지기 때문이다. 1장에서는 치환(대입) 모형, 3장에서는 환경 모형, 4장에서는 메타순환적 평가기, 5장에서는 명시적 제어 평가기 그리고 우리가 흔히 아는 컴파일러가 등장한다.

책은 이러한 모형들에 관해 설명할 때 다음과 같은 순서를 따르고 있다. 먼저 표현식을 사용해 개념을 이해하는 데서 출발한다. 이렇게 만들어진 설계를 자바스크립트 코드를 통해 동작하도록 구현한다. 마지막으로 이 구현에 대한 시뮬레이션을 만들어 검증하는 것으로 마무리한다. 중간중간 등장하는 풍부한 연습 문제는 독자들에게 스스로 학습하고 도전할 기회를 제공한다.

[유익한 점]
무엇을 기대했던 내 예상을 벗어났다. 1장에서부터 등장하는 함수는 주인공으로서 책의 마지막 장까지 함께한다. 데이터도 객체도 함수로 표현할 수 있다는 건 다소 충격적이었다. 컴퓨터 프로그램의 구조와 해석에 관해 설명하는 도구가 함수가 될 줄은 몰랐지만 함수에 대한 저자들의 깊은 이해와 함수의 무한한 가능성을 엿볼 수 있었다.

책 전반적으로는 여러 가지 새로운 관점을 제시하고 많은 질문들을 일깨워 주었다. 상수도 함수도 모두 추상화라는 것, 함수와 데이터는 다르지 않다는 것, 시간을 표현하는 방법에 상태뿐 아니라 스트림이 있다는 것, 추상화를 위해서 장벽이 필요하다는 것, 형식을 넘나드는 연산을 구현하는 것이 얼마나 어려운지, ...

프론트엔드 개발자로서 JavaScript나 React를 통해 알게 된 개념에 대해서도 다시 생각해볼 수 있었다. 용어가 직접적으로 등장하지 않는 경우도 있지만 호이스팅, 람다, TDZ, 실행 컨텍스트, 제너레이터, 디스패치, 제너릭 등 내가 이해하는 개념에 대해 설명하는 것이 맞나 추리해 나가는 것은 책을 읽으며 느낀 즐거움 중 하나였다.

[아쉬운 점]
1장부터 등장하는 수학 예제들은 큰 진입 장벽이라고 본다. 궁극적인 목표인 대규모 시스템 설계를 위해서는 수학적 엄밀함에 익숙해지는 것이 좋겠지만 대부분의 사람들에게 개념을 이해하기 위해 넘기에는 너무 큰 산으로 느껴질 것 같다. 하지만 쉽게 읽히지 않는다는 것을 염두에 두고 적극적으로 리소스를 활용한다면 아무리 어려운 책이라도 읽지 못할 이유는 없다고 본다.

또 하나의 아쉬운 점은 자바스크립트를 자바스크립트라 부를 수 없다는 것이다! 대부분의 개념을 설명할 때 함수 표현을 빌리기 때문에 파이썬이나 그 어떤 다른 언어로 쓰였더라도 크게 달라 보이지 않았을 것 같다. 이는 이 책이 특정 언어에 종속되지 않고 프로그래밍 그 자체의 원리를 설명하는 데 중점을 두고 있기 때문이다. 책이 다루는 주제가 쉽지 않기 때문에 스킴과 비교하면 어떨지 모르겠으나 자바스크립트라서 더 이해하기 쉬울 거라는 가정은 잘못된 것으로 판명 났다.

[총평]
책을 읽다 보면 저자들이 프로그래밍을 마법과 같이 경이로운 것으로 여기며 한 줄 한 줄마다 마법사가 스펠을 쓰듯이 주의를 기울인다는 걸 깨닫게 된다. 하지만 오늘날 대부분의 개발자들은 추상화 덕분에 하드웨어 수준 또는 로우 레벨의 소프트웨어 수준에 대한 이해 없이도 원하는 결과물을 만들어낼 수 있다. 최적화 덕분에 성능에 이상이 생기기까지는 성능에 대해 고민하지 않아도 된다. 이러한 경향은 프로그래밍을 이미 규격화된 공장에서 상품을 찍어내는 것처럼 느껴지게 한다. 하지만 어린 시절 드라이버를 손에 쥐고 전자 제품을 뜯어본 적이 있는 사람이라면 추상화라는 블랙박스를 한번 열어보고 싶을지 모른다.

[추천 대상]
- 최근 인기를 끄는 함수형 프로그래밍의 가능성과 한계를 알고 싶은 사람
- 작고 단순한 프로그램에서 복잡하고 큰 프로그램을 만들어 나가는 방법을 알고 싶은 사람
- 다른 사람의 것을 가져다 쓰기보다 본인만의 언어나 컴파일러를 만드는 데 관심이 있는 사람
- 이미 알려진 문제를 빠르게 해결하는 것뿐만 아니라 정답을 알지 못하는 문제를 해결하는 능력을 기르고 싶은 사람


"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

 

Intro

SICP(Structure & Interpretation of Computer Programs)는 컴퓨터 과학 분야에서는 빠질 수 없는 유명한 명서이다. 그러나 최근에는 모르는 사람이 더 많을 것이다. 나 또한 이 책을 처음 알게 됐을 때가 2020년도였다. 알더라도 이 책에 도전하는 사람은 몇 없었다. 그 이유는 Scheme이라는 생소한 언어를 사용하기 때문이다. MIT에서도 수업 교재로 쓰였던 책이었고, 이 분야에서는 꽤 유명한 책이라 읽어보고 싶었지만 인공지능에 빠져 선형대수학을 공부하고 있을 때라 아쉽게도 읽을 시간이 없었다.

이번 나는 리뷰어다 2023에 참여하게 되어 JavaScript로 각색된 이 책을 읽을 수 있게 됐다. 엄청난 행운이라 여긴다. 이 책이 두꺼워 완독까지 얼마나 걸릴지는 모르겠지만, 계속 꾸준히 읽어볼 예정이다.

Book Review

JavaScript

이 책은 원래 Scheme이라는 언어로 쓰였던 책이다. Scheme은 LISP라는 언어의 한 방언이다. 둘 다 함수형 프로그래밍에 관심이 있다면 들어볼 만한 언어이지만 꽤 생소한 언어이다.

이 책을 리뷰할 때 당연히 처음부터 하고 싶은 말은 이 책이 JavaScript로 쓰였다는 점이다. 접근성을 매우 높였다고 말할 수 있다. 이제 나를 포함하여 이 책에 관심 있던 사람들이 읽을 수 있게 됐다. 이게 다 자바스크립트, 파이썬 등 자주 쓰이는 언어에도 함수형 프로그래밍이 추가되어 이 책을 읽을 수 있게 됐다. 굳이 LISP과 Scheme을 몰라도 함수형 프로그래밍을 배워볼 수 있는 기회가 생긴 것이다.

엄청난 두께

두께에 압도당하는 책이다. 전공책이 생각나며 이 책을 받았을 때 '언제 다 읽지?'라는 생각이 들었을 정도이다. 참고문헌(Bibliography), 찾아보기(Index)를 제외해도 824쪽이나 된다. 그러나 이렇게 두꺼운 데는 다 이유가 있다.

첫 번째 이유로 연습문제가 꽤 많다. 어느 정도 앞부분을 읽었을 때는 '재밌는 문제가 많네.' 정도였는데 뒤로 갈수록 점점 더 어려운 문제들이 많이 나온다. 특히 sin 함수를 계산해보기도 하고, 적분을 하는 등의 수학과 관련된 내용이 많다. 또한, 알고리즘 문제에 자주 사용되는 개념들도 많기에 사전에 알고리즘 수업을 들어봤거나 공부해 본 사람이라면 읽는 데 유리할 것이다.

두 번째 이유로 컴퓨터 과학과 관련된 다양한 주제를 다루면서 설명도 꽤 자세하다. 프로그래밍 언어뿐만이 아니라 자료구조, 컴파일러, 동시성, 논리 회로 등이 책에서 나온다. 그렇기에 전반적인 CS 지식이 있다면 읽기 더욱 쉬울 것이라 생각한다.

대상 독자

함수형 프로그래밍과 전반적인 CS 지식을 공부하고 싶은 사람에게 이 책을 추천하고 싶다. 또한, 꾸준히 공부 습관을 길러보고 싶은 분들께도 추천한다. 이 책은 무려 약 800쪽의 두꺼운 책이다. 그렇기에 실제로 이 책을 읽다가 포기하신 분들도 많다고 알고 있다. 완독을 목표로 한다면 다른 선수 지식은 다 필요 없고 인내심을 갖고 천천히 읽는 것을 추천한다.



 

 

SICP란 의미조차 모르고 있었지만, 해당 책을 통해 처음 알게되었다.

Structure and Interpretation of Computer, 컴퓨터 프로그램의 구조와 해석이라는 의미!

 

프로그래밍에 관한 관점을 바꾸어 준 책,

두고두고 다시 꺼내 읽는 책이라고 칭송하는 개발자가 많다고 한다!

 

물론, 접근하기 어렵다는 평도 있는데 일반적인 SICP는 스팁이라는 다소 생소한 언어를 사용해 더 그렇게 느낀다고 하는데 이 책은 자바스크립트로 되어있어 조금은 더 접근하기 쉽지 않을까?

 

나도 자바스크립트 언어는 사용하고 있기 때문에,

생소한 용어에도 궁금한 마음이 들어 해당 책을 읽게 되었다.

 

처음 옮긴이에 말에서도 자바스크립트는 스킴의 DNA를 담고 있는 언어라고 소개한다.

우리가 잘 아는 자바스크립트를 만든 브렌던 아이크씨도 스킴 애호가이고,

웹브라우저에서 스킴을 사용해보자는 미끼로 브렌던 아이크씨를 영입했다는 흥미로운 이야기까지ㅎㅎ

 

SICP는 접근이 어렵지만, 관련된 문서와 그 역사적 맥락을 알게되면 재평가되고 컴퓨터에 대해 다시 생각하게 된다고 한다.

 

이 책의 내용이 MIT의 컴퓨터 과학 입문 과목의 기반으로 쓰인다는 점도 흥미로웠고

가르치는 교수님의 목표는 과목을 수료한 학생들이 프로그래밍의 스타일 요소들과 미학이 어떤 것인지 감을 잡게 하는 것이라고 한다.

 

책의 분량은 참고 문헌 및 찾아보기를 제외하면 824p.

단숨에 읽어나가기는 어려운 분량이지만 개발자의 길을 택한 이상 한번쯤은 흥미를 가지고 여유가 될 때마다 읽어나가면 좋을 것 같다 :)

 

프로그래밍 언어에서 유용한 사고법과 그 표현법을 소개해 강력한 프로그램을 효율적으로 조직화하는 법을 알려준다는 이 책!

 

더 나은 프로그래머가 되려면 어떻게 해야하는지 고민하는 사람에게 해당 책을 추천한다고 하니 한번쯤 도전해보는건 어떨까 싶다!

 

 

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.



이 책에서 처음에 다루는 게 '함수를 이용한 추상화'입니다. 만약 자바스크립트를 다룬 책이었으면 간단히 설명하고 넘어갔겠지만 이 책은 함수를 이루는 것들은 하나하나 뜯어봅니다. 이게 제게 꽤 매력으로 다가왔습니다. 자바스크립트를 제대로, 깊이 이해하고 싶었던 제게 '바로 이거다!' 싶은 책이었죠.

 

​함수를 만들고 복잡도가 증가하면서, 구조적인 고민이 필요한 시기를 이 책은 놓치지 않았습니다. 정답을 이야기하면서 더 나은 해법도 제시하죠. '선형 재귀와 반복'을 다룬 부분은 꽤 인상적이었습니다. 그냥 막연하게 썼던 재귀였지만, 재귀와 반복을 비교하는 내용을 보면서 막연함이 사라진 경험을 했으니까요.

 

이 책을 제대로 소화하기까지 아마 꽤 오랜 시간이 걸릴 겁니다. 자바스크립트로 각색했고 번역도 잘 돼 있지만, 원래 내용이 쉽지 않았으니까요. 하지만 그만한 노력과 인내를 들일 가치가 있는 책이라고 말하고 싶습니다. 이 책을 제대로 소화하기 전과 후는 큰 분명 차이가 있을 거라는 확신이 들었기 때문입니다.

컴퓨터 프로그램의 구조와 해석(SICP)는 '마법사 책(Wizard Book)', 'MIT 컴퓨터 과학 입문 과정의 교과서'로 유명합니다. 프로그래밍의 원리를 알려주는 책은 맞습니다만, 특정 언어의 문법을 배우거나 알고리즘을 배우는 내용과는 거리가 조금 있으며, 배워서 바로 도움을 받을 수 있는 성격의 책은 아닙니다.

 

10569098_884730798231822_5289485369359182595_n.jpg

 

사람들은 '위기의 순간'이나 '옳은 판단'이 필요할 때면 '예전 방법'을 찾습니다. 그 '예전 방법'에는 맹자, 공자, 플라톤의 '철학'이 될 수도 있고, 손자병법, 논어와 같은 '고전'이 될 수도 있으며, 등산, 마라톤 같은 행동을 통한 '생각'이 될 수도 있습니다. 어쨌든, 주변 지인들의 짧은 조언을 구하거나 ChatGPT에 프롬프트를 작성하는 것보다는 '예전 방법'을 찾게 되고, 필요에 대하여 더 깊게 몰두할수록 '예전 방법'의 중요성과 필요성은 더욱 강조됩니다.

 

이 책은 코딩 및 프로그래밍계의 (위에서 언급된)'철학', '고전, '생각'에 해당되는 서적 중 하나로 평가받고 있으며, 이는 추천평 및 감수의 글을 써주신 김명호 박사님, 이광근 교수님 등 이미 많은 구루와 개발자분들이 인정한 것으로 부인할 수 있는 여지가 없는 사실입니다.

 

원래 SICP는 스킴을 통해 컴퓨팅 개념과 프로그래밍을 정의하며 컴퓨터 과학의 추상적인 개념을 배워나가면서 스킴 언어를 학습해 나가는 입문서였습니다. 시대에 흐름에 맞추어 자바스크립트로 변화되었지만, 아직도 본질을 담고 있습니다. 다만, "SICP에 나오는 예제"가 "바닐라 자바스크립트로 실행할 수 없는 게 있다"라는 부분에 원래 SICP의 색깔이 조금 희석되었다는 생각이 들기도 합니다.

 

하지만, 대부분의 독자들에게는 스킴 대신 자바 스크립트로 이해할 수 있는 책이 더 환영받을 겁니다. 더 친근하고, 언어의 기본을 배우기에 접근하기 쉽기 때문입니다. '기본'을 배우기에 '예'는 부수적이니까요. 작은 망치로 두들겨 만드는 칼만이 가치 있는 것은 아닐 것입니다. 오히려 지금 같은 생산성을 강조하고 점을 찍으면 다수의 브라우저 코드를 만들어주거나 주석만 적당하면 가끔 놀라는 코드를 추천해 주는 Copilot 구독 시대에 '고전'을 실용적이게 읽을 수 있는 선택지가 있다는 점은 축복입니다.

 

왜 자바 스크립트인가라는 물음에는 옮긴이의 말과 가이 L. 스틸의 추천사에서 힌트를 찾아볼 수 있습니다. 자바 스크립트를 만든 브랜든 아이크가 스킴 애호가이고 자바와 달리 함수를 일급 객체로 취급하거나 람다, 꼬리 재귀, 블록 범위 변수 등 여전히 스킴 DNA를 가지고 있기 때문입니다. 스킴은 리스프(LISP)의 방언입니다. 이 책은 언어를 배우는 게 아니라 개념을 배우는 게 목적인 데다가, 자바 스크립트로 작성된 것은 덜 완전하고, 잘 구현하지 않은 리스프의 방언인 스킴의 또 다른 방언으로 구현됐다고 볼 수 있지 않을까요?

 

SICP는 카이스트, 서울대를 포함한 수백여 대학의 교재로 사용되고 있으며, 인터넷에서 많은 리소스를 찾을 수 있습니다.

 

MIT교재로 사용되는 스킴 SICP(2nd)의 PDF 파일은 아래 링크에서 구할 수 있고.

https://web.mit.edu/6.001/6.037/sicp.pdf

 

MIT과정의 과제 및 코드 등의 정보를 아래의 링크에서 구할 수 있습니다.

https://mitp-content-server.mit.edu/books/content/sectbyfn/books_pres_0/6515/sicp.zip/index.html

 

SICP(2nd)의 풀 텍스트는 아래 링크에서 확인할 수 있고,

https://mitp-content-server.mit.edu/books/content/sectbyfn/books_pres_0/6515/sicp.zip/full-text/book/book.html

 

읽기도 편하고 복사하기도 편한 HTML5 버전은 아래에서 구할 수 있습니다.

https://sarabander.github.io/sicp/html/index.xhtml

 

이에 대한 소스코드는 아래 링크로 얻을 수 있고.

https://github.com/sarabander/sicp

 

이에 PDF버전은 아래에서 확인할 수 있습니다.

https://github.com/sarabander/sicp-pdf

 

이맥스에서 볼 수 있는 아스키 버전도 있습니다.

https://www.neilvandyke.org/sicp-texi/

 

screenshot[1].png

 

마지막으로 머릿말에서 언급한 스킴 SICP(2nd)과 SICP JS를 병치한 형태의 온라인 비교판은 아래 링크에서 확인할 수 있습니다.

https://sicp.sourceacademy.org/

 

자바 스크립트를 통해 기본을 배우면서 해당 문법과 개념을 지탱해 주는 기반을 느낄 수 있습니다. 한 가지 아쉬운 점이라면 기존 번역서와 달리 양장서가 아니어서 오랫동안 보관하고 싶은 책의 귀퉁이가 말아올라가는 것을 막지 못한다는 점뿐이네요.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 



최근 어드민 페이지를 개발하면서 타입스크립트를 자주 사용하고 있습니다.

 

그러나 막상 쓰면서도 100% 잘 쓰는지 의문이 들었습니다.

 

 

그 이유는 주로 하는 업무가 백엔드라 머릿속에서 컨버팅이 늦은 점이 가장 컸습니다.

 

 

또한 타입스크립트는 결국 자바스크립트로 컴파일되기 때문에 자바스크립트 잘 알아야 한다는 생각이 들면서 날이 갈수록 변화하는 흐름에 잘 따라가지 못하고 있다고 느껴집니다.

 

 

그래서 자바스크립트만을 위해서 따로 공부하기에는 다른 일들이 많아서 CS 공부할 겸 '자바스크립트로 배우는 SICP' 책을 읽었는데요.

 

이 책에 대한 내용을 2가지 정도로 요약해보려고 합니다.

 

 

014.jpg

 

 

 

 

1) Lisp 언어에서 자바스크립트로

국내에서 SICP를 처음 본 것은 인사이트 출판사에서 번역한 '컴퓨터 프로그램의 구조와 해석'입니다.

 

 

당시 마법사 책으로 주변에서도 읽기는 하지만 다 읽은 사람들은 찾기는 힘들었습니다.

 

 

Lisp 언어라 생소하기도 하고 당장 현업에서 쓸 것 같지도 않아서 읽다가 포기한 이유도 큽니다.

 

 

그러나 이번 자바스크립트로 변화되어서 천천히 곱씹어 보면서 읽었습니다.

 

 

최근 책들이 새롭게 나오면서는 대체로 '자바스크립트'로 재출간하는 패턴이 보입니다.

 

 

마틴 파울러가 쓴 리팩토링 역시 자바에서 자바스크립트로 변경돼 출간된 것처럼 시대의 트렌드인 함수형 언어에서 '자바스크립트' 많은 독자를 끌어모으면서 언어에 대한 부담을 낮춘 것이라 봅니다.

 

 

024.jpg

 

 

 

 

2) 개발과 교육의 트렌드

이 책은 80~90년대 MIT에서 CS 과목으로 주로 교육 부교재로 사용했습니다.

 

 

MIT의 교육 정책상 이 책을 바탕으로 수업을 개설하지 않고 Python 기반으로 교육을 진행합니다.

 

 

AI와 배우기 부담이 적은 Python이 학생들에게 가르치기 편하기 때문이라는 생각도 듭니다.

 

 

아쉬운 점은 개발이라는 게 단순히 어떠한 라이브러리를 익히고 그것만 사용해서 어떠한 결과를 만드는 것이 전부는 아니라고 봅니다.

 

 

남은 것과 내 것을 어떻게 잘 섞고 하는 기반의 내용은 SICP 내용에 서술되었기 때문입니다.

 

 

단순히 저 분야 뜬다고 해서 기반 지식이 없어지는 게 아니라 기반 지식이 밑에서 지탱합니다.

 

 

결국 언젠가는 다시 기반 지식을 닦기 위해서 회귀를 분명한 시간이 있습니다.

 

그 시간을 줄이기 위해선 틈틈이 CS 등 지식을 채우기 위해서 노력해야 한다고 봅니다.

 

 

033.jpg

 

 

 

 

PS

이 책은 현업에서 개발하다가 더 이상 구현에 흥미를 잃고 CS를 채우고 싶은 분들에게 추천해드리는데요.

책이 상당히 두껍고 연습문제의 양이 무지 많습니다.

 

 

한번 많은 양을 푸는 것보다는 적절하게 시간을 배분해서 풀어야 완독하는 데 도움이 됩니다.

 

 

MIT에서 예전에 SICP 강의한 영상을 유튜브에 볼 수 있어서 책을 읽다가 이해가 가지 않은 부분은 채우는 것도 하나의 방법이라 생각이 듭니다.

 

 

#javascrip #마법사책 #한빛미디어 #SICP #LISP

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

SICP.jpg

 

 

 

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

 

1. TL;DR

더 나은 더 효율 적인 더 쉽게 읽히는, 더 변화에 유연한 코드를 짜고 싶은 사람들은 읽어 보면 좋은 책 입니다.

 

책을 읽다 보면 예제 코드도 작성해보고, 고민할 시간이 많아지게 되다보니, 읽을 때 시간이 소요가 된다는 것은 알아두세요.

2. 이 책을 선택한 이유

컴퓨터 프로그램의 구조와 해석이라는 책은 워낙 유명하기 때문에 가지고는 있었습니다. 그러나 언어의 특성상, 실습해보지 않고 그냥 읽다보니 안 읽혀서 그만두고만 책이었습니다. 주위에서 워낙 극찬이 많고 추천도 많았지만, 익숙한 언어가 아니니 잘 익히지 않았던게 컸습니다. 최근 프론트 개발자 분들끼리 이야기하는 단톡방에서, 이 책이 자바스크립트로 다시 쓰여졌다는 이야기를 듣고, 이책을 다시 한번 정독해보고 싶어서 이 책을 선택하게 되었습니다.

 

3. 리뷰

읽다 보면 본인이 얼마나 아무 것도 모르는 채 작성하고 있었는지 알 수 있습니다. 고수준 언어의 경우 각각의 어구, 어휘들이 특정 속성과 로직을 가지고 작성이 되며 이게 기계어로 파싱되어서 해석이 된다는 것은 알 수 있습니다. 그러나 이런 이론적인 바탕에 대한 공부를 해 본적이 없다보니 설명하라고 한다면, 또는 이와 관련이 된 작성글들을 본다면 외계어처럼 읽히기 마련입니다. 이 책은 그런 자연스럽게 사용되지만 이해하지 않고 있던, 공부하지 않았던 내용들에 대해 이론적으로 잘 설명해 주고 있습니다. 

 

개발자들의 큰 고민중 하나는 코드를 어떤 방식으로 짜는게 효율적이고, 더 나은지 에 대한 고민일 것입니다. 이를 판명하기 위해서는 어떠한 판단 기준과 논리 근거가 있어야 하는데, 이 책을 읽으면 이에 대한 근거들이 생기는 것 같습니다. 하지만 이론적인 내용들이 많다보니 이해하는데도 시간이 걸리고, 이를 내재화 하는데에는 시간이 더 걸릴 수 있음을 인지하는게 좋습니다.

 

4. 총평

적극 추천하는 책 

 

어느 정도 개발 경력을 가진 사람들에게 좋은 책입니다. 특히 이론적인 기반이 없는 비전공자 한테도 좋고, 자신의 코드를 더 업그레이드 하고 싶은 사람들에게도 좋습니다. 전공자 이지만 이론적인 내용을 더 보강하고 싶은 개발자들에게도 좋을 것입니다. 

 

자신이 코드를 작성할 때 이에 대한 이론적인 근거가 생긴 다는 점, 어떤게 더 나은 코드고 어떤게 더 안좋은 코드인지 분별이 가능하다는 점은 개발자의 커리어에서 정말 중요한 부분인데 빠르게 읽으면 읽을 수록 좋고, 경력이 쌓일 때 또 봐도 많은 것들을 배울 수 있는 책입니다.

 

자바스크립트로 배우는 컴퓨터 프로그램의 구조와 해석이라는 제목부터 감동이었다.

나는 자바스크립트로 개발을 시작했고, 아직까지도 자바스크립트를 주력 언어로 사용하고 있다.

하지만 자바스크립트에 대한 책이 아니라면 개발 서적 중 예시 코드를 자바스크립트로 다루는 책은 거의 없다.

그래서 다른 개발서적을 보면서도 그 내용을 설명하기 위한 코드 자체의 이해에도 조금 더 시간을 기울이게 되는 경우가 많았다. 반면 이 책은 예시코드들이 자바스크립트로 되어 있기에 내게는 한결 직관적으로 다가왔고, 부담감을 조금은 덜 수 있었다.

하지만 이 책은 결코 쉽지 않다.

‘컴퓨터 프로그램의 구조와 해석’을 자바스크립트로 다루는 것일 뿐, 그 내용 자체가 가벼울 수 없기 때문이다.

884쪽이라는 두께만큼 다루는 내용도 방대하고 깊다. 내게 익숙한 자바스크립트로 쓰여서 더 와닿는 것도 있겠지만, 자세한 쓰인 내용을 번역자님이 번역도 매끄럽게 하신 것이 느껴졌다.

그래서 이 책은 한번만 보고 방대한 내용을 온전히 흡수하기에는 많이 어렵고, 외국의 대학에서 이 책을 왜 강의 교재로 사용하는지도 이해가 갔다.

한번에 다 알아차리기에는 내용이 많지만, 자세하게 설명이 되어 있기에 이해가 되지 않았던 부분이나 처음에는 그냥 넘어갔던 부분도 두세번씩 보면 분명히 더 와닿을 것으로 느껴지는 단원들이 많다.

책 마무리 단계에서 보이는 인덱스 페이지도 두꺼운 두께를 반영하는 것과 동시에 대단원과 그것의 세부 단원들에 대해 아주 상세하게 구성되어 있는 것이 인상적이었다.

이 책의 장점은 어떤 것이 있는지 알아보면 아래와 같다.

장점

  1. 한 개념에 대해 적확한 어휘를 사용한다.

    예를 들어 79쪽에는 ‘lexical scoping’이 나온다. 보통 ‘정적범위’ 나 ‘렉시컬 스코핑’ 등으로 부르곤 하는 이 용어를 번역자분이 자세한 설명과 함께 ‘어휘순 범위 적용’이라고 풀어쓰신 부분이 있다.

    한국어를 모국어로 하는 사람이어도 컴퓨터 프로그래밍 용어는 영어로 바로 사용하는 경우가 많고, 번역이 어려운 단어도 많았을 것으로 예상되는데 또렷한 번역이 좋았다.

  2. 읽을수록 곱씹으며 한 번 더 생각하게 만드는 개념이 많다.

    이 책에는 이진탐색트리, 포인터, 디지털 논리 회로, 레지스터 등이 등장한다.

    반가산기와 전가산기 회로를 만드는 자바스크립트를 보는 것은 처음이었기에 조금 더 재미있고 신선하게 다가왔다.

    책 제목의 특성상 당연할 수 밖에 없지만, 읽기 전에는 예상하지 못했던 바여서 ‘여기서 자료구조가 연결되는구나!’, ‘우와 이렇게 반가산기를 구현하는구나’와 같은 순간들이 많아서 흥미로웠다.

  3. 자바스크립트에 국한되지 않아 좋다.

    이 책에서 자바스크립트는 개념을 더 쉽게 설명해주기 위한 수단일 뿐, 자바스크립트를 통해 더 많은 이야기를 풀어나간다. 자바스크립트 이외에는 깊게 배워본 언어가 없어서 ‘커링’도 당연히 자바스크립트의 개념 중 하나라고 알고 있었다. 하지만 이 책에서는 커링에 대해 설명과 연습문제가 나와있어서 커링 뿐만 아니라 다양한 개념들이 자바스크립트 한정이 아닌 컴퓨터 프로그래밍 전체에서 사용되는 개념이라는 것을 알게 되어 좋았다.

이 책의 방대한 내용에 비해 내가 이해하고 받아들인 내용은 얕아서 감히 이 서평을 써도 될지 조금 망설여지기도 했다.

보다 더 많은 시간을 들여서 한 단원씩 꼼꼼하게 흡수하고 싶은 책이기 때문이다.

그리고 아는 내용이 많아질수록 분명히 더 많은 것들이 보일 수 있는 책이라고 생각한다.

자바스크립트를 주력으로 하는 (혹은 스킴보다 자바스크립트가 익숙한) 개발자 모두에게 이 책을 추천한다.

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

 

SICP 즉 "컴퓨터 프로그램의 구조와 해석" 책은 예전에 나온 책입니다.

프로그램 개발자라면, 한번쯤은 들어본 책일 것입니다.

그리고, 그 소문은.. MIT에서 사용하는 교재라는 것이죠.

 

이러한 유명세로 SICP는 이미 출판되어 있습니다.

2007년에 양장으로 근사하게 나왔고, 2008년에는 양장이 부담스러웠는지, 2권으로 분리되어서 출판되었습니다.

그리고, 2016년도에 2판이 나오기도 했죠.

http://www.yes24.com/Product/Goods/2715278

http://www.yes24.com/Product/Goods/3745925

http://www.yes24.com/Product/Goods/23951885

 

위의 링크에 있는 오리지널 책들은 인사이트에서 출판되었는데, 2023년에 나온 이 책은 한빛미디어에서 출판되었습니다.

 

자, 그럼 이 예전 오리지널 책과, "자바스크립트로 배우는 SICP"의 차이점은 뭘까요?

내용 자체는 동일합니다만, 그 내용을 설명하기 위해 사용한 언어가 다르다는 점이 차이점입니다.

오리지널 책에서는 "스킴"이라는 LISP기반의 언어를 사용해서, 설명을 하고 있습니다.

얼마전, 함수형 프로그램이 인기를 끌기 시작하면, 클로저, 하스켈, 스칼라 이 3개 언어가 핫이슈가 된 적이 있었습니다. 이들 언어의 뿌리라고 할 수 있는 함수형 프로그램 언어의 시작점은 아무래도 LISP이 아닐까 싶은 것이죠.

 

LISP은 다양한 파생 언어를 갖고 있었는데, Common Lisp, Clojure, Racket, Railgun, 그리고 Scheme 이 유명합니다.

 

이 오리지널 SICP는 Scheme를 가지고, 프로그램을 어떻게 만들고, 그렇게 만들어진 프로그램이 어떻게 동작하는지를 설명했던 책입니다. 좀더 길게 얘기하자면, Scheme 설명, 컴파일러 생성, 에뮬레이서 생성, 에뮬레이터에서 컴파일러 올려서 Scheme로 만든 프로그램을 돌려보기.. 까지의 과정을 설명하는 책이었습니다.

 

내용만 보자면, 800여 페이지 분량이 부족하게 느껴질 정도의 방대한 분량인데, 사실, 일반적인 대학 과목에서라면, 3가지 정도의 과목(컴퓨터 기본구조, 프로그래밍 개론, 컴파일러)이 하나로 합쳐진 것이 아닐까 싶으니까 말이죠.

 

함수형 프로그램을 공부할 때, 가장 큰 장애물은, 기존 순차적 프로그램 언어에 익숙한 개발자라면, 개발 패러다임을 바꿔야 한다는 점이었습니다. c 나 java의 경험이 오히려 함수 기반의 프로그램 개발을 방해한다는 것이었는ㄷ데, 이것은, 객체지향 패러다임이 나왔을 때, 기존 C 프로그래머들이 반발하던 것 보다도 더 심하지 않을까 싶긴 했습니다.

 

아무튼, 그래서, 아예 처음 프로그램을 배우는 사람이 Scheme으로 시작한다면, 좀더 쉬울 수 있었겠지만, 소문만 듣고 이 책을 보는 사람들에게는 "아 이게 뭐지?" 하는 사용 언어의 장벽이 크게 작용했다는 점이 문제였습니다.

 

그리고, 초판이 나온 뒤, 수십년 뒤에, Scheme이라는 LISP 기반의 언어, 함수형 프로그래밍 언어에 익숙해지지 못해서, 도중에 포기해버린 개발자들을 위해, 저자는 새로운 언어, 즉 Javascript를 가지고 다시, 원래의 이야기를 설명하게 되었는데, 이 책이 바로 그 책입니다.

 

확실히, scheme으로 설명된 오리지널을 보는 것 보다, javascript로 설명된 이것을 보는 것이 편했습니다.

(책장에 처음 샀을 때 그 모습 그대로 꽃혀있는, 2007년도의 오리지널 양장본 책을 보면서 느꼈던 죄책감을 이제야 줄일 수 있을 것 같네요)

 

누군가가 그러더군요. <<클래식이란, 모두가 알지만 아무도 읽지 않은 책이다>> 라고 말입니다.

 

확실히 이 책은 클래식은 맞습니다. 수 많은 프로그램의 대가들이 극찬한 책이었으니까요. 또한 모두가 좋은 책이라고 말하고 있으니까요.

 

하지만, 과연 scheme를 사용했던 오리지널 책으로 제대로 읽은 사람이 얼마나 있을까 하는 것은 의심이 드는 책이기도 했습니다. (산 사람은 많지만 읽은 사람은 없을 것 같은 그런 책이었으니까요)

 

그러나, Javascript라면? 그러면, 읽은 사람이 훨씬 많이 늘어나지 않을까 싶은 그런 책이었습니다.

 

하지만, 그럼에도 불구하고, 쉽게 읽히지는 않는 책이었습니다. 혼자 본다면, 도중에 포기할 유혹을 강하게 느낄 수 있는 책이기도 합니다.

일단, 책이 너무 두껍기 때문에 (페이지 뿐만 아니라, 출판사에서 신경써서, 좋은 종이로 인쇄했기 때문에, 종이 질은 좋지만, 더 무겁고, 휴대하기 힘든 책이 된 것은 아이러니 하네요) 집에서 마음을 한번 강하게 잡고 읽어야 합니다.

 

또한, 표지는 양장으로 해 주면 더 좋지 않았을까 하는 아쉬움이 들기도 했습니다. 어차피 집에서 놓고 봐야 하고, 두께 때문에, 중간에 책등이 쪼개질 것 같은 불안감 때문에 그렇습니다.

 

아무튼, 정리하자면, 소문으로만 듣던 (사긴 했지만 읽지는 못했던) 책이, 좀더 익숙한 언어(쉬운 언어는 아닙니다)로 새단장을 하고 다시 찾아온 책입니다. 하지만, 아무리 쉽게 바꿨다고 해도, 내용 자체의 난이도는 높은 편이라서 (이미 다른 개발 스타일에 익숙해져있다면 더욱 고치기 힘드니까 말이죠), 혼자서 끝까지 보면서 공부하기보다는 그룹 스터디를 만들어 함께 공부하는 것이 좋을 것 같습니다.

 

가장 좋은 것은 MIT에서 그랬던 것처럼, 처음 프로그램에 입문할 때, 개발 스타일을 잡기 위해, 수업 교재로 사용하면 더욱 좋지 않을까 싶습니다.

 

-----

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

-----

SICP(The Structure and Interpretation of Computer Programs, 컴퓨터 프로그램의 구조와 해석)은 MIT의 컴퓨터 과학 입문 강의를 기반으로 만들어진 서적이다. 컴퓨터 과학의 기본 원리와 설계의 핵심 개념을 밑바닥부터 다져가면서 학습할 수 있는 SICP는 Scheme이라는 LISP의 방언을 통해 학습을 진행하기 때문에 다소 접근하기 어려운 편이었다. 이를 널리 사용되고 있는 언어인 Javascript로 각색한 SICP in JS가 이번에 한빛미디어를 통해 번역본으로 출시되었다. 

 많은 모던 프로그래밍 언어 중 Javascript로 이 책이 각색된 이유는 Javascript의 멀티 패러다임 중, 함수형 프로그래밍이 가능한 부분을 꼽을 수 있겠다. 책의 주된 내용은 아래에서부터 차근차근 추상을 쌓아올리면서, 컴퓨터 프로그래밍의 다양한 문제들을 해결하는 과정을 담고 있다. 높은 단계의 추상을 추구하는 것은, 즉 코드의 의존성을 낮추는 것이고 이는 순수 함수 위주의 함수형 프로그래밍으로 진행된다. Scheme은 그런 추상이 가능한 언어이고 Javascript 또한 ECMAScript 2015를 통해 도입된 람다 표현식, 블록 레벨 스코프, 상수 등을 통해 함수형 프로그래밍이 가능해졌다. 때문에 원판의 내용을 거의 그대로 가져올 수 있었다고 한다. 

 컴퓨터 과학의 입문 강의를 기반으로 만들어진 책이지만, 다루고 있는 내용은 '입문'이라기에는 다소 난해하게 느껴질만한 내용을 다루고 있다.  1장에서는 기본적인 함수의 조합과 추상화를 통해 복잡한 계산을 수행하는 과정을 연습한다. 이 과정에서 다루는 복잡한 계산들은 프로그래밍과 연관된 수학적인 주제들로 구성되어 있는데, 단순히 읽고 넘어갈 수 있는 수준이 아니라 오래 생각하면서 답을 도출해야만 하는 내용이다. 2장에서는 데이터를 추상화하고, 추상화한 데이터를 통해 더 높은 차원의 데이터를 만들어가는 과정을 다룬다. 자료구조를 만들고 다루는 방법을 직접 구현하는 과정이기 때문에, 1장과 마찬가지로 연습문제를 간단하게 해결할 수 없다. 연습문제 중, 람다 계산식을 통해 자연수를 정의하는 문제(처치 수)도 있을 정도다. 

 리뷰를 작성하고 있는 지금, 겨우 2장을 읽어나가고 있는 정도라 이 책에 대한 평가를 내린다는 것이 좀 어렵게 느껴진다. 3주 전에 책을 받았고, 꾸준하게 읽어나가고 있는데도 아직 1/4을 채 진행하지 못했다. 그럼에도 이 책에 대한 평가를 좋게 내릴 수 밖에 없는 근거는, 아직까지도 내가 이 책을 붙잡고 있는 이유로 설명할 수 있다. 연습문제를 풀고 책이 전달하고자 하는 내용을 이해하는 것이 고된 만큼, 이해했을 때 얻는 성취감이 정말 값지게 느껴졌다. 재귀, 람다식, 커링 등의 난해한 프로그래밍 기법들을 터득한 것, 간추리기를 통해 더 높은 표현 수준을 만들고 이를 통해 추상화의 장벽을 쌓아나가는 것, 평소에 개발하면서 사용하던 여러 고차 함수를 직접 구현해보면서 이해도를 높이는 것 등, 프로그래밍에 있어서 흥미롭고 중요한 내용들을 배워볼 수 있었다. 남은 과정에서도 얼마나 흥미로운 내용이 기다리고 있을지 기대가 된다. 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 

 


자바스크립트로 배우는 SICP

 

 

책을 읽을 때는 왜 읽어야 하는지, 무엇을 알고 싶은지를 미리 생각하고 읽어야 더욱 재밌고 효율적으로 읽을 수 있다고 생각합니다. 따라서 이 2가지에 해당하는 내용으로 먼저 시작해보면 좋을 것 같습니다.

 

이 도서는 원래 MIT에서 강의하던 SICP라는 강의의 내용을 담고 있습니다.

일반적으로 마법사책이라고 많이 불립니다. SICP는 번역하면 컴퓨터 프로그램의 구조와 해석으로 볼 수 있고 실제로 그렇게 번역되었던 책도 있습니다.

 

MIT에서 SICP는 6.001이라는 수업에 있었습니다.

하지만 이제는 MIT에서 SICP를 가르치고 있지 않는데 SICP 커리큘럼이 더이상 현대적인 엔지니어가 되도록 준비시키지 못한다고 합니다. 8~90년대에는 간단하고 잘 이해할 수 있는 것들을 조립을 해서 프로그램을 만드는데 요새는 잘 모르는것에 대해 프로그래밍을 합니다.

처음보는 라이브러리들을 가져와서 코딩을 하고 이런것들이 일상이 되었습니다. 따라서 현대적인 개발 환경에서 SICP 지식이 당장은 큰 도움이 되지 못한다고 느낀게 아닐까 싶습니다.

 

SICP는 전체적인 것들을 분석을해서 개발을 합니다.

SICP는 당장 개발에 도움이 되는것에는 부족할 수 있지만, 프로그래밍을 전반적으로 다루는 방법에 있어서는 

SICP 지식이 많은 도움이 된다고 생각합니다. 남의 것을 가져다가 개발을 하는게 요즘의 일반적인 개발 방식이 되었지만

결국 도메인에 맞게 만들려면 +를 할 줄 알아야하고 그런 능력을 SICP를 통해 기를 수 있다고 생각합니다.

 

저도 비슷한 생각이 있습니다. 물론 기존에 잘 만들어져 있는 도구들을 이용하여 제품을 만들어내는 것도 중요하지만

특정 도메인의 문제를 해결하기 위해서 새로운 도구를 만들어내거나 혹은 자체적인 도구들만 사용해서 개발을 해야하거나

기존에 해결법이 나와있지 않은 새로운 문제를 접하게 되었을 때 이와 같은 상황에서는 새롭게 만들어낼 수 있어야 한다고 생각합니다.

따라서 SICP라는 책은 위와 같은 이유로 읽을 가치가 있고 Scheme이라는 언어가 아닌 우리에게 친숙한 JavaScript라는 언어로 새롭게 나온 '자바스크립트로 배우는 SICP' 라는 책이기 때문에 접근성도 좋아졌다고 생각합니다.

 

일부 사람들은 컴퓨터에 대한 지식을 쌓는것에 대해 간과하는 느낌이 있는 것 같습니다. 흔히 말하기에 컴공 지식, CS 6대 지식이라고 많이들 이야기를 합니다. 컴퓨터 공학 자체에 대한 공부를 하지 않고 단순히 프로그래밍 언어의 문법, 라이브러리, 프레임워크들만 공부하면서 개발을 하는 것은 결국 한계가 온다고 생각합니다. 컴퓨터가 어떻게 동작하는지에 대한 지식이 전혀 없이 컴퓨터 위에서 돌아가는 프로그램을 만든다는 것은 무언가 50%만 하는 것 같다는 생각도 듭니다. 컴퓨터를 깊이 이해하고, 그 지식을 바탕으로 프로그램을 더욱 효율적으로 개발하는데 영감을 얻고 싶어서 이 책을 읽게 되었습니다.

 

 

 

책은 꽤나 두꺼운 편입니다.

대략 800쪽 정도로 구성되어 있습니다.

일반적으로 내용이 어렵고, 두께가 두꺼운 개발 서적을 읽을 때 가장 중요한 것은 꾸준히 읽는 것이라고 생각합니다.

따라서 저도 꾸준히 읽는 방법을 택했습니다.

 

목차는 총 5장으로 구성되어 있습니다.

 

제1장 함수를 이용한 추상화

제2장 데이터를 이용한 추상화

제3장 모듈성, 객체, 상태

제4장 메타언어적 추상화

제5장 레지스터 기계를 이용한 계산

 

초반 1, 2, 3장은 모든 언어에 적용되는 프로그래밍의 개념으로 우리가 개발을 하면서 무의식적으로 하고 있었던 행동들을 프로그래밍 개념으로 알아가면서 개념을 더욱 탄탄하게 잡을 수 있는 파트라고 생각합니다. 현재 저도 이 부분을 읽고 있는데요. 개념/이론 설명으로 시작하고 연습문제를 풀고 있습니다. 특정 상황에 한정되지 않는 프로그래밍 문제들을 해결하면서 근본적인 문제 해결능력을 올리기 좋은 부분인 것 같습니다. 후반 4, 5장은 언어 처리기를 개발하게 됩니다. 프로그래밍 언어를 배우는 데 있어서 컴파일러를 같이 공부하게 되면 더욱 시너지가 나는데요. 이를 위해서 책의 목차가 이렇게 작성되어 있는 것 같습니다. 연습 문제의 양이 상당하고 모든 연습문제는 지은이가 제공하는 웹페이지에서 실행해볼 수 있어서 더욱 재밌게 공부할 수 있습니다.

 

이 책은 욕심이 넘치는 개발자분들이 읽으시면 좋을 것 같다는 생각이 듭니다. 

당장 개발을 하기 위함이라면 꼭 필요한 내용이 아닐수도 있지만, 결국 10년이 지나서도 살아남고 훌륭한 프로그래머가 되기 위해서는 읽어보면 좋을 책이 될 것 같습니다.

 

 "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 

 

 

자바스크립트로 배우는 SICP_02.png

 

 

'자바스크립트로 배우는 SICP' 라는 재목을 보고 요즘 자바스크립트가 인기가 많은데, 

또 새로운 방법으로 자바스크립트를 사용하는 SICP라는개 나왔나 보다 하였으나, 

이 책은 제목이 좀 햇갈리게 번역이 된게 아닌가 싶다.

 

이 책의 원 제목은 'Structure and Interpretation of Computer Programs' 으로 줄여서 'SICP' 라고 한것이였으며, 

책의 위에 작게 적혀 있는 '컴퓨터 프로그램의 구조와 해석' 이라고 적혀 있는 이게 실제 숨은 책의 제목인거 같다.

 

 

중간에 작게 적혀 있는 글씨를 보면 'Structure and Interpretation of Computer Programs: Javascript Edition' 이라고 

적혀 있는데, 이 책은 3번째 개정판으로 이전에 출간되었던 첫번째판(1984년)과 두번째판(1996)년은 리스프(Lisp)의 

변종 언어인 스킴(Scheme) 언어를 사용하여 설명이 되어 있었다고 하며, 이번에 출간된 책은 기존에 스킴으로 

되어 있는 코드들을 자바스크립트로 각색을 하여 출간이 된 책이라고 한다.

 

만약 세월이 흘러 개정된 4판이 출간이 된다면, 그때는 파이썬이나 다른 새로운 언어로 각색이 되어 

출간이 되지 않을까도 생각해 본다.

 

 

앞에서도 적었다 싶이 이 책은 자바스크립트를 배우기 위한 책으로 착각을 한다면, 

아마도 바로 책을 덮을 수도 있을 것이다. 이 책은 900페이지 가까이 되는 얇지 않은 책의 분량으로, 

뒤에 참고문헌과 색인을 제외하더라도 824페이지가 되기 때문에 프로그래밍에 대해 깊이 있게 관심있는 

분들이 아니라면 두께만 보고도 부담감이 갈수 있는 책이다.

 

 

 

 

 

 

자바스크립트로 배우는 SICP_04.png

 

 

계산적 과정을 서술하려면 적당한 언어가 있어야 한다. 그런 용도로 이 책에서는 자바스크립트JavaScript라는 프로그래밍 언어를 사용한다. 우리가 일상적인 생각들을 자연어(영어, 스웨덴어, 중국어 등)로 표현하듯이, 그리고 정량적(quantitative) 현상들을 흔히 수학 표기법으로 서술하듯이, 계산적 과정에 관한 절차적인 생각들을 이 책에서는 자바스크립트로 표현한다. 

 

 

이 책을 보기 위해서 꼭 자바스크립트를 알아야 하지는 않으며, 자바스크립트를 모르더라도, 책의 예제들을 

보면서 자바스크립트로된 코드들을 이해할수 있으며, 기본적인 프로그래밍에 대한 경험이 있다면, 

어떤 프로그래밍 언어라고 하더라도 비슷한 구조로 되어 있기 때문에, 이해하는데는 어려움이 없을 것이고, 

다른 언어로 응용도 할수 있을 것으로, 책을 보고 이해하는데는 어려움이 없을 것이다.

 

이 책은 총 5개의 장으로 구성이 되어 있는데, 1장에서 3장 까지는 모든 고수준 프로그래밍 언어에 공통된 개념들을 

다루고 있어서, 프로그래밍을 공부해본적이 있거나 사용해본적이 있다면 한번쯤 들어봤을 것이고, 

작성하고 있는 프로그래밍 코드 안에 포함된 내용들로, 이 책은 자바스크립트와 같은 특정 프로그래밍 언어를 

공부하려는게 아닌 그 프로그래밍 언어의 구조에 대해서 깊숙히 파고들고 이해해보며 왜 그렇게 

프로그래밍을 작성하는지를 알아보고 해석하고 연구하는 책입니다.

 

 

 

 

 

 

자바스크립트로 배우는 SICP_05.png

 

다른 모든 인위적이고 창조적인 활동에서 그렇듯이, 어떠한 동작의 결과를 머리속에서 그리는 것(시각화)은 전문 프로그래머가 되는 데 꼭 필요한 능력이다. 예를 들어 전문 사진작가가 되려면 장면을 어떻게 바라봐야 할지, 다양한 노출 설정과 후처리 방법으로 사진을 인화했을때 각 영역이 얼마나 어둡게 나올 것인지 등을 예측하는 방법을 배워야 한다. 그런 것들을 예측 할 수 있어야 그로부터 거꾸로 추론해서 프레임, 조명, 노출, 인화 과정을 계획해서 원하는 효과를 얻을 수 있다. 프로그래밍에서도 마찬가지이다. 프로그래밍에서 우리는 하나의 계산적 과정이 취할 일련의 동작들을 계획하며, 그러한 과정을 프로그램의 요소들로 제어한다. 원하는 행동을 보이는 프로그램을 안정적으로 구축하는 방법은 그런 능력을 갖추고 나서야 비로소 배울 수 있다.

 

프로그래밍이라는게 수학적인 계산을 컴퓨터가 수행하도록 작성하기에 책에서 수학적인 계산 부분을

자바스크립트 코드로 작성을 하고 설명해주고 있기 때문에, 수학이 어려우신 분들은 다시 어려우실수 있으나,

자바스크립트 코드로 이해를 하시고 넘어가시면 되기 때문에, 수학에 대한 큰 부담은 가지시지 않으셔도 될듯 합니다.

 

 

 

 

 

 

자바스크립트로 배우는 SICP_06.png

 

 

  

데이터 추상화의 핵심은 복합 데이터 객체를 사용하는 프로그램이 "추상 데이터(abstract data)"에 대해 작동하도록 프로그램의 구조를 짜는 것이다. 다른 말로 하면, 프로그램은 데이터에 관해 최소한의 가정만(주어진 과제를 수행하는 데 꼭 필요한 것만) 두어야 한다. 그와 함게, '구체적(concrete)' 데이터 표현을 해당 데이터를 사용하는 프로그램과는 독립적으로 정의해야 한다. 시스템의 이 두 부분 사이의 인터페이스는 선택자(selector)라고 부르는 함수와 생성자(constructor)라고 부르는 함수들의 집합으로 구성된다. 이 인터페이스는 구체적인 표현을 이용해서 추상 데이터를 구현한다.

 

책에서 함수를 이용한 추상화, 데이터를 이용한 추상화, 메타언어적 추상화로 총 5개의 장에서 3개의 장의 제목에

추상화라는 제목이 붙어 있는데, 추상화란 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을

간추려 내는 것을 말하며, 프로그래밍에 핵심적인 부분이기에 꼭 이해를 해야 합니다.

 

 

 

 

https://web.mit.edu/6.001/6.037/sicp.pdf

 

고맙게도 MIT 대학에서 2판을 무료로 공개하고 있는듯 하니, 관심있는 분들은 참고해보셔도 좋을거 같다.

 

 

 

 

틈틈히 시간을 내서 계속 보고 있지만, 아직까지 책의 많은 부분을 보지를 못하고 있으며, 

프로그래밍을 공부하면서 각 프로그래밍 책에서 간단하게 이렇게 사용하는거다라고만 알려주는 것들을 

좀더 깊이 있게 이해할수 있어서 프로그래밍을 하는데 깊이 있는 이해를 하는데 많은 도움이 되고 있습니다.

 

IT개발자로 준비를 하시는 전공자분들은 아마도 대학에서 한학기 수업으로 수강을 하신 분들도 계실듯 하고, 

아니신분들이시라면 꼭 읽어보시는 것을 추천드리며, 비전공자 분들이시라면 개발자로 취업을 준비하는데, 

큰 도움이 될듯 합니다.

 

 

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 

 

MIT에서는 오랫동안 SICP를 가르치다가 중단하였기에 배우지 않아도 된다라고 주장하시는 분들이 있습니다.하지만 이런 주장을 하시는 분들은 이 책을 제대로 읽어보지 않으신 거라고 생각됩니다.시대를 떠나서 현대에도 충분히 고민하고 공부할 내용이 가득하며,개인적으론 시니어로 가려면 이정도는 소화를 해야하지 않나? 라고 의견입니다.

첫인상

먼저 SICP는 Structure and Interpretation of Computer Programs의 약자다. 사실 서점을 돌아다니다가 스쳐서 봤을 때는 하드웨어 관련된 내용처럼 보여서 JS로 하드웨어를 다룰 수 있다고? 개꿀이네. 라고 생각했다. 다른 분들은 이런 실수를 하지 않기를 바라며 서평의 서문에 적어둔다. 책 외관이 아주 무서운 책처럼 보였다. 일단 엄청 두껍다. 찾아보기를 포함해 무려 page 881 웬만한 전공책를 옆에 가져다놔도 전공책이 단편소설로 보일 정도의 두께다. 이 책의 무거움을 한결 덜어주기 위해 표지에 보이는 세련된 마법사 모자 일러스트를 집어넣었지만.. 오히려 모자무게만 더해진 것 같다. 보통 나는 책과의 첫 만남으로 나는 책의 아무 부분만 펴서 2~3 페이지를 읽는 방식을 선택한다. 이 책과의 첫만남을 한창 진행하던 도중 어디서 익숙한 냄새가 나기 시작했다. 씁쓸하면서도 습한.. 나의 공대의 냄새. 그렇다. 이 책은 공대생을 위한 전공책이였던 것이다. 결국 컴퓨터 과학이라는게 사람이 손으로 하던 계산을 기계가 할 수 있도록 만든 학문이므로 수학과 관련된 내용이 조금 많다.파이를 구한다던지 적분을 한다던지 등등 한동안 잊고 살았던 지식들 다시 기억났다. 한창 대학교 과를 정하던 시기에 해리포터에 나오는 모자처럼 이 모자가 나에게"컴퓨터 공학" 이라고 말해줬으면 얼마나 좋을까하는 내심 아쉬움도 있었다.

 

전반적인 내용

위에서 말했던 것처럼 수학적인 내용이 많다. 즉 수학에서 사용하는 일반적인 식들을 어떻게하면 수치적으로 구현하는가에 대한 설명이다. 하지만 비단 이런 내용만 있는건 아니다.컴파일러, 저장소 할당, GC, 모듈, 추상화 같이 컴퓨터와 개발(개인적으로 CS와 개발 방법론이 구분되어 있다고 생각한다) 전반에 대해 다루고 있고 이 내용 하나하나들이 굉장히 수준이 높다. 그래서 사실 초급 개발자들이 읽기에는 어려운 책이 아닌가 싶다. 개인적으로 추천하는 대상은 비전공자 + 연차 3~4년 인 분들이 읽으면 많은 시너지가 날 수 있는 책이라고 생각한다.

시너지라고 하면 대학원같은... 아니다. 그렇게 생각한 이유는 연차가 쌓이면서 단순이 개발적 이슈 뿐만아니라 하드웨어적인 이슈도 만나게 되는데 그런 부분들이 책을 읽는데 도움이 될거라 생각헀다. 그리고 이 책을 한번에 쭉 읽기 보다는 챕터를 하나 잡고 특정 부분에 대한 이론과 구현을 해보는 것을 추천한다. 가령 5.3의 저장소 할당과 GC 부분에서 직접 GC를 구현하는 부분이 있는데 GC에 대한 이론적 배경과 실제 JS로 구현 + 현재 내가 사용하는 언어의 GC와 해당 로직이 들어가는 이유 같은걸 깊이 탐색해보면 의미있는 학습이 될거라 생각한다. 나도 서평 작성을 위해 책 전체를 훑긴 했지만 주별로 한주제씩 깊이 파볼 생각이다.

 

 

결론

무섭게 생겼지만 착한 책이였다. 아직 어색한 사이라 조금씩 야금야금 친해져야겠다.

구입하기 전에 서점에서 잠시 읽어보기를 권한다. 

'ㅅ')단순 실용서를 생각하면 오산이다.

 

이 도서는 마치 학술 자료나 전공 서적 같은 구성을 가지며, 프로그래밍 그 자체에 대한 탐구서이다.

개념/이론 설명 -> 연습 문제 -> 설명 -> 연습 문제... 가 끊임없이 반복된다.

 

읽다보면 그 어려움에 숨이 턱턱 막히는데, 괜시리 ‘MIT 학생들만 이해할 수 있는 교과서’ 로 불리고 있는게 아닌 것 같다. 

(실제로 1980년대에 쓰여진 MIT의 컴퓨터 과학 입문 과목의 교과서라고 한다.)

 

용감하게 이 도서를 뽑아든 당신이라면 '계산적 과정' 에 연관된 수많은 개념들을 훈련하고,

머릿 속의 프로그래밍 과정을 '시각화' 할 수 있을 것이다.

 

훑어본 바로는 수식과 복잡한 개념들이 계속해서 등장하며,

그 난이도도 쉽지 않은 수준이어서 이해하기에 쉽지 않게 느껴졌다.

 

수식 연산 예시와 그를 어떻게 추상화, 함수를 이용하여 표현할 수 있는지 반복적으로 설명하는데...

읽을 수 있다면 고된만큼 얻는 것은 많은 책이렷다. 'ㅅ')a'

 

언어와 그 구성에 대한 개념 정리의 풀 패키지' 같은 도서이며, 

이 도서를 완독할 수 있다면 적어도 프로그래밍 세계에서는 두려울 것이 그닥 없으리라...

'추상화' 훈련과 '시각화'에 분명한 도움이 될 것이다.

(분명한 것은 읽는데 상당한 시간이 걸릴 것이다.)

 

.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 

SICP는 무엇의 줄임말일까?

처음 듣어보시는 분들도 계실것 같고, 아시는 분들도 있을것입니다.

 

Structure and Interpretation of Computer Programs

한글로 번역하면, 컴퓨터 프로그램의 구조와 해석로 해석되고 불리어 집니다. 
기존에도 이렇게 동일 저자분의 책이 출간되어 있습니다.
하지만 기존에 책은 아래와 같은 장벽이 있었습니다.
SICP는 사실 모든 프로그래밍 언어에서 사용하기 유용하고 강력한 프로그램 조직화 방법을 소개하지만
스킴(Scheme)이라는 언어를 사용해 진입 장벽이 있었다.
 

"이번에 새롭게 출간된 SICP는 많은 개발자들에게 친숙한 언어인 자바스크립트로 옮긴 책입니다."

책을 받고 나서 책의 두께에 매우 압도 당했습니다. (p.883)

책이 두꺼운 이유는 설명이 매우 자세하게 되어 있고, 연습문제가 매우 많이 있습니다.

 

책을 보는 순간 무자정 책을 보면 안될거 같은 생각이 들었습니다.
기본 내용은 1판,2판 모드 큰 맥락은 비슷하여서 우선 관련 책에 대한 블로그 및 다른 분들이 중요하다고 생각하는 
사항들을 먼저 접해보고 잭을 읽어보고 싶었습니다.

 

 

 

 

 

아래 블로그에서도 좋은 정보를 찾았습니다.

· https://steelbear.tistory.com/70

· http://ropas.snu.ac.kr/~kwang/4190.210/mooc/ (서울대학교 이광근 교수님)
강의 내용은 2012년 강의 내용입니다. 저도 강의를 다 보지는 못했지만, 아주 좋은 내용입니다.

시간이 되시면 영상을 보시면 좋을것 같습니다.

 

 

 

 

http://ropas.snu.ac.kr/~kwang/4190.210/mooc/l01_02_01.mp4

 

 

 

■ 목차 살펴보기

책의 목차는 5장으로 구성되어 있습니다.

목차를 보면 "추상화"라는 단어가 많이 있는것이 눈에 들어옵니다.

제1장 함수를 이용한 추상화
제2장 데이터를 이용한 추상화
제3장 모듈성, 객체, 상태
제4장 메타언어적 추상화
제5장 레지스터 기계를 이용한 계산
 

1장의 추상화는 interface나 abstact 메소드 같은 패턴을 이야기 할거 같습니다. 아닐수도 있구요

2장의 추상화에 데이터라는 말이 나오는데 enum같은 것을 의미하는것일까? VO나 Entity객체를 의미하는것일수도 있을것 같습니다.

value를 Object개념으로 사용하는것일거 같은 생각이 듭니다.

 

4장의 추상화에서 나오는 메타언어적이라는 것은 무엇을 의미할까요?

상상을 해보면 spring에서 의존성을 해소하기 위해서, 의존성분리 DI/IoC개념을 의미할 것도 같고,

properties를 통해서 meta적인 코드성을 이용해서 프로그래밍을 하는 것일까요?

 

이렇게 적어놓고 보니, 책에서 주안점을 두는 부분을 조금이라도 나만의 시각으로 바라볼수 있을거 같습니다.

책의 내용중 기억에 남는 부분을 정리해보려고 합니다.

■ 제1장 함수를 이용한 추상화

  • 1장의 내용은 추상화의 개념보다 프로그래밍을 하기 위한 기본요소에 대해서 설명합니다.
  • 표현식, 연산, 이름생성을 통해서 함수라를 개념을 도출합니다.
  • 함수의 종류는 다양하게 구성되며, 재귀함수, 반복, 거듭제곱 등등 다양한 표현식을 제공합니다.
    수학적인 표현이 모두 프로그램적으로 표현이 가능한 부분입니다.
  • 람다표현식도 설명되어 있습니다.
  • "1.3.4. 함수를 돌려주는 함수"이 절이 제일 핵심이 아닌가 생각이 듭니다. 
    "함수가 다른 함수를 인수로 받는 능력은 프로그래밍 언어의 표현력을 크게 향상한다."
    함수가 단순히 return 되는 항목이 고정된 value 값이 아닌 다양한 return타입을 가지는것은 프로그래밍의 다양성을 확보합니다.

 

■ 제2장 데이터를 이용한 추상화

  • 1장보다는 조금 더 프로그램 적으로 구체화를 하는 장표이다.
  • 데이터 객체들을 조합해서 복합 데이터(compound data)를 형성함으로 써 추상을 구축하는데 사용되는 수단 사용
    • 복잡한 현상을 모형화(modeling)하기 위해 프로그램을 설계해야함
    • 다양한 측면을 가진 실세계의 현상을 모형화 하려면 부품이 여러개인 계산적 객체를 구축해야 함
  • "데이터 추상화" 방법론
    • 프로그램에서 데이터 객체의 표현을 다루는 부분과 그러한 객체를 실제로 활용하는 부분을 분리한다는 개념
    • 핵심원리 : 복합 데이터 객체를 사용하는 프로그램이 "추상 데이터"에 대해서 작동하도록 프로그램의 구조를 짜는것
    • 복합 데이터를 이용하면 프로그램의 모듈성을 높일수 있다.
    • 프로그램의 설계와 유지보수, 수정이 훨씬 쉬워진다.
    • 프로그램은 데이터에 관해 최소한의 가정만 두고, 데이터의 표현을 독립적으로 진행해야 함
    • 추상화 장벽 (abstraction barrier) : 데이터 추상화를 이용하면, 프로그램의 서로 다른 부분들 사이에 존재한 영역
  • 복합 데이터를 다루는 중요한 개념
    • 닫힘 (closure)
    • 합의된 인터페이스 (conventional interface)

■ 제3장 모듈성, 객체, 상태

  • 이전장에서는 프로그램 구성 기본요소, 원시함수, 원시데이터 조합을 통한 복합적 개체 생성, 추상화의 필요성 학습
  • 프로그램을 효과적으로 구성하기 위한 방법이 필요!!
    • 대규모 시스템이 모듈성(modularity)을 확보하기 위한 전략이 필요함
    • 객체(object)에 초점을 두고 대규모 시스템을 구성하는 방법
    • 정보의 흐름 or 스트림에 초점을 두고 접근하는 방법
  • 객체
    • 객체의 상태는 하나 이상의 상태변수들로 특정지을 수가 있다
    • 다수의 객체로 구성된 시스템에서 객체들이 완전히 독립적인 경우는 드물다.
    • 각각의 객체는 상호작용을 통해 다른 객체의 상태에 영향을 미친다. (coupling 역활 수행)
    • 계산적 객체는 실제 객체의 상태를 서술하는 자신만의 지역상태변수를 가져야 한다
  • 배정
    • 배정연산 (assignment operation) : 언어는 주어진 이름과 연관된 값을 변경할수 있어야 함
    • 배정표현식 : 이름 = 새 값
    • 함수형 프로그래밍 (fuctional programming) : 배정을 전혀 사용하지 않고 프로그램을 짜는 방식
    • 명령식 프로그래밍 (imperative programming) : 배정을 적극적으로 사용하는 프로그래밍 방식
  • 동시성
    • 상태의 복잡성, 같음, 변환에 깔린 문제는 배정을 도입하면, "시간" 이라는 요소가 포함된다.
    • 직렬화 (serialization) : 스레드들이 동시적으로 실행되기는 하지만, 여러 스레드가 동시에 실행할수 없는 함수들의 집합
    • 뮤텍스 (mutex) : 기본적인 동기화 메커니즘
    • 교착 (deadlock) : 두 스레드들이 서로 종료되길 기다리는 과정 (둘이상의 공유자원 접근시 발핼할수 있는 위험 존재)
  • 스트림
    • 배정때문에 생기는 다양한 문제를 해결하기 위한 방법중에 하나
    • 지연평가 (delayed evaluation)를 이용한 스트림 표현
    • 무한 스트림 방식

 

 

■ 제4장 메타언어적 추상화

  • 복잡한 시스템을 구성시, 한가지 프로그래밍 언어로 충분하지 않을때가 발생한다.
    • 특별히 적합한 원시 연산들과 조합 수단들, 추상화 수단들을 제공하는 새로운 언어를 도입하며 효과적 해결 가능
    • 정의
      • 언어로 언어를 만드는 개념
      • 컴퓨터의 기계어 (물리적인 언어)를 통해서 하드웨어를 Control
      • 기계어 위에 고수준 언어를 상용해서 시스템의 대규모 조직화에 적합한 조합 및 추상화 수단들 제공
  • 평가기(ealuator) 또는 해석기 (interpreter)
    • 해당 언어로 된 문장이나 표현식을 받고 그 문장이나 표현식을 평가하는데 필요한 동작들을 수행하는 함수
    • 평가기의 핵심부
      • evaluate 함수 : 프로그램의 한 구성요쇼(component)와 환경을 받는다.
        • 원시 표현식
        • 조합
        • 구문형
      • apply 함수 : 두개의 인수를 받는다. 하나는 함수이고, 다른 하나는 그 함수를 적용할 인수들의 목록이다.
        • 함수 인수
        • 조건부 구성요소
        • 문장렬
        • 블록
        • 반환문
        • 배정과 선언

 

 

 

  • 구성요소의 표현식
    평가기를 거처 실제 우리가 작성하게 되는 형태의 프로그램적인 구문 요소들에 대해서 설명한다.
리터럴 표현식 : list("literal", 값)
이름  : list("name", 기호)
표현식 문장 : <<표현식>>
함수 적용 : 함수 표현식(인수-표현식, . . . . . . , 인수 표현식)
조건부 구성 요소 : <<술어 ? 귀결-표현식 : 대안-표현식>>
람다 표현식 : (이름, . . . , 이름) => 표현식
문장렬 : <<문장, . . . , 문장 >>
블록 : { 문장들  }
반환문 : <<return 표현식>>
배정 : <<이름 = 표현식 >> = list("assignment", <<이름>>, <<표현식>>)
상수,변수,함수 선언 : << 이름 = 표현식>>

■ 제5장 레지스터 기계를 이용한 계산

  • 앞에서 학습하고 이해한 사항을 가지고 우라가 알고 있는 레지스터 기계를 구현해보는 실습 chapter이다.
  • 실제 아래 그림보다 더 복작하고 서브루틴, 이중재귀, 저장소, 스택의 구현등을 통해 구체화 해본다.

 

 

■ 책에 대한 소감

  • 유명한 책을 보고 나서 유명한 이유를 알게 되었습니다.
  • 이 책이 처음 나온 시점이 몇십년전이니까, 이런한 지식을 바탕으로 다양한 언어들이 나온것 같았습니다.
  • javascript를 통해서 예제가 제공되어서 코드를 이해하기 좋았습니다.
  • 조금 더 근본적으로 생각해볼 거리와  평소 놓치고 있던 부분들을 경험할 수 있었습니다.
  • 예시가 많으니, 차분히 풀어보면 많은 도움을 받을수 있는 책이라고 생각합니다.
  • 설명도 자세히 잘 되어 있었습니다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

2019년부터 한빛미디어의 "나는 리뷰어다" 도서 리뷰 이벤트에 참여하고 있습니다. 매월 한빛미디어의 책을 한 권씩 받아서 읽고 리뷰하는 건데요. 연말, 연초에 신청을 받아서 한 해동안 활동하게 됩니다. 2023년에도 가슴 졸이며, 신청을 했는데 다행히 선정되었다고 메일을 받았습니다.

만 3년 넘게 리뷰어 활동을 고집하고 있는 이유는 두 가지 놓고 싶지 않은 장점이 있기 떄문입니다. 첫째, 리뷰어로 책을 받아들면, "강제"로 책을 읽게 됩니다. 다시 말해 한달에 적어도 책을 한권은 읽게 된다는 거죠. 둘째, 관심이 좀 덜한 분야라도 역시 "강제"로 읽게 됩니다.

"나는 리뷰어다" 책 선정 메일을 받으면, 도서 목록에서 읽고 싶은 책 3권을 선택하라고 하는데요. 꼭 읽고 싶다는 생각이 드는 책이 한달에 세 권이 될리는 없기 때문에 결국 덜 관심있는 책도 선택하게 됩니다. 참 희한한건, 항상 관심있는 책보다 덜 관심있는 책이 선정되어 보내진다는 겁니다. 아마 제가 관심있는 책은 다른 리뷰어들도 관심이 있으니 선정되는 확률이 떨어질꺼라 짐작해봅니다.

올해 첫 리뷰 책 목록에는 <자바스크립트로 배우는 SICP>가 있었습니다. SICP는 Structure and Interpretation of Computer Programs의 약자입니다. 우리말로 "컴퓨터 프로그램의 구조와 해석"이죠. 이 책은 컴퓨터 공학의 기본 교과서에 해당하는 책으로 상당히 오랜 시간 권위를 지켜온 책이기도 합니다. 하지만 저는 이 책을 읽은 적이 없는데요. 왜 그런지 모르지만 제가 배웠던 교수님들은 이 책을 교과서로 선정해서 가르치지 않으셨었습니다.

그래서, <컴퓨터 프로그램의 구조와 해석>이라는 책을 사서 읽는 중이었습니다. 하지만 <컴퓨터 프로그램의 구조와 해석>은 스킴이라는 프로그래밍 언어를 사용해 설명하는 책입니다. 물론 스킴을 잘 모르더라도, 책을 이해할 수 있다고는 하지만, 스킴이 낯선 사람들 입장에서 스킴을 가지고 컴퓨터 프로그램을 설명하는 책도 낯설게 느껴집니다. 그래서 정말 진도 나가기 힘들더군요. 한 페이지 읽다가 딴생각하고, 다시 읽다가 딴생각하고를 반복했습니다. 그러던중 <자바스크립트로 배우는 SICP>라는 책이 나왔다는 것을 알게 되었죠. <자바스크립트로 배우는 SICP>는 <컴퓨터 프로그램의 구조와 해석>의 자바스크립트 편이었던 겁니다.

책 리뷰 목록에서 <자바스크립트로 배우는 SICP>를 보았을 때 정말 반가웠습니다. 혹시나 선정될까? 라는 기대감에 신청을 했는데... 다른 때와는 다르게 가장 관심있는 이 책을 받아보게 되었습니다. 하지만 책을 받아든 순간, '엇'하고 외마디 비명을 질렀습니다. 책의 분량이 어마어마하다는 걸, 간과하고 리뷰하겠다고 신청했다는걸, 그때야 깨달았기 때문입니다. 900페이지 육박하는 책을 20일도 안되서 읽어야 하는 상황이라서... 참 난감했습니다. 어쨌든 리뷰를 써야 하니 열심히 읽었습니다.

컴퓨터 프로그래밍(코딩)은 무얼까요?

이 책에서는 "물리적 또는 정신적 과정에 대한 하나의 모형이 우리의 마음속에서 부화한 것"이라고 말합니다. 책 서문부터 상당히 공감되는 이야기 인데요. 결국 우리가 코딩한다는 건, 어떤 문제를 해결하는 "방법"을 프로그래밍 언어로 "표현"한 것이기 때문입니다. 물론, "표현"법을 익히는 것도 중요하지만, 문제 해결 방법을 생각해 내는 것이 더 중요합니다. 아무리 표현법을 잘 알아도, 문제 해결 방법을 모르면 코딩을 할 수 없기 때문입니다.

그래서, 이 책은 우리의 해결 방법과, "함수"를 연결하는 것부터 이야기를 시작합니다. 보편적인 해결법이 "수학"에서 온게 많기 때문인지, 1장을 읽다가 보면, 자괴감을 느끼곤합니다. '나... 수포자 인데... ' 뭐 이런 생각을 하며 자꾸 책을 덥고 싶게 되죠. 하지만.. 저는 "강제"로 읽어야 하는 상황이기 때문에, 꾸역꾸역 2장으로 넘어갔습니다.

이제 데이터에 대한 이야기 입니다. 그리고 3장 모듈!!! 우리 머릿속에 해결법이 정리된 코드가 되기 위해서 필요한 이야기들을 한단계씩 해 나가고 있습니다. 모듈을 잘 만들 수 있다면, 이제 우리는 코드를 잘 짤 수만 있을 것 같습니다. 그 다음 메타언어, 레지스터 기계에 대한 이야기가 나오면서, 이 책이 왜 "컴퓨터 프로그램의 구조와 해석"이라는 제목을 갖게 되었는지 이해가 되었습니다. 우리 머릿속의 해결법을 프로그래밍 개념과 연결해서 결국은 프로그래밍 언어를 배웠을 때 그 표현법을 가지고 표현해 낼 수 있는 상황에 이르게 하는게 이 책의 목적인 것입니다.

이 책을 읽은 독자들은 이제 어떤 프로그래밍 언어를 배우더라도 제대로 방향을 잡고 코딩을 해갈 수 있을 겁니다. !!!

<프로그래머의 뇌>라는 책에서는 "에츠허르 데이크스트"라는 분의 말을 인용합니다. "정신이 손상되기 때문에 베이직을 가르치는 것은 금지되어야 한다!!!" 정신이 손상된다는 말은 아마도 우리가 문제를 해결하는 데 잘못된 습관을 가지게 만든 다는 것인듯 합니다. 베이직은 지극히 순차적인 명령을 내리는 언어이기 때문에 여기에 익숙하게 되면 다른 사고 방식을 익히기 힘들어진다는 거죠.

비슷하게 C언어 개발자들이 C++을 잘못 다루는 사례도 있습니다. C언어는 하향식으로 코딩을 하기 편리하게 되어 있는데 C++은 사실 상향식으로 코딩을 하려고 만든 언어입니다. 다시 말해 세부적인 기능을 뭉쳐나가다가 전체를 만드는 방식과, 전체 그림을 먼저 조망하고 세부를 조율해 가는 건, 다르거든요. 하지만, C언어에 익숙한 개발자들은 C++를 C언어처럼 사용합니다. 함수 대신 클래스와 상속을 사용할 뿐이죠. 즉 표현법이 바뀌었지만, 문제 해결 방법을 생각해 내는 생각 방식에는 바뀐게 없었던 것이죠.

다시말해, 코딩의 방향성에 대한 고민이 없으면, 잘못된 코드를 만들어낼 가망성이 높아진다는 말이 됩니다. 그리고 SCIP는 제대로된 코딩의 방향성에 대해서 컴퓨터 공학 역사를 통털은 지식을 가지고 설명하는 책이라고 할 수 있고요.

정말, 중요한 책인 <컴퓨터 프로그램의 구조와 해석>을 붙잡고 진도나가지 못하고 있었는데 <자바스크립트로 배우는 SICP>를 리뷰하려고, "강제"로 읽게 되면서, 읽을 수 있게 되었던 것 같습니다. 이제 시간을 좀 여유있게 갖고, 두 권의 책을 비교해가면서 읽어보려고 합니다. SICP는 파면 팔 수록 정말 많은 걸 알게 해주는 책인것 같네요.

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 

 

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

 

이 책의 별명이 ‘마법사 책’인 이유는 단순히 원서의 커버 이미지 때문이 아닙니다. 제1장 시작 부분에서 저자는 계산적 과정(computational process)에 관해 설명하며 이를 마법에 비유합니다. 마법사가 지적 활동을 하는 영혼을 불러내기 위해 주문을 외워 마법을 부리듯이, 프로그래머는 프로그램을 만들기 위해 프로그래밍을 합니다. 원리를 알기 전에는 마치 신기한 마법같이 보이는 계산적 과정을 구현하는 방법을 알려준다는 의미에서도 마법사 책이라는 별명이 걸맞습니다.

 

프로그래밍 언어의 원소라고 할 수 있는 표현식과 변수명부터 시작하여 프로그래밍을 하면서 만나는 일반적인 문제에서 발견할 수 있는 패턴을 설명하고 점차 복잡한 프로그램을 구축하는 방법을 알려줍니다. 추상화를 위해서 함수가 왜 필요하며 어떻게 쓰일 수 있는지, 단순히 조건 표현식으로만 표현할 수 없는 복잡한 상황을 해결하기 위해 조건문을 사용해보는 흐름 등, 프로그래밍의 특징과 상황을 원론적으로 다룹니다. 강의 교재였기에 설명이 아카데믹하고 주석도 많이 있어서 내용이 쉽고 빠르게 읽히지는 않지만 탄탄한 기초와 공학적인 관점을 훈련할 수 있는 책 같습니다.

 

자바스크립트를 더 공부하고 싶은 마음에 여러가지 리뷰 가능한 책들 중 '자바스크립트 SICP'를 선택하게 됐다. 책 소개에도 800페이지가 넘어서 긴장하긴했는데, 실제로 받아보니 정말 두꺼웠다. 좀 더 편하게 공부하기위해 근처 제본소에 가서 분철을 했다.   책은 내 생각보다 더 어려웠다. 국비 끝내고 자바스크립트 이제 쫌쫌따리 공부를 시작한 나에게는 용어의 장벽이 조금 있긴하지만, 컴퓨팅 과정을 인지심리학이랑 연결지은 부분은 너무 좋았다. 또한 자바스크립트로 예시를 들기위해 자바스크립트 설명부터 시작해, 프로그래밍의 기본 요소, 환경 등 필요한 지식을 차근차근 깊게 깊게 알려주기때문에 꼭꼭 씹어먹게 되는 책이다. (알고있던 삼항연산자도 이 책으로 읽으니 어렵다 ;-; ) 읽다보면 회사에서 들었지만 이해못하고 넘어갔던 용어들이 꽤 나온다.    서평을 하기위해 완독을 하고싶었지만,.. 완독은 어렵고.. 밑줄치고 타이핑하며 넉넉하게 반년이상 투자해가며 씹어나갈 계획이다. 컬러면 더 좋았지만.. 가끔 회색이 있다는것에 감사하며.. "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."  

 

 

고백하자면 학부생 시절, 전공 공부를 소홀히 했었다.
전공 공부는 중간고사, 기말고사 때 어디선가 얻은 일명 '족보'를 곁에 두고 나올 문제만 공부했다.

졸업 후 일을 하면서 전공 지식이 부족함을 느끼고 뒤늦게나마 전공 공부에 대한 갈증을 해소하고 있다.
오늘 소개할 도서는 마치, 학부생 시절 접했던 전공 도서를 생각하게 한다.
약 1,000페이지(실제로 883페이지)에 달하는 책의 두께가 '나 전공이야' 라고 말하는 것 같다. 뜨헉!

 

 

 

몰랐는데 이 SICP는 꽤 뼈대있는(?) 전공 도서였다.
"컴퓨터 프로그램의 구조와 해석(Structure and Interpertation of Computer Programs, SICP)"이 1984년에 1판이 나온 이후로 전 세계 대학교에서 교과서로 쓰였다고 한다.

 

 

이 책은 그 유서깊은(?) 전공 도서의 JavaScript 버전이다.
그래서 제목도 "자바스크립트로 배우는 SICP"가 아닌가!

 

목차를 보면 33페이지에 걸쳐 추천사, 머릿말, 감사의 말 등 소개 페이지이다.
그리고 883페이지까지 심도 있는 내용을 다루고 있다.

 

심도있는 설명과 함께 예제 또한 상세히 설명을 하고 있고, 각 장의 끝에는 연습문제를 두어서 앞서 배운 내용을 혼자 고민해볼 수 있도록 구성되어 있다.

     

 

텍스트만 있는 것은 아니고 여러 그림을 추가하여 이해를 쉽게할 수 있도록 도움을 준다.

 

 

사실 방대한 내용으로 아직 끝까지 다 보지는 못하였다.
그러나 평소에 아무 생각없이 사용하던 함수, 동시성 프로그래밍 등에 대해 깊게 고민해보는 시간이 되지 않을까 싶다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."


 

한빛미디어.png

 

KakaoTalk_20230210_170015643_14.jpg KakaoTalk_20230210_170015643_12.jpg

 

자바스크립트로 배우는 SICP는 프로그래머들 사이에서도 '마법사의 책'이라고 불리울 정도로 유명하고,

1985년부터 지금까지 전세계 수많은 교육기관으로부터 교과서로 채택될 정도로 아주 훌륭한 전문 서적이랍니다.

그래서 그런지 확실히 교과서적인 느낌이 강하고, 기술적인 부분보다는 이론 부분을 좀 더 강조한다는 느낌이 들었습니다.

그리고 해당 분야의 이해력을 높이기에 이만한 도서가 또 있을까 싶은 생각도 들었네요.

이 책은 프로그래머를 꿈꾸는 사람이나 효율적인 프로그램을 만들고 싶은 개발자, SICP에 대해서 자세히 알고 싶은 사람들이 읽기에 참 좋았고요.

 

 저 같은 경우엔 이제 막 개발에 관심을 가지고 있는 터라, 현재 자바스크립트 배우면서 동시에 이 책을 보고 있답니다. 

해서 ~ 저에게는 해당 서적이 좀 많이 ㅋㅋ 어렵게 다가왔지만~ 전공자나 프로그래머들은 아주 스무스하게 쉽게 읽어 내려가실 수 있으실 것 같아요.

설명이 제법 잘 되어 있거든요. ㅎㅎ 필히 읽어보시면 좋을 도서라고 생각합니다. 

KakaoTalk_20230214_205854109_01.jpgKakaoTalk_20230214_205854109.jpg수정KakaoTalk_20230210_170015643_02.png

 

아래의 사진은 책 뒷면에 나와 있는 예제소스 주소로 접속하여 책에 나와 있는대로 프로그램을 입력하고 실행해 본 결과 입니다.

image.png

 

image (1).png

 

 

 

결제하기
• 문화비 소득공제 가능
• 배송료 : 2,000원배송료란?

배송료 안내

  • 20,000원 이상 구매시 도서 배송 무료
  • 브론즈, 실버, 골드회원 무료배송
닫기

리뷰쓰기

닫기
* 상품명 :
자바스크립트로 배우는 SICP
* 제목 :
* 별점평가
* 내용 :

* 리뷰 작성시 유의사항

글이나 이미지/사진 저작권 등 다른 사람의 권리를 침해하거나 명예를 훼손하는 게시물은 이용약관 및 관련법률에 의해 제재를 받을 수 있습니다.

1. 특히 뉴스/언론사 기사를 전문 또는 부분적으로 '허락없이' 갖고 와서는 안됩니다 (출처를 밝히는 경우에도 안됨).
2. 저작권자의 허락을 받지 않은 콘텐츠의 무단 사용은 저작권자의 권리를 침해하는 행위로, 이에 대한 법적 책임을 지게 될 수 있습니다.

오탈자 등록

닫기
* 도서명 :
자바스크립트로 배우는 SICP
* 구분 :
* 상품 버전
종이책 PDF ePub
* 페이지 :
* 위치정보 :
* 내용 :

도서 인증

닫기
도서명*
자바스크립트로 배우는 SICP
구입처*
구입일*
부가기호*
부가기호 안내

* 온라인 또는 오프라인 서점에서 구입한 도서를 인증하면 마일리지 500점을 드립니다.

* 도서인증은 일 3권, 월 10권, 년 50권으로 제한되며 절판도서, eBook 등 일부 도서는 인증이 제한됩니다.

* 구입하지 않고, 허위로 도서 인증을 한 것으로 판단되면 웹사이트 이용이 제한될 수 있습니다.

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?

자료실

최근 본 상품1