머신러닝 시스템 설계 - 프로젝트 범위 산정부터 프로덕션 배포 후 모니터링까지, MLOps 완벽 해부하기
칩 후옌 지음, 김대근.김영민 옮김 / 한빛미디어 / 2023년 3월
평점 :
장바구니담기


· 책의 난이도 있습니다. 단순히 Ops 입장의 책은 아니고 MLOps를 잘하기 위한 책이라는 생각이 들었습니다.

  머신러닝 알고리즘 개발자 분들도 이책을 보면, 많은 도움을 받으실수 있다고 생각이 들었습니다.

  알고리즘 개발시 필요한 요소들이 크게 시스템적으로 접근했을때 어떻게 접근하는지는 비슷한 부분이 많았습니다.

· 저자분의 다양한 경험 및 이론을 잘 뒷받침 하는 자료 및 근거가 제시되어 있어서 참고할 내용이 많이 있습니다.

· MLOps를 구축하기 위해서, 기준이 되는 바이블 같은 책입니다.

· 언급되는 항목이 꼭 MLOps가 아니여도 곳곳에 전체적인 시스템적으로 도움을 받을만한 내용이 있습니다.

· 책의 서문에 나온 대상독자 글에서도 명확히 이책의 장점이 나타납니다. 아래와 같은 시나리오는 한번쯤은 고민해봤을 부분이라고

생각이 되고, 지면을 통해서 순차적으로 설명되어 집니다.

 

 

■ 언제 머신러닝을 도입해야 할까? 우리 프로젝트에 머신러닝이 더 적합한 것인가?

· 약간 근본적인 질문입니다. 머신러닝 시스템을 구성하기 전에 한번더 머신러닝에 대해서 정의하고, 일반 솔류션과의 차이점을 환경적인 부분에서 재 정의 해보면 좋을것 같습니다.

· 책에서는 총 9가지 항목으로 정의합니다.

  1. 학습 : 시스템에 학습 능력이 있습니다. (RDBMS는 ML시스템이 아님)
  2. 복잡한 패턴 : 학습할 패턴이 존재하며 복잡합니다.
  3. 기존 데이터 : 사용가능한 데이터가 있거나, 데이터 수집이 가능합니다.
  4. 예측 : 예측에 대한 문제입니다.
  5. 본적 없는 데이터 : 본적없는 데이터가 훈련 데이터와 동일한 패턴을 갖습니다.
  6. 반복적입니다.
  7. 잘못된 예측으로 발생하는 비용이 낮습니다.
  8. 대규모로 수행됩니다.
  9. 패턴이 지속적으로 변합니다.

위의 사항을 보면, DBMS에 저장된 기존 아키텍처를 사용해서 정보를 제공하는것 말고, 예측, 패턴을 제공하는 서비스에는 머신러닝이 검토하는 과정이 필요해 보입니다.

 

 

■ 머신러닝 시스템 vs 전통적인 소프트웨어

분명 다르다고 알고 있고, 차이점이 있다는 것을 알고 있는데 정확히 표현을 못할수 있습니다.

· 가장큰 차이는 데이터 관점입니다.

· 기존 소프트웨어 SWE는 코드와 데이터가 분리돼 있다고 가정하에 설계되어있고, 가능한 코드와 데이터를 모듈화 하는것에 우선하는 경향이 있는데, ML 시스템은 코드, 데이터, 그리고 이것으로 생성된 아티팩트로 구성되어 있습니다.

· ML알고리즘은 데이터를 개선하는데 매우 큰 비중을 둡니다. 이렇게 다양한 데이터 샘플을 유연하게 처리 할수 있는 구조가 되어야 합니다.



■ 머신러닝 시스템의 핵심 : 반복 프로세스

· 보통 반복인 batch성 작업으로 처리됩니다. 하지만, ML에서는 조금 더 다르게 반복 프로세스가 더욱 중요한 부분을 차지합니다. 

그 이유는 워낙 많은 다양한 모델을 학습해야 하고, 그 중심에는 지속적으로 변경되는 데이타가 있습니다.

 

· 책에서 나온 광고 사례입니다.
· 책에서 언급된 처리는 사람이 할수 없는 시스템화 되어 이어야 하는 부분입니다.

 

 

■ 데이터의 중요성

· 우리는 DB에 많은 데이터가 저장되어 있다고 하지만, 데이터의 종류는 정형화된 데이타 말고, 더 많은 비정형화된 데이타가 있습니다.

데이터의 형태는 매우 다양하고, MLOps에서도 이러한 부분이 고려되어야 하고 

이러한 관점은 알고리즘 개발자입장에서도 매우 관심이 많습니다. 연구를 하려는 데이터가 다양한 포맷으로 제공되고

보통 상업적인 데이터를 제외하고는 그 형태가 매우 다양하기 때문입니다.

사용자의 로그를 기준으로 보아도, 년월일의 포맷이 다 다르고 그 data의 생성되는 위치도 모두 일치하지 않습니다.

이러한 Pre-Handling 하는 입장에서 어떻게 그 사항을 다루어야 하는지 설명합니다.

· Json, CSV, 넘파이, 판다스를 통한 설명이 있고, 데이터를 행과 열의 입장에서 제공하는 예시도 좋았습니다.

· 우리가 많이 사용하는 관계형 데이타베이스, RDBMS를 통한 데이터 접근법도 참고하면 됩니다.

· NoSql은 Json,xml, bson등의 형태로 인코딩됩니다. 그래프 모델 등이 있습니다.

· 정형데이타, 비정형데이타가 있습니다.


■ 훈련데이터

훈련데이터는 머신러닝을 하기위해서 반드시 있어야 하는 매우 중요한 요소입니다.

이러한 훈련데이터의 속성을 아는것이 매우 중요합니다. 학습에 필요한 데이터는 모두 동일하지 않고

어떻게 분류하고, 구분지어서 관리하느냐, 어느 관점으로 Data-Set의 기준선을 정하는지 등에 따라서 많은 차이가 발생합니다.

· 다양한 샘플링 기법으로 비확율샘플링, 단순 무작위 샘플링, 계층적 샘플링, 가중 샘플링, 저수지 샘플링, 중요도 샘플링이 있습니다.

· 레이블링의 기법으로는 수작업 레이블, 자연 레이블등이 있습니다.

· 클래스의 불균현 문제를 해결하고, 올바른 지표를 추출해서 리샘플링 할수 있게 합니다.

 

■ 모델에 대한 평가

작성된 모델이 정상적인가, 잘 동작하는지 평가하고 확인하는 과정이 필요합니다.

· 모델 개발과 훈련은 머신러닝 모델이 많은데 어떠한 알고리즘을 사용해야 할지 정하는데 도움이 됩니다.

  1. 최첨단만 추정하는 함정에 빠지지 않기
  2. 가장 단순한 모델부터 시작하기
  3. 모델을 선택할때 사람의 편향을 주의하기
  4. 현재 성과와 미래 성과를 비교 평가하기
  5. 트레이드오프를 평가하기
  6. 모델의 가정을 이해하기

· 양상블을 이용해서 처음 적용하는 입장에서 모델을 예측해보면 좋습니다. 배깅, 부스팅, 스태킹 기법을 이용합니다.

· 평가를 하기 위해서 ML도 베이스라인을 정하고, 교란테스트, 불변성 테스트, 방향예상테스트, 모델보정, 신뢰도 측정, 슬라이스 기반평가 등을 수행합니다.

 

 

■ 배포하기, 장애는 어떠한 것이 있을까?

보통 이책의 가장 관심이 있는 부분이 7장 (모델배포와 예측서비스) 부분이라고 생각이 듭니다.

· 아래 통상적으로 알고 있는 질문은 ML배포관련된 현업의 충분한 의문해소를 제공합니다.

<아래 사항은 이렇다는 것이 아니고, 많이 통념으로 인지하는 그러한 제목글입니다.>

  1. 한번에 한두가지 머신러닝 모델만 배포합니다.
  2. 아무것도 하지 않으면 모델 성능은 변하지 않습니다.
  3. 모델을 자주 업데이트할 필요가 없습니다.
  4. 대부분 머신러닝 엔지니어는 스케일에 신경 쓰지 않아도 됩니다.

· 시스템이 배치처리를 해야 할지, 온리인 처리를 해야 할지, 파이프라인에 대한 구성

· 많은 모델에 대해서 어떻게 효율적으로 서비스를 할지, 압축에 대한 부분에 대한 해법

  이러한 모델도 지속적으로 업데이트 해야 하는 부분도 기존 시스템과 다른 부분입니다.

· 장애관련해서는 프로덕션 환경 데이타가 훈련데이터와 다른경우가 있습니다.

· ML 인프라를 위한 레이어는 아래와 같이 제시합니다.

일반적인 시스템과 같이 사용하는것도 있지만, ML을 위한 별도의 레이어가 제공됩니다.



댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
스프링 코딩 공작소 - 스프링 MCV로 나만의 웹 애플리케이션을 만들어 보자!
송미영 지음 / 길벗 / 2022년 12월
평점 :
장바구니담기


3가자 장점이 명확한 책이라고 생각이 됩니다.

· 기존에 SpringBoot가 아닌 Spring으로 서비스가 개발된 소스를 유지보수, 개발하시면 많은 도움이 됩니다.

· Spring에 대해서 조금 더 원리를 알수 있습니다.

· maven, log4j, 인터넵터, web.xml 등 많이 사용하지만 조금 더 학습하고자 하시는 분들에게 도움이 됩니다.

스프링 책도 있고 스프링부트 책도 있습니다. 만약 스프링 부트를 공부하고 싶은 분이나, 회사에서 스프링 부트 환경으로 개발을 하시는 

경우에는 스프링책으로 학습하거나 필요가 없는 것일까요?

결론부터 말씀드리면, 그렇지 않다고 생각합니다. 스프링 책으로 학습이 필요하다고 생각합니다.

 

최초 스프링으로 개발이 되어 오면서 추후 스프링 부트가 나왔습니다.

예전에는 책에도 언급된것 처럼 스프링, WAS등을 개별로 구성하여서 서비스 환경을 구축하였습니다.

하지만 현재는 스프링부트로 예전에 스프링에서 환경구성 및 Framework을 사용하는데 불편하다고 하는 부분이 개선되어서

스프링부터가 나온것이고, 스프링부트의 핵심은 스프링에 있습니다.

스프링책과 스프링부트의 책이 다른책이 아니라고 생각합니다.

스프링부트 책에서도 Bean에 대해서 다루고 다양한 @Annotation에 대해서 다룹니다.

이책은 스프링에 대해서 조금 더 "원론적이고, 기본적인 동작방식에 대해서" 다루기 때문에, 부트를 사용하시는 분들도 충분히 도움을 받을수 있는 책입니다.



댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
UX/UI 디자이너를 위한 실무 피그마 - 디자인 시스템에서 개발 전달까지, 개정판
클레어 정 지음 / 한빛미디어 / 2022년 11월
평점 :
구판절판


■ 피그마를 잘 활용할수 있게 Step by Step

· 피그마는 도구 입니다. 그래서 각 메뉴 및 기능에 대한 설명이 매우 중요합니다.

· 이 책에서는 메뉴에서 제공하는 기능 설명을 우선 1장에서 설명을 합니다.

· 2장에서는 그래픽의 스타일을 사용법을 통해서 "컬러, 라인, 그라데이션"등 사용법을 설명하고 Organization플랜 제공 항목인 팀 라이블러를 통한 공유 방법을 설명합니다.

· 3장에서는 개인적으로 가장 중요하다고 생각하는 레이아웃에 대해서 설명합니다.

레이아웃을 구성할때, 중요한 반응형디자인에 대한 구성도 할수 있습니다.

"콘스트레인트" 라고 하는 어떤 오브젝트의 위칫값을 상하좌우 강제로 고정하는 기능이 있어서 많이 사용하실거 같습니다.

 

 

 

· 4장에서는 화면 구성시 필요한 리소스 - 컴포넌트, 플러그인, 위젯을 사용하고 관리하 다양한 방법이 소개됩니다.

· 5장에서는 Figma를 조금더 잘 활용하기 위한 다양한 협업 기능이 있습니다.

 

 

베리언츠 : 컴포넌트 세트를 만들고 더 체계적으로 사용하는 기능

컴포넌트 프로퍼티 : 지정된 텍스트를 쉽게 변경하고, 아이콘을 앞이나 뒤의 원하는 위치로 지정하기 편리

인터랙티브 컴포넌트 : (컴포넌트 + 베리언츠 + 프로토타입)의 3가지 기능이 합쳐져 실제 같은 인터랙션을 바로 구현해보는 기능

버전히스토리 : 30분 단위로 오토세이브로 기록하고, 이전 내역을 볼수 있는 기능

 

 

· 6장부터는 실제 앞단원에서 배운 요소요소 항목을 가지고 본적격인 실습을 합니다.

 

 

· 실습 장표를 구성시, iOS, 안드로이드, 반응형서비스를 구성하면서 각각의 다른 Device을 하게  예제가 있는 부분이 좋았습니다.

예를 들어 안드로이드와 iOS에는 구조적인 호면 차이가 있습니다. 안드로이드는 하단의 소프트 키가 있어 iOS와 달리 '뒤로 가기' 버튼이 없어도 된다는 특징이 있습니다.

반응형 웹은 크게 모바일 뷰, 패드 뷰, 데이크톱 뷰 별로 디자인을 만듭니다.

 

 

· 9장에서 소개되는 요서는 Figma에 종속적이지 않지만, 가장 많이 사용하는 항목들인데 그것들에 대한 디자인에 대한 원칙 및 기준을 제시하는 부분이라서 많이 생각할 수 있고, 한번 익히고 배워놓으면 계속 사용하게 될 내용으로 구성되어 있습니다.

 

 

 

 

 

■ 디자인을 잘하기 위한 노하우가 잘 설명되어 있습니다.
피그마의 사용법에 대한 부분 이외에 "디자인 노하우"가 잘 정리되어 있습니다.

현업에서 이러한 지식이 없이, 디자인 작업을 진행하게 된다면, 몇번이고 다시 작업을 하고

정확하게 제품 릴리즈에 필요한 디자인 요소를 놓칠수가 있습니다.

 

이러한 부분은 실제 협업에서도 매우 중요한 개념이여서 많은 도움이 됩니다.

→ 디자인하기 전 알아야 하는 UI 기술 지식 (P.61)

 

 

책에 소개되는 추가적인 "디자인 노하우"에는 아래와 같은 부분이 있으니 참고해주세요.

→ 팀원들에게 피그마 도입을 설득하고 싶어요! (P.40)

→ 아이콘 활용 팁 (P.230)

→ 다크모드의 디자인 요소 (P.266)

→ 반응형 디자인의 이해 (P.303)

→ 디자인과 개발 화면이 다를때 (P.382)

추가적으로 책의 요소요소 마다 Tip이라는 항목으로 도움이 되는 정보가 제공됩니다.

 

■ 대상 독자

· 디자인 서적이여서 그런지, 편집 및 화면구성이 눈에 잘 들어와서 편하고, 핵심내용이 눈이 잘 들어옵니다.

· 피그마는 디자인을 잘 하기 위한 도구 입니다. 그래서 디자인을 하려고 할때 필요한 기본적으로 알아야할 중요 개념을 깔끔하게 설명해줍니다. 

· 피그마를 다루는 디자이너의 입장, 기획자의 입장, 개발자의 입장을 느껴볼수 있어 좋았습니다.

· 피그마가 디자인툴이기는 하지만, "프리젠테이션"에 활용할 수도 있어서 매력적입니다.

· 현업 디자이너 입장에서 스케치에서 피그마로 변경하는 사례를 많이 소개해주는 Tip들이 많이 있습니다.

· Figma를 처음 사용해보려고 하시는 분이나, 본격적으로 사용해보려고 하시는 독자분들에게 도움이 되는 책입니다.


댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
개발자를 위한 시프트-레프트 테스트 - 단위 테스트, 리팩터링, 애자일 개발 시 품질 담보, 테스트 자동화 등 소프트웨어 품질을 높이는 개발자 테스트 실천 기법
다카하시 주이치 지음, 김모세 옮김 / 제이펍 / 2023년 2월
평점 :
장바구니담기


책의 저자분과, 옮긴이의 서문을 보고 이책의 방향성과 어려운 이야기를 매우 쉽고 핵심을 잘 짚어주는 책이라는 느낌이 들었습니다.

저자는 일본인이지만, 경험한 기업은 글로벌한 기업(SAP, MS, 소니)에서 다양한 품질활동을 경험이 있으십니다.

또 소트프웨어 품질연구로 박사학위까지 취득하셔서, 현실과 이론의 적정한 밸런스를 가지고 있으시다고 생각이 들었습니다.


저자는 "개발자가 검증하는 내용" 과 "QA 진행시 검증되는 요소"는 명확히 다르다고 저자는 정의합니다.

역자는 "개발활동 주체"와 "품질활동 주체"가 분리되어 있으며, 개발활동 주체가 발견할수 있는 오류의 영역과, 품질활동 주체가 발견할수 있는 오류의 영여깅 전혀 다르다고 정의합니다.

이러한 내용에 많은 분들이 공감을 하실 거라고 생각이 듭니다. 


책의 제목에서 보듯이 눈에 들어오는 키워드가 3가지 있습니다.

① 개발자

 시프트레프트

③ 테스트

여기서 처음에 그 의미를 잘 파악하기 어려운 단어는 ② 시프트레프트 입니다.

shfit-left  : 직독을 하면 왼쪽으로 이동시킨다는 의미입니다.

무엇을 왼쪽으로 이동시킨다는 의미일까요? 네. 맞습니다. 책에서 애기하는 테스트 과정을 의미합니다.

 

반대개념 및 우리가 보통 일반적으로 사용하고 있는 개념이 시프트라이트(shift-right)라는 개념도 있습니다.

시프트라이트의 의미는 "무엇보다 제품 개발과정에서 가장 분주한 시점을 후반부에 두든것" 이라고 합니다.

■ 시프트-레프트의 정의

· 소프트웨어 개발 과정과 관련된 접근법

· 제품이나 프로세스 등의 전체 개발 과정에서 품질을 향상하는 중요한 활동을 최대한 조기에 설계하고, 코딩단계에서도 수행하는 전략

·  이론적으로는 누구나 테스트 비중등을 앞으로 이동하고 싶어 합니다. 현실적인 방법에 누구나 궁금할 것입니다.

   아래 그림을 보면서, 공감을 많이 하실것 같습니다. 테스트가 제일 마지막에 몰려서 한꺼번에 진행되는 구조입니다.

■ 소프트웨어 개발시 수행해야 하는 테스트 목록

필자는 단위테스트에서 아래 3가지 기법을 이해하고, 실천할수 있다면 충분하다고 합니다.

· 단위 테스트

· 조합 테스트

· 경곗값 테스트 : 이 테스트만으로도 80% 의 버그를 잡을수 있음

· 상태 전이 테스트 : 상태가 변경되어서 프로그램적으로 영향을 미치는것

· 탐색적 테스트

· 통합 테스트

· 시스템 테스트



댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
자바스크립트로 배우는 SICP - 컴퓨터 프로그램의 구조와 해석
해럴드 에이블슨 외 지음, 류광 옮김 / 한빛미디어 / 2022년 12월
평점 :
장바구니담기


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를 통해서 예제가 제공되어서 코드를 이해하기 좋았습니다.
  • 조금 더 근본적으로 생각해볼 거리와  평소 놓치고 있던 부분들을 경험할 수 있었습니다.
  • 예시가 많으니, 차분히 풀어보면 많은 도움을 받을수 있는 책이라고 생각합니다.
  • 설명도 자세히 잘 되어 있었습니다.

 

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



댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo