U E D R , A S I H C RSS

이영호/64bit컴퓨터와그에따른공부방향


~cpp 
현재 머리가 제정상은 아니지만 다시 다른 충격적인 것을 목격한바 짧은 고민 끝에 공부 방향을 바꾸기로 했다.

8비트 -> 16비트
16비트 -> 32비트

이 경로를 거쳐 컴퓨터를 접해온 사람들의 실력은 현재로 생각하면 굉장하다.
연륜과 많은 공부 때문이 아니라 컴퓨터 구조 자체에 대한 깊은 이해를 바탕에 둔 듯하다.
내가 이러한 방식으로 공부를 하면 그들을 따라 잡을 수 있을까? 결코 불가능하다.
그들의 실력은 지금 32비트 공부 세대들이 생각하기에 천재 그 이상이다.
컴퓨터 구조를 자세히 알고 어셈블리를 자유자재로 다루며 그러한 실력으로 32비트
윈도우 커널을 조사하고 그것을 이용하다니.
그들과 나의 사이엔 큰 장벽이 있음을 실감한다.

32비트 -> 64비트 가 되면 기존에 가지고 있던 책들의 내용도 바뀌게 된다.
결국 공부는 새롭게 해야하며 32비트의 지식들은 역사의 뒤안길로 자리잡게된다.
때문에 완전한 64bit 체제가 자리 잡기 전까진 32비트 체제의 지식을 내것으로 만들어야한다.
하지만 많은 양이므로 불가능 하다. 그전에 64bit체제가 완성 될 것이므로.
이것은 패러다임을 따르는 입장에서 32bit를 버려야한다는 뜻이된다.

앞으로 내가 걸을 길은 그들과 같은 길을 걷는 것이다.
패러다임을 따라 편하자고 C++과 같은 것을 파고 든다면
결코 기초가 탄탄하고 높은 사람의 벽을 뛰어넘을 수 없다.
C, C++, Assembly, Linux Kernel, Network, Compilers

내가 걸어야할 길은 지금과 같은 Network, Linux Kernel이 아니라
Assembly이다. Assembly를 현재 나와 있는 가장 발전된 언어라 생각하고 Assembly를 누구보다 깊게 파고 들어야한다.
(C를 사용할 시 Inline Assmbly만을 허용한다.)


이젠. Assembly와 함께 내가 그나마 깊게 아는 C언어를 파고들겠다.
Assembly를 마음껏 다루도록 286AT를 창고에 꺼내서 마음껏 테스트를 하겠다.
OS를 만들기도 하겠으며, 저 사람들과 같은 MDir Clone, Graphics, Sound 등 모든 것을 Assembly로 해내겠다.

종국에 C++과 같은 현재 패러다임을 따르는 사람들은 결코 나를 넘지 못하리니...


몇가지 질문을 한다면 (활동 영역을 아마 시스템 프로그래머 분야로 잡은 것 같아서, 좋아하는 분야를 공부하는 것에 대해서는 큰 이견이 없습니다.)
  • 32비트에서 64비트 컴퓨터로 바뀔 경우, 어플리케이션 개발자들의 경우 기존 개발 방식에서 많은 차이가 생길까요? 32비트에서 64비트 컴퓨터로의 전환이 개발자들의 페러다임의 전환을 의미할까요?
  • C++ 혹은 더 나아가 C++ 보다 속도상으로 느린 스크립트 언어를 쓰는 사람은 C++ 개발자들보다 덜 우수할까요? (위의 Assembly > C++ 로 평가한것으로 봐서는, 퍼포먼스와 하드웨어 제어 용이성 관점에서 Assembly 를 평가한 것 같습니다만) C++ 개발자들 혹은 더 나아가서 Java 나 Python 과 같은 개발자들이 Assembly 와 같은 low level 제어성을 포기하는대신 얻어간 것은 어떤 것일까요?
--1002
└저도 C (배우게 된다면 Assembly도.ㅎ)를 좋아 합니다.ㅎ 무엇보다 빠른 연산속도와 하드웨어 제어(해본적은 없지만), 포인터를 통한 메모리 접근등 좋은 점이 많아요.* 그렇지만 예를 들어 1만 팩토리얼을 출력하는 프로그램을 작성하시오. 라고 문제가 주어졌을때, C로 짜면 한나절이지만 파이썬으로 작성하게 되면 5분도 안걸리게 됩니다. 물런 연산속도가 느리기는 하지만 말입니다. 이런 점에서 봤을때, 속도가 중요하다거나 특화된 프로그램을 작성해야할 경우에는 C와 같은 언어가 좋지만 보편적으로 사용하는 워드프로세서라든지 기타 응용프로그램이나, 제작해야할 프로그램의 제작시간이 짧을 경우에는 상위레벨의 언어가 좋을거라고 봅니다. 뭐 이렇게 말은해도.. 사실 서로의 장점을 그때그때 맞춰서 섞어쓰는게 가장 좋지 않을까요?ㅎ (게임을 만들때 하위레벨의 언어로 하드웨어를 직접 사용한다 하더라도, 다이렉트를 이용하지 각각의 그래픽 카드에 맞춰서 프로그램을 만들지 않는것과 비슷한것 같아요.) 이상 지나가는 행인1의 잡다한 생각이었습니다.^^* - 조현태


(우선 제 지문의 맥락을 담은 질문부터. 과연 Java와 Python 개발자들이 Assembly+C개발자와 같이 좋은 효율의 다른언어 컴파일러를 만들 수 있을까요. 현재 함수보다 좋은 함수를 생각해 냈는데 그것을 구현하려면 low level의 지식이 필요한데, 자신은 Java와 Python 들만 알고 Assembly를 모른다면 어떻게 해야할까요?)
음. 아쉽게도 그런 용도로 Assembly를 평가 한게 아닙니다. 우수하고 못하다의 평가는 여기서도 나오는군요. 한가지만 파면 성공한다와 같은 맥락이랄까요... 저는 미래의 직장보다도 현재의 지식욕을 채우고 싶을 뿐입니다. 누구보다도 이것에 대해 많이 알고 싶고 또한 그렇게 되길 바랄뿐입니다. 과연 Java나 Python등을 공부하다보면 컴퓨터에 대한 가장 기초적인 지식들을 얻기 쉬울까요? 그렇기 때문에 Assembly에 대한 직접적인 접근을 하려고 하는 것입니다. 지식욕이 아니더래도 현직에 계시는 프로그래머분들께 컴퓨터에 대한 기초가 부족하고 프로그램만 짤 줄 아는 신참 직원들은 항상 한계에 다다르면 좌절한다라는 말을 들은적이 있습니다. 한번쯤은 생각해 볼 문제입니다. Assembly > C++을 평가한 것은 이런 맥락입니다. 컴퓨터에 대한 기초가 있느냐 없느냐. Assembly를 만지고 C++을 만진 사람의 경우는 모르겠지만 C++만 만지고 Assembly를 공부하지 않은 사람의 한계는 언젠가는 드러나게 되죠.
전 어제 제가 평생 해도 따라가지 못할것 같은 사람을 보았습니다. 그 사람과의 벽이랄까요. 물론 그분이 연륜이 있으시지만 컴퓨터 자체에 대한 기초적이고 깊은 지식은 따라가질 못하겠습니다. 그분의 소싯적에 C언어로만 짠 프로그램들은 컴퓨터에 대한 깊은 이해가 없으면 불가능한 것들이었습니다. 그분이 Assembly를 배우지 않고 C를 처음부터 만졌다면 어땠을까요? 그런 프로그램들을 짤 수 있었을까요? 이상, 우물 밖으로 튀어나온 개구리였습니다.
(64 비트로 변할 때에는 프로그래머가 3가지 아키텍쳐(32비트 때에는 32비트 아키텍쳐 한가지)에 대한 것을 모두 생각해야하기 때문에 32비트만 취급할 수는 없겠죠. 호환성때문에. 결국 64비트 아키텍쳐에도 공부할 시간을 할애해야하고 32비트의 공부시간이 줄어든다는 말이었습니다.) - 영호

이러고 보니 현직 프로그래머들의 싸움이 되고 있군요. System 프로그래머와 일반 Application 프로그래머의 싸움. 한가지... 모두가 다 그런것은 아니겠지만, 전 Coder에 머무르고 싶지는 않습니다. 저 높은 수준까지는 아니더래도 Programmer로서 Guru정도의 위치에는 가고 싶군요. - 영호

그냥 시스템 프로그래머와 어플리케이션 프로그래머의 차이정도로만 생각하겠습니다. 언어 관련 논쟁과 다른 레이어간 논쟁에 대해서는 정말정말 재미없습니다. ^^ 의도하는 바도 아니고요. 단지, '시스템 프로그래머' 컨텍스트가 붙지 않았을 경우에는 다른 사람들에게는 좀 갸우뚱할 상황이여서 쓴 것일 뿐입니다. (그렇다고 시스템에 대한 이해의 중요성을 무시하려는것은 당연히 절대로 아니고요.)

참고로, 어플리케이션 개발쪽에서는 다른 이야기들이 이슈가 됩니다. 순수하게 프로그래밍 부분만을 생각한다면(조금 개인적인 생각이 짙습니다만)
  • 어떻게 하면 정해진 시간 내에 원하는 스펙을 충족시키고, 최선의 성능을 발휘하는 결과물들을 만들어낼까?
이와 관련하여
  • Global Optimization 관점에서, 어느 부분은 생산성을 살리고 어느 부분은 퍼포먼스를 추구할까? 퍼포먼스를 추구하는 모듈에 대해서는, 어떻게 하면 추후 퍼포먼스 튜닝시 외부 모듈로의 영향력을 최소화할까? (InformationHiding)
    • 혹은, 전혀 다른 차원에서의 해결법은 없는가? (우스개 소리나마, 미국이 우주에서 이용할 수 있는 볼펜 개발차 수만달러 쓸때 소련에서는 간단히 연필로 해결했다.. 급의)
  • 어떻게 하면 확장성과 교체성이 뛰어나고 코드 상의 중복이나 Dependency 문제를 적게 일으키는 모듈을 만들어낼까?
  • 어떻게 하면 추상성이 높은(적은 코드로 더 많은 일을 하게 하여, 실제의 도메인 문제 자체에 촛점을 맞추게 하는) 모듈을 만들까?

이를 잘 하는 사람은 또 다른 관점에서 Guru 로 평가를 받습니다. 혹은 'Architect' 명함을 붙일 수 있기도 합니다. --1002

참고로 저는 82년부터 기계어(Machine Code)로 프로그래밍을 해본 사람입니다. 그렇지만 그 경험이 제가 현재 컨설턴트로, 프로그래머로 살아가는데 결정적 도움이 되었다는 생각은 들지 않습니다.

"종국에 C++과 같은 현재 패러다임을 따르는 사람들은 결코 나를 넘지 못하리니..."라는 말이 참이 되는 시점이 있다면 "나 역시 그들을 넘지 못하리니."도 참이 되진 않을까 반문해 보세요. 그리고 만에 하나 그렇게 된다면 거기에 만족할 수 있을까 생각해 보세요. 너무 이른 걱정이려나요? (전문성은 분야를 넘어서까지 적용되지는 않는다는 것이 최근 인지과학이 밝혀낸 사실입니다. 반드시 체스 전문가가 바둑을 특별히 잘두거나, 바둑 전문가가 체스를 뛰어나게 잘두거나 하지는 않습니다. 체스 고수가 특별히 IQ가 높고 암기력이 뛰어나거나 하지도 않고요. 한가지를 잘해서 두루 잘하기는 무척 어렵습니다)

컴퓨터 계의 대부 다익스트라(EdsgerDijkstra)는 이런 말을 했죠. "천문학이 망원경에 대한 학문이 아니듯이, 컴퓨터 과학 역시 컴퓨터에 대한 것이 아니다."(Computer science is no more about computers than astronomy is about telescopes.) 망원경 속을 들여파봐야 거기에서 명왕성이 뭔지 알 수가 없고, 컴퓨터를 속속들이 이해한다고 해서 컴퓨터 과학에 달통할 수는 없다 그런 말이죠.

관점은 많습니다. 세상을 보는 창도 여러개이구요. 아직 대학을 다니는 시기에 너무 한쪽에 치우친 공부를 할 필요는 없을 것 같습니다.

--JuNe

// 위에 C++과 같은 패러다임 <- 이것은 C++을 부정한게 아니라 C++을 먼저 공부하는 것을 한탄한 것입니다. 제가 적은 글이 이상하네요?
잘 읽었습니다. 혹시 천문학을 공부해보셨는지요? 어릴적부터 천문학(정확히 천체물리학)에 관심이 많아 대학 과정을 고등학교때 배우기도 했습니다만(조금 이상한 geek같죠?), 천문학을 잘 하려면 말씀하신대로 컴퓨터에 대한 학문처럼 두루 잘 알아야하죠. 이러한 수학, 물리학화학(스펙트럼, 통계역학, 열 역학, 양자역학, 상대론 등)을 제대로 공부해 둬야 비로서 천문학을 제대로 공부할 수 있습니다. 즉, 어느 한가지라도 약하다면 그 사람은 천문학자가 아닌 천문대에서 일하는 사람과 뭐가 다를까요? 제가 Assembly를 공부하려 한것은 한쪽으로 치우친 공부가 아닌 컴퓨터의 가장 기초를 먼저 닦고 다른 분야로 올라가겠다는 것입니다.
다양한 것을 접하라. 맞는 말입니다. 제가 고등학교 때 배운 수학이나 현대물리학 이러한 것들이 프로그래밍 하는데에도 많은 도움이 되고 있습니다.(또한 의식적이거나 무의식적으로 그러한 지식이 코드에 베여나오기도 하구요) 하지만 이렇게 다양한 것을 접하는 것은 대학 강의 자체에서도 할 수 있는 것이 아닐까요?
선배님께서 82년부터 기계어로 해오신 것들이 다른 언어를 접하고 그 기초를 익힐때 도움이 안되었을까요? C언어의 포인터만 생각해도 C언어를 처음 접하는 사람과 어셈블리를 접하고 C언어를 접하는 사람에게는 큰 차이가 있을 것 같네요.(저 역시 포인터의 어설픈 이해를 어셈블리를 조금 공부해보고 제대로 잡았으니까요) C언어만 접한 사람들이 왜 상수를 고치지 못하는지 제대로 이해할까요? (C언어 책의 대부분은 상수는 고치지 못한다라고만 말하지 메모리의 실행 코드 부분이어서 고치지 못한다고는 말을 하지 않죠 :) )
훌륭한 과학자들은 많은데 우리나라에서 노벨상이 나오지 못하는 이유는 기초과학이 약해서...라죠? - 영호

P.S: 천문학과 컴퓨터로 치면, 망원경은 컴파일러가 되겠고, Assembly어는 물리학 쯤이 되겠네요. 천문학 및 천체물리학 개론에는 망원경 단원이 1단원 분량으로 망원경 제작법 이런 것들이 아닌(망원경 제작은 아마추어 별바라기들이 하죠.) 물리학의 광학적 특성에 대해 다루죠 :) 예를 조금 잘못 드신거 같네요. 아니면 제가 위에서 제가 여러번 반박한 글들에 제 의도가 제대로 나타나지 않았던가요.

다른 사람이 제 생각에 이의를 제기하면 생각을 다시 하고 고치지만, 제가 정말로 옳다고 하는 것들은 어떤 권위가 와도 굴복하기 힘드네요.(이러면 적을 만들기 쉽지만, 자신을 버리긴 힘드네요.) 이번 생각만은 제가 옳은 것 같습니다. 현재에는 가장 기초가 되는 Assembly어를 다지고 다른 것에 관심을 돌리겠습니다. :)



생각이 너무 한쪽에 치우신거 같네요. 아마도 저 말고 다른 선배님들도 저와 비슷한 심정(생각)으로 글을 쓰셨을거 같습니다. 선배님들 말이 어셈블러를 공부하지 말라? C++만 공부하라~~ 이렇게 들리셨나요? 저는 아닌거 같은데요. 조금만 더 생각하고 읽었으면 좋겠네요. 위에 쓰신 글들을 보니 어쩌면 프로그래밍에 관련해서 저보다 더 많이 알고 있으리라 생각되는데요. 우선 젤하고 싶은 생각은 남의 글을 비판적으로 읽는것도 중요하지만, 그사람의 입장에서 생각해보는게 좋을거 같군요. A라고 말했는데, B라고 들으면 안돼겠죠. 어셈을 익히고 C++을 익히는것도 좋습니다. 그렇다고 C++을 익히고 어셈을 익히는게 나쁜 방법이라고 생각하지는 않는데요..@,.@. 제생각에는 님은 "어셈을 꼭 인힌다음 C++을 익혀야돼" 라는 고정관념에 빠진듯 함니다. 어셈을 모른다고 프로그램을 적게 이해한다고 생각하지도 않구요. 제 의견이지만 특정 프로그램언어 보나는 알고리즘, 자료구조 이런것들이 더 중요하다고 생각합니다. 그리고 C++이 쉽다? 정말 그럴까요? 정말 C++이 어셈보다 쉽다고 생각하시나요? 이펙티스 C++이나 엑셀레이터 C++ 이런책들을 한번 읽어 보시는것도 좋을거 같네요. 머 주저리 주저리 쓰게 됐는데 어디까지나 제 생각이고, 다른사람들의 입장에서 글들을 한번 다시 읽어 보는것도 괜찮은 생각인거 같군요. - 상섭
'특정언어를 공부한다'에는 두가지 의미가 같이 포함되어서 그런 것 같습니다. 즉, 언어 자체를 공부하는 것과 해당 언어가 쓰이는 분야(시스템, 웹, 컨커런트 등)를 공부하는 것. 아마 영호군의 경우 강조하려는 것은 시스템 레벨에의 지식에 대한 공부일 것이므로, '알고리즘/자료구조 대신 특정 프로그램언어를 공부한다'는 기우가 아닐까 생각. (물론, 하려는 이야기는 이해했음..~)--1002


영호군 말에 틀린것은 없습니다. 기초가 중요하다는건 옳은 말이죠~ 단지 위의 글이 너무 자신의 입장에서만 쓰여졌기에 남들에게 조금은 불편하게 보였던것 같습니다. 다른 많은 글들은 그러한 불편한 심기를 표현한것 같군요^^ 기초는 정말로 중요합니다. 하지만 컴퓨터공학의 모든 영역에서 assembly가 기초인 것은 아닙니다. (영호군이 관심있는 영역에서는 그럴지 모르겠지만..) 영호군이 assembly를 통해 기초를 잘 다진다면 누구도 영호군을 넘지 못할 것입니다. 단, 영호군과 같은 영역의 사람들에게만 그렇겠죠. 다른 영역에서 공부를 하는 사람들은 영호군을 넘을 필요 조차도 없거든요. 마찬가지로 영호군도 아무리 assembly로 기초를 다졌다 해도 다른 영역에서 열심히 공부하는 사람들은 절대로 넘지 못합니다. 역시 넘을 필요도 없겠죠. 여기에 많은 조언을 해주신 선배님들은 영호군의 주장이 틀렸다고 질타하는 것이 아닐꺼라 생각합니다. 세상에는 영호군이 생각하는것보다 다양한 것들이 있다는 충고라 생각합니다. --상규

새로운 기술은 전혀 어울릴것 같지 않은 기술들이 섞일 때 나오곤 합니다. 한가지만을 고집하다가는 자신의 영역에서 최고로 많이 아는 사람이 될지는 모르겠지만, 자신의 영역을 발전시켜가는 사람은 되지 못합니다. 언젠가 시간이 된다면, 영호군의 주장과는 반대로 보다 상위 개념을 기초로 하여 C++를 공부해 보세요. Assembly를 기초로 C++를 공부한 사람들을 절대로 넘지 못할 새로운 것들을 얻게 될 것입니다. --상규

잡담성 글이지만.. 예전의 제 모습과 비슷한것 같아 정이 가군요... 저도 영호군처럼 시스템 레벨의 것들을 무척 좋아합니다. 중학교 다닐때 어렵게 구한 assembler와(그시절엔 인터넷이 쓰지 않았기에 구하기가 쉽지 않았죠...) 어머니가 주신 참고서값으로 몰래 산-_-;; assembly 책 한권으로 집에 오기만 하면 mov ax, 4c00h를 타이핑하곤 했습니다. 그리고 저도 제가 하는 것만을 계속 고집했었죠. 뭐.. 지금은 생각이 좀 바뀌었지만 --상규

상규의 생각에 전적으로 동의합니다. 시스템 프로그래밍에서 있어서 최고가 되는 데에는 영호군이 말한바도 한가지 방법이 되겠지요. 하지만 절 비롯한 많은 분들이 B 를 잘하려면 A 부터 탄탄히 닦아야 한다는 의미로 받아둘여질 수 있어 저로서는 동의하기 힘든 부분입니다. 다른 사람의 생각을 자신의 기준으로만 재는 것은 바람직하지 않다고 생각합니다 - 임인택
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:30:31
Processing time 0.0328 sec