Skip to content

Chapter 14 The Nineties #1689

@jongfeel

Description

@jongfeel

1990년대

1989~1992년: 클리어 커뮤니케이션스

기술적인 측면에서 클리어 커뮤니케이션스를 다니던 첫 몇 년간은 정말 황홀했습니다.
당시 다른 회사에 다니던 친구가 자기네 컴퓨터에 전화 접속 링크를 열어 주었는데, 그들의 컴퓨터는 인터넷에 연결되어 있었습니다!
그래서 저희는 하루에 두 번씩 그곳에 접속하여 이메일을 보내기도 하고 UUCP로 유즈넷(USENET: 당시에는 네트뉴스(Netnews)라 불림)에 접속하기도 했습니다.
드디어 온라인 세상이 온 것이죠!

1년쯤 지나자 선 마이크로시스템스에서 C++ 컴파일러를 내놓았습니다.
저희는 이미 많은 코드를 C로 작성했는데, 다행히도 이 C++ 컴파일러는 기존 코드들을 문제없이 컴파일할 수 있었습니다.
그래서 저희는 시스템의 기존 C 코드와 함께 C++ 코드도 작성하기 시작했습니다.

유즈넷

이제 그렇게 인터넷에 접속할 수 있게 되면서부터 저는 네트뉴스를 읽기 시작했습니다.
‘comp.object’와 ‘comp.lang.c++’ 뉴스그룹에도 가입했습니다.
당시 저는 스트롭스트룹의 <The Annotated C++ Reference Manual(해설 C++ 참조 매뉴얼)> 책과 더불어 많은 C++ 책을 읽으면서 프로그래밍 실력이 빠르게 향상되었습니다.
그래서 저는 제 실력을 기반으로 여러 뉴스그룹에 글을 올리기 시작했습니다.
대부분은 다른 사람들이 올린 질문에 대한 답변이거나 프로그래밍과 관련한 토론에 대한 것들이었습니다.
제가 참여한 뉴스그룹은 초창기 소셜 네트워크였으며 정말 흥미로운 경험이었습니다.

이 뉴스그룹에서 활동하던 중 저는 <The C++ Report>라는 잡지에 실린 글들이 자주 언급되는 것을 보았습니다.
그래서 저는 그 잡지를 월간 구독하기 시작했고, 매 호를 빠짐없이 탐독했습니다.
그 잡지에는 짐 코플리엔(Jim Coplien), 그래디 부치(Grady Booch), 스탠 립맨(Stan Lippman), 더그 슈미트(Doug Schmidt), 스콧 마이어스(Scott Meyers), 앤드류 코에니그(Andrew Koenig) 같은 사람의 글이 실렸습니다.
대부분의 글과 편집 수준은 매우 높았고 내용 또한 알찼습니다.
그렇게 저는 그 사람들이 쓴 글에서 정말 많은 것을 배웠습니다.

엉클 밥

우리 사무실의 프로그래머 중 한 명인 빌리(Billy)는 팀원 모두에게 별명을 붙이는 것이 취미였습니다.
그가 지어 준 제 별명은 ‘엉클 밥(Uncle Bob)’입니다.
빌리는 질문이 생길 때마다 연구실 건너편에서 “엉클 밥! 이건 어떻게 해야 하나요?” 하고 큰소리로 불렀습니다.
그는 이 호칭을 끊임없이 사용했는데 저는 사실 별로 마음에 들지 않았습니다.

한편 그 당시 저는 객체지향 설계에 관한 책들을 닥치는 대로 읽고 있었습니다.
그중 가장 훌륭했던 책은 그래디 부치가 쓴 <Object Oriented Design with Applications(객체지향 설계와 응용)>입니다.
그래디 부치의 책은 저에게 하나의 큰 전환점이 되었습니다.
그 책에서는 클래스, 관계, 메시지를 표현하기 위해 아주 인상적인 다이어그램 표기법을 사용하고 있었습니다.

화이트보드로 사람들에게 소프트웨어를 설명할 때 그와 유사한 다이어그램을 그리고는 했고, 클리어 커뮤니케이션스에서 개발했던 수많은 소프트웨어를 설계할 때도 이런 형태의 다이어그램들을 활용했습니다.

1992년: <The C++ Report>에 글 게재

저는 <The C++ Report>에 글을 투고하기 시작했는데, 놀랍게도 항상 게재 승인을 받았습니다.
덕분에 편집장이었던 스탠 립맨(Stan Lippman)과도 꽤 친분을 쌓을 수 있었습니다.

저는 변화가 필요하다고 생각했고, 바로 그때 제 인생을 바꿀 전화 한 통을 받았습니다.

1993년: 래셔널

그 전화는 헤드헌터에게서 걸려 온 전화였으며, 캘리포니아 산타클라라에 있는 회사에서 프로그래머를 찾는다는 내용이었습니다.
그 회사에서 진행하고 있는 프로젝트가 소프트웨어 다이어그램을 그리는 CASE(Computer-Aided Software Engineering) 툴을 개발하는 프로젝트라는 말을 듣고 관심이 생겼습니다.

래셔널에는 그래디 부치(Grady Booch)가 근무하고 있는 회사여서 저는 더욱 래셔널에 관심을 가졌습니다.

저희는 C++와 객체지향 데이터베이스를 활용해서 작업했습니다.
다이어그램은 스파크스테이션 화면에 그려졌고, 객체 형태로 저장되었습니다.
당시로서는 정말 흥분되는 최첨단 기술이었습니다.

그 기간 동안 저는 그래디 부치를 두세 번 정도 만났습니다.
그는 덴버 인근에 살며 일을 하고 있었고, 때때로 산타클라라로 비행기를 타고 오고는 했습니다.
그와 만난 자리에서 저는 그에게 책을 쓰고 싶다고 제안했습니다.

부치는 출판 과정에서 저를 도와주겠다고 흔쾌히 말해 주었고, 프렌티스 홀(Prentice Hall)의 출판 담당자인 앨런 앱트(Alan Apt)를 저에게 소개해 주었습니다.

1994년: ETS

9개월이 지나자 래셔널과 계약이 끝났습니다.
로즈의 첫 번째 버전이 출시되었고, 이제 다음 단계로 나아가야 할 때가 되었습니다.

그러던 중 전화를 한 통 받았는데, 이번에도 래셔널이었지만 로즈 팀은 아니었습니다.
그 대신 계약 프로그래밍 부서에서 연락을 주었습니다.

고객은 뉴저지 프린스턴에 있는 교육시험서비스(Educational Testing Service, ETS)입니다.
저는 그곳으로 가서 C++와 객체지향 설계에 관한 컨설팅을 시작했습니다.
2주에 한 번 정도 2~3일씩 출장을 가고는 했습니다.

ETS는 미국 건축사자격위원회(National Council of Architectural Registration Boards, NCARB)와 계약을 맺고 있었습니다.
그들이 ETS에 의뢰한 것은 건축사 자격 인증을 위한 자동화 시험을 만드는 일입니다.
건축사가 GUI를 사용하여 건축 도면을 그리면 그 도면이 저장되어 채점 시스템으로 전달되고, 그 시스템이 도면을 해석하여 건축 원리에 맞는지 평가하여 점수를 매기는 방식입니다.

각 GUI 프로그램마다 대응되는 채점 프로그램이 하나씩 있었고, 이 짝을 비네트(vignette)라고 불렀습니다.

계획은 이랬습니다.
짐과 제가 몇 달 동안 가장 복잡한 비네트인 비네트 그란데(Vignette Grande)를 먼저 개발합니다.
비네트 그란데는 평면도를 다루는 비네트고, 저희 목표는 이 비네트 그란데를 만들면서 나머지 비네트를 빠르게 개발할 수 있도록 해 주는 재사용 가능한 프레임워크를 만드는 것이죠.
그다음 더 큰 팀을 만들어 나머지 비네트 17개를 빠르게 개발할 예정이었습니다.

재사용 가능한 프레임워크라니……. 아, 저희가 얼마나 순진했던지요.
객체지향에 관한 책과 글들은 모두 재사용성에 대해 말하고 있었습니다.
저희는 우리가 뛰어난 객체지향 설계자라 믿었고, 탁월한 재사용 프레임워크를 만들어 낼 수 있다고 생각했습니다.

문제는 바로 나타났습니다.
저희가 만든 재사용 가능한 프레임워크가 실제로는 전혀 재사용할 수 없다는 사실을 깨달은 것입니다.
다른 비네트들은 비네트 그란데를 작성할 때 내린 여러 가지 설계 결정들과 맞지 않았습니다.
몇 주가 지나자, 이 문제를 해결하지 못하면 나머지 비네트 17개를 제때 완성할 수 없다는 것이 분명해졌습니다.

저희 팀은 우선 비네트 세 개의 개발에 집중함과 동시에 그 세 비네트에 모두 적용할 수 있는 프레임워크를 다시 만드는 데 주력하기로 했습니다.
비록 그 과정에 수개월이 더 걸렸지만 결국 성과를 거둘 수 있었습니다.
비네트 세 개는 모두 새 프레임워크를 사용하게 되었고, 비네트 그란데만 예전의 프레임워크를 사용하는 형태로 남았습니다.

우리는 결국 재사용 가능한 프레임워크를 만들려면 실제로 그것을 두 개 이상 애플리케이션에 적용해 보아야 한다는 사실을 깨달았습니다.

<The C++ Report> 월간 칼럼

그 무렵 저는 <The C++ Report>에 글을 두 편 발표한 상태였습니다.
스탠 립맨이 제게 편지를 보내 월간 칼럼을 써 보지 않겠느냐고 물었습니다.
그래디 부치가 더 이상 객체지향 설계 칼럼을 쓰지 않기로 했기 때문에 그 자리를 제가 이어받을 생각이 있냐는 것이었습니다.
저는 당연히 동의했습니다.

패턴

저는 1994년에 열린 C++ 콘퍼런스에 참석했습니다.
그 자리에는 짐 코플리엔도 있었는데, 그의 셔츠에는 ‘패턴에 대해 물어보세요(ask me about patterns)’라고 적힌 메모가 핀으로 꽂혀 있었습니다.
저는 그에게 여러 가지 질문을 했고, 그는 제 이메일 주소를 받아 갔습니다.
몇 주 후, 그는 현재 여러 명이 함께 책을 집필 중이며 온라인 리뷰어를 찾고 있다는 내용의 이메일을 보냈습니다.
그들이 집필하고 있던 책 제목은 <Design Patterns(디자인 패턴)>이었으며, 저자는 에릭 감마(Erich Gamma), 리처드 헬름(Richard Helm), 존 블리시디스(John Vlissides), 랄프 존슨(Ralph Johnson) 이렇게 네 명이었습니다.

1995~1996년: 첫 번째 책, 콘퍼런스, 강의, 그리고 오브젝트 멘토사

제 첫 번째 책에서는 몇 가지 설계 원칙을 다루었습니다.
특히 개방-폐쇄 원칙(open–closed principle)과 리스코프 치환 원칙(liskov substitution principle)을 구체적으로 언급했는데, 이 두 원칙은 베르트랑 메이어(Bertrand Meyer)와 짐 코플리엔의 책에서 접한 것입니다.

이후 저와 짐은 오브젝트 멘토(Object Mentor Inc.)라는 회사를 설립합니다.
짐은 NCARB 프로젝트를 전담하는 동시에 일부 컨설팅 업무도 맡았습니다.

원칙

1995년 5월, 저는 comp.object 뉴스그룹에 올라온 한 포스팅을 읽었습니다.
그 포스팅 제목은 “The Ten Commandments of OO Programming(객체지향 프로그래밍의 십계명)”이었죠.
그 글에서 제시된 내용은 나쁘지 않았지만, NCARB 프로젝트에서 제 경험을 바탕으로 보았을 때 다소 순진하다고 생각했습니다.
그래서 저는 직접 11계명을 답글로 올렸고, 그 안에 여러 설계 원칙을 정리하여 제시했습니다.
바로 이 답변이 훗날 SOLID 원칙과 컴포넌트 원칙의 진정한 출발점이 된 계기였습니다.

이후 1년간 저는 설계 원칙들을 다듬어 이름을 붙였으며, 다음과 같이 최종적으로 아홉 가지 설계 원칙으로 정리하여 강의에 사용하기 시작했습니다.

  • OCP, 개방-폐쇄 원칙(Open–Closed Principle)
  • LSP, 리스코프 치환 원칙(Liskov Substitution Principle)
  • DIP, 의존성 역전 원칙(Dependency Inversion Principle)
  • REP, 릴리스-재사용 등가 원칙(Release-reuse Equivalence Principle)
  • CCP, 공통 폐쇄 원칙(Common Closure Principle)
  • CRP, 공통 재사용 원칙(Common Reuse Principle)
  • ADP, 추상 의존 원칙(Abstract Dependencies Principle)
  • SDP, 안정된 의존 관계 원칙(Stable Dependencies Principle)
  • SAP, 안정된 추상화 원칙(Stable Abstractions Principle)

1997~1999년: <The C++ Report>, UML, 그리고 닷컴

1997년 말, <The C++ Report>의 편집장이던 더그 슈미트(Doug Schmidt)에게서 전화가 걸려 왔습니다.
그는 곧 편집장 자리에서 물러날 예정이라며 저에게 그 역할을 맡고 싶냐고 물었습니다.
저는 당연히 하겠다고 했죠.

두 번째 책:

1995년 5월 comp.object에 올린 글 이후, 제 설계 원칙에 대한 생각은 상당히 굳어(solidified)졌습니다.
저는 클래스 원칙과 컴포넌트 원칙을 최종적으로 구분했습니다.
여기에 인터페이스 분리 원칙(Interface Segregation Principle, ISP)을 추가했습니다.

이후 저는 첫 번째 책이 다소 부족하고 지나치게 좁은 주제에만 집중되어 있었다는 것을 알게 되었습니다.
그래서 보다 완벽하고 일반적인 객체지향 소프트웨어 설계에 관한 내용을 담을 수 있는 두 번째 책을 써야겠다고 생각합니다.

1999~2000년: 익스트림 프로그래밍

켄트 벡의 익스트림 프로그래밍은 정말 완벽했습니다.
물론 ‘테스트를 먼저 작성한다’는 그 터무니없는 부분만 빼고 말이죠.
그 외 나머지 부분은 제 고객들에게 딱 설명해 주고 싶은 내용들이었습니다.
저는 정말 흥분했습니다.

당시 저는 <The C++ Report>의 편집장이었기 때문에 그에게 XP에 관한 글을 한 편 써 달라고 부탁했습니다.

켄트는 제가 요청한 글을 작성해 보내 주었고, 그 글은 <The C++ Report>에 실렸습니다.
켄트 벡의 글에 대한 반응은 매우 좋았고, 저는 고객들에게 그 글을 참고하라고 자신 있게 말할 수 있었습니다.

우리는 페어 프로그래밍도 함께해 보았는데, 그 과정에서 켄트 벡은 제가 터무니없다고 생각했던 테스트 우선(test-first) 방식을 직접 보여 주었습니다.
그는 작은 테스트 케이스를 먼저 작성하고 단 두 시간 만에 간단한 자바 애플릿 하나를 완성해 냈습니다.

저는 이전까지 그런 방식은 한 번도 본 적이 없습니다.
당시 저는 프로그래머로 30년을 일해 왔지만, 이렇게 완전히 새로운 코딩 방법을 접하게 될 줄은 전혀 몰랐습니다.
정말 충격이었습니다.
특히 두 시간 동안 작업하면서 단 한 번도 디버깅을 하지 않았다는 사실이 정말 인상 깊었습니다.
저는 확신했습니다. 그가 사용한 기술은 우리도 반드시 익혀야 할 기술이라는 것을 말이죠.

우리는 매우 넓은 공간을 임대했고, 새로운 강사 여러 명을 채용했습니다.
닷컴 버블이 줄 수 있는 모든 기회를 최대한 활용하기로 했습니다.

저희는 그 행사를 XP 이머전(XP Immersion)이라고 불렀습니다.
매일 오전 9시부터 오후 9시까지 이어지는 5일짜리 교육 과정이었습니다.

저녁 식사 후에는 특별 연사가 강연을 했는데, 마틴 파울러(Martin Fowler), 워드 커닝햄, 여러 유명한 소프트웨어 업계 인사들을 초청했습니다.
저희는 이런 행사를 3개월마다 개최했으며 동시에 C++, 자바, 객체지향 설계에 대한 교육과 컨설팅도 계속 이어 갔습니다.

XP 이머전 행사는 엄청난 성공을 거두었습니다.
매번 수강생 60명 정도가 참가하여 성대하게 치루었는데, 수많은 찬사와 훌륭한 평가가 이어졌습니다.
그야말로 세상을 다 얻은 듯한 기분이었습니다.

Metadata

Metadata

Assignees

Labels

2026We Programmers우리, 프로그래머들 - AI 시대에 잊혀 가는 '프로그래머 정신'을 다시 깨우다

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions