비난하기

비난하기
대학에 다니던 시절에 꽤 오랜시간을 일식집 주방에서 파트타이머로 근무 했었다. 일하던 기간동안 주방장이 몇 차례 바뀌었는데 이상하게도 새로 들어온 주방장은 꼭 이전 주방장이 만들어 놓았던 소스류의 맛이나 주방 시스템 체계등을 비난하면서 일을 시작하는 것이다. 
계속 근무하고 있던 입장인 나는 이전 주방장과 더 친밀한 관계를 가지고 있는데 그런 비난을 듣고 있자니 여간 불편한게 아니었다. 
더구나 비난의 대상이 되는 주방 시스템(일하는 체계)은 몇년동안 해당 환경에서 시행착오를 거치면서 최적화 된 시스템이었고, 새로 막 들어온 사람이라면 그 배경을 모르고서는 이해할 수 없는 여러가지 복잡한 이유를 바탕으로 구축된 체계였으며 비난하던 당사자도 결국에는 당신이 비난하던 그 비슷한 모습으로 시스템을 변화시켜 나가고는 했다.

 

지금 나는 소프트웨어 아키텍트로 일하고 있는데, 거의 대부분의 경우 먼저 만들어져 있는 아키텍처 기반에서 작업을 하는 경우가 많다. (새로운 주방에서 일을 시작하는 주방장처럼..)
보통 많은 아키텍트(나를 포함)들이 신규 사이트에 들어오면서 기존(as-is)의 아키텍처를 부정(비난)하는 것으로 부터 일을 시작하는 경우를 많이 본다.
모든 경우에 그런 것은 아니겠지만, 그렇게 함으로서 자신의 능력이 더욱 돋보일거라 생각하는 측면이 없지는 않을 것이다. 
얼마전 우연하게  근무하던 전 직장에서 수행한 프로젝트의 아키텍를 비난하는 얘기를 들은적이 있다. 

그 당시에는 내가 역량이 많이 부족하기 했지만, 사실 비난 받았던 이유는 그런 측면이 아니었다. 내가 그 시스템을 구축하던 당시의 상황과 배경정보를 전혀 고려하지 않고 현재의 상황에 대입해서 비난을 하고 있다고 생각하니 화도 많이 나기도 했지만 억울하기도 한 생각이 들었다.
그러면서 들었던 생각은, 그 동안 내가 비난했던 많은 레거시들도 지금의 그 모습을 갖게 되기 까지는 그 때 당시의 당면한 많은 문제들을 해결하고, 수많은 이해 관계 당사자들의 요구사항을 만족시키기 위해 나보다 훨씬 훌륭한 사람들이 깊은 고민을 한 결과일지도 모른다는 것이다. 
그래서 되도록 이미 만들어진 어떤 결과를 평할 때에는 지금의 기준에 비추어 보아 부족한 부분이 많이 보이더라도, 무턱데고 비난하기 보다는 그 모습을 갖게 된 그 당시의 시대적(?)상황을 이해해 보려고 노력하는 편이다. (하지만 아무리 그러려고 해도 도저히 이해하지 못할 경우도 많이 경험하곤 한다. -_-)
전임 주방장의 고충을 잘 이해하고 나면, 훨씬 더 훌륭한 주방장이 될 수도 있지 않을까? 혹은 내 비난이 부메랑이 될 수도 있을 거라는 그런 생각이 드는 오늘이다.

객체지향의 사실과 오해

요즘 조영호 님의 “객체지향의 사실과 오해”라는 책을 보고 있는데, 아직 중간정도 밖에 보고 있지않지만 책 내용중 어떤 부분때문에 좀 당혹스러웠다. 
사실 이 책은 토비님이 조영호님과 인터뷰하는 동영상을 보고 “객체지향은 현실을 모방하는게 아니고 은유한 것이다”라는 내용에 호기심이 생겨 구매하여 읽게되었다. 
그동안 내가 직접 모델링을 하거나, 후배들에게 모델링에 대해서 교육을 할때도 현실 세계를 모방하려했고 또 그렇게 가르쳐왔던 터라 내가 그동안 잘못 알고 있었던가라는 생각에 책을 구입해서 자세히 읽어봐야겠다라는 생각이 들었다. 
일단 책을 읽으면서 든 생각은 책에서 얘기하는 내용이 너무 좋아 한번 감탄하고, 저자분의 뛰어난 식견과 지식의 깊이에 대해 다시 놀라고, 객체지향이라는 주제에 대서 본인의 사상적틀을 완성한것으로 보아 정말 대가임에 틀림없구나 하는 생각이 들었다. (사실 부끄럽지만 토비님 동영상을 보기전까지는 저자분에 대해서 잘 모르고 있었음)

일단 결론부터 얘기하자면 나는 여전히 객체를 모델링할때 “현실세계를 모방”할 것이고 후배들에게도 그렇게 하도록 조언할 것이다. 
책에서는 전화기는 스스로 통화버튼을 누를 수 없고, 계좌는 스스로 이체를 할 수 없으므로 객체로 표현된 전화기나 계좌는 현실세계를 모방한게 아니고 조금 참조해서 세로운 세계를 창조한 것이라고 얘기한다. 그런 면에서 볼때 현실세계를 표현하는 객체는 현실세계를 모방하는 것이 아니고 은유하는 것이라고 말한다. 
나는 이렇게 단정하는 것에는 문제가 있다고 생각한다. 

그 이유를 말하기 전에 먼저 저자께서 현실세계와 객체간의 관계를 표현하는데 사용된 두가지 개념인 “모방” 과 “은유”에 대해서 그 의미를 명확하게 할 필요가 있다. 
먼저, 나는 객체는 현실세계를 은유해서 표현한다는 의견에 동의할수가 없다. 
책에서도 얘기하고 있지만 은유는 “실제로 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 한 형태”라고 정의할 수 있다. 예를 들어 “내 마음은 호수요”, “부장님은 화나면 완전 호랑이야”라고 얘기하는 것은 “마음과 호수”, “부장님과 호랑이”는 사실 아무 관계도 없지만 호수와 호랑이의 대표적 속성을 차용해서 내 마음과 부장님의 성격을 좀 더 이해하기 쉽게 표현하려고 한 것이다. 
소프트웨어를 만드는 우리가 쉽게 접하는 은유(메타포)로 표효하는 대표적인 것들이 있는데, 바로 socket, client, server, shell 등과 같은 것들이다. 이렇게 표현함으로 해서 그러한 것들이 무엇을 하는 것인지 구구절절 설명하지 않아도 적절한 은유덕분에 그 의미를 파악하는게 어렵지 않다. 
하지만 이것들이 현실세계의 소켓과 노예와 고객, 껍데기등을 객체로 표현한 것은 아니지 않은가?
객체는 오히려 현실세계의 모습에 상당히 많은 부분을 의존하고 있으면 어플리케이션(시스템)이라는 세계에서만 가능한 특별한 몇몇 능력을 더 부여받을 수 있는 것이라고 생각한다. 
여기에서 말하는 “현실세계에 많은 부분을 의존하고” 있는 것이 바로 현실세계를 모방하는 것이라고 나는 생각한다. 모방이라는 행위는 특정한 대상을 배끼거나 옮겨놓는 것을 말하는데, 그렇게 한다고 해서 모방한 것이나 피모방된 것이 반드시 동등(equal)한 관계에 있는 것은 아니라고 생각한다. 
다시 말하면, 모방하는 과정에서 원래의 대상을 특정할 수 있는 한계를 유지하는 한, 필요에 따라 일정부분은 가감이 될 수 있는 것이라고 본다. 따라서 객체를 통해 현실세계의 실상을 특정할 수 있다면 그것은 모방이라고 부르는게 더 적절한것 같다는 생각이다. 
우리가 찰흙으로 사람의 형상을 빚을 때, 사람보다 팔다리가 좀 이상하게 길어도, 머리가 유난히 커도 그 조형물이 인간을 은유한다고 하지 않고 모방해서 만들었다고 하는게 적절한 것처럼 객체도 그 객체가 표현하고자 하는 대상을 은유할게 아니라 모방하는 것이 그 객체의 책임과 역활을 명확하게 이해시킬 수 있으리라 생각한다. 
이러한 이유들로 나는 여전히 객체가 현실세계를 모방하도록 할 것이다. 

물론 어디까지나 나의 개인적인 견해이며, 이 견해가 이 책을 폄하하는 것이 아니라는 사실을 알아주었으면 한다. 이런 나의 개인적 의견에도 불구하고 이 “객체지향의 사실과 오해”라는 책은 내가 그 됨됨이를 논하기에는 너무 훌륭한 책이라는 사실에는 변함이 없다. 
기회가 된다면 저자분을 직접 만나뵙고 밚은 얘기를 나눌 수 있으면 좋겠다. 

혹시 이 글을 조영호님께서 보시게 된다면 “저는 책 때문에 조영호님 열렬한 팬이 됐습니다” 하고 얘기하고 싶습니다. ㅋㅋ

OSX 에서 Google Cloud Platform 인스턴스에 ssh 접속하기

구글 Cloud Platform에 인스턴스를 만들고 작업을 위해 터미널로 접속을 할 필요가 있다.
osx(맥) 환경에서 어떻게 터미널을 이용해서 어떻게 접속하는지 간단하게 정리해 본다.

  • 기본적인 사항은 여기 참고 : https://cloud.google.com/compute/docs/console
  • 맥은 터미널에서 아래 명령어로 gcloud sdk를 설치해야 함 ( 윈도우 사용자는 https://cloud.google.com/sdk/
  •  $curl https://sdk.cloud.google.com | bash 
  • 위 명령어로 gcloud 를 설치하면 설치과정 마지막에 환경변수를 세팅할 rc파일을 물어보는데, default 가 .bashrc 라서 .profile 파일로 지정을 해 주어야 제대로
  • 아래 명령어로 gcloud workspace를 생성해야 한다.(터미널에서..)
  •  gcloud config set project YOUR_PROJECT_ID 
  • 다음과 같이 gcloud ssh 로 클라우드 머신에 접속해서 사용하면 됨.
  •  gcloud compute ssh YOUR_APPLICATION_NAME --zone us-central1-a 
  • 위에서 –zone 옵션을 주었는데, 같은 프로젝트로 여러 인스턴스를 만들었다면 zone 옵션은 필수다.
  • 다른 SSH 로 접속 하려면 아래 여기 참고 : https://cloud.google.com/compute/docs/console