근황

###

공돌이의 본분을 찾아서 여기서 리서치를 시작했습니다. 제 관심 분야인 프로그래밍 언어 쪽 교수들과 접촉해서 메릴랜드 & 하버드 & AT&T에서 공동으로 하고 있는 리서치 컴파일러에 제가 생각하고 있는 기능들을 더해보는 중입니다.

###

구글이 회서 설명회 및 리쿠르팅을 와서 참석했습니다. 닷컴 버블 이후로 IT 경기를 이끌어 온 구글이고 최근 다양한 프로젝트와 제품으로 승부수를 건데다가 썬 마이크로시스템과 협력 의사도 밝힌 만큼 매우 활발하게 사람도 뽑고 있습니다. 구글 회사 이미지도 상당히 긍정적인 것 같습니다. 여기 엔지니어링 스쿨 사람들이 가장 선호하는 직장이 아닌가 싶습니다.

구글의 조직은 다른 회사에 비해서 특이한 면이 있는데, 3-5명 정도의 매우 조그만한 팀으로 이루어져 있습니다. 대신 횡으로 팀끼리 상호 협력하는 시스템이죠. 다른 회사의 개발팀이 수 십명 이상의 인력으로 수직적인 매니저-프로그래머 관계가 있는데 비해서 구글은 훨씬 평평한 구조입니다.

구글은 사업 영역이나 아이디어 발굴을 가장 하부 조직인 엔지니어들 사이의 아이디어를 적극 활용하는 분위기입니다. 구글랩이라는 홈페이지 가보면 구글 내부의 리서치 프로젝트들을 볼 수 있는데 이들이 다 팀별로 아이디어를 제시하고, 상호 평가 받은 후 밀어줄 프로젝트를 밀어주는 방식으로 하고 있습니다.

가장 매력적인 조건은 일부 소프트웨어 대기업이 연구소에나 적용하는 20% 룰을 회사 전체에 적용한다는 것입니다. 업무 시간의 20%는 회사일과 상관 없이 자기 연구에 사용할 수 있도록 배려해 주겠다는거죠. 이게 일주일 5일이면 하루, 일년으로 치면 3달에 육박하는 시간이기 때문에 여기서 참신한 아이디어가 많니 나온다고 볼 수 있습니다.

구글의 강점은 단순히 “검색”이 아니고 그 검색을 하기 위해 쌓아 놓은 인프라에 있습니다. 검색을 하기 위해서의 세계 각지에 데이터 센터를 구축하고 컴퓨터 클러스터를 가지고 있기 때문에 그 어느 회사보다도 많은 컴퓨팅 파워를 가지게 됩니다. 또한 서치 엔진이 부지런히 모아놓은 데이터의 양보다 그 어느 회사보다 많지요.

지난 수십 년간 크게 발전이 없었던 인공지능(AI)의 여러 분야들이 이런 인프라에 힘입어 조금씩 빛을 보는 분위기입니다. 예를 들어 구글 툴바를 통해 제공되고 있는 언어 번역 서비스도, 구글의 컴퓨팅 파워와 데이터가 증가할 수록 같은 알고리즘으로 더 높은 번역률을 보이고 있다는 거죠.

이래저래 비전이 있는 회사인 것 같습니다.

###

여기 소프트챗(softchat)이라는 프로그래밍 연구 모임에 가입했습니다. 동아리 같은 성격이지만 구성원은 대부분 교수와 박사 4-5년차로 이루어져 있더군요. 일주일에 한 번 정도 자기 리서치 영역 세미나 하고 의견을 나눕니다. 학내에서 진행되는 소프트웨어 프로젝트를 교류하기도 하고요.

이 모임은 외부 연구자와 학자들을 많이 초청하는데, 벌써 MS리서치, 스탠포드 등 여러 사람들이 다녀갔습니다. 주로 제 관심 분야의 연구를 들을 기회가 있었는데 생각보다 매우 즐겁습니다. 사람이 사는 방식, 즉 미래를 바꿀 수 있다는 과학자/엔지니어로써는 최고의 비전을 제시하는 것 같습니다.

Google: A Behind-the-Scenes Look을 보고

컴퓨터공학과를 전공한 사람이면 내 전공으로 세상에 어떤 기여를 할 수 있을까 고민하게 된다. 전공과 아무 상관 없는 직장을 얻어서 누구나 할 수 있는 일을 하면서 적당한 월급을 받고 이에 만족하며 살겠다면 아무런 문제가 없겠지만, 내가 배운 전공으로 세상에 도움을 주는 획기적인 일을 할 수 있다면 이보다 더 행복한 일은 없을 것이다.

포항공대는 학교의 특성상 학부 과정 도중에도 자연스럽게 “연구”에 익숙해 진다. 학부 과정 중에도 연구 참여나 과제 연구를 통해서 끊임없이 지금까지 배운 전공의 기초 지식을 바탕으로 기존에 풀지 못했던 문제 혹은 새로운 영역의 문제를 푸는 연습을 하게 된다. 이런 과정에서 공부, 즉 연구에 흥미가 생기고 자연스럽게 진학을 결심하게 되는 것 같다.

그러나 나이를 먹다 보면 조금 더 현실적인 문제에 부딪히게 되는데, 그런 연구를 즐겁게 하면서도 소위 돈과 명예로 대변되는 현실적인 성공도 할 수 있는 방법이 없을까라는 것이다. 연구하는 사람이 돈을 알면 안 된다는 말은 불행히도 공학을 연구하는 사람에게는 적합하지 않는듯하다. 공학 자체가 현실의 문제를 풀기 위해 출발하였고 돈이 안 되는 연구란 결국 세상에 쓰이지 않는 기술일 가능성이 크기 때문이다.

일반적으로 전산을 전공한 엔지니어가 세상에 나가면 80%은 자신의 새로운 아이디어를 전혀 실험해 보지 못한 체 기존의 제품을 유지보수 하는데 모든 시간을 쓰게 된다고 한다. 이미 완전한 산업을 이룬 운영체제(OS), 데이터베이스 시스템(DBMS) 등은 물론이고 이른바 바닥부터 새로운 제품을 만들어 볼 기회를 갖는다 것 자체가 쉬운 일이 아니다.

대학, 대학원에서 아무리 뛰어난 실력을 갖추었다 하더라도 대부분 남의 소스 코드를 수정하고 고치는 데 시간을 보내며 전체 제품이 어떤 구조로 이루어졌는지 조차 알 수 없는 게 현실이라면 엔지니어의 현실은 너무 서글프다.

구글은 엔지니어 입장에서 가장 이상적인 성공 스토리다. 젊은 대학원생 두 명이 자신의 분야를 열심히 연구했고 이 연구의 성과를 바탕으로 회사를 설립했고 그 회사가 전세계를 변화시키며 엄청난 부를 창출했다. 그들은 자신이 하고 싶은 연구를 마음껏 할 수 있는 기반을 마련했고, 검색이란 키워드 하에 구글은 새로운 서비스를 계속해서 창조해 내고 있다.

구글은 기술 자체도 새롭고 재미있지만, 구글 성공의 의의를 엔지니어의 입장에서 찾는다면 기존의 전산학을 각종 지식을 응용해서 완전히 새로운 도메인(domain)의 문제를 풀고 이를 실험할 수 있는 거대한 베이스를 제공했다는 점이다. 80-90년대 거대 소프트웨어 회사의 출현 이후로 IT 산업은 어느 정도 성숙기에 들어섰다고는 하지만, 비슷한 지식을 바탕으로 완전히 새로운 영역에서 기술적으로도 상업적으로도 크게 성공할 수 있음을 보여준 회사가 구글이다.

대학 생활을 하면서 기초 지식을 배우는 걸 소홀히 해서는 곤란하겠지만 이 기술을 이용하여 할 수 있는 일이 무엇인지 나만의 비전을 가지고 공부 방향을 설정하는 것도 무척 중요하다는 사실을 느꼈다.

Choosing an appropriate language

Developers must choose one programming language over another for a given task. Unfortunately, most software engineers do not know which one to choose among various programming languages available out there. Every programming language has a paradigm, which can be imperative, object-oriented, functional or declarative and each paradigm has different characteristics and pros and cons for a specific task. Moreover, within each paradigm, one language is quite different from the others in runtime performance, memory consumption and many others factors.

For example, most developers choose C when they need blazing speed. When someone wants a program to run on Windows with as small a distribution as possible, they often choose C++ with MFC statically linked. When they need GUI software that will run on Mac, Windows and UNIX machines, they may choose Java even though it does not work perfectly.

For a command line tool that must run on any UNIX machine, script languages such as Perl, Python and Ruby will be choices. For rapid development and smooth UIs, Visual Basic is the choice. Although developers know that they have to pay for the price in the size of the distributable. If developers have to run inside a web browser, JavaScript is really the only choice.

Most mistakes are made when developers choose their languages based on syntax. It is true that some developers prefer C/C++/C#/Java syntax while others like neat Python syntax more. They have lots of opinions on what makes a good syntax and the beauty of clean syntax.

However, what happens when developers choose C language when they need to build a CGI program for web servers? CGI programming needs a lot of string manipulation procedures and C language is one of the worst languages to process string operations. Productivity will fall down rapidly even though they are accustomed to C language and C standard library for processing strings such as strcpy, strcat and so on.

Programmers must focus on various aspects of language and language runtimes when they choose an appropriate language for their projects. Criteria for choosing one language over other languages are countless and we cannot take all of them into consideration at the same time because some of criteria may conflict among them.

When someone wants readability, writability, reliability and performance all together, there is no such language in the world. Reliability and performance are often in trade-off relationship. Features which enhance reliability such as array bounds check, null check and type-safety check need more computation and thus degrade the performance. Readability and writability are also a good example of trade-off. Perl has greatly enhanced writability by embedding regular expressions in its syntax, but most Perl developers cannot read others’ source codes.

Then people may ask “Which criteria do we need consider?” Choosing a good language for a project is deeply related to the characteristic of the project. If projects require rapid prototyping and nice UIs, either Visual Basic or Python is the choice. If software is to be downloaded via communication or broadcasting channel, we need to control the permissions of the downloaded applications. In this case, we have to choose Java or C#.

Mechanical procedure to choose the best language for given projects is to list up requirements of the project and to sort them according to the relative importance. If performance is the first requirement, you have to choose C language or its variants. Developers have to remember the phrase, “Think projects first and choose a language according to the characteristics of the projects.”