컴퓨팅의 정수 - 컴퓨팅 사고력을 키우는 100가지 기술 문제
우쥔 지음, 신준기 옮김 / 제이펍 / 2023년 8월
평점 :
장바구니담기


상위 개발자로 성장하기





책을 선택한 이유




IT 개발자는 많지만 실력있는 개발자는 드물다.



소스코드를 읽고 수정하는 정도의 실력으로


좋은 개발자라고 말하기는 곤란하다.




우수한 개발자로 성장하기 위한 컴퓨팅 사고를 알아보기 위해


"컴퓨팅의 정수"를 선택한다.




"컴퓨팅의 정수"는



0장 컴퓨팅의 본질: 기계 운동에서 전자 운동으로


1장 작지만 큰 차이: Big O 개념


2장 역방향 사고: 순환에서 재귀로


3장 모든 것이 코드다: 추상화와 표현


4장 지능의 본질: 분류와 조합


5장 도구와 알고리즘: 그래프 이론 및 응용


6장 복잡함의 단순화: 분할 정복법 응용


7장 공간과 시간의 균형: 스토리지의 이해


8장 병렬과 직렬: 파이프라인과 분산 컴퓨팅


9장 상태와 과정: 등가성과 인과관계


10장 결정론적 알고리즘과 확률: 확률론적 알고리즘과 응용


11장 이론과 실습: 전형적인 문제 풀이



로 구성되었다.






0장 컴퓨팅의 본질: 기계 운동에서 전자 운동으로 에서는



최초의 컴퓨터는 중국주판이다.


주판 공식으로 기계적으로 계산한다.



파스칼은 최초의 기계식 계산기를 만들었으며,


찰스 배비지의 차분기관은 기계식 계산기의 한계를 드러낸다.



튜링은 계산의 본질에서 컴퓨터의 한계를 찾는다.


에니악은 튜링의 개념을 실제로 실현한다.





1장 작지만 큰 차이: Big O 개념 에서는



폰 노이만은 컴퓨터를 소프트웨어와 하드웨어로 나눈다.



컴퓨터 하드웨어의 성능 차이는 소프트웨어 알고리즘이 결정한다.



좋은 알고리즘은 빠른 속도와 적은 메모리 공간을 요구한다.


도널드 커누스는 알고리즘 복잡도를 계량화 한다.



좋은 알고리즘과 나쁜 알고리즘의 차이,


최적의 해결책을 찾기 위한 감각에 대해 이야기 한다.



정렬 알고리즘은 기초적이면서, 프로그램에서 가장 많이 사용한다.


병합 정렬, 퀵 정렬, 힙 정렬 등 상용 정렬 알고리즘을 알아본다.



정렬 알고리즘 아이디어가 결합되면서, 인트로 정렬, 팀 정렬로 발전한다.




2장 역방향 사고: 순환에서 재귀로 에서는



컴퓨팅 사고는 컴퓨터 관점에서 문제를 생각한다.


최고의 개발자는 재귀적 사고를 마스터해야 한다.



재귀적 사고는 순환적 사고 방법의 반대로 계산한다.



순회는 이진 트리 경로를 따라 이진 트리의


각 노드를 통과한다.



개발자는 인간 고유의 사고방식에서 벗어나


재귀적 사고방식을 가져야 알고리즘을 이해할 수 있다.



순회의 데이터 구조, 중첩되는 재귀의 특징을 설명한다.



컴퓨팅 사고는 재귀적 사고다.


위에서 아래로, 전체에서 부분으로 순환한다.



재귀 알고리즘을 구현하는 스택과 큐,



재귀 개념을 확장하면서 복잡한 문제를


간단한 문제로 분해하는 중첩 개념을 살펴본다.



개발자의 알고리즘 숙달도는 소프트웨어의 핵심 경쟁력이다.





3장 모든 것이 코드다: 추상화와 표현 에서는



인코딩은 다른 개체를 완전히 구별한다.



개발자는 컴퓨터 관점에서 코드를 설계해야 하며,


사람이 코드를 이해할 수 있는 연결통로를 만들어야 한다.



개발자는 컴퓨터 관점에서 자신의 생각을 검토할 수 있어야 한다.



베테랑 개발자는 코딩 원칙을 유연하게 적용해 회사 차원에서


문제를 해결할 수 있어야 한다.



인코딩의 범위와 정밀도의 균형을 맞추기 위해


범위와 정밀도의 균형을 맞추는 것이 핵심이다.



비선형 코딩으로 범위를 확장하고, 조정하며,


차등 코딩으로 코드 길이를 줄여 미세 조정을 완료한다.



코딩 기술은 가장 중요한 것에 최고의 자원을 사용해야 한다.



개발자의 수준은 오픈소스 코드의 이해,


코딩 알고리즘 원리의 이해, 필요에 따른 코드 수정 능력으로


파악할 수 있다.



개발자는 희소 행렬 저장 및 사용을 마스터해야 하며,


중급 개발자는 대규모 행렬을 구현할 수 있어야 한다.



이진법 원리를 이해하고, 잉여 정보를 배제하면서


정보 인코딩과 효율적 표현을 해야 한다.





4장 지능의 본질: 분류와 조합 에서는



컴퓨터 작업의 대부분은 계산이 아닌 정보 분류,


구성, 검색 및 재구성이다.



지능 문제의 본질은 범주 분류 문제다.


개발자는 지능 문제를 분류 문제로 바꾸어야 한다.



집합은 세상의 모든 것을 분류하는 하부 논리다.


의사결정 트리, 해시 테이블, 이진 트리 알고리즘의 확장,


카탈랑 수와 등가성 문제에 대해 알아본다.




5장 도구와 알고리즘: 그래프 이론 및 응용 에서는



그래프 이론은 조합론의 한 분야다.



그래프는 점과 선의 조합이다.


노드는 객체, 간선은 관계를 설명한다.



컴퓨팅 예술은 실제 문제를 그래프 이론 문제로


변환할지 결정한다.




그래프 순회 알고리즘은 특정 방식으로 그래프의


모든 노드에 접근하는 알고리즘이다.



웹 크롤러 구축 개발자의 문제, 최단 경로를 찾는 동적 계획법,


네트워크 트래픽의 최대 흐름 달성하기,


이분 그래프의 최대 매칭 문제를 알아본다.



그래프 이론의 매칭 문제를 파악하고,


최대 흐름 문제의 핵심을 이해하면서,


복잡한 상황을 고려해 문제를 해결해야 한다.



그래프는 점과 선을 통해 문제를 해결한다.




6장 복잡함의 단순화: 분할 정복법 응용 에서는



분할 정복 알고리즘은 개발자의 컴퓨터 과학 소양을


측정하는 척도다.



분할은 복잡한 문제를 간단한 하위 문제로 나누고,


정복은 하위 문제를 해결한다.



하위 문제를 해결 할 수 있을 때까지 반복하여


분할 정복 알고리즘을 호출한다.



하위 문제의 결과를 결합해 원래 문제의 최종 답을


얻을 때까지 병합한다.



분할 정복은 정렬 문제를 효과적으로 해결한다.



퀵 정렬 알고리즘에서 큰 수열의 중앙값을 찾는데


분할 알고리즘의 역할을 알아본다.



분할 정복 알고리즘은 그래프 및 행렬과 같은


복잡하거나 다차원 데이터 계산에 사용할 수 있다.



맵리듀스는 클라우드 컴퓨팅의 거대 컴퓨터 자원을


편리하게 사용하고, 대규모 작업의 계산을 완료하며,


병렬 처리로 계산 시간을 단축하는 서버 분산 알고리즘이다.



맵리듀스 설계자는 분할 정복 알고리즘으로


복잡한 컴퓨팅을 문제를 해결 할 수 있다.



구글 브레인은 다른 머신러닝 알고리즘 대신


심층 인공 신경망을 사용한다.



분할 정복 알고리즘의 이해는 알고리즘의 본질을 이해하는 것이다.


고도로 결합된 작업을 알고리즘에서 획기적으로 작업을 수행한다.



컴퓨터 과학의 본질 분할 정복 알고리즘의 본질을 철저히 이해해야 한다.




7장 공간과 시간의 균형: 스토리지의 이해 에서는



시스템 프로그램을 작성하기 위해서 컴퓨터 저장 구조의


원리를 이해하지 못하면 프로그램의 실행 효율성을


제대로 제어할 수 없다.



이론적으로 완벽한 알고리즘도 너무 많은 메모리 공간을


차지하면 구조적으로는 실현할 수 없다.



개발자는 데이터 액세스, 메모리 계층, CPU 프로세서 등을


고려해 프로그램이 최고의 효율성을 달성하도록 해야 한다.



순차적으로 저장된 데이터를 빠르게 찾거나 수정하기 위해서는


인덱스를 만들어야 한다.



컴퓨터 과학에서 데이터 저장은 중요하다.


좋은 소프트웨어를 만들기 위해서 저장 기술과


컴퓨터의 저장 장치 특성을 철저히 이해해야 한다.




8장 병렬과 직렬: 파이프라인과 분산 컴퓨팅 에서는



컴퓨터 성능 향상을 위해서 직렬과 병렬을 사용해야 한다.



파이프라이닝은 프로세서 효율성을 향상시킬 수 있다.


직렬 작업은 논리적 파이프라인으로 수행할 수 있지만


물리적으로 병렬 회로의 지원이 필요하다.



병렬 컴퓨팅은 동일한 하드웨어를 더 많이 추가해 컴퓨팅 시간을 줄인다.



GFS는 병렬 컴퓨팅 저장 정보 문제를 해결하며,


맵리듀스는 병렬 컴퓨팅 정보처리 문제를 해결한다.



GFS는 빅파일 아이디어를 기반으로 구현된다.


데이터 액세스 대역폭을 늘리고, 청크 서버 계층을 추가해


병목현상을 줄일 수 있다.



대용량 데이터 파일로 결합해 데이터 액세스의 효율성을 개선하고,


대용량 데이터 블록을 나눠 병목현상 및 데이터 보안 문제를 해결한다.



병렬 처리 및 직렬화는 컴퓨팅 속도를 높이고 초거대 규모의


컴퓨터 문제를 처리할 수 있다.



우수한 시스템 개발자나 아키텍트는 직렬 및 병렬 메커니즘을


철저히 이해하고 문제를 직렬 및 병렬 부분으로 분해한 후


사용해야 한다.



개발자는 정보 처리 감각을 키우고, 시스템 측면에서


문제를 이해하면서 경험을 쌓아야 한다.




9장 상태와 과정: 등가성과 인과관계 에서는



복잡한 논리 관계를 가진 큰 프로세스를 간단한 프로세스로


추상화하는 것은 소프트웨어 개발자의 기본 능력이다.



컴퓨터로 문제를 해결하는 것은 문제를 독립적인 상태나 프로세스로


분해하는 것이다.



비슷한 상황을 같은 상태로 통합하며 문제를 해결하기,


상태를 추상화하고 어려운 문제를 분류하고 해결하는 등가성,


복잡한 인과관계를 파악하고 그래프로 명확하게 설명하는 인과관계,



문제의 다양한 상황을 상태로 추상화하고 상태 간


논리적 인과관계를 명확히 하는 능력이 필요하다.




10장 결정론적 알고리즘과 확률: 확률론적 알고리즘과 응용 에서는



빅데이터 시대는 대량의 무작위 데이터에서 규칙성을 찾는다.



서로 다른 두 데이터의 지문이 충돌하는 것을 방지하려면


무작위성을 지키는지 확인해야 한다.



데이터 지문은 무작위성으로 데이터의 진위를 확인하고,


무작위로 생성된 데이터에서 원본데이터로 역추출하는 것이 불가능하다.


무작위성은 암호를 도용하려는 사람들이 원래 일반 코드를 유추할 수 없도록 한다.



양자 통신은 일회용 키로 정보를 암호화하는 것이다.


무작위성으로 암호화 키를 분배하는 원리를 살펴본다.



최적화 전략을 더 잘 이해하려면, 그래프에서 최단 경로를


찾는 문제를 해결해야 한다.



소프트웨어 의사결정을 해야 하는 개발자는


비용과 이익의 균형을 유지하거나 특수한 상황의


균형 전략 조정을 고려해야 한다.




11장 이론과 실습: 전형적인 문제 풀이 에서는



복잡한 문제를 작고 단순한 문제로 분해하지 못하면


전문가라고 할 수 없다.



가장 긴 연속 부분 수열 문제, 구간 병합 문제,


열두 개의 공 문제, 스카이라인 문제,


가장 긴 회문 문제, 계산기 문제,



검색 결과 요약 문제,


합이 k인 부분 수열을 찾는 문제


등 실리콘 밸리 기업에서 자주 출제되는 면접 질문의


해법을 설명한다.



"컴퓨팅의 정수"는 컴퓨팅 계산 원리 및 알고리즘을 소개하고,


재귀적 사고와 분할 정복 알고리즘 등 컴퓨팅 사고를


갖추어야 함을 말한다.




개체를 구별하는 인코딩의 핵심 요소,


지능 문제의 본질이 분류 문제인 이유,


그래프 이론으로 매칭 문제 해결하기,


저장 장치의 특성을 반영한 시스템 소프트웨어 설계,



파이프라인과 분산 컴퓨팅을 활용한 성능 향상,


복잡한 프로세스를 간단하게 분리하기,


무작위성으로 보안 유지하기, 최적화 전략 등을 설명한다.



"컴퓨팅의 정수"는 개발자가 프로그램을 개발하기 위해


해결해야 할 문제들을 살펴보면서,


소프트웨어 개발자가 갖추어야 할 사고방식에 대해 설명한다.



IT 개발자면서, 베스트셀러 작가 답게,


복잡한 IT 개념을 비유와 사례를 들어 쉽게 설명한다.



소프트웨어를 개발할 때 고려해야 할 요소들의


핵심 포인트를 이해하면서,


소프트웨어를 전체적인 관점에서 조망할 수 있도록 한다.




개발자 수준에 따른 소프트웨어 이해 정도를 소개하므로,


개발자의 능력을 스스로 평가해 볼 수 있다.




실리콘 밸리 기업 면접 질문에서


자주 출제되는 문제를 소개하므로,


IT 면접 시험을 준비할 수 있다.





"컴퓨팅의 정수"를 통해 좋은 프로그램을 개발하기 위해


갖추어야 할 컴퓨팅 사고를 이해하게 된다.




제이펍 출판사 에서 "컴퓨팅의 정수"를 증정해주셨다.


감사드린다.



#제이펍 #컴퓨팅의정수 #제이펍 #우쥔 #吴军


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