apue 공부를 시작하며 전반적인 공부방법에 의문이 생기네요.
원서로 읽는것을 습관처럼하려고, apue라는 (* advanced programming in the unix environment) 책을 원서로 구입하여 보고있습니다.
한글로 번역된 컴공서적은 여러 학부를 지내오면서 읽어왔으나, 원서로된 심도깊은 책은 처음이라, 제가 공부하는 방법이 맞는건지 의문이 생기네요.
영어를 해석하는데는 딱히 무리는 없습니다. 하지만 역시나 한글로 된 서적보다는 덜 친숙해서 그런지, 아니면 학부때는 시험을 보려고, 외우려고 책을 읽고 공부해와서 그런지
(사실 개인적으로 전공을 공부하려고 책을 개인저으로 구입해본적은 처음입니다ㅠ 학부공부에 게을렀던..)
apue를 읽고 해석하여 실행코드들을 리눅스 환경에서 실행시켜보고 이해하고 넘어가는 수준입니다. 전체적인 흐름을 잡는 느낌?이네요 뭔가를 외우고 머릿속에 정확하게 남아있는거 같지는 않는 느낌입니다.
현재 챕터2 구현과, 한계 등의 내용을 끝낸 상태인데, 구체적인 내용이 많아서 그런지 하나하나 그냥 그때그때 이해하고 잊어버리는거 같네요. 실제로 앞내용을 다시보면 바로 떠오르진 않습니다. 한번 읽어보면 금방이해가 갑니다만.
챕터 2의 내용이 초반부분이라 그런건지, 아님제가 하는 읽고 흐름만 이해하는 모두 외워서 공부하는 그런 공부 방식이 맞는 방법인지 궁금합니다.
고등학교때부터 학부초기 때까진 시험을위해 무작정 외워왔던 저이기에...
시간낭비할까봐 살짝 걱정이라 이런글까지 올리네요.. (한심..)
노여움 마시고 답변 부탁드립니다.
팁을 드리자면
"내용을 알고 있는" 원서 읽기부터 시작하세요.
C언어 교본이나 자료구조&알고리즘 같은, 컴공 기초 과정부터 원서로 공부하기 시작하면 좀 더 수월하게 시작할 수 있습니다.
학부과목에서 번역서로 공부하셨다니, 그 책들의 원서를 구하셔서 시작하는 것도 괜찮겠네요. 복습도 할 겸 원서에 익숙해 지는 겁니다.
그렇게 몇 개월~몇 년 하다보면 슬슬 처음 접하는 내용도 원서로 공부할 수 있게 될 겁니다.
모르는 내용 공부하는데 원서도 처음이면 당연히 더 어렵죠. 두 마리 토끼를 동시에 잡으시려는 듯한데, 어디 도망 안 갑니다. 하나씩 잡으세요.
사실은 원서라는 부담보단
원서를 언급하긴 했지만 원서에대한 부담보단 apue라는 깊은 이론책을 (보통 언어책을 흥미롭게 봐왔고... 실습의주의 책만 접해와서..)접해보지 못했기때문에 흐름을 이해하고 넘어가는 식의 (일일히 외우지 않고)공부를 해도 되는지 궁금합니다. 원서에대한 내용은 제 질문과 논지가 달랐네요 죄송합니다.
------------------
컴퓨터 공부하는 그냥 사람입니다.
E메일 : hudin9 at 쥐메일.
you gonna be more hungry.
--------------------------
저도 작년에 APUE 원서로 한번 쭉 봤는데요.
전 애초부터 번역본을 볼 생각은 안했고, 원서로 보자! 였습니다.
저는 책 보면서 작성자님 방식대로 흐름 알고, 이해하고 넘어가고, 원서를 읽으면서 정 이해가 안되는 부분만 실제로 코딩 해보고 값 찍어 보면서 확인하고 넘어가는 수준이었습니다.
그래도 어떤 챕터에서 어떤 내용이었다 라는 정도 알고 있었고.
그리고 실제 프로그래밍을 하면서 유사한 문제에 부딪혔을때, 아 이런 내용이 있었지! 라고 생각이 나면서 책 해당 부분을 찾아보고 참고해서 해결해 나가곤 했습니다.
사실 공부 하는데 왕도가 어딨고 정답이 어딨을까요
자신만의 방식이 있는거고, 자신이 이해 하기 나름이지요.
실제로 자료구조나 알고리즘의 모든 내용을 다 알고 있지 못하지만, 대략적으로 어떤것이다 이런게 있다 정도만 알고
그것들을 실제 사용할때는 검색해서 그 내용을 적용 하는 것 처럼 (뭐 간단한 소팅이나 자료구조 같은건 머리속에 들어와 있긴 하지만, 자주 사용 하지 않는건 찾아 봐야 하죠)
이 또한 마찬가지 아닐까요? 이런게 있다. 라는 정도만 알고 이해하고 넘어가고 실제 사용하고자 할때 찾아보고 쓸 수 있을 정도.
그정도만 되면 충분하다고 생각 합니다.
제가
알고리즘을 예로들어주시니 정말 제가 하고있는 방식에대해 확실히 확신이 드네요.
앞으로도 지금처럼만 아니 더욱 깊이있게 노력하도록 하겠습니다.
좋은 의견 감사드립니다.
------------------
컴퓨터 공부하는 그냥 사람입니다.
E메일 : hudin9 at 쥐메일.
you gonna be more hungry.
--------------------------
제 의견으로...... ---------- 운영체제의
제 의견으로......
----------
운영체제의 개념을 이해하셔야 합니다.
운영체제 이전에는 운영체제가 하는 기능/역할도 코드를 만들어야 했었습니다. 현대에도, 아주 단순한 임베디드 시스템, 원칩컴퓨터, 제어장치 등은 운영체제 없는 원시적인 형태로 만들어지는 경우가 많습니다. 4비트 프로세서 또는 8비트 프로세서를 쓰기도 하고 메모리도 극소량이라서 그런 경우가 많지요. 그러나, APUE에서 다루는 내용은 이런 원시수준이 아니라 유닉스라는 이상적인 운영체제 개념을 논하고 있습니다.
(과거에) 현재 무엇이 필요한 것이지?
무엇이 개발/사용하는데에 있어서 공통적인 문제지?
만약 공통문제를 해결해 주는 것(운영체제)이 없다면 어떤 일이 벌어지는 거지?
이런 어려운 문제들을 전문가 대신 자동으로 관리/모니터링/운영 해 주는 것(운영체제)이 필요하지 않을까? 등
의문에 대한 답에 대한 해결책을 찾아가다가 이상적인 운영체제를 낳았습니다. 그 질문들이 현대 운영체제의 모습을 만들었으니 말입니다.
운영체제가 등장한지는 제법되었지만, 현대에도 꾸준히 진화하면서 발전하고 있습니다.
이상적인 운영체제로 오래전(1980년대까지)에는 IBM 의 MVS를 언급했었지만, 1990년을 접어 들면서는 1970년에 만들어진 유닉스가 그 이상적인 운영체제로 자리잡기 시작합니다. UNIX를 그 이상적인 운영체제 개념으로 바라본 책들이 나오기 시작했는데(대학교재랄까요?), 스티븐스의 UNP 및 APUE가 그 대표작이겠지요. 미닉스를 공부하다가 만들어진, 1993년에 등장한, 리눅스(유닉스나 도진개진)는 이제 말할 나위도 없겠지요. 카네기멜른 대학에서 만든 Mach에서 비롯된 윈도우계열 운영체제와 유닉스를 손봐서 만든 OSX는 구지 언급하지 않겠습니다. 리눅스 손봐서 만든 안드로이드 및 그외 수십개의 운영체제들도 있습니다만, 여전히, 유닉스/리눅스는 공부할 만한 매력이 있습니다.
유닉스, 그 시작의 모범적인 책으로 APUE는 빠지기 어려운 책임에는 분명합니다.
유닉스를 알아가는 방법으로는 이론적인 방법론(유닉스 운영체제 어쩌구라는 전공서적)과 실전적인 방법론(유닉스상에서 유닉스가 제공하는 기능-시스템 호출등을 이용해서-프로그램을 어찌 작성하는가?) 이 있을 수 있습니다.
APUE는 그 중 후자에 해당합니다. 즉, 실제로 해봄으로써 유닉스라는 운영체제를 학습하도록 하는 것이지요.
단지, 이 책이 만들어진 시기가 과도기 (유닉스의 변종들의 대통합 = SVR4 이전,근처) 라 내용이 다소 현대의 리눅스/유닉스와 차이를 보일 수 있습니다. 그러나, 큰 맥락은 동일하지요.(개정판이 어디까지 반영되었는지는 확인해 보지 않았네요.)
유닉스의 이론적인 개념이 구현된 것을 실제로 체험해 볼 수 있도록 여러 장으로 나누어 작성한 책이 APUE라고 볼 수 있습니다.
유닉스 운영체제는 여러 서브 시스템의 모임으로 구성되어 있는데요. 프로그래머라면 알아야 하는 기본이랄 수 있는 파일시스템 , 프로세스 서브시스템 등이 있습니다.
APUE는 예를들어 '파일시스템' 부분도 여러 챕터에 거쳐 나누어 설명하고 있고, 아울러 다른 서브 시스템(프로세스, 디바이스드라이버등)에 대한 설명도 비슷한 유형으로 나누어 설명하고 있습니다. 전체를 한번에 보는 것도 좋지만, 일단 파일 시스템 부분에 대해서 깊이 보는것도 좋겠습니다. 파일시스템을 보고 다른 이론/실습/서적/자료를 참고하여 보충을 해나가는 방법도 나쁘지 않다고 봅니다. 한번 보고 마냐고요? 외울 정도가 되도록 봐야 합니다. 즉, 파일처리를 가볍게 할 수 있을 정도로 숙지해야 한다는 얘기지요.
아울러, 코드를 컴파일하고 돌려 보면서 유닉스라는 시스템을 이해하려면, C언어의 특성보다는 시스템(유닉스)의 특성을 이해하도록 추구해야 합니다. (언어는 본래 기본이고,) 시스템(운영체제)별 특성에 부합하도록 트레이닝이 필요하다는 얘기입니다. 예를 들어, 통신 인터페이스, 즉, 소켓이라면 유닉스의 BSD 스타일을 기본으로 하고, 유닉스/리눅스/OSX에는 없지만, 윈도우 시스템의 특성에 기인해서 필요했던 WSA*로 시작하는 인터페이스를 윈도우란 독특한 시스템의 특성 때문에 생겨난 것으로 이해하며, 알아야 하기 때문이지요.
아울러, 동일한 유닉스라도 차이를 보이는 경우가 있고, 각각의 시스템들의 미묘/미세한 차이를 극복하는 방법을 이해하게 되면, 분산시스템을 이해하는 기본이 되기도 합니다.
보다 실천적인 방안으로는 언어 수준에서 래핑하려고 노력한 Libarary 보다는 시스템을 이해하는 시스템 호출(system call)에 집중해야 한다는 얘기입니다. 래핑한 것들은 추후 업자(취업 후)로 살게되면 자연스럽게 접하게 됩니다. 그러나, 저는 공부/학습하는 시기에는 시스템에 집중하는게 좋다는 견해를 가지고 있습니다.
극단적인 예로, printf()라는 라이브러리 보다는 write(), mmap()등에 치중해야 한다는 얘기지요.
결국, printf()도 궁극적으로는 write()를 호출하게 되니, 즉, 시스템 호출을 하게 되니 말입니다.
궁극의 필수적인 원소/프리미티브를 정의한, 시스템이란, 운영체제란 무엇인가?라는 의문은 결국 커널은 대체 뭐야? 라는 곳으로 향하게 되겠지요. write()를 보면서 커널의 버퍼캐시, 디바이스 드라이버까지 들여다 보려고 하는 의지가 생길 수도 있습니다, 좋은 현상이라고 봅니다. 왜 이렇게 시스템 호출을 만들었는가? 라는 고찰없이, 단지 컴파일해서 실행하는 수준으로 돌려보기만 해서는 남는게 없을 수 있습니다. 그렇다고, 커널 코드까지 볼 필요는 없지만 말입니다.
적어도, 왜 이렇게 만들었지? 이유는?을 생각해 보세요.
현대에 널리 퍼져있는 라이브러리, 프레임워크, 스크립트 등의 화려함을 느끼기에 앞서, 단지, 10줄 짜리 코드에 쓰인 '시스템 호출(system call)'이라는 창구를 통해 시스템(유닉스등)의 심오함을 느껴 보도록 하세요.
----------
* 대충 100개 정도의 시스템 호출을 기억하고 있다면, 자신감을 가지고 더 나아가도 될 것이라고 봅니다.
세상엔
우리나라 포럼에도 이런 심도깊은 답변을 주실수 있는걸 보면 참 기술의 세계는 끝이 없는걸 느낍니다.
현재 제가 3장 파일 입출력 파트를 공부하면서 느낀점을 제대로 집어주셨네요.
printf보단 write() 시스템호출이라.. 어려우면서도 이길이 맞다는 점을 글에서 내포시켜주셔서 참 감사드립니다.
공부하면서 시스템호출에 대해 그리고 그 함수에대해 그 매개변수 인자에 대해 좀더 궁금증을 가지고 공부하고 있었는데
이 공부법이 맞다는걸 확신시켜 주셔서 좀더 자신감을 가지고 지금 하는 공부에 열중할 수 있을거 같습니다.
심도있는 답변 저에게 많은 도움 되었습니다. 한번 만나 식사라도 대접하고 싶은 심정이네요 감사드립니다.
------------------
컴퓨터 공부하는 그냥 사람입니다.
E메일 : hudin9 at 쥐메일.
you gonna be more hungry.
--------------------------
댓글 달기