리뷰: Coders at Work
Peter Seibel 의 coders at work 완독. 현업에 있는 / 있었던 유명 프로그래머 – 이쪽 업계에선 여러가지 의미로 슈퍼 스타 – 들의 인터뷰 15개를 엮어놓은 책이다.
인터뷰한 사람들의 면면을 살펴보면, 학계에 있던 사람부터 시작해서 (Knuth 교수라거나 haskell 의 Simon. Peyton-Jones, Guy Steel 등등), 업계에서 처음부터 지금까지 일해온 사람들(Live Journal을 만든 Fitzpatrick, 넷스케이프의 Zawanski, JSON의 Crockford, JavaScript의 Eich, Java Collections 의 저자 Bloch 등등) 혹은 양쪽 다에서 업적을 쌓은 사람들(AI 책의 저자이면서 구글의 리서치 디렉터인 Peter Norvig, UNIX와 C의 Ken Tompson 등등) 을 포함한다.
사실 이렇게 넓은 스펙트럼을 다루고 있어서인지, 프로그래밍에 관한 관점, 프로그래밍에 요구하는 관점, 어떤 언어가 필요한지, 자기 자신을 과학자/공학자/장인(craftsman)/예술가 중 무엇으로 보는지, 얼마나 수학을 해야하는지에 대한 생각이 각자 다르다. Literate Programming에 관해서는 대부분 괜찮지만 난 Knuth 수준으로 안해봤다가 대세였음…
일단 각 사람들이 다루는 분야가 프로그래밍 언어(C, Haskell, Smalltalk, Erlang, JavaScript, Fortress) 나 그에 밀접한 영역(Compiler, Interperter, EMACS(?), Java Collections)이거나, 아니면 현재 우리가 사용하는 시스템의 밑단(UNIX, ARPANET) 인 경우가 대부분이다. 어떤 의미로는 우리 시대의 – 적어도 컴퓨터 공학/전산학 분야에서는 – rocket science 인 듯…
프로그래머가 가져야하는 자질로,
- 간단함, 명료함에 대한 추구
- 자세한 것을 다룰 것
- 추상화 해서 생각할 것
- 수학적인 지식(분석적인 면 말고, 구성적(synthetic)인 면에서)
- 새로운 분야에 대해 호기심을 가질 것
등을 말하고 있다.
다만 실제로 프로그래밍에 임하는 자세에는, “실제로 코드가 동작하고 이를 유지한다” 쪽에 치중하는 계열이 있고, “(API 적인) 명료한 인터페이스를 생각하고, 이를 잘 지지할 테스트를 만든다” 라는 사람들도 있었다. 그리고 정말 극단적으로는, 모든 코드를 종이 위에 작성하고 이걸 만들었더니 거의 버그가 없었다는 Knuth의 TeX도 있다. 허허허(…)
그리고 자기가 일하는 형태에 따라 자기가 과학자 혹은 공학자로 생각하는 경우가 많았고, 대부분 장인과 예술가 적인 면을 가지고 있다고 말했다. 많은 사람들이 C++ 의 거대해진 면에 대해서 비판적이었고, C/C++/Java 그리고 묵시적인 면에서는 python 등도 포함해서 포인터 기반의 연산을 가지고 있는 자체에 대해서 불만을 표시하기도 했다 – 그리고 이 인터뷰 내용을 다른 인터뷰 당하는 사람한테 말하고 반론이 나오기도 해서 꽤나 흥미로웠다(…).
인상적인 구절이 너무 많아서 – 예전에 Peter Norvig이 말한건 간단히 포스팅 했다 – 인용 + 인상 정리로 한 달은 우려먹을 수 있을 것 같지만 이건 이 책 읽을 이들의 즐거움을 위해서 패스하고, 내 맘에 든(…) 구절을 몇 개 정리해보겠다.
Zawanski: I was kind of freaked outwhen I realized that there are people graduating with CS degrees who’d never written C.
Joel Spolsky 가 말하는 거랑 비슷한 의미.
Fitzpatrick: The thing that annoys me about Java is that everyone has such a strong aversion to JNI stuff. Sometimes a library is in C++. The Python people – in the outside community and inside Google – don’t care. They’re like, “Oh, we’ll, SWIG-wrap-it.” They get on their way and they’re happy. Python gets support for something right away if it’s in C++ because they’re not religious about what the source language is.
Java people are like, “Must be pure Java. We cannot use JNI because then if the JVM crashes, we don’t know why.” The problem with that is you end up writing everythin twice, once for C++ and Python and all the other languages, and the once for Java. So if they could come up with a good embedding story or get over this fear of JNI, then I wouldn’t mind it.
Java를 쓰는 사람들이 “그냥 SWIG 래핑해서 쓰지”하는 Python 계열의 사람들과 달리, “JNI가 아니라서 크래시 나면 어딘지 알수 없잖아”라고 해서 라이브러리를 두번 작성한다고 불평. 다만 Java가 더 좋은 임베딩 방법을 찾거나, JNI 문제에 덜 신경쓰게 되면 좋겠단다… 이래서 내가 C++/Python 패러다임에 살고 있는지도.
Bloch: Even today, writing unit tests for concurrency utilities is an art form.
Mutex 버그로 고생했던 기억을 회상하면서, “병행성을 다루는 도구의 유닛 테스트를 작성하는건 아직도 예술의 영역이다”라고 말하고 있다 ㅠㅠ. 회사에서 내가짜는 유닛 테스트 중에 병행성 테스트는 없다(…). 그냥 부하 잔뜩 걸어서 테스트해보는 정도?-0-
Erlang 의 저자인 Joe Armstrong은 코드 재사용성의 문제가 OOP에 있다고 생각한다.
I think the lack of reusability comes in OO langueages, not in functional languages. Because the problem with OO languages is the’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.
코드 재사용성을 (어느정도는) 강조하는 OOP지만, 실제적으론 묵시적으로 들고다니는 환경 때문에 너무 많은 의존성을 낳아 오히려 재사용이 안되고 함수형 언어에는 그런 문제가 없다는 것. 덤으로, 난 erlang을 함수형 언어로만 생각했는데, Armstrong 인터뷰에서 가장 많은 영향을 준 언어는 prolog 라고 말한다. PL 시간에 쌩고생 시킨 그 언어가 Orz
적절히 인용할 부분을 찾진 못하겠지만(…), SSA (컴파일러 이론의 static single assignment) 를 생각해내기도하고, 첫번째 튜링 어워드를 받은 여성인 Fran Allen은 “C의 성공 때문에 컴파일러가 최적화할 여지가 없거나 적은 언어들이 주류 언어가 되어버렸다”라고 비판했다. 즉, 좀 더 고수준의 언어를 가지고 만들어야 컴퓨터 공학이 발전할텐데, 시스템 프로그래밍 언어였던 C가 크나큰 성공을 거둬서 앞으로 갈 길이 너무 멀고, 발전이 너무 더디다라고 말한다.
이건 Python 도 저수준 언어의 기능 – 명시적인 메모리 공간에 대한 모델 – 이 있기에 겪을 수 있는 문제가 있는걸 생각하면, 약간은 수긍이 가는 듯도…
여기에 대해 ARPANET의 초기 구현을 작성한 Bernie Cossell은, 어셈블리어 프로그래밍을 하던 사람들에게 C의 표현력은 신선한 공기와 같아서 어쩔 수 없었고, 그 표현력과 저수준 지원 때문에 C는 다른 모든 언어 – 심지어 DoD가 우리와 계약하려면 Ada를 써라! 라고 했는데도 C가 더더욱 번성해버릴 정도로 – 보다 더 널리 쓰였다고 변호한다.
여튼 더 인용하고 싶은 문장은 매우 많지만, Bloch의 인터뷰를 인용해서, 내가 이 직업에 있는 이유를 설명해놓고 리뷰를 끝낸다.
What we’re doing is an aesthetic pursuit. It involves craftsmanship as well as mathematics and it involves people skills and prose skills – all of these things that we don’t necessarily thik of as engineering but without which I don’t hink you’ll ever be a really good engineer. So I thik it’s just something that we have to remind ourselves of. But I think it’s one of the most fun jobs on the planet. I think we’re really lucky to have grown up at the time that we did when these skills led to these jobs. I don’t know what we would have been doing a few generations back.
우리가 하고 있는 일은 미적인 추구다. 우리가 하는 일은 장인 정신 뿐만 아니라 수학과 사회적인 기술과, 글 쓰는 기술을 모두 필요로 한다. 이 모든게 공학에 꼭 필요한 거라고 생각되진 않지만, 이것 없이는 정말 뛰어난 공학자가 될 수 없다. 그래서 난 이것들이 우리가 상기해야할 무언가라고 생각한다. 그렇지만 난 이 일이 세상에서 가장 재밌는 일 중 하나라고 생각한다. 우리가 이 기술을 가지고 이 직업을 갖게만든 시대에 태어난걸 행운이라 생각한다. 만약 수 세대 전에 태어났다면 난 내가 뭘 하고 있을지 상상도 못하겠다.
컴퓨터 공학을 전공하고, “뭔가를 만들어보고 싶다”는 열망이 있다면 꼭 한 번 읽어보라고 권하고 싶은 책이다. 다만 다루는 내용으로 볼 때 이거 한국어판이 나올 수 있을까?-_-;