Computer Curriculum

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
훌륭한 프로그래머, 소프트웨어 엔지니어, 전산학자, BillGates( :( ), LinusTorvalds( :) )가 되기 위해 꼭 공부해야할 분야들과 그 필독서들.

1. 공통

먼저 컴퓨터 구조나 전산한 전반에 대한 쉬운 개론서를 읽어보는 것이 바른 수순이지만 처음엔 건너뛰어도 큰 상관이 없다. 자신이 좋아하는 소프트웨어를 잘 사용하는 것, 자신의 개인용 컴퓨터를 잘 꾸미고, 제대로 활용하는 것 등도 중요하다.

정말 쉽고 재미있는 전산학 개론서로는 다음 책을 흔히 추천한다.
  • Computer Science : An Overview by J. Glenn Brookshear
  • Code: The Hidden Language of Computer Hardware and Software by Charles Petzold

다음은 최소한 한가지 이상의 프로그래밍 언어를 익히는 것이 필수적이다.

가장 널리 사용되고, 범용적인 언어로는 C언어가 대표적이다. (꼭 C를 첫번째 언어로 배우는 것이 좋다는 이야기는 아니다)

C언어를 배울 때는 다음의 세 바이블(삼위일체라고도 한다)을 구비한다.
  • The C Programming Language (흔히 white book이라고 부른다)
  • C : A Reference Manual
  • The Standard C Library

The C Programming FAQs 또한 혼자공부할 때 갖추고 있으면 좋을 것이다. 궁금해하는 것의 해답이 거의 모두 나와있다.

프로그래밍을 공부하더라도 하드웨어에 대하여 알고 있으면 도움이 되는 경우가 많다. 컴퓨터 구조에 대한 좋은 책으로 다음과 같은 책이 있다.
  • Computer Organization and Design : The Hardware/Software Interface Second Edition by David A. Patterson, John L. Hennessy

2. 프로그래머

3. 소프트웨어 엔지니어

우선 대학교재 수준의 개론적 이해를 통해 전반적인 그림을 얻는 것이 중요하다. 이 때 소프트웨어 개발 경험이 부족하다면 매우 지루하게 느껴질 수 있다. 하지만 최소 1년 정도의 프로그래밍 경험이라도 있다면 책을 보면서 "그래, 맞아! 이런게 필요했어!"를 연발한다. 자신의 문제의식을 형성해있기 때문이다.

개론 서적으로는 다음 책을 추천한다.
  • Software Engineering by Ian Sommerville

조금 다른 관점에서 대학교재보다는 훨씬 덜 아카데믹하고 더 실용적인 책으로 다음 책들이 꼽힌다.
  • Wicked Problems Righteous Solutions by Peter Degrace, Leslie Hulet Stahl : 이 책은 Steve C McConnell이 가장 좋아하는 SE 책이다.
  • Software Project Survival Guide by Steve C McConnell
  • Rapid Development : Taming Wild Software Schedules by Steve C McConnell

이쯤 공부를 했으면 SE의 고전들을 공부해야 한다. 역사를 모르면 반복하게 된다.
  • The Mythical Man-Month, Anniversary Edition : Essays on Software Engineering by Frederick P. Brooks
  • Peopleware by Tom Demarco

(more to come)

4. 오픈소스 해커

오픈소스를 위해서는, 우선 EricRaymondHowToBecomeAHacker를 보고, 해커가 가져야 할 기본 소양이 무엇인지 알아야 하며, [http]성당과 시장의 '해커 문화의 짧은 역사'로 오픈소스 커뮤니티에서는 왜 유닉스를 주로 사용하게 되었는지를 알고, 유닉스에 대한 기초 지식을 쌓아야 하는데, 일반적으로 유닉스 공부에 추천되는 책들은 다음과 같은 것들이 있습니다.

좀더 자세한 설명과 목록을 원한다면 [http]Linux Reading List Howto 를 참고

4.1. 유닉스 디자인에 관한 책들


The Design of the Unix Operating System ISBN:0132017997

The Design and Implementation of the 4.4BSD Operating System ISBN:0201549794

Unix Internals: The New Frontiers ISBN:0131019082

The Magic Garden Explained: the internal of Unix System V Release 4, an opensystem design ISBN:0130981389

4.2. 유닉스 프로그래밍 서적들


Advanced Programming in the Unix(R) Environment ISBN:0201563177

Unix Network Programming, Volume 2: Interprocess Communications ISBN:0130810819

Unix Network Programming, Volume 1: Networking APIs - Sockets and XTI ISBN:013490012X

The Unix Programming Environment ISBN:013937681X

4.3. 유닉스 사용법에 관한 책들


Unix Power Tools ISBN:0596003307

The Underground Guide to Unix : Slightly Askew Advice from a Unix Guru (Underground Guide) ISBN:0201406535


그리고, 오픈소스 해커는 EricRaymond의 글에서도 언급 되었듯이, 언더그라운드적인 활동보다 자기가 관심있는 분야의 오픈소스 프로젝트에 주도적으로 나서기를 좋아합니다. 따라서, 자기가 관심있는 프로그램들의 소스나 제반에 대해 분석하여 버그 리포팅, 제안, 패치 기여 등을 적극적으로 하며, 메일링 리스트와 CVS, 유즈넷, IRC 등을 통해 항상 다른 해커들과의 원활한 의사 소통을 하는 것이 좋습니다. 우리나라의 특성상 [http]KLDP같은 곳에서 JikhanJung님과 같이 외국어 문서나 외국어로 된 프로그램의 한글화를 하는 것도 적절한 오픈소스 해커로서의 활동이라고 할 수 있습니다.

그러나, 오픈소스 해커들은 [http]The Girl's Guide to Geek Guys에서 말하는 것과는 달리 여자들에게 가장 인기 없을 만한 요소를 고루 갖추는 경우가 많아서 퍼키와 같이 늘 쓸쓸히 지내게 되는 경우가 많지만. 나름대로의 오픈소스 특유의 분위기는 빠져나갈 수 없는 마력에 흠뻑 취하게 만들어서 기꺼이 평생의 취미로 갖게 됩니다.

5. 전산학자

컴파일러
알고리즘/자료구조
  • Introduction to Algorithms, CLR : 전세계적으로 가장 많이 쓰이는 알고리즘 개론서적 중 하나
  • Data Structures and Algorithms or The Design and Analysis of Computer Algorithms, Aho, Hopcroft and Ullman
  • TheArtOfComputerProgramming, DonaldKnuth : 백과사전
  • Programming Pearls, Jon Bentley : 알고리즘뿐만 아니라 프로그래머에게 여러모로 감동적인 책

어느 정도 DS에 대한 이해가 있다면, PP를 먼저 보고, 바로 CLR을 봐도 좋다. 특히 CLR은 개정판(2판)에서 루프 불편식(Loop invariant)을 앞부분으로 당겨온 것 등 전체적으로 많은 변화가 있었으므로, 개정판을 구할 것을 권한다.

Artificial Intelligence
  • Artificial Intelligence: A Modern Approach, Peter Norvig : 몇 년에 한 번 나올까 말까한 AI 개론서로 평가를 받는다.

Information Retrieval
  • Information Retrieval, Frakes et al. : 고전
  • Information Storage and Retrieval, Korfhage
  • Modern Information Retrieval, Baeza-Yates et al. : 세계 대학(원) IR 수업에서 가장 많이 쓰이는 개론교재 중 하나
  • Managing Gigabytes: Compressing and Indexing Documents and Images, Witten et al. : 최근 들어 인기가 급부상한 책. 매우 실용적.

보통, MIR과 MG를 함께 공부하는 것을 권한다.

Theory
  • Introduction to Autmata Theory, Languages and Computation 2nd ed. H-U : 흔히들 베틀북이라고 부르는, 가장 오래되고 전통적인 교과서. 설명은 다른 책 읽어도 좋으니 연습문제를 열심히 풀 것. 최신판은 내용과 연습문제가 많이 생략되었으므로 2판에 한한다.
  • Lambda Calculi, Hankin : 이 분야의 교과서 중 가장 빠르고 쉬운 입문서.
  • The Formal Semantics of Programming Languages - An Introduction, Winskel : 역시 이 분야 교과서 중 가장 쉬운 책
  • Pisa note, Abramsky : Domain theory 에 있어서의 '비급'.
  • Communication and Mobile Systems: the Pi Calculus, Milner : 대가가 쓴 학부생도 읽을 수 있는 입문서. Pi의 full treatment 를 위해서는 Sangiorgi-Walker가 필요하다.
  • 학부에서 Algebra 와 Mathematical Logic 과목을 들을 것. 이론들의 언어를 사용하기 위해서는 그 정도의 기초훈련은 필요하다.

6. BillGates

컴퓨터 공부를 하는 사람 중 상당수가 BillGates를 닮고싶은 사람으로 삼고 있는 경우가 많고, 컴퓨터 분야에서의 성공이 요즘 세상에는 비지니스적인 성공과 꼭 분리된 것만은 아닌 듯 하다. 컴퓨터 공부를 해서 "성공"하려면 BillGates적 모델에 대한 이해가 아주 중요하다.

BillGates처럼 세계적 회사의 CEO가 되려고 하지 않더라도, 설령 Wiki:JustaProgrammer로 남기를 원하더라도 다음의 커리큘럼은 자신의 커리어에 큰 도움이 된다. 경영 능력을 갖춘 프로그래머와 그렇지 못한 프로그래머는 그 가치 차이가 엄청나다. 또 프로그래머일지라도 (기술뿐만이 아니고) IT업계의 흐름을 읽고 사업의 조류를 꿰뚫는 것이 필요한 경우가 많다.

우선 경영학 전반에 대한 이해가 필요하다. 대학에서 보는 경영학 개론서적 하나 정도를 설렁설렁 일독하고, 조금 실용적인 책들을 봐 나가야 한다. 특히 다음의 서적들이 탁월하다(모두 국내에서 구할 수 있다).
  • High Tech Start Up
  • The Ten-Day MBA

컨설팅 관련 서적들도 봐 두는 것이 유용하다.
일반적인 문제 해결 능력, 사고 능력의 신장도 핵심적이다.
성공적인 조직의 사례 공부도 중요하다.
  • In Search of Excellence
  • Organizing Geniuses

리더쉽은 "배울 수 있는 것"이다.
IT업계의 특성에 대한 공부는 다음 책들이 뛰어나다.
  • Customer.com
  • Information Rules
  • The Cluetrain Manifesto
  • Blown to Bits
  • InnovatorsDilemma
  • Net Ready
  • CrossingTheChasm : 벤처기업가는 물론 모든 기술집약적 산업 관련자들이 꼭 봐야할 필독서

평소에 다음의 잡지들을 항상 가까이 한다.
Visionary라고 할만한 사람들이나 기술자(techie)들을 사귀고, 듣고, 배우면서 인맥을 관리한다.

마이크로소프트 잡지 01/11월의 기사를 참고해보세요. 전산학의 각 분야에 대한 추천책이 많이 나와있어요. 주로 프로그래밍에 관한 내용이 많군요. --아무개



"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>