2013년 10월 19일 토요일

기술적 부채에 대처하는 자세 Ver2.0

 기술적 부채Technical Debt라는 말을 들어 본 적이 있는가? 1992년 Ward Cunningham이 비 기술자들에게 문제를 전달하기 위해 사용하기 시작한 단어로,  간단히 말해 꼭 해 두지 않아도 또는 프로젝트가 끝날 때 까지(심지어는 끝나고 나서도) 티가 잘 나지 않는 작업들을 지칭한다.

 일반적으로 잘 알려진 기술적 부채로는 악취 나는 코드, 테스트 커버리지, 적절하지 못한 객체 모델링과 같은 작업들이 있다.

기술적 부채를 둘러싼 순환구조

 Ward Cunningham이 부채라는 표현을 쓴 이유는 복리이자가 발생하기 때문으로 이 문제를 제대로 다루기 위해서는 문제를 순환구조로서 파악하지 않으면 안된다.

기술적 부채의 악순환

기술적 자산의 선순환


 기술적 부채가 지닌 대표적인 특징은 빌린 사람과 갚는 사람이 일치 하지 않는다는 점인데, 빌린 사람은 최초 개발자에 해당하고 갚아야 하는 사람은 표면적으로는 유지 보수 개발자이고 본질적으로는 시스템 소유자(프로젝트 오너)라 볼 수 있다. 기술 부채는 소프트웨어를 사용하는 앤드유저에게는 직접적인 가치를 제공하지 않기때문에 관리업무에서 흔히 소외되는 요소중 하나로, 좀 더 직설적으로 이야기 하자면 코드 가독성을 높이기 위해 고객에게 릴리즈 일정을 조정해 달라고 할 수 없다는 뜻이다.

 금융 부채와 마찬가지로 적절하게 컨트롤 되기만 한다면 기술적 부채가 꼭 나쁘기만 한 것은 아니다. 적절한 기술적 부채의  운용은 프로젝트 진행에 상당한 융통성을 가져다 주기 때문이다. 채무를 예로 들자면 단기 상환채무를 장기 상환채무로 옮긴다던가 보다 많은 이자가 발생하는 부채를 적은 이자가 발생하는 부채로 옮기는 것과 같은것이다.

 하지만 이자는 어딘가에 몰아넣고 잊어버릴 수 있는것이 아니다. 시간과 함께 착실히 증가하게 되며 이를 제대로 인지하고 관리해 두지 않는 다면 프로젝트나 비지니스를 망치는 심각한 문제로 커 질 수도 있다. 이 점 때문에 기술적 부채는 이상과 현실 사이에서 영원히 고통 받는 프로젝트 매니저들에게 중요한 숙제거리이다.

누락된 자동화 테스트 

 제때에 작성해 두지 않은, 또는 부실하게 작성되어 실행 패턴에 대한 커버리지가 부족한 자동화 테스트는 대표적인 기술 부채이다. 멀쩡하게 동작 하는 것 처럼 보였던 코드들은 지름신 에게 휘둘린 후 애써 모른 척한 신용카드 청구서처럼 때가 되면 어김 없이 당신을 찾아와 비용 지불을 요구할 것이다.  버그의 처리 비용은 생성 후에 얼마나 빠른 시간 내에 처리 되느냐에 따라 달려 있다는 것은 이미 여러 연구에 의해 밝혀진 사실이다.

 이에 반해 테스트 케이스를 작성하는 과정 자체는 테스트 대상이 되는 실행 코드에 대한 통찰력을 늘리는 데에도 많은 도움을 준다. 이것은 채무의 반대되는 의미로 기술 자산이라 불러도 좋을듯 하다. 

 자동화 테스트는 젠킨스와 같은 CI툴과 만나 더욱더 놀라운 시너지 효과를 낸다. 프로젝트의 누군가가 새로운 소스를 커밋 한다면 CI서버는 이를 감지하여 자동화 테스트를 실행하고 그 결과 최단 시간에 새로운 코드가 발생 시킬 수 있는 문제점들을 알려준다.

 자동화된 테스트 코드의 가장 큰 장점은 코드가 사양 변경에 매우 견고해 진다는 점 이다. 제대로 작성된 테스트 코드를 가지고 있다면 추가되는 사양 변경에 대해 두려움 없이 작업을 할 수 있을것이다. 테스트 결과는 수정한 내용이 다른 코드들에 부작용 없이 잘 움직인다는 것을 보증해 줄 것이며 만약 예상치 못한 문제가 생기더라도 즉각 CI를 통해 이를 인지 하여 대처 할 수 있을 것이다.

 성실하게 작성된 테스트 코드들은 부채가 아닌 착실하게 신뢰성이라는 이자를 불려가며 당신의 코드를 더욱더 가치있게 만들어 줄 것이다.
만약 프로젝트 일정중에 잠시잠시 여유시간이 생긴다면 언제나 자동화 테스트를 추가하고 또 추가하라. 언제나 녹색을 유지하는 테스트 결과 그래프는 당신의 작업을 더욱 즐겁게 만들어 줄 것이다.

리팩토링

 리펙토링은 특히 자동화 테스트와도 밀접한 관계를 지닌다. 요즘같이 좋은 툴이 리펙토링을 지원하는 시대에도 어쨌든 소스코드가 변경된다는것은 테스트가 필요함을 의미하기 때문이다.

리팩터링에 대해서는 아래의 글을 참고하길 바란다.



 여기서 한가지 짚고 넘어가고 싶은 것은 많은 사람들이 리팩토링을 단순히 소스코드를 보기 좋게 하여 가독성을 높이는 작업 쯤으로 인식하고 있는데 객체 지향 프로그래밍에서 리팩토링은 보다 심오한 의미를 지닌다.

 자바와 C#을 비롯한 많은 언어들을 객체 지향 프로그래밍이 대세가 되었다는 지금에도 실상 동작하는 코드의 내부를 들여다보면 트랜잭션 스크립트 패턴을 이용하는 경우가 거의 대부분이다. 하지만 진정한 객체 지향 프로그래밍을 위해서는 도메인 모델링 패턴이 반드시 필요 하며 이를 위해서는 반복 적인 객체 모델링 작업이 필수적이다.

 다만 도메인 모델 패턴은 플라톤의 이데아론에 비견될 정도로 한번에 완성된 모델을 제시하는 것이 쉽지 않기 때문에 모델 변경과 구현의 사이클을 지속적으로 행하는 반복적 정제가 거의 필수이자 최선의 개발방법으로 여겨진다.


도메인 모델 패턴에 대해서는 최범균님의 블로그에 상세히 소개되어 있다.


 리팩토링 작업은 기능 추가 및 개선 작업 과는 별도로 진행되는 특성이 있으므로 프로젝트를 원활히 돌리기 위해서는 고수준의 형상관리 능력을 요구 받는다. 즉, 메인 스트림의 개발을 멈추지 않으면서 브런치로 리팩토링을 진행하고 다시 이를 머지 하는 과정이 필수적이라고 할 수 있다.

결론

 프로젝트 내부에서 기술 채무는 빨리 제거 하는 것 만이 능사는 아니다. 서론에서 기술한 바와 같이 기술적 채무는 개발자가 게을러서 발생하는 것이 아니며, 스케줄 진행상 거의 필수 불가결하게 발생하게 되므로 적절하게 관리만 된다면 프로젝트 진행에 상당한 융통성을 가져다 줄 수 있다.  물론 처음부터 기술 부채가 발생하지 않도록 노력 하는 것은 중요하지만 사안에 따라서는 프로젝트 이해 관계자들의 승인 하에 과감한 이월(유지 보수 관리자에게 떠 넘기기)을 선택 하거나 아예 디폴트를 선언하는것도 한가지 방법이 될 것이다.  디폴트 선언(냄새나는 코드 무시하기)에 대해서는 Eric Evans가 제안한 전략적 설계가 좋은 지침이 될 것이다. 

 기술 부채는 금융 부채와 마찬가지로 한꺼번에 상환 하기 어려운 경우가 대부분이기 때문에 프로젝트 매니저는 스케줄 관리에 기술 부채 상환에 대한 부분을 반영하고 전략적으로 유지 되도록 관심을 기울여야 할 것이다. 작업 관리에 Trac이나 Redmine과 같은 이슈 트랙커를 사용하고 있다면 이러한 기술 부채를 다루기 위한 별도 카테고리를 만들어 관리하는 것도 좋은 방법이다.

 기술적 부채의 관리에 관한 보다 심도있는 논의는 InfoQ에 Sven Johann과 Eberhard Wolff가 개제한 Managing Technical Debt를 읽어볼 것을 추천한다.

2013년 9월 30일 월요일

It will fail. Keep it simple. - 핀터레스트의 스케일링 노하우

4월달에 포스팅한 QCon Tokyo 2013에 대한 글에서 핀터레스트(Pinterest)의 스케일링에 대한 Marty Weiner씨의 강연에 대해서 언급한적이 있다.

핀터레스트는 국내에서는 잘 알려져 있지 않지만 일종의 사진중심의 SNS로 북미 지역에서는 상당한 인기를 끌고 있다.

QCon SanFrancisco 2012에서의 강연 동영상(영어)

영어의 압박이 있긴 하지만, 스케일링에 대한 살아있는 노하우를 얻을 수 있는, 서버의 규모를 키워나가야 하는 인터넷 서비스 관련자에게는 귀중한 노하우가 되리라 생각한다.

추가: 포스팅 이후에 국내의 한 블로거가Junichi Niino씨의 블로그 포스팅을 번역한 글을 발견했기에 링크를 추가한다. 프레젠테이션 내용과 함께 잘 정리되어있다.

QCon Tokyo 2013 Scaling Pinterest 강연내용 요약 (한글)

2013년 9월 29일 일요일

스크럼 개발팀의 최적 인원수는 몇명일까?

8월 말경 참가했던 "폭포수 개발 경험자를 위한 스크럼 강좌" 에서 있었던 일이다.  교육 내용중에 스크럼 개발팀의 최적인원은 5인에서 9명까지라는 내용이 있었는데 어떤 근거로 그러한 수치가 나왔을까가 의문이었다.

개인적으로 팀의 인원구성은 금전적인 영향 이상으로 프로젝트에 큰 영향을 미치는데, 이른바 무임승차 팀원의 발생과 그로 인한 팀웍의 저하때문이다.

얼마전 휴가중에 읽은 '착각하는 CEO(유정식저)'에서 이러한 나의 의문에 관련된 부분이 있어 내용을 요약해 소개해 보고자 한다. 참고로 이 '착각하는 CEO'에서는 팀 운영과 관련해서  깊은 심리학적 통찰력을 제공하고 있으므로 팀 매니지먼트에 관심있는 분은 꼭 읽어두길 권한다.

패트릭 라플린의 연구결과에 따르면 고도의 사고를 요하는 문제풀이에서 팀을 이뤄 문제를 풀 경우의 정답에 이르기 까지 필요한 질문의 수를 조사해 평가하는 방식으로 다음과 같은 사실을 이끌어냈다.

개인의 성적 ≒ 2인그룹의 성적 < 3~5인그룹의 성적

라플린이 이 연구를 통해 얻어낸 결론은 다음과 같다.

1. 문제 해결의 효율성은 세 명 이상일때 가장 좋다.
2. 세명 이상의 그룹에서는 인원이 추가되어도 문제 해결력이 더 좋아지지 않는다.

그렇다면 그룹이 다섯명을 넘어설때에는 어떠한 일이 발생할까?

조셉 렌줄리는 각각 한 명, 세 명, 여섯 명, 열두 명으로 이루어진 그룹을 구성하여 창의적인 발상을 제시하라고 지시했다. 각 그룹의 창의성을 평가하니 세명짜리 그룹과 여섯 명짜리 그룹은 차이가 거의 없었다. 팀원 한 명이 평균적으로 그룹에 기여한 바를 측정하니 그룹 규모가 커질수록 그 값이 줄어드는 이른바 무임승차자가 발생했기 때문이다.

팀원수가 적정수준을 넘어서게 되면 무임승차 하는 인원이 발생하기 쉬워진다.


'착각하는 CEO'에서 저자 유정식씨는 적절한 팀원의 수를 연구, 문제해결과 관련된 팀원은 3~5명, 단순한 업무를 수행하는 운영위주의 팀은 열명정도를 하나의 팀으로 묶는것이 좋다고 하는 안토니 제이의 의견을 팀 구성 최적 인원수의 근거로 제시하고 있다.

스크럼팀은 대부분 운영보다는 연구, 문제해결을 위한 팀으로 볼 수 있을것이고 이에 따라 필요한 최저인원은 3명이지만 실제로는 4인 이상이 적합할 것이다. 대체로 팀원중 한 명은 팀 리더가 되어 실제적인 업무외에 내외부 커뮤니케이션 관련 업무에 많은 시간을 할애해야 하기 때문이다.

따라서 위의 연구 결과를 토대로 필자가 내린 견론은 팀으로서의 시너지 효과를 내면서 무임승차 없이 최고의 효율을 기대할 수 있는 개발팀의 인원 수준은 4~7명으로, 8명 이상의 인원이 된다고 하면 두개의 팀으로 나누는것이 스크럼팀으로서는 더 높은 효율을 낼 수 있을것이다.

다만 이는 어디까지나 작업 스케줄을 개인이 아닌 팀단위로 생각하는 스크럼팀에 한정된 이야기로, 전통적인 폭포수 개발 관리법에 의한 개발을 수행하는 팀의 경우는 운영위주의 팀으로 보고 단일 팀에 대해 최대 10명정도까지는 효율적인 운영이 가능할 것이다.



2013년 9월 15일 일요일

JAVA EE 7에 추가된 "핫" 한 기능들

오늘은 6월 12일 발표된 자바 엔터프라이즈 에디션 7(이하 Java EE 7)에 새로이 추가된 기능들을 간략히 살펴보고자 한다.

전체적인 방향성은 Spring의 장점을 받아들인 Java EE 6 의 흐름을 계승하고 있으며, 눈에 띄는 큰 변화라고 한다면 HTML5를 비롯해 WebSocket과 JSON서포트 그리고 크라우드 환경에 대한 지원을 들 수 있겠다. 이 외에 잡 플로 컨트롤을 가능하게 하는 배치 프레임워크의 등장이 눈에띈다.

Glassfish4를 필두로 Java EE 7을 지원하는 어플리케이션 서버가 속속 등장하고 있는 상황에서 조만간 Spring과 함께 엔터프라이즈 어플리케이션의 표준으로 자리 잡을것으로 기대된다.

HTML5
우선 가장 큰 특징으로 꼽는것이 HTML5의 지원이 되겠다. 단순히 스팩에 대한 지원 뿐만이 아니라 보다 편리하게 HTML5를 이용 할 수 있도록 여러 기능들을 추가해 놓았다. 아울러 최근 웹 트렌드를 반영하고자 크롬을 포함한 웹 브라우저들이 잇달아 지원을 시작한 WebSocket과 웹상에서 데이터 프로토콜의 표준으로 자리잡은 JSON에 대한 서포트도 주목 할 만 하다.WebSocket과JSON은 아래 별도항목으로 자세히 다루도록 하겠다.

WebSocket
Java EE 7의 WebSocket지원은 HTML5의 등장과 더불어 미래 웹 기술을 방향성을 보여준다. WebSocket은 장점은 기존의 HTTP상에서 구현되던 Ajax나Comet에 비해 보다 적은 오버헤드로 쌍방향 통신이 가능하다는 점 이다. 즉, HTTP기반 프로토콜은 각각의 Request와 Response별로 HTTP헤더를 첨부해 보내는 형식으로 커넥션을 반복해서 맺어야 했던것에 비해 WebSocket은 한번의 핸드쉐이크 이후에 하나의 연결을 계속해서 재 사용 할 수 있다는 것이 매리트이다.

JSON
군살 없는 데이터 표현방식으로 최근 각광받는 JSON에대한 API가 추가되었다. 개인적으로 JSON은 확작성과 가벼움을 동시에 갖춘 텍스트 베이스 데이터 포멧으로 향후 웹 뿐만 아니라 다양한 분야에서 기존 데이터 포멧을 대체해 나갈것으로 기대하고 있다.

JMS 2.0 API
Java EE에서 JMS지원은 특별히 새로울것도 없지만 JMS2.0의 경우 송수신을 위한 간편한 API가 추가된 점이 눈에 띈다.

클라우드 환경 지원
사실 Java EE 7 사양 발표시에 가장 주목하고 있던 부분이지만 아쉽게도 이번 7에서는 기본적인 사항들만 지원한다고 하는 어정쩡한 형태가 되고 말았다. (이러한 어정쩡함 때문에 아마도 상용 프로젝트에서 이 Java EE 7 의 클라우드 지원 기능을 이용하는 케이스는 찾아보기 어려우리라.) 본격적인 클라우드 지원은 Java EE 8부터 가능할 것이라고 하는 예측이 많지만 완벽한 형태의 네이티브 클라우드의 지원이 가능할 것인지에 대해서는 클라우드 자체도 아직 표준이 정착되지 않은 상황인지라 회의론도 만만치 않다.

배치 프레임워크
엔터프라이즈 어플리케이션에서 배치 어프릴케이션이 차지하는비중을 생각한다면 이제와서야 프레임워크에서 지원된다는 점은 다소 늦은 감이 있다. 그동안 Jboss나 WebSphere와 같이 밴더별로 지원해 오던 배치잡 관련 기능(스케줄링, 잡 플로우 컨트롤)이 표준 사양화 됨에 따라 향후 엔터프라이즈 어플리케이션 개발에 많은 영향을 끼칠것으로 기대된다.

JAX-RS 2.0
심플함을 추구하는 경향상 SOAP보다 REST가 대세로 자리를 굳혀가는 모양새다. 7부터는 JAX-RS 2.0의 지원으로 RESTful서비스와 관련하여 보다 다양한 기능들을 제공하고 있다.

병렬처리 관련 기능 강화
병렬처리와 관련한 유틸리티가 추가되었다. 특히 주목할 부분은 7 부터 도입된 하이레벨 스레드 컨트롤 기능이다.

CDI
큰 인기를 끈 Java EE 6에 이어서 7에서도 CDI가 지원되고 있다.

Servlet 3.1
당연하게 들릴지도 모르지만 최신 서블릿 사양인 Servlet3.1이 7에서 지원된다.
Servlet 3.1은 논-블로킹 I/O를 포함한 향상된 HTTP프로토콜 매커니즘과 보안기능 향상을 제공한다.

2013년 5월 7일 화요일

자바 디컴파일 솔루션 소개

오픈소스가 주류를 차지하는 오늘날에도 자바 라이브러리 (jar) 파일에서 자바 소스를 추출해 내야 하는 경우가 종종 생기곤 한다. 이러한 경우 이 글이 도움이 될 수 있을 것이다.

1. Jar 파일 갯수가 적을 경우
JD-GUI
단독으로 동작하는 어플리케이션으로 어노테이션등 자바 5 이후의 소스에 대해서도 디컴파일을 가능하게 해준다. JAR 파일 단위의 디컴파일을 지원하며 디컴파일 된 소스는 패키지 구조 그대로 폴더에 저장된다. 디컴파일 하고자 하는 jar 파일이 적을경우 대단히 훌륭한 솔루션 이지만 jar파일이 수백개에 이른다던지 하는 경우 커맨드라인 인터페이스를 지원하지 않아 일일이 GUI를 통해 디컴파일을 해야만 하는 번거로움이 있다.

JD-Eclipse (Eclipse Plugin)
이클립스의 경우 JD-Eclipse를 추천한다. jadclipse도 같은 기능을 하는 플러그 인이기는 하나 기능적으로 최근까지 꾸준히 업데이트를 해 오고 있는 JD-Eclipse가 보다 나은 선택이 되리라 본다. (jadclipse는 2009년11월 업데이트를 마지막으로 개발이 멈춰있는 상태이다.)

2. Jar 파일 갯수가 대단히 많을경우
이 포스트를 작성하는 2013년 5월 현재. Java Decompiler 프로젝트에서 아직까지 커맨드라인 인터페이스를 제공하지 않는 관계로 수백개에 이르는 Jar파일을 디컴파일 해야 하는 경우에 의지력을 시험받는 경우가 생겨난다. 만약 자신의 인내심의 한계를 넘어가는 객수의 jar 파일들을 디컴파일 해야 하는 경우 다음과 같은 방법을 사용해 일괄적으로 디컴파일이 가능하다.
※단, 이 경우 제약이 있는데, jad 디컴파일러 자체가 워낙에 오래된 디컴파일러 이다 보니 어노테이션 같은 자바 5 이후의 문법에 대해서 제대로된 디컴파일이 되지 않는다는 점 을 주의해야 한다.

준비물
jad
jadretro
cygwin (리눅스나 유닉스의 경우 필요 없음. 위도우 쉘이나 파워 쉘을 사용하고자 하는 경우는 각자의 환경에 맞게 스크립트를 수정하여 사용할 것.)

①디컴파일 하고자 하는 jar파일들을 한자리에 모은다.
②7zip과 같은 압축 관리 툴을 이용해 jar 파일들을 각각의 파일명으로 된 폴더 아래 압축을 풀어낸다.
③java 5 이후의 컴파일러로 컴파일된 class파일들의 경우 jadretro를 이용해 jad가 디컴파일 가능한 형태의 바이너리 파일로 변환시켜 준다.
(for f in `find [class파일 저장 폴더] -name '*.class'`;do jadretro $f;done)
④폴더명을 jad컴파일러로 넘겨주어 디컴파일을 실행
(for f in `ls -1 [class파일 저장 폴더]`;do `jad -o -r -sjava -d[소스파일 저장 폴더]/$f/ tmp/$f/**/*.class` ;done)

2013년 4월 25일 목요일

QCon Tokyo 2013


이번주 화요일, 개발자 커뮤니티인 InfoQ에서 진행하는 컨퍼런스인 QCon Tokyo 2013에 다녀왔습니다.
올해는 크라우드,모바일/HTML5,임베디드,에자일/모델링,빅데이터/분산처리를 중심으로 세션이 펼쳐졌으며 저는 개인적인 관심 분야인 클라우드와 DDD(Domain Driven Design)을 중심으로 세션에 참가하였습니다.

QCon Tokyo 2013 프로그램

개인적으로 인상깊었던 세션에 대해서 간단히 소개해 봅니다.

Scaling Pinterest - Marty Weiner

사진공유 서비스인 Pinterest의 엔지니어인 Marty Weiner씨가 처음 1명의 개발자와1대의 서버로 시작한Pinterest가 서비스 규모를 키워감에 따라 어떻게 스케일링 문제에 대응해 나갔는지에 대해 발표한 세션으로 실제 서비스 상에서 발생한 문제에 대한 성공과 실패에 대한 개발자의 생생한 경험담을 들을 수 있는 값진 시간이었습니다. 개인적으로는 이번 컨퍼런스에서 가장 건질것이 많지 않았나 싶습니다.
간단히 요약 하자면
-소규모에서는 MySQL이 짱임.
-스케일링 성공의 열쇠는 아마존 EC2/S3의 활용
-대규모 데이터베이스 구축에 있어서의 클러스터링 보다는 분할(Sharding)이 유리
프레젠테이션 자료는 위에 링크한 프로그램 안내표에서 받으실 수 있으며 조만간 동영상 링크가 추가될 예정입니다.

DDD를 스크럼으로 진행하자! 또는 스크럼을 DDD로 진행하자! - 하라다 키로

도메인 드리븐 디자인. 요즘 공부하고 있는 분야기인 한데 도통 감이 안와세 헤메이고 있습니다. 하라다씨는 어제도 같이 술한잔 했던 분인데 적지 않은 나이임에도 불구하고 열정으로 가득찬 열혈 개발자 이십니다. 솔직히 일본에서 일하면서 놀랐던 점은 나이 많은 분들이 현역에서 활동하면서 경험과 지식을 후배들 전해주고 있다는 점 입니다.

암튼 요약하자면
-처음부터 완벽한 모델링을 추구하려 하지 마라. 어차피 쓸모 없어진다. 빨리 만들어서 돌려보고 피드백 하라.
-전통적인 워터플 개발프로세스에선  DDD는 위의 이유로 성공하기가 어렵다.
DDD로 수행하는 Scrum 플로우

Model Exploration Whirlpool
하라다씨가 자신의 세션에서 필살기로 준비한 그림입니다. 문제는 아직도 제 눈에  C자 세개 겹처놓은것으로 밖에는 보이질 않는다는 점 입니다.
Model Exploration Whirlpool 설명 PDF자료


작은 오브젝트로 도메인모델을 작성하라 : DDD실전가이드 - 마스다 토루

바로위의 하라다 키로씨의 세션이 DDD와 에자일의 개념 소개에 치중한 반면 이번 세션은 실제 DDD를 개발에 적용함에 있어서 신경 써야 할 사항들을 구체적으로 제시합니다. 마스다 토루씨도 컨퍼런스후에 열린 맥주파티에서 이야기 할 수 있는 기회가 있었는데 제 아버지 연배임에도 개발 전반에 대해 이야기가 잘 통해서 놀랐습니다. (특히 클라이언트 뒷담화)

세션 내용을 요약하면
- 커뮤니케이션의 불완전함이 결국 모델의 불완전함으로 이어진다. 완벽한 소통을 위해서는 움직이는 프로그램을 하루라도 빨리 고객에게 제공하고 피드백을 받아야 한다. (위 세션 내용과 거의 같은 맥락임)
- 도메인 모델을 가능한한 잘게 나눌것
- 도메인 층을 UI.데이터베이스,외부인터페이스와 분리하여 관리할것
- 확장성을 생각한답시고 복잡하게 디자인하지 마라. 눈에 보이는것을 구현하는것으로 충분할 때가 많다.
- 도메인 오브젝트는 작명에 신경쓰고, 작게, 잘게.
- 무조건 작게 만들라! -예) 클래스는 50줄 이내, 메소드는 3줄 이내, 팩키지는 10파일 이내. 커지는것은 결국 재사용을 어렵게 하고 리팩토링을 힘들게 하여 점점 프로그램을 망가트린다.
등등등.. 암튼 적다보니 상당히 알찬 세션이였구나 하는 생각이 듭니다.

끝나고보니 버벅대는 영어로 들이대며 다닌 데다가 잘 못하는 술에 맥주한잔 마시고 얼굴이 벌게서 돌아다닌게 생각나 챙피한 하루였습니다. 요번 골든위크 연휴때는 조용히 집에서 에릭 에반스의 Domain Driven Design 이나 정독해 봐야겠습니다.

2013년 2월 19일 화요일

책 이야기 - 문장강화

문장강화.


대학교 교양수업시간에 읽은 이후 언제 다시한번 정독해야지 하고는 18년 이라는 세월이 흘러버렸다. (연수를 꺼내니 갑자기 울컥해진다.)

3년전 구입해서 충분히 숙성된 이 책을 지난 주말 아침 마눌님께서 주무시는 틈을 이용해서 읽어 보았다.


이 책의 놀라운점은 무려 쓰여진지 70년이 넘은 책 임에도 오늘날 글쓰기에 유용한 책을 거롤하는 자리에는 꼭 그 이름이 등장한다는 점과 책의 내용이  "고칠수록 좋아지는 것은 문장의 진리다" 라는 한줄로 요약이 된다는 점 일 것이다.

주옥같은 예문들은 읽는것 만으로도 내공이 쌓이는것을 느끼게 해 주는 말 그대로 무림 비급이라 할 수 있겠다.

집이 좁은 나같은 사람에게도 부담없이 eBook으로도 나와 있으니 모쪼록 글쓰기에 목마른 사람들에겐 꼭 읽어볼 것을 추천한다.

책을 다 읽고 보니 문득 옆에 놓여져 있는 맨먼스 미신에도 눈길이 간다. 문장강화에 비해서는 한참이나 어리지만 아직까지 읽히는 컴퓨터 관련 서적으로서는 최고령 (1975년 초판발행)이 아닐까 싶다.



뛰어난 통찰은 시대를 뛰어넘는다.