자바스크립트-CSS 창시자들과의 대담 

(지디넷코리아=임민철 기자) 웹이 유럽입자물리연구소(CERN)에서 과학 연구를 위해 태어난지 올해 25주년이다. 웹은 이제 단순히 정보를 전달하는 역할을 넘어 사람들의 일상 활동에도 깊숙하게 뿌리를 내린 하나의 문화가 됐다. 

웹을 빠르게 확산시킨 기폭제는 '자바스크립트(JavaScript)'와 '캐스케이딩스타일시트(Cascading Style SheetsCSS)'라는 2가지 기술이었다. 자바스크립트와 CSS는 각자 웹 사용자 기반을 넓히는 동시에 그 스스로가 거대한 커뮤니티를 갖춘 생태계로 20년간 발전에 발전을 거듭해왔다. 

한국이 웹을 받아들인지도 이제 20년이 됐다. 이를 위해 웹 생태계의 구루들이 한국을 찾았다. CSS와 자바스크립트의 창시자들이 한국을 찾았다. 자바 스크립트를 만든 브렌던 아이크(Brendan Eich) 전 모질라 최고기술책임자(CTO), CSS창시자인 하콤 비움 리(Håkon Wium Lie) 오페라소프트웨어CTO가 주인공이다. 

이들은 지난 17일 세종대학교 '한국웹20주년기념 국제컨퍼런스'에서 마련된 좌담회에도 참석해 패널 토론 시간도 가졌다. IT평론가인 김국현 에디토이 대표가 사회를 맡아 두 사람과 대담을 진행했다. 주요 대화 내용을 정리했다.


▲ 17일 서울 세종대학교에서 한국웹20주년기념 국제컨퍼런스가 진행됐다. CSS 표준 제안자 하콤 비움 리 오페라소프트웨어 CTO와 자바스크립트 창시자 브렌던 아이크 전 모질라 CTO가 오전 순서인 웹의 과거와 미래를 주제로 한 토론에 패널로 참석했다.


■웹기술 '아버지'들에게 '엄마는 누구냐' 묻자… 

김국현(이하 '김'): (웹이 나오고 나서 5년쯤 지나 자바스크립트와 CSS가 공개되고 발전한 과정을 물으며) 20년 전, 대체 무슨일이 있었던 건가 

하콤 비움 리(이하 '리'): 20년전(1994년) CERN 연구실에 있을때 HTML 코드를 보고 있었다. (웹의 창시자) 팀 버너스 리와 함께 웹을 개발중이었다. 웹을 개발하며 느낀것은 웹이 잘 작동했지만 몇몇 요소들이 빠져 있었다는 점이다. 텍스트를 글꼴, 색깔 등으로 '프리젠테이션'하는 방법, 문자와 이미지를 함께 배치하는 등 정보를 표현하는 방법 등이 부족했다. 그래서 CSS를 제안하게 됐다. 

브렌던 아이크(이하 '아이크') : 자바스크립트는 CSS보다 늦게 나왔다. 올해 5월기준으로 정확히 19주년을 맞았다. 내1995년 4월 넷스케이프에 합류해 (창립자 마크 안드레센을 포함한) 동료 2명과 함께 개발했다. 나와 동료들은 컴퓨터 전문가 아니더라도 쓸 수 있는 간단한 언어가 웹에 필요하다고 생각했다. 그래서 1995년 9월 넷스케이프 시험판에 '라이브스크립트(LiveScript)'란 이름으로 탑재된 언어 개발에 참여했다. 라이브스크립트는 이후 '자바스크립트'로 바뀌었다. 자바와 아무 관계가 없었기 때문에 상당한 혼란이 있기는 했지만...


▲ (왼쪽부터) 김국현, 브렌단 아이크, 하콤 비움 리. 사진=한국웹20주년컨퍼런스 제공.


김: 당신들이 자바스크립트와 CSS같은 주요 웹기술의 '아버지'라 불린다면, '엄마'라고 부를 수 있을만한 사람은 누굴까 

리: CSS 개발을 위해 '기스베르트 보스(Gijsbert Bos)'와 협력했다. (편집자 주: 기스베르트 보스는 베르트 보스(Bert Bos)라고도 불리며, 네덜란드 출신 컴퓨터과학자로 CSS 구현 및 테스트용 브라우저 '아르고(Argo)'를 개발하고 'CSS-웹을 위한 디자인'이란 CSS 개론서를 하콤 비움 리와 공동 집필함.) 또 사용자 커뮤니티로부터 CSS 완성에 많은 도움을 받았다. 

CSS 초안을 1994년 10월 10일 내놨다. 사흘후 넷스케이프 브라우저가 나왔지만 CSS는 거기에 구현되지 않았다. 72시간밖에 여유가 없었기 때문이다. 94년 10월은 CSS에겐 매우 중요한 한 달이었다. 당시만 해도 CSS는 많은 추가 작업을 필요로 하던 상황이었다. CSS에 참여할 수 있는 커뮤니티 메일링리스트가 있는데, 지금도 활발하게 활동하는 중요한 커뮤니티다. 1990년 이후 1만7천개 메시지가 쌓여 있다. 이들 참여자가 없었다면 CSS는 오늘과 같은 모습을 갖추거나 광범위하게 사용되는 성과를 거두지 못했을 거다. 

아이크: 자바스크립트도 너무 서둘러 만들어졌다. 불과 10일 남짓한 기간에 지금의 자바스크립트에서 장단점으로 꼽을만한 것들이 만들어졌다. (넷스케이프 브라우저 보급으로 자바스크립트 확산을 거든) 마크 안드레센을 '어머니'라 불러도 될 것 같다. 

하콤이 말한 것처럼 커뮤니티의 도움도 중요한 역할을 했다. 커뮤니티 멤버들은 자바스크립트 프로그래밍 언어에 있는 문제를 찾아내고, 부족한 요소에 대해 추가해줄 것을 요구했다. 나는 그런 요구를 최대한 빨리 수용하려고 노력했다. 

김: 당신들이 자바스크립트와 CSS란 기술을 만들어내지 않았다면, 지금쯤 뭘 하고 있었을 것 같나, 그리고 두 기술과 만나지 못한 '웹'에는 어떤 일이 벌어졌을 것 같나 

리: 웹에 개방형 표준 언어가 없었다면, 지금과 많이 다른 성격을 띠었을 거다. 마이크로소프트(MS)나 통신사같은 상업적 회사, 한국 등의 대기업이 (웹을) 장악했을 거라 생각한다. 개인적으로 (웹 생태계에) 오픈 스탠더드, 오픈소스가 상당히 중요하다고 생각한다. 

그리고 나는 노르웨이 농장지대에서 사과 농사를 한 적이 있는데, (CSS를 만들어내지 않았다면) 어쩌면 0과 1로 조합된 일(IT산업)이 아니라 농부가 됐을지도 모르겠다. 세상에는 농부와 같이 컴퓨터공학자와 전혀 별개인 영역의 삶과 역할도 중요하다고 생각한다. 농업은 쉽지 않다. 

아이크: (자바스크립트 개발) 당시 다니고 있던 넷스케이프는 벤처회사였다. 인터넷닷컴 '로켓'이 처음 우주로 발사된 시점이었다. 넷스케이프에서 나와 들어간 모질라에서도 자바스크립트를 개발했는데, 개인적으로는 그걸 시작하지 않았다면… 내가 있을만한 다른 영역이 있었을 거라 본다. 

웹의 경우, 수천개 혁신이 가능한 개방된 환경에 놓여 있었다. 자바스크립트를 만들지 않았다면 그거와 비슷한 'BB스크립트'나 'MS스크립트'같은 게 만들어졌을 거다. MS는 프로그래밍 언어를 만드는 능력과 플랫폼을 만드는 기술을 갖고 있었다. 

MS 플랫폼의 언어는 (독점 SW인) 윈도 비주얼스튜디오에서 쓰는데 웹에선 자바스크립트를 쓴다. 자바스크립트가 없었다면 MS같은 회사가 웹을 장악했을 것이다. 사실 자바스크립트 개발에 MS의 '비주얼베이직'이 영감을 줬다. 디테일을 참조한 게 아니라, 언어를 초심자 프로그래머도 쉽게 쓰도록 만들었다는 점에서 그렇다. 

김: 자바스크립트나 CSS 라이브러리는 매우 많다. 대단한 생태계를 만든 셈이다. 축하드린다. 하지만 이건 사람들이 현재 자바스크립트와 CSS의 기본 기능에 답답하고 불편함을 느낀다는 점을 방증한다. 그 한계를 극복하려는 이들이 그만큼 많다는 것인데, 이런 점은 불편하지 않나. 

리: 라이브러리는 지루하거나 반복적 작업을 대신해 '아티스트'의 수고를 덜어 준다. 요긴한 라이브러리 기능은 CSS에 탑재하는것도 의미 있을 것이다. 이를 위해 워킹그룹에서 그런 것처럼 (표준화 단체와 커뮤니티가) 양방향 작업을 할 수도 있다. 

(과거 자바스크립트를 사용해야 했던 표현들도 지금은 CSS로 가능한 게 많아) 10년 전에 비하면 사람들이 원하는 표현을 구현하기 위해 CSS를 쓰는 것이 훨씬 쉬워졌다. 프로토타이핑도 효율적으로 할 수 있다. 요즘은 라이브러리로 기능을 확장하려면 그냥 혼자 쓰면 된다. 예전엔 그걸 위해 많은 사람을 설득해야 했다. 

아이크: (많은 라이브러리는 자바스크립트의) 광범위한 성공을 나타낸다고 생각한다. 표준은 (그걸 확장하는 라이브러리와 함께) 항상 공동 진화 체제를 갖춰야 한다. 혼자 경직되거나 도태돼선 안된다. 개발자요구를 반영해야하고 계속 나아져야 한다. 

스티브 잡스가 애플 플랫폼을 만든것처럼 "이 플랫폼에선 이런 방법으로만 해야한다"가 아니라, 다양한 방식을 수용할 수 있어야 한다. 애플을 나쁘게만 말하는건 아니지만, 애플 플랫폼은 매우 통제되고 협의적인 플랫폼이다. 효율적인 환경이지만, 웹은 그런식으로 되지 않는다. (발전이) 더 개방적으로 이뤄져야한다. 

■애플-구글발 웹 생태계 위협? 

김: 애플 얘기가 나온김에…애플과 구글이 웹 개방성을 강화시켜준건 사실인 것 같다. (브라우저를 탑재한 스마트폰 확산으로 데스크톱에서 많이 쓰이던) 플러그인을 사라지게 했다든지. 그런데 모바일 애플리케이션 플랫폼 시장을 양분하면서 웹에 대한 기존 개발자의 관심도 흡수해버렸다. 구글과 애플(플랫폼)에 치우친 개발자들 관심은 웹의 위기인가, 기회인가, 어떻게 봐야할까 

리: 리스크라고 생각한다. 애플은 휴대폰에 다양한 (자체) 애플리케이션프로그래밍인터페이스(API)를 제공한다. 이것을 쓰기 위해 앱 개발자들이 구글이나 애플과 '계약서'를 쓰고(편집자 주: 앱 장터 개발자 프로그램 등록을 뜻함) 뭘 만드는 게 좋지만은 않다. 

하지만 웹으로 구성하는 경험을 이런 (모바일 앱 생태계같은) 독점 세상에 묶이게 하면 한계를 보일 수 밖에 없다. 웹의 미래가 상업적인 기업에 장악되는 셈이기 때문이다. 누구도 그걸 원치는 않을 것이다. 이번 컨퍼런스에선 웹 기술로 앱을 대체할 방법을 주제로한 세션도 준비됐다. 당장 실현되진 않겠지만 가능성이 있는 얘기다. 

아이크: (위험이 있다는 의견에) 동의한다. 나는 웹이 앞으로 어떻게 성장할 지에 대해 말하고 싶다. 난 구글과 애플이 웹을 버렸다고 생각지 않는다. 이들은 웹에 많은 혁신을 가져왔다. 혼재된 이해가 섞여 있다. 대형 벤더만 웹을 주도할 순 없다. 네이티브 기술과 웹이 혼용된 페이스북 앱만 보더라도. 웹은 앱, 네이티브 시스템과 함께 성장할 것이다. 물론 그러려면 많은 개발자의 관심과 사랑을 필요로 한다. 

김: CSS와 자바스크립트의 한계를 고쳐보려는 기업들의 노력이 두드러진다. 명시적으로 구글 언어 '다트(Dart)'가 궁극적으로 자바스크립트 지위를 빼앗으려는 시도로 보이는데, 어떻게 생각하는지 

아이크: 다트는 원래 '대시(Dash)'란 이름으로 알려져 있었다. 당시 자바스크립트를 대체하려는 언어로 구글 언어를 표방했다. 그런데 구글은 입장을 바꿔 "자바스크립트 컴파일(변환)을 하겠다, 다트는 (자바스크립트 역할을 대신하지 않아도) 그 자체로 훌륭한 언어다, 다른 브라우저에도 쓰이길 원한다"고 말한다. 

이건 구글이 현실을 보는거라 생각한다. 자바스크립트를 없애긴 거의 불가능한 일이다. (생물 진화 과정에) '미토콘드리아'가 세포안에 들어왔듯, 지금 와서 이를 바꿀 수 없다. 그냥 품은 채로 진화를 하는거다. 다트 역시 자바스크립트의 진화나 혁명을 돕거나 함께 해나갈 수는 있지만, 대체는 불가능하다. 
  
리: CSS도 다른 언어가 대체하진 못 할거다. 어려움이 많을 것이다. 서로 다른 기술을 다루는 공학자들 사이에서 (기술 언어간의) 긴장은 항상 있었다.CSS에 대해서도 많은 이론적 접근이 있지만, 향후 많은 연구가 이뤄져야한다고 본다. 

미래엔 CSS도 '컴파일' 될 거다. 선호하는 문법이 있을 거고, 다른 네이티브CSS로 전환될 수도 있을 거다. 이것도 시간이 오래 흘러야 가능한 일이다. 그래서 결론적으로 웹은 500년 이상 유지될 것이다. 지금 작성한 HTML,CSS, 자바스크립트 코드가 500년 뒤에도 계속 읽힐 거란 얘기다. 

김: 웹의 '공유'를 촉진하기 위해 만들어진 기술들이 현대 '컴퓨팅' 분야에서 핵심 역할을 하는 것 같다. 대단한 일이다. 그런데 지금처럼 자바스크립트같은 기술의 활용 분야가 (성능개선을 위한 asm.js 같은 아이디어로) 컴퓨팅에 치중하다보면 접근성 강화를 비롯한 웹의 근본 철학에서 멀어지는 게 아닐까 

리: 난 텍스트에디터로 CSS 코드를 직접 쓴다. 앞으로도 그럴 예정이다.CSS는 사람들이 내용을 쓰고 읽을 수 있고, 텍스트와 이미지의 기초적인 표현 언어로서 기본적인 역할을 할 수 있어야 한다. 하지만 언어와 그걸 위한 라이브러리는 양자택일 관계에 있는 게 아니다. 함께 활용해 나가는 것이다.

아이크: 나는 500년 앞을 내다보기는 어려운데, 1천년 쯤 미래는 어떨까? (좌중 웃음) 하콤의 의견에 동의한다. 자바스크립트는 살아있는 언어로, 사람이 손으로 코드를 쓸 수 있는 언어라 생각한다. 대중적인 기반 언어가 되길 원하고, 많은 사람들이 쓰길 원한다. 여러 프로그래밍 언어와 비교해 보면 자바스크립트는 계속 성장 중이라 생각한다. 

김: 좀 그런 질문일지 모르겠는데, 두 사람이 각자 애용하는 라이브러리는 뭐가 있나 

리: 슬라이드를 만들 때 쓰는 라이브러리가 있다. 이름은 정확하게 기억나지 않는데 굉장히 좋다. 그 기능을 CSS 표준에 포함했으면 하는 생각이 들 정도다. 물론 실제로 그걸 표준화하려면 해당 안건이 위원회를 통과해야 하고, 테스트와 설득 과정을 거쳐야 한다. 쉽진 않은 과정이다. 

아이크: 리빌(Reveal.js)이라는 프리젠테이션용 라이브러리를 쓴다. 자바스크립트는 핵심 부분만 표준화하고, 라이브러리를 통해 개발자들이 빨리 작업을 수행케 하는 게 좋다. 개발자들의 요구사항을 모두 표준화하는 건 불가능하다. 새로운 라이브러리가 나오면 과거 라이브러리는 무용지물이 되기도 한다. 

리: 라이브러리를 많이 쓰는데 호버링(hovering, 편집자 주 : 웹페이지 구성요소 중 마우스 커서를 올렸을 때와 같이 초점이 맞춰진 상태를 가리킴) 개념이 유용했다. 자바스크립트를 안 쓰고 CSS 코드만으로 쓸 수 있게 만들어졌다. 과거 자바스크립트로 구현된 뒤 CSS에 들어간 기능 사례다. 

아이크: 웹의 진화에 대해, 'extensiblewebmanifesto.org'라는 사이트에 가 보면 이런 논의가 있다. 표준을 최소한으로만 유지하면 됐지, 너무 많은 라이브러리를 다 표준화할 필요는 없다는 얘길 한다. 더 많은 개발자가 빨리 구현하길 원하는 부분을 직접 작게 만드는 게 났다는 생각인데, 매우 공감된다. 

리: 그런 웹기술에 대한 확장가능성(extensibility) 논의에는 오해 소지가 다소 있다. 내가 타이포그래피 쪽 일을 했던 사람이라 그런지, 내 생각은 좀 다르다. 요즘도 웹은 CSS 요소를 대부분 라인, 컬럼, 페이지 형태만으로 사용한다. 그 이외 것을 구현하기 위한 핵심요소가 지금의 CSS엔 빠져 있다. 

CSS-자바스크립트의 긴장관계? 

김: 예전엔 (웹 애니메이션같은) 자바스크립트로만 가능했던 기능을 이제CSS만으로도 할 수 있는 경우가 생겼는데, 이렇게 CSS와 자바스크립트의 역할 중첩을 어떻게 봐야 할까 

리: 언어는 경우에 따라 경쟁 관계에 놓일 수 있다. 일반 프로그램이 웹에 오면 자바스크립트와 경쟁하게 된다. 웹에서의 프로그래밍이 쉽다고 하는 얘기는 CSS보단 자바스크립트 덕분이다. 

이와 별개로 간단히 퍼블리싱 작업을 하기 위한 기반은 CSS가 유용하다. 구현된 값과 속성 설정에 익숙하면 자바스크립트 없이도 결과물을 낼수 있다. 프로그래밍은 더 편리할 수 있겠지만, 그런 건 인류의 90%가 아니라 1%정도만 하면 된다고 생각한다. 전세계에 뛰어난 프로그래머가 흔하진 않기 때문에, CSS가 (규모의 경쟁에선) 승리할 것 같다. (좌중 웃음) 

아이크: 동의한다. CSS는 프리젠테이션과 퍼블리싱에 유용하다. 자바스크립트는 혁신적인 프로그래밍을 하는 사람에게 유용한 언어다. 트위터가 (프론트엔드 구현용 라이브러리로) 내놓은 '부트스트랩'처럼 많은 이들이 (시각적인 표현을 위해) 자바스크립트를 쓰지 않고 CSS 기능을 활용하는 추세다.

김: 당신들의 2가지 기술이 열린 웹 생태계를 20년간 키워 왔는데, 더 중요한 앞으로의 시대에 가장 큰 위협은 뭐가 될 것이라 생각하나 

리: 어떤 기업이 (표준) 개발을 다 장악해 버리는 것. 애플과 구글은 지금도 (표준화 과정에서의 영향력이) 굉장히 막강하다. 그런데 오픈스탠다드가 규칙이 아닌 세계에 살고 싶진 않다. 개방형 표준의 관점에서 지난 2005년 최대 위협은 (브라우저 시장을 독점한) MS였는데, 이런 위협은 계속 변화하며 대두될 것이다. 

오픈 커뮤니티가 더 강해져야 한다. 정부나 규제당국의 노력으로는 (독점 환경을) 이길 수 없다. 열정을 갖춘 사람들이 개방형 웹 커뮤니티를 든든히 지원하며, 즐겁게 일해야 한다. 웹은 더 많은 사람들에게 필요하고 어떤 거래 동의서 작성같은 게 필요치 않은 공간이기에 훨씬 더 중요하다. 

아이크: OS기반(네이티브) 앱의 영향력이 커지면서 웹에 많은 도전과제가 생겼다. 스티브 잡스가 아이폰을 들고 나와 발표할 때, (모바일 사파리에)CSS3 표준의 '라운디드코너'나 '애니메이션 트랜지션'을 위해 CSS를 활용했다고 얘기하기도 했다. 스마트폰이 웹을 잘 쓰게 된 건 좋은 일이고 앞으로 더 많이 이뤄져야 할 현상이다. 

내가 우려하는 부분은 상업적인 기업이 독점 기술의 하위구조에 CSS와 자바스크립트를 가져간다든지, 계정, 인증서, 보안, 이런 부분을 독점하는 게 문제로 작용할 수 있다는 점이다. 여러분이 자신의 데이터를 갖고 있어야 하는데 실제로는 쉽지 않다. 데이터가 언제나 클라우드 서비스에 수집되고 있어서다. 이는 작은 기술보다는 큰 시스템의 문제다. 

김: 한국에선 일상생활을 순수한 웹으로 하지 못하는 경우가 참 많은데, 두 사람이 만일 오늘부터 한국에서 살기로 결정했다면 어떻게 하고 싶겠나 

리: 아직도 한국에서 일상적인 웹 활용을 위해 IE가 필요한가? 그렇다면 잘못됐다고 생각한다. 한국은 기술적으론 선두권에 있는 나라인데, 때론 액티브X처럼 (도입이) 너무 앞서나간 게 아닌가 할 때가 있다. 난 이걸 고치려고 노력할 것 같다. 여러분 중에도 그런 활동가가 많을 것 같다. 

아이크: 안드로이드나 iOS같은 스마트폰엔 액티브X같은 게 없다고 보는 경향이 있는 듯하다. 그래서 한국의 인증서나 액티브X가 사라질 거라고들 전망하는데, 한국이 그런 기존 환경에서 벗어나는 과정은 내 생각보다 좀 더 오래 걸리는 것 같다. 내가 한국에 산다면 IE를 사용해야 될 것 같다. 하지만 웹의 발전을 위해선 계속 노력할 것이다. 

김: 당신들이 여기 와 계신, 개발자를 비롯해 웹 업계에 종사하는 다양한 참석자들과 입장을 바꿔 보자…오늘 당장 웹 생태계에서의 경력을 시작하는 입장이라면 많은 생각이 들텐데, 당장 뭐부터 시작할 것 같나 

리: 일단 기초를 다지기 위해 반드시 필요한 HTML을 15분동안 공부할 거다. 그리고 45분동안 CSS 기초를 익힐 거다. 그럼 1시간 정도 공부를 한 거다. (아이크를 보면서) 자바스크립트는 얼마나 걸릴지 모르겠는데? 

아이크: '열흘' 걸린다. (편집자 주 : 자신이 자바스크립트 개발에 들인 기간 정도를 지칭한 유머) (좌중 웃음) 

리: 그 뒤 500년 동안은 편히 일할 수 있다. 좀 진지하게 말하자면, 반드시 기술에 대한 이해가 필요하다. HTTPURL, 특히 HTML(웹의 창시자 팀 버너스 리가 실제로 만든 3가지 기술)을 다 이해해야 한다. '앱'도 연구해 볼 것 같다. 특정 기업이 독점한 구조는 따르지 않겠지만. 

즉 앱을 만들겠지만, 결국 많은 사람들에게 접해보게 할 수 있는 웹 기반의 방법을 찾을 것 같다. 웹은 아이폰같은 최신 스마트폰을 쓰지 못하는 국가에 사는 사람들도 피처폰, 모바일폰, 인터넷카페 컴퓨터 등으로 세계 어디서나 쓸 수 있다. 미국 서부나 내가 사는 노르웨이에 국한하지 않는다. 

웹을 지칭하는 표현 앞에 '월드와이드'가 붙는 이유는, 그게 이제껏 웹이 해온 일이기 때문이다. 언제나 웹으로 활용 가능한 콘텐츠가 만들어지고, 전세계에서 통용된다. 진정한 세계적 범주에서 퍼져나가는 건 웹 뿐이다. 산업화된 선진국뿐아니라 어디서든 쓰인다. 따라서 새로운 시장도 계속 열린다. 

아이크: 내 이력을 되짚어 보면 과거 베이직, 하스켈, C 프로그래머가 인기있었다. 지금은 자바스크립트도 많이 쓰는데 파이썬, 루비도 있고, C++도 (진화를 거듭해) 세번째, 네번째 삶을 이어가고 있다. 스마트폰 프로그래밍에도 많이 쓰인다. 더 '제너럴리스트'가 되라고 조언하겠다. 

특정 분야만 파고드는 게 아니라 다양한 언어를 배우길 권한다. 그리고 배포와 컨트롤 시스템뿐 아니라 다른 시스템도 알아야 한다. 이런 다방면의 지식을 공유하는 개발자들의 수가 엄청나다. 과거 어느때보다 많다. 앞서 얘기한 (커뮤니티의) 공동의 진화는 프로그래밍을 시작하는 데에 큰 도움이 된다. 지금은 내가 배우기 시작했을 때보다 훨씬 개방적이고 책을 살 필요도 없이 지식을 구할 수 있다. 

김: 마무리하는 의미에서 한국과 관련된 질문을 드리고 싶은데, 한국분들은 앞으로 어떻게 해야할까? 오페라소프트웨어 본사 소재지인 노르웨이를 포함해 북구 스칸디나비안 지역의 (웹 분야) 경쟁력이 크다면, 그런 스칸디나비안의 강점이 한국에 시사할바가 있을까 

리: 오페라 창립한 1995년에 난 거기없었지만, 강력했다. 더이상은 아니지만, 노키아나 에릭슨같은 휴대폰 개발사들도 경쟁력이 있었다. 똑똑한 사람이 많고, 그런 소프트웨어와 서비스가 다수 구현됐다. 하지만 이제 많은 개발은 미국 서부에서 주도한다. 지금은 그게 '혁신의 자석'처럼 작용하고 있고, 성공적이라고 생각된다. 앞으로 이게 세계 각지로 분산됐으면 한다. 삼성, LG같은 제조사를 둔 한국을 포함해 전세계로, 균형잡힌 분포가 이뤄졌으면 한다. 

웹과 관련된 기술 대부분이 CERN에서 개발됐다. 팀 버너스 리도 당시 연구소 컴퓨터서비스랩의 여러 연구진 가운데 한 사람이었다. 당시 웹을 개발했을 땐 오늘날처럼 퍼져나가리라고는 아무도 예상하지 못했다. 여러분들도 그런 (자신이 만든 기술 결과물이 널리 확산되는) 기회를 누리기 바란다. 웹은 전세계 누구에게든 그런 기반이 돼 줄거라 생각한다. 

아이크: 나는 삼성과 개인적으로 일한 적이 있고, LG도 모질라와 (파이어폭스OS 단말기로) 협력 관계에 있다. 이제 미국 서부에 많은 순수한 소프트웨어 회사들도 (벤처 창업을) 생각해보기 바란다. 

오늘날 소프트웨어로 성공을 거두려면 미국 서부로 가야한다고 생각하곤 하는데, 구글은 스탠포드에서, 페이스북은 하버드에서 시작했다. 소프트웨어는 예술, 과학 같은 거다. 하드웨어식으로 접근해선 안된다. 여러분에겐 순수한 소프트웨어에 집중하고 많은 '이니셔티브'를 해보길 권한다. 

김: 마지막으로 웹개발자들에게 해줄 말이 있다면 

아이크: 자바스크립트에 투자하시라. 

리: 가능할 경우엔, CSS를 쓰시라. (좌중 웃음) 

김: 한국에 웹이 도입된지 20주년 되는 해인데, 좌담회를 마치며 앞으로 500주년이 될 때를 위해 만세를 외쳐보자. 만세~ 

리&아이크 : (사회자의 행동을 보고 머뭇거리다가 통역을 듣고 난 뒤) 만세~ (좌중 웃음) 


by kelicia 2014. 10. 26. 14:05



조엘 온 소프트웨어

저자
조엘 스폴스키 지음
출판사
에이콘출판 | 2005-04-15 출간
카테고리
컴퓨터/IT
책소개
2005년 15회 JOLT상 수상작! 아마존 선정 컴퓨터 인터넷...
가격비교


Aㅏ......

드디어 다 읽은 이 책 ㅠ_ㅠ...

날 너무 힘들게 했다 orz 


고작 책 하나 읽는데 무려 4주 이상 걸린 듯 싶다.

읽고 싶은 책으로 시작해서 읽어야만 하는 책으로 끝나버렸다. 

- 억지로 꾸역꾸역 읽은 듯한 느낌이라 - 지금 리뷰를 쓰는 이 시점에도 

뭔가 찜찜하고 반성해야만 할 것 같은 기분이다.



그래서 보통 같으면 목차를 하나씩 훑으면서 자세히 리뷰를 썼지만

이번에는 기억에 남는 일부 장에 대해서만 리뷰하겠다. 

(이 책은 제대로 못 읽었다는 느낌이 강해서 차후 다시 읽을 책 리스트에 올랐다 OTL)


→ 근데 막상 책을 다시 훑으면서 쓰다보면, 나름 자세히 쓰게 되더라.




< 1부 > 비트와 바이트 : 프로그래밍 실전



1장. 언어 선택


- 순수 C :  빠른 속력이 필요할 때


- MFC, C++ : 배포판 크기를 윈도우용으로 최소화 해야 한다면 정적 링크 언어를 선택


- JAVA : 맥, 윈도우, 리눅스에서 돌아갈 GUI 가 필요할 때 (GUI 가 완벽하지는 못하겠지만 실행은 되니까)


- Visual Basic : 작업 시간이 충분하지는 않지만 멋지게 보이는 GUI 를 만들어야 할 때

(하지만 배포판 크기가 커지는 데다가 윈도우에 묶여야만 한다는 단점이 있음)


- Perl : 속력에 무관하며 어떤 유닉스 기계에도 돌아가는 명령행 도구가 필요할 때


- JavaScript : 웹 브라우저 내부에서 동작해야 한다면 피할 수 없는 녀석


- SQL 내장 프로시저 부문 : 몇몇 회사에서 제공하는 독점적인 SQL 파생 버전을 이용해야만 함


=> 05년도 책이라 이보다 더 나은, 상황에 따라 더 적절한 언어들이 생겼을 수도 있겠지만

그래도 참고할 만한 내용이라 남겨본다. 요새 VB 를 쓰는 곳이 있나 싶기도 하고...

'VB 대신에 WPF 를 쓰지 않나?' 라는 생각이 든다. 잘은 모르겠다.




2장. 기본으로 돌아가기


- 소프트웨어 개발에 있어 최하위단 에서 벌어지는 단순한 동작 원리에 대해 논한다.

이 장의 내용은 책에서 완전 초반에 다루는 내용인데다 내가 이 책을 읽는데 4주가 걸렸음에도

블로그에 꼭 남기고 싶다는 생각을 한번도 잊은 적이 없다.



- C언어에서 문자열이 동작하는 방법에 대해...

void strcat(char* dest, char* src)
{
    while(*dest) dest++;        // NULL 문자열을 찾아간다
    while(*dest++ = *src++);    // dest 뒤에 src 글자를 하나씩 붙여나간다
}

눈치챘겠지만 이 코드에는 문제가 있다.

어떤 문자열에 여러 개의 문자열을 이어 붙이기 위해 이 함수를 여러 번 호출한다면...

NULL 을 찾기위해 1번째 while 루프를 미친듯이 돌려야 한다. (러시안 페인트공 알고리즘)


이를 해결하는 건 간단하다.

char* strcat(char* dest, char* src)
{
    while(*dest) dest++;        // NULL 문자열을 찾아간다
    while(*dest++ = *src++);    // dest 뒤에 src 글자를 하나씩 붙여나간다
    return --dest;    // 마지막 문자열의 위치를 반환, 이유는 첫번째 while 문 참고
}

이렇게 하면 O(n²) 의 복잡도를 O(n) 으로 줄일 수 있다.

너무 당연한 거 아니냐고 생각할 수도 있지만 글쎄...

그래도 중요하다고는 생각하니 남기고 싶었다. 기본이니까.



- malloc 은 어떻게 동작할까?

malloc 의 본질은 사용 가능한 메모리 블록을 Linked List 로 길게 연결한 Free Chain(자유 체인) 이다.


malloc 은 Linked List를 따라가며, 요청받은 메모리 양보다 큰 블록을 찾는다.

이렇게 찾은 블록을 2개로 쪼개서 하나는 호출한 사용자에게 반환하며, 

쪼개고 난 다음에 남아있는 블록은 다시 Linked List에 넣어둔다.


free를 호출할 때, free 는 해제한 메모리를 Free Chain에 추가한다.

결국 Free Chain 은 자그마한 조각으로 잘게 쪼개지므로, 

큰 메모리를 할당 받기 원할 때 원하는 크기를 충족하는 조각이 없을 수도 있다.

이럴 경우 malloc이 Time out을 선언한 다음에 Free Chain 주위를 샅샅이 훑어 조각을 정렬하고,

인접한 작은 자유 블록을 더 큰 블록으로 결합한다.


결국... malloc 의 성능이 결코 아주 빠르다고 볼 수 없다. (malloc은 항상 Free Chain을 돌아다님)

정리하는 과정에서 종종 예측할 수 없을 정도로 너무 느려질 수 있다는 사실을 알게 된다.


덧붙여 말하자면, 이런 현상은 Garbage Collection을 지원하는 시스템과 동일한 성능 특성이며, 

시스템 성능 저하 원인이 Garbage Collection 이라는 주장이 전적으로 옳지만은 않는 결론에 도달하게 된다. 



- 똑똑한 프로그래머는 항상 2배수로(4, 8, 16...) 메모리 블록을 할당하는 방법으로

잠재적인 혼란을 최소화 한다. 이렇게 말하면 상당히 큰 공간을 낭비하는 듯이 보일 지는 몰라도

항상 50% 이하로 기억공간을 소비한다는 사실을 확인할 수 있다고 한다.

=> 솔직히 이부분은 이해가 잘 안 된다ㅡㅡ........orz



- JAVA 에서 얼핏 알고 있었던 이야기지만...

String 클래스와 String Builder 클래스의 차이점을 따져 2가지 중에서 무엇을 사용할 지

생각해야 할 필요가 있다. 차이점은 스스로 찾아보자. 나도 어쩌다 누군가의 블로그에서

차이점을 알게 됐는데, 꽤 중요한 내용이라고 생각했지만 따로 정리를 안 했다. 차후 포스팅 하겠다.




3장. 조엘 테스트 : 더 나은 코드를 위한 12단계


1. 소스코드 관리 시스템을 사용하고 있습니까?

2. 한 번에 빌드를 만들어 낼 수 있습니까?

3. 일일 빌드를 하고 있습니까?

4. 버그 추적시스템을 운영하고 있습니까?

5. 코드를 새로 작성하기 전에 버그를 수정합니까?

6. 일정을 업데이트하고 있습니까?

7. 명세서를 작성하고 있습니까?

8. 조용한 작업 환경에서 일하고 있습니까?

9. 경제적인 범위 내에서 최고 성능의 도구를 사용하고 있습니까?

10. 테스터를 별도로 두고 있습니까?

11. 프로그래머 채용 인터뷰 때 코딩 테스트를 합니까?

12. 무작위 사용편의성 테스트를 수행하고 있습니까?


개당 1점씩, 10점 이하는 심각한 문제가 있다고 한다.

이 테스트에 대해서는 난 노코멘트 하겠다. 잘 모르겠다.




4장. 개발자가 꼭 알아두어야 할 유니코드와 문자 집합에 대한 고찰


ASCII 코드 : 32 ~ 127 사이의 숫자를 이용해 영문 표현이 가능. (32 는 공백(space))

7비트로 글자를 저장할 수 있다.


하지만 대다수의 컴퓨터가 8비트인 바이트 단위를 쓰기 때문에 ASCII 에서는 1비트가 남게된다.

즉, 128~255 사이에 위치한 코드를 마음대로 요리할 수 있다는 이야기이다.


그래서 이 사이에 어떤 값을 넣느냐에 대해서 많은 사람들이 동시에 동상이몽을 하게 된다.

IBM PC가 고안한 OEM 문자집합(유럽형 언어를 위한)를 시작으로 

온갖 OEM 문자 집합 형식이 생겨나면서 각 언어권 별로 용도에 맞게 128 글자를 정의했다.


예를 들어 A 나라에서는 resume 으로 보이는 글자가 B 나라에서는 rλsumλ 이런 식으로

보일 수 있다는 이야기이다.


이런 상황 속에 ANSI 표준 위원회에서는 ANSI 표준을 만들어 이 난투극를 끝냈다.

하지만 여전히 지역에 따라 128 이상 문자를 다루는 여러 방법이 존재했고 

이렇게 각기 다른 시스템을 '코드 페이지'라고 부른다.


그런데 여기서 생각해봐야할 건 아시아권 코드 페이지 이다. 

아시아 문자집합은 8비트로 표현하기에는 부족하다는 점이 사람을 골 때리게 한다.


그래서 DBCS(Doublc Bytes Character Set) 이라 하는 2바이트 문자 집합 시스템으로 해결하게 된다.

몇몇 글자는 1바이트로, 다른 글자는 2바이트에 저장하는 방식인데 짜증나는 부분이

문자열을 따라 쉽게 앞으로 나갈 수는 있어도 뒤로 돌아오기에는 무척 번거롭다는 점이다.


문자열에서 왔다갔다 하기 위해 s++, s-- 만으로는 안 된다는 점인데 그래서 윈도우에서는

AnsiNext, AnsiPrev 같은 함수를 쓰도록 독려했대나 뭐래나.



결국 8비트로는 안 되겠다 싶어 나온 게 사랑스러운 Unicode.

많은 사람들이 유니코드가 16 비트(2바이트)로 표현되기 때문에 

65536 개의 문자만을 사용할 수 있다고 생각한다는데(나도 그랬고), 

사실 이미 코드 숫자가 65536 를 넘었다고 한다.

모든 유니코드 글자는 실제로 2바이트로 압축할 수 조차 없다고 한다. (싱기방기ㅇㅅㅇ)


Unicode 는 실제로 글자를 다루는 일종의 철학이라고 한다. 각 글자에 존재하는 관념적인 철자마다

고유 번호를 붙여놓았고 'U+0645' 식으로 표현한다고 한다. (U+는 유니코드, 숫자는 16진)


저런 식으로 표현한 것을 '코드 포인트' 라고 한다.


여기서 머리 아프게 '인코딩' 이야기가 나온다.

예를 들어서 'Hello' 를 유니코드로 표현해보겠다.


U+0048    U+0065    U+006C    U+006C    U+006F


이 코드 포인트 숫자를 각각 2 바이트로 저장하면, (Big Endian)


00 48     00 65     00 6C     00 6C     00 6F


여기서 다른 표현법이 있다고 하면, (Little Endian)


48 00    65 00    6C 00    6C 00    00 6F


그지같게도(?) 글자 표현법이 Big Endian, Little Endian 으로 나뉘게 되어

유니코드 저장 방식이 2가지로 나뉘어 버리게 된다. 


따라서 이를 구분하기 위해 유니코드 문자열 시작 부분에 

FE FF 를 저장하는 관례가 생기게 된다. (UTF-16/Little Endian 의 경우)

이를 유니코드 바이트 순서 표시라고 부르며, 상위와 하위 바이트 순서를 바꿀 경우 FF FE로 보이게 된다.


아무튼 유니코드 인코딩 초기 방식이 이따구여서(?) 

미국 국적 프로그래머 사이에서 이야기가 상당히 많았던 것 같았다.

일반 영문 텍스트의 경우 U+00FF 상위에 존재하는 코드 포인트를 거의 사용하지 않기 때문이래나 뭐래나.

나는 아시아권이니 저 인간들이 느끼는 감정따위 이해할 수 있을리가.


하지만 이 때 'UTF-8' 이 등장하게 된다.

유니코드 코드 포인트를 따르는 문자열을 저장하기 위한 또 다른 시스템으로,

8 bit 인 1 바이트를 사용해 매직 U+넘버를 기억 공간에 저장한다.


0~127 사이에 존재하는 모든 코드 포인트를 단일 바이트로 저장하고,

128 이상인 코드 포인트만 2, 3 바이트에서 시작해 최대 6바이트까지 확장해서 저장한다.


이런 방식을 적용할 경우 모든 어떤 코드 포인트도 올바르게 저장할 수 있다는 특성을 얻게 된다.



조엘님이 이 장에서 가장 강조하는 것은

"일반 텍스트 라는 개념은 존재하지 않는다."

인코딩 방식을 모르는 문자열은 아무 의미가 없기때문에

메모리, 파일 또는 e-mail 내부에 문자열이 있으면 이 문자열 인코딩이 무엇인지 알아야만 하며, 

그렇지 않으면 그 문자열을 해석할 수 없어 사용자에게 올바르게 보여줄 수 없다는 것이다.



문자 집합에 대한 역사적인 관점으로 쭉 훑어 보았는데~~

평소에 이와 관련된 에피소드가 있다면..

DB에서 데이터 저장하다가 인코딩 때문에 빡쳤던 경험과 기타 웹 개발 경험,

최근에는 바이너리 파일 까보다가 Little Endian 표기법으로 약간의 삽질을 했던 경험 정도?


꽤나 심오한 세계인 것 같기도 하고 아무튼 어렵다 ㅡㅡ;; 

조엘님은 결코 어렵지 않다고 하지만 전 어렵네요 ㅇㅇ..orz


범상용화적인 소프트웨어를 개발하려는 분, 혹은 하시는 분들은 반드시 알아야 할 내용이 아닌가 싶다. 

물론 나도 이해하려고 이 장을 몇 번이나 뒤적거렸다. 언젠간 다시 찾아보게 될 내용이라 생각된다.


조금 찜찜한 게 있다면 내가 이렇게 막 장황하게 적었는데도

잘 이해가 안 되는 것 같다 ㅋㅋㅋㅋ 으앙 모르겠다




15장. 쏘면서 움직여라 


요즘 신입의 자세로 열심히 노력하면서도, ""잘"" 하는 사람으로 거듭나고자 

스스로를 궁지에 모는 행동을 많이 하는 것 같아 내심 스트레스가 많이 쌓여서 우울했었다.

(사실 지금도 약간 그런 상태지만)


그런데 이 장을 읽으면서 조금이나마 위안을 얻을 수 있었다.


첫 줄부터 '저는 가끔 일이 전혀 손에 잡히지 않을 때가 있습니다' 라고 적혀있다.

업무효율이 떨어지는 기간이 하루, 이틀.. 심하게는 몇 주를 허비하게 되는 때도 여러 번 있었다고 한다.


일에 몰입하기는 커녕 흐름을 타지 못 했고, 자신의 존재가 마치 사라져버린 것 같았다고.


그리고 자신이 실제로 하루에 생산성 높게 코딩을 하는 시간이 

고작 2~3시간에 불과하다는 사실이 무척 괴로웠다고 한다. 


즉, 하루동안 일에 몰입하기까지의 장벽은 너무나도 높다는 것이었다.

그 장벽만 넘으면 일에 몰입해 생산성을 높일 수 있는데.


그런데 너무 이런 압박감에 시달릴 필요가 없다는 것을 깨닫게 된 것이

군대에서 '적들을 향해 총을 쏴서 적의 머리를 숙이게 만들고, 그 시점에 적과의 거리를 점차 좁혀간다'라는

엄호 사격 전술을 알게 되었을 때부터 15년이 지난 후였다.


내가 움직이지 않으면 적군은 무슨 일이 벌어졌는지 눈치채게 되고,

내가 쏘지 않으면 적이 사격해 나를 꼼짝 못하게 만들 것이다.


그러니 매일 조금씩 움직여야만 한다고 한다.


코드가 ㅄ같고 아무도 원하지 않는다는 사실이 문제가 되는 것이 아니라는 것이다.

늘 조금씩 움직이면서 코드를 쓰고 버그를 지속적으로 잡아낸다면, 시간은 내 편이 된다는 것이다.


다음은 책에서 그대로 따왔다. 내가 요약해서 적을 수도 있겠지만,

담담하게 풀어 쓴 문체 자체까지 내게는 위안이 되었기 때문에 인용하겠다.


매일 조금씩 앞으로 나아가야 합니다. 이렇게 하다보면 조만간 당신이 이길 것입니다.

어제 하루동안 제가 한 일이라고는 FogBUGZ 에서 컬러 정책을 조금 개선한 사항뿐입니다.

이 정도면 충분합니다. 조금씩 발전해 나가는 겁니다.

날이 갈수록 우리 소프트웨어는 점점 더 좋아지며, 더 많은 고객을 확보할 수 있다는 점을 노릴 뿐입니다.

Oracle 정도로 큰 회사가 되고 난 다음에 거대한 전략을 생각해도 늦지 않습니다.

매일 아침 출근해서 에디터를 여는 것만으로도 충분합니다.




16장. 장인정신 


요약하면, 장인정신이 필요한 경우가 있는 건 이해하지만

모든 소프트웨어 개발에 항상 장인정신을 투자할 필요는 없다고 충고하는 장이다.


나의 경우는 완벽주의자에 가깝기 때문에 이것저것 사소한 것에도 까다롭게 구는 경우가 많다.


하지만 조엘님은 나같은 사람에게 날카롭게 지적하듯이 

'1%의 결함을 고치기 위해 500% 달하는 노력이 필요할 수 있다

그럼에도 불구하고 추가 비용을 감당할 정도로 충분한, 고칠 가치가 있는 결함인가?' 라고 해주셨다.


일반 소비자를 위한 상용 소프트웨어, 또는 상품 소프트웨어를 개발하는 방법만이

장인정신에 투자할 수 있는 유일한 길이라고 한다. => 장기간에 걸쳐 경쟁우위를 제공하는 핵심 요인이 될테니까.

(사내용 인사 관리 프로그램 같은 경우, 이런 장인정신을 뒷받침할 수준까지 이르지 못한다)


왠지 예전에 내가 인턴 생활을 할 때 사내용 프로그램 개발에

투철한 장인정신을 발휘했던 내 모습을 떠올리게 된다. 으으.




< 2부 > 개발자 다루기



20장. 인터뷰를 위한 게릴라 가이드


- 조엘님이 말한 채용 프로세스 : 


1) 이력서

i. 실수가 많은 이력서 버린다 (ex. Windows를 Window로 썼다든가) : 꼼꼼한 사람을 뽑기 위해

ii. 과거에 특별히 어려운 선별 과정을 거친 경험이 있는지 (ex. 입학 기준이 높은 대학, 깐깐하게 사람 뽑는 회사)


2) 전화 인터뷰 :

i.  프로그래밍 문제 하나로 한 30분 정도 이야기를 나눔 (ex. XML Parser 를 어떻게 짜실 건가요?)


3) 대면 인터뷰 :

i. 면접관은 적어도 6명은 되야 하고, 최소 5명은 동료 프로그래머로 채운다.

   이 중에서 2명 이상의 면접관이 지원자가 별로라고 하면 고용을 안 하는 게 낫다고 한다.

ii. 지원자를 동시에 인터뷰 하지 않고, 각 인터뷰는 화이트보드가 있는 방에서 1:1 로 진행한다.



- 조엘님이 생각하는 좋은 지원자

i. 똑똑하다.

- 잡다한 지식을 많이 알아야 한다는 것이 아님

(ex. 오라클 8i에서 varchar와 varchar2 의 차이 => 인터넷에서 15초면 찾을 수 있는 내용)

ii. 업무를 성실하게 완수한다.


사람을 파악할 수 있는 방법은 말할 기회를 주는 것이기 때문에

개방형 질문이나 문제를 던져야 한다고 한다. 그러면 어떤 질문을 해야하는지 다음을 살펴보자.

(※ 참고로 조엘님은 면접 전에 지원자에 대한 선입견을 품지 않으려고 극도로 조심한다고 한다. ex. 학벌)



- 해야할 질문 :


1. 첫 인사 

지원자를 편하게 해주려는 목적으로, 여기서 첫인사는 지원자가 하는 인사라기 보다는

면접관이 지원자에게 하는 인사이다. (ex, 오는 길이 어땠는지, 면접관 소개, 인터뷰 진행 방식 등)


2. 최근 프로젝트 경력에 대한 질문

- 개방형 질문의 예시 :

ex. 지난 학기에 들은 수업 중 가장 좋아했던 수업은 무엇이죠? 전산 과목이 아니어도 좋습니다.

ex. 전 직장에서 했던 최근 프로젝트는 어떤 프로젝트 였나요?


- 개방형 질문을 던져놓고 초점을 맞춰야 할 자질 3가지 :

i. 열정

똑똑한 사람은 자신이 수행한 프로젝트에 대해서 열정적으로 말하게 됨

(이야기를 하면서 흥분하게 되고 말이 빨라지고 손짓이 따르게 됨),

반면 인터뷰 내내 무덤덤한 사람은 별로.

ii. 상대 수준에 맞게 설명 :

다른 사람에게 자기 아이디어를 납득 시키기 위해서는 어떤 태도를 취해야 되는지 아는 사람인가.

iii. 팀 프로젝트 였다면 리더십을 발휘했을 것 같은지


3. 답변 불가능한 질문

- 한때 구글에서 나왔었다는 면접 문제들...(짜증) :

ex. LA에는 주유소가 몇 개나 있을까요? 워싱턴 기념탑 무게는 몇 톤일까요? 등등


- 문제 해결 능력 + 창의력 이 있는 사람인지 :

지원자가 당황해 하면 힌트를 던져주되, 계속 멍청하게 앉아 있는 경우

이 사람은 구조의 손길만을 기다리는 사람으로 문제 해결 능력이 부족하다고 판단.


4. 프로그래밍 문제

- 종이 주고 손코딩 : 코드가 10줄 넘는 문제는 피하자. 

제들을 보면 실제 N사가 이걸 보고 베낀 듯한 면접 질문들 몇개 있음...


i. 원래 저장위치에서 문자열을 역순으로 변환하기

: 함수 성능이 어떤지, strlen 함수를 몇 번 호출했는지 판단, O(n) 이면 충분함에도 불구하고 

루프 안에서 strlen 을 계속 호출하는 바람에 O(n²) 인 strrev() 를 본적도 있다고.


ii. Linked List 를 역순으로 만들기

: 똑똑한 지원자라면 바로 코드를 안 짜고 구현 전에 계획을 짤 것이다.

아마 옆 귀퉁이에 네모와 네모를 연결한 화살표를 그리기 시작할 것임.


iii. 한 바이트에서 1인 비트 세기

: C 비트 연산을 아는지 확인하려는 의도가 아님,

똑똑한 지원자는 1번만 만들면 되는 참조표를 이용할 것임(많아야 256 개니까)

또는 처음에만 bit 를 세서 참조표에 저장하는 캐쉬 사용을 제안 등등...

목적은 코드를 다듬고, 최적화하고, 개선할 방법을 찾아내는 능력이 있는지 보기 위함.


iv. 이진 검색

v. 문자열에서 '연속적으로 문자가 반복되는 길이(run-length)'가 가장 긴 부문문자열 찾기

vi. atoi

vii. itoa (스택이나 strrev 를 써야하기 때문에 좋은 문제)



좋은 프로그래머라는 증거 몇 가지 :

i. 간단한 규칙이라도 변수 명명법을 사용.

ii. C에서 상수는 "==" 왼쪽에 두는 버릇.

(ex. if (x == 0) 이 아니라 if (0 == x) 라고 쓴다든가)

iii. while 루프에서 변하지 않는 값이 무엇인지를 본능적으로 안다.

(ex. while (index <= length) 가 아니라 while (index < length)

iv. C++에서는 가상 소멸자를 사용한다.



5. 자신의 코드에 만족하는가?

- 4.에서 작성한 코드에 만족하는지 물어본다

- 손코딩이다 보니 실수는 하기 마련, 하지만 실수를 찾아낼수 있어야 한다는 게 포인트.

ex. 문자열 함수에서 NULL 종결자, 세미콜론, 길이가 0인 문자열이 들어오면 안 돌아가거나, 

malloc이 실패하면 GPF가 발생. (General Protection Fault 의 약자, 

프로세서의 메모리 보호 하드웨어가 잘못된 주소 접근을 잡아낼 경우 발생한다)


6. 질문이 있는가?

- 우수한 지원자는 직장을 선택할 수 있기 때문에 면접관은 일방적으로 인터뷰를 하는 입장만은 

   아니라는 사실을 명심해라. 인터뷰는 상대방도 여기가 일할 만한 곳인지 파악하는 시간이다.

   (가끔 면접관들 중에 상당히 거드름 피우는 ㅄ 같은 놈들도 많다, 회사에 대한 이미지를 다 깎아먹음)


- 일부 면접관은 총명한 질문을 하는지 판단하려고 들지만 조엘님의 경우, 

이 시점에서 어떤 질문을 하든 이미 결정을 내렸기 때문에 개의치 않는다고 한다.


하지만 꽤 흥미롭거나 인상깊은 질문으로 었다는 이야기도 많이 들어봤다.




26장. 허술한 추상화의 법칙


모든 쓸 만한 추상화에는 어딘가에 구멍이 존재합니다.


-> 차후 이 책을 다시 읽을 때, 이 부분을 자세히 읽고 분명히 이해해야 할 필요가 있다고 느낌.

지금의 나로서는 사실 이해가 잘 안 되서 ㅠ_ㅠ 중요 문구만 남기겠다.




< 3부 > 조엘 따라하기



31장. 말단이면서도 해내기


- 전략 1 : 혼자라도 하십시오

일일 빌드 서버가 없다면? 만들면 된다. 밤마다 일일 빌드를 돌리고, 다른 팀원에게 이메일을 보내라.

빌드 단계가 너무 복잡하다? makefile 을 써라.

사용편의성 테스트를 아무도 안 한다? 종이나 VB 프로토타입을 사무직 친구에게 보여주면서 직접 테스트 해라.


- 전략 2 : 입소문의 힘을 이용하십시오

전략 1과 비슷한 내용이라 생략.


- 전략 3 : 우수한 인재를 모으십시오

이 내용이 왜 이 장에 포함되어 있는지 잘 모르겠다. 말단이라면서

우수한 인재를 팀으로 끌어들이라면서 채용과 인터뷰 업무에 참여하라고 한다.

말단이 그게 가능한 건가? 아니면 조엘님이 말하는 '말단'이 내가 생각하는 '말단'이랑은 다른 건가?


- 전략 4 : 고문관은 봉쇄해야 합니다

고문관이란 질 낮은 코드로 다른 질 좋은 코드까지 더럽히는 사람을 일컫는 말이다.

이 사람의 코드를 보면 마음 같아서는 전부 버리고 새로 다시 짜고 싶겠지만 참아야 한다!!


그냥 내버려 두고 코드에서 생기는 버그를 계속 보고 한다.

그러면 고문관은 보고할 버그가 없어질 때까지 그 작업에 매달리게 될 것이다.

다시 말해 다른 코드를 해치지 않을 것이다. (진짜 그런지는 솔직히 조금 의문이다)


- 전략 5 : 방해 받지 않는 곳으로!

와.............. 대박 공감이다. 

내가 예민한데다 약간 산만해서 그런지 일할 때 만큼은 조용한 환경에서 일하는 걸 좋아한다.

나 같은 말단이 자리를 지키지 않는다는 건 눈치보이기 쉽상이지만...

노트북 들고 조용한 곳에서 생산성 있게만 작업할 수 있다면 어디든 좋을 것 같다 OTL


- 전략 6 : 꼭 필요한 인물이 되십시오

조엘님의 경우, 옛날에 말단 프로그래머로 어떤 회사에서 일할 때 회사가 조엘 테스트 2점이었다고 한다.

그래서 업무 환경을 고쳐야 되겠다고 작정을 했다고 한다. (헉...)


하지만 같이 일 하는 사람들에게 좋은 인상을 심어주는 일이 무엇보다 중요하다는 점도

알고 있었기에 매일 하루 7시간은 무조건 코드를 짰다고 한다. 

(무수한 체크인 만큼 다른 팀원에게 좋은 인상을 주는 방법은 없기 때문!!

-> 내가 전에 인턴했을 때는 일을 엄청 하면서도 체크인을 잘 안해서 ㅄ 될 뻔한 적도 있음)


하지만 매일 퇴근 전 1시간은 업무 환경 개선에 힘을 쏟았다고 한다.

이 시간 동안 일일 빌드, 버그 DB 설치, 명세서 작성, 업무와 관련된 문서 작성 등등.

그렇게 노력하니까 조금씩 나아졌다고 한다.


실제로 이게 가능한가....? 싶기도 하지만.. 만약에 어떤 말단이 이런 짓(?)을 한다면

이 사람은 꼭 필요한 사람이라고 느낄 거라고 확신한다. 생각이 있는 관리자라면.



조엘님은 책임자가 아니라도 변환를 일으킬 수 있다고 해주시면서

그렇지 못하면 적을 만들게 된다고 한다.


내게 있어서 전략 1, 5, 6 만큼은 뭔가 와닿는 것이 있었다. 특히 1, 6.





그 외 4부, 5부도 있지만 내가 다룰 만한 내용은 없는 것 같으니 생략하겠다.


이번 책은 다른 책에 비해 조금 두꺼웠다. 한 500 페이지 가까이 되니... ㅠ_ㅠ

아직 독서 습관이 안 잡힌 나로서는 솔직히 부담스러웠다. 그래서 읽는 것조차 힘들었고.


당분간 개발자를 위한 서적은 쉴 생각. 너무 개발자 서적만 읽었더니 오히려 스트레스 받는 것 같다.

독서 습관 들이려다 지치고 싶지는 않으니 다른 책들도 읽어 봐야 겠다.


원래 이 책 읽고나서 More Joel on software 도 읽으려고 했는데... 좀 쉬었다가 읽어야겠다.


확실히 배울 점이 많은 책이었다는 건 분명하지만 왠지 지쳐버렸다 ㅠ_ㅠ.. (리뷰를 써서 그런가?)

아무튼 휴식이 필요해


by kelicia 2014. 10. 12. 18:31


언리얼 엔진 4 문서에서 '데이터 주도형 게임 플레이 요소' 라는 글을 읽고

따라해보다가 설명된 것 치고는 은근히 어물쩡(?) 설명되있어서 

사람을 몇 시간씩 구글링하게 만들게 한다ㅡㅡ+...


열받아서 나처럼 헤매는 이가 없도록 포스팅을 하게 됐다.



그래서 오늘 할 것은 

".csv 파일의 데이터를 언리얼 엔진4 에서 사용할 수 있도록 DataTable 오브젝트를 생성하는 가이드 라인" 을 

작성해 보겠다. 

+ 팁으로 일부 버그에 대한 핸들링도 언급하겠다.


다소 영문 문서를 그대로 번역한 느낌의 말투가 있더라도 양해를(__)

제가 직접 해본 것을 기반으로 포스팅한 거라 "반드시 이렇다!" 라는 건 아닙니다!




언리얼 엔진4에서 사용되는 DataTable 의 유형은 크게 2 가지이다.


1) Data Table

어떤 데이터 타입이든 자유롭게 정의할 수 있다. 

ex ) int, string, TAssetPtr<UTexture>, 기타 등등.


2) Curve Table

부동소수점 실수 타입의 데이터만 정의할 수 있고 곡선 상의 보간에 특화된 테이블이다.


- Curve 는 게임 내의 밸런스나 기술/능력에 대한 특성 조절에 유용하게 사용될 수 있다고 한다.

예를 들어 게임 난이도 설정에 따라 HP 가 달라지는 몬스터가 있는 경우

100 ~ 10,000 범위의 HP Curve 를 선형이든 큐브형이든 어떤 방식으로 정의한 후에,

어려움의 난이도 에서 몬스터의 HP 값을 그 Curve 의 최소 / 최대 값 의 75% 정도에서

따오면 된다.

(Curve Table 의 경우, 자세한 내용을 다루는 것은 못봐서 이 정도로만 언급하겠다)




그러면 아까 위에서 말한 가이드 라인으로 돌아와서

크게 5가지 스텝으로 나누어 설명하도록 하겠다.


1. .csv 파일 생성

2. FTableRowBase 를 상속받는 구조체를 생성

3. 코드 빌드 후 언리얼 엔진 재실행

4. 컨텐츠 브라우저에 .csv 파일을 드래그앤드롭 하면 DataTable 오브젝트 생성

5. 블루 프린트나 코드에서 4. 의 오브젝트를 이용해 데이터에 접근 가능




1. 언리얼 엔진에 import 할 .csv 파일을 생성한다.


다음과 같이 엑셀에서 데이터를 만든 후, 저장할 때 .csv 파일을 생성해도 된다.

A1 은 비워두라고 되어있지만 굳이 쓰고 싶다면 써도 큰 문제는 없다.


왜냐하면 첫 번째 컬럼 값들은 Row ID 를 나타냄으로서 

데이터 테이블에서 Row 를 구분하기 위해 반드시 있어야 하는 기본적인 아이라 

언리얼 엔진4에서 이 파일을 import 할 때, 첫 번째 컬럼은 건너뛰어 버리기 때문이다.

(관련 링크 : CreateTableFromCSVString

https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/UDataTable/CreateTableFromCSVString/index.html )


내가 만든 샘플 데이터(.csv)들은 다음과 같이 생겼다.




2. FTableRowBase 를 상속받는 구조체를 생성한다.



언리얼 엔진에서 프로젝트를 열고, 코드를 추가해준다. 

이 때 주의해야 할 점은 None 이 아니라 언리얼 엔진에서 제공하는 클래스를 반드시 상속받도록 하자.

안 그러면 차후 빌드할 때 꽤나 골치 아파진다.. 그냥 Dummy 클래스 하나 만든다고 생각하자.


저 같은 경우에는 'Show All Classes' 에 체크하고 Engine 클래스를 상속 받았습니다.

별 뜻 없습니다. 단지 None 으로 하고 구조체만 달랑 정의했다가 -매우 - 피봤기 때문에ㅠ_ㅠ

누군가가 "이렇게 하니까 되던데요" 라고 하는 코드를 보고 저 클래스를 상속 받았을 뿐.


Engine 클래스가 아니더라도 Actor 를 받아도 되고 상관 없습니다.

구조체 정의하기 전에 언리얼 엔진의 클래스를 반드시 상속 받는 Dummy 클래스를 만드는 게 포인트.



저 같은 경우 빈 프로젝트에서 데이터 테이블을 생성하고 있었는데,

찾아보니 이 문제(?)를 해결 하기 위해서는 프로젝트에 반드시 언리얼 엔진에서 

상속받은 클래스가 적어도 1개 이상 있어야 한다고 한다.

(관련 링크 : https://answers.unrealengine.com/questions/71182/can-not-derivate-from-struct-ftablerowbase.html )



클래스를 만들었으면 구조체를 정의하는데 그 안에

1.에서 만든 데이터 필드들의 이름과 동일하게 변수들을 작성해주면 된다.


내가 만든 데이터들을 기반으로 구조체를 작성해 본 결과는 다음과 같다.

언리얼 엔진에서 Engine 클래스를 상속받은 MyDataAsset 이라는 클래스를 생성했고,

아래 코드는 MyDataAsset.h 에 작성하였다. LevelUpdata 라는 구조체를 만들었다.



아까 위에서 보여준 .csv 파일에서 첫번째 셀의 값에 Name 이라는 값을 넣어주었지만

코드에서는 적어주지 않았다. 적어도 되고 안 적어도 되는 듯 싶지만...


언리얼 엔진4 문서에서는 생략하길래 그냥 나도 생략해버렸다. 귀찮아서.


여기서 포인트는 구조체가 FTableRowBase 를 상속받았다는 점.

아, 참고로 언리얼 엔진 구조체 내에는 함수를 정의할 수 없다고 한다. 

(상당히 내겐 충격적이었음_-_ .......... 구조체 내에 함수 정의를 못 해서

밑에 다룰 버그 관련 내용에서 살짝 귀찮게 됨)



코드 따라서 입력하기 귀찮으신 분들은 포스팅 맨 아래 참고 링크들

따라가셔서 ctrl + c,v 하시면 됩니다~




3. 빌드를 하고 언리얼 엔진을 재실행 시킨다.


주의해야 할 점은 빌드 하기 전에는 반드시 언리얼 엔진을 종료시켜야 한다.

안 그러면 LNK 에러를 미친 듯이 뿜어낼 수 있다. (정확한 이유는 잘 모르겠음)


엔진 종료 -> 빌드 -> 엔진 재실행


순서로 가자.




4. 엔진의 컨텐츠 브라우저에서 1. 에서 만든 .csv 파일을 드래그앤드롭 한다.



이 때, 다음과 같은 다이얼로그 박스가 하나 나올 것이다.



3. 에서 정의한 구조체인 LevelUpData 가 보일 것이다.

만약 2.에서 언리얼 엔진으로부터 상속 받은 클래스가 없다면 저 망할 Row Type 에 

내가 정의한 구조체가 뜨지 않는, 짜증나는 현상의 연속을 보게 될 것이다. -> 이것때문에 삽질 겁나 함.



아무튼 여기까지 Import 과정을 모두 마쳤으면 위의 스샷처럼 콘텐츠 브라우저에

'DataTable' 이라는 초록색 오브젝트가 생긴 것을 볼 수 있다 :-)


오브젝트를 더블 클릭하면,


요렇게 이쁘게 나오는 것을 볼 수 있다.


참고로 중간에 .csv 파일의 데이터가 수정되었다면 

엔진 쪽에서 만든 오브젝트를 우클릭 -> Reimport 하면 변경된 데이터를 볼 수 있다.



그런데 ! 주의해야할 점을 알려준다면 

위와 같이 어떤 파일의 상대주소를 데이터로 넣었을 때, 제대로 안 뜨는 경우가 있다.


나의 경우 어떤 삽질을 했냐면...


엑셀 파일에서 "Texture2d'/Game/Textures/AchievementIcon2'" 라고 입력을 한 뒤에

.csv 파일로 변환해서 그 파일을 열어보면 어처구니 없게도 ㅡ_ㅡ

양쪽에 큰 따옴표가 2개씩 더 붙어서 나오는 현상이 있었다.

이렇게. -> """Texture2d'/Game/Textures/AchievementIcon2'"""


저런 경우에는 언리얼 엔진에서 import 한 데이터가 None 으로 뜨게 되버린다.


또는 큰 따옴표를 빼먹고 Texture2d'/Game/Textures/AchievementIcon2' 라는 데이터가

.csv 파일에 저장되어있을 때, import 하면 데이터가

Texture2d' 까지 밖에 안 보이는 현상이 있었다.


위 스샷 처럼 정확한 주소를 보이게 하려면 .csv 파일을 열어봤을 때, 데이터가

"Texture2d'/Game/Textures/AchievementIcon2'" 와 같이 정확히 한쌍의 큰 따옴표만 감싸고 있어야 한다는 점.


그러니 엑셀에서 큰 따옴표를 사용해 데이터를 저장할 때는 주의하자 ! !



참고로 아래는 언리얼 엔진 문서에서 발췌한 내용이다.

The double quotes around the asset type are important for the property importing pipeline. Without them, the text is imported as Texture2d'.





5. 블루프린트나 코드 상에서 4.에서 생성한 오브젝트에 접근해보자.


여기서 중요한 건, 블루프린트에서 데이터에 접근할 때 짜증나는 버그가 존재한다.

차후 엔진 측에서 고쳐줄 지는 모르겠지만 지금 언리얼 엔진 4.4 버전 상에서는 아직도 존재한다.


1) 블루프린트에서 DataTable 오브젝트에 접근 하기


무슨 버그가 있는지 일단 살펴보겠다.

아래에 보면 개발자가 정의한 데이터 테이블에 있는 데이터에 접근하기 위해 

"Get Data Table Row (DataTable Object 이름)" 라는 노드가 존재한다.

이게 문제다.



빨간색으로 'X' 표시 되어있는 부분이 문제의 버그다.

막상 블루프린트 작성할 때는 멀쩡히 잘 연결되다가 언리얼 엔진을 종료하고

다시 이 프로젝트를 열면 저기 표시되어 있는 링크 부분이 사라지게 되는 버그가 발생한다.

그래서 데이터에 접근이 안 되서 컴파일 할 수 없다고 난리다. 


(데이터 테이블의 초기화 문제였나? 암튼 그런 쪽으로 뭔가 버그가 있는 듯 했다.

구글링했을 때 영문으로 뭐라고 나와있었는데 이해할 수 없었다. 아시는 분은 방명록에 남겨주시면 ㄳㄳ (__)

자세한 링크는

https://answers.unrealengine.com/questions/67457/get-data-table-row-bug.html )


결국, 문제의 'Get Data Table Row' 노드를 사용할 수 없다.

그러니 우회하는 방법으로 데이터에 접근하자. 꽤 간단하게 해결되는 문제다.



여기서부터 내가 구글링의 도움을 받아 실험한 결과를 토대로 작성한 가이드 라인이다.

정답은 아니고 '이런 식으로 해결 할 수 있다고 하네요' 정도로만 읽어주시면 감사하겠습니다 :-)



① 언리얼 엔진에서 코드를 추가한다.

내 경우에는 Actor 를 부모 클래스로 상속받아 'DummyActor' 클래스를 생성했다.



② DummyActor.h 에 다음과 같이 작성해준다.



사실 나는 아까 선언했던 LevelUpData 구조체 안에 getTableRow() 함수를 넣으려고 했지만 

위에서 이미 언급했듯이 구조체 안에 함수 선언을 할 수가 없다...ㄱ-....아놔..


그래서 따로 울며 겨자먹기로 새로 클래스를 만들어 위와 같이 코드를 작성해주었다.



③ DummyActor.cpp 에 다음과 같이 작성해준다.



빨간색 네모 박스에 있는 코드가 핵심이다.



④ 언리얼 엔진을 종료하고 빌드한 후, 엔진을 재실행하자.



⑤ 내 경우에는 게임이 Play 될 때 좌측 상단에 데이터를 출력하는 걸 테스트하고 싶었다.

그래서 잘은 모르지만(?) : 참고로 필자는 언리얼 엔진4 써 본지 얼마 안 된 조금 멍청한 초보다.

GameMode 를 상속받아 블루프린트를 생성하였다.



⑥ 블루프린트에서 DataTable Row Handler 타입의 변수를 하나 생성해 

Default value 에서는 4.에서 생성한 Data Table 오브젝트에 연결 할 수 있다.

Row Name 은 데이터 테이블에서 행을 구분해주는 첫번째 컬럼을 말한다. 가져오길 원하는 RowID 값을 선택하면 된다.


아까 정의한 getTableRow 함수를 가져와야 하니 DummyActor 변수도 생성해주자.



⑦ 다음과 같이 데이터에 접근할 수 있다.

원하는 데이터에 접근해 마음대로 지지고 볶고 하시면 됩니다. 잘 안 보이시면 이미지 클릭.





여기까지 블루프린트에서 DataTable 에 있는 데이터에 접근하는 방법이었습니다.


코드 부분은 제가 따로 테스트를 하려고 시도했지만...

언리얼 엔진4의 최소 메모리 스펙이 8GB 인데... 제 컴이 그 절반 밖에 안되는 녀석이라

여기까지 도달하는 데도 수많은 시간이 걸렸습니다 흑흑 ㅠ_ㅠ


그래서 코드로 데이터 접근하는 부분인 제가 직접 해보지는 못 했구요,

관련 자료 링크만 정리 해서 남겨봅니다.




* 엑셀 데이터로 게임 플레이 구동시키기(한글) :

https://www.unrealengine.com/ko/blog/driving-gameplay-with-data-from-excel


* 데이터 주도형 게임플레이 요소(한글, 영문은 주소에서 KOR 를 INT 로 바꿔주세요) :

https://docs.unrealengine.com/latest/KOR/Gameplay/DataDriven/index.html


2개 링크 모두 비슷한 설명 수준이구요, 자세한 설명은 아닙니다.

그냥 '이러한 흐름을 거치면 .csv 파일이 import  됩니다. 하하:D' 정도?


* 제가 방금 언급했던 미처 확인하지 못한 코드에 대한 자료는 언리얼 엔진4 위키에 있습니다. 아래 링크 참조.

https://wiki.unrealengine.com/Using_excel_to_store_gameplay_data_-_DataTables



되는 것만으로도 감지덕지한 기분으로 하다보니 미처 '이 부분은 왜 이렇게 되는거임?' 이라는 궁금증이

있었음에도 불구하고, 일단 되게끔 만드는 데 집중하다보니 부족한 부분이 많이 있습니다 ㅠ_ㅠ


혹시 지적해주실 내용이 있으시다면 조금 귀찮으시더라도

방명록에 꼭 남겨주세요. 수정해야할 부분은 수정하도록 하겠습니다 :-)



'Programming' 카테고리의 다른 글

유니티로 개발할 때 많이 쓰이는 .gitignore  (0) 2017.08.07
[C]printf()에서 "%ul"와 "%lu"의 차이?  (0) 2015.07.05
자료구조 : Linked List  (0) 2014.04.25
Delegate (대리자)  (1) 2013.12.20
[Python, C#]Lambda Form  (0) 2013.12.19
by kelicia 2014. 9. 22. 14:39
| 1 2 3 4 5 6 7 ··· 18 |