»
S
I
D
E
B
A
R
«
[책리뷰] 박시백의 조선왕조실록 (1~5권)
Dec 9th, 2015 by Wegra Lee

외우는 걸 지극히 싫어하는 성격 탓에 학창 시절 역사를 멀리해서인지, 가장 가까운 왕조이자 여러 매체를 통해 손쉽게 접할 수 있는 조선에 대해서는 잘 모르고 살아왔다. 그러다 업을 바꾸고 당장 절실해진 인문학 소양 쌓기에 재미 붙이고 살던 어느 날, 부담없는 만화로 멋드러지게 차려낸 한 세트의 이 책을 본 바로 그 날.. 어느새 내 손가락은 구매 버튼을…

총 20권인데 겸사겸사 부모님 댁에 두고 갈 때마다 조금씩 읽느라 아직 5권, 조선 건국부터 세조 때까지밖에 읽지 못했다.

지금까지의 큰 느낌은..

1. 등장인물이 너무 많아 종종 누가 누군지 헷갈린다. 500년치를 20권에 담다보니 어쩔 수 없는 부분일 것이다.

2. 나라를 잘 다스리기위한 정책, 토론, 업적은 거의 없고 온갖 암투로 얼룩진 권력 투쟁 이야기가 주를 이룬다. 권력 앞에서는 형제도 없고 애비도 없고 마누라도 없다. 그러니 조카 따위야 말해 무엇하랴. 외척도 다 죽이고 공신도 다 죽이고 형제도 다 죽인다. 이 책과 <왕좌의 게임>을 같은 시기에 보았는데, 전 편 주인공들이 너도나도 손잡고 목이 잘려나가는 모습이 아주 인상적이었다. <왕좌의 게임>쪽은 그래도 가상의 드라마지만, <조선왕조실록>은 우리 역사고 조상이란 점에서 안타까운 마음이…

3. 실록이라 함은 왕도 볼 수 없는 객관적 자료라고 하지만, 이 역시 힘을 가진 자의 시선에서 쓰인 것임을 드러내는 정황이 너무 자주 나온다. 오늘도 나라를 지배하고 계신 악당들께서 과거를 지우는 순간을 살고 있어 씁쓸함이 한층 더해진다.

지금까지는 유쾌한 역사는 아니었다. 이후로도 임진왜란, 병자호란, 일제 침략 등 나라를 뒤흔드는 큰 난들이 잔뜩 기다리고 있지만, 중간중간 자랑스럽고 뿌듯한 이야기들도 펼쳐지길 기대해보며 우선은 여기까지 정리해본다.

[책리뷰] ‘앵무새 죽이기’와 ‘파수꾼’
Dec 8th, 2015 by Wegra Lee

<앵무새 죽이기>라는 책 제목은 숱하게 들어온 고전 명작이지만 아직 읽어보지 못했는데, 같은 저자의 새로운 책 <파수꾼> 출간에 맞춰 광고를 하기에 함께 사서 읽게 되었다.

먼저 주의할 점 하나.
<파수꾼>은 <앵무새 죽이기>의 후속작이 아니다. 두 책은 완전히 다른 책이라 생각하고 읽기를 권한다.

두 책은 같은 저자가 같은 주인공들을 내세워 시대만 바꿔 같은 주제를 말하다 보니 속편 혹은 후속편으로 오해하기 쉽다. <앵무새 죽이기>가 워낙 오래된 책이라 많이들 이미 읽은 탓도 있지만, 출간 시점과 시대 배경 면에서는 <파수꾼>이 더 최근이다 보니 대부분 독자가 <파수꾼>을 나중에 읽게 된다. 하지만 작가가 처음 쓴 원고는 <파수꾼>이다. 애초에 <앵무새 죽이기>는 작가의 기획이 아니었다. <파수꾼> 원고를 검토한 편집자가 작가에게 주인공이 어렸을 때를 배경으로 1인칭 시점으로 다시 써보라 하여 탄생한 명작이 바로 <앵무새 죽이기>다.

즉 작가는 애초에 두 책을 시리즈로 기획하지 않았고, <파수꾼>이 <앵무새 죽이기>로 ‘대체’된 것이다. 그래서 작가가 말하고자 하는 주제는 거의 겹치면서 설정상에는 모순이 몇 개 나타난다. 그래서 <파수꾼>을 후속편이라 생각하고 읽으면 재미도 떨어지고 거슬리는 설정도 눈에 들어온다.

둘을 다른 책으로 본다면.. 비슷한 시대에 미국 사회의 흑인 인권이라는 같은 주제로 쓰인 경쟁작이라 볼 수 있다. 그렇다면 둘 중 더 나은 책은? 내 선택은 <앵무새 죽이기>다.

가장 큰 차이는 이렇다.
<파수꾼>의 주인공은 20대 중반의 배운 여성이다. 그리고 이야기에서 상당한 비중을 차지하는 그녀의 아버지는 변호사고 삼촌은 박사다. 즉, 문제의식을 직접적으로 이야기하며 어려운 비유와 용어가 많이 섞여 있다.
이와 달리 <앵무새 죽이기>는 어린 여자아이의 1인칭 시점으로 서술되었다. 천진난만한 아이의 눈으로 인권이라는 어려운 주제를 직접적으로 논하기도, 온전히 이해하기도 어렵다. 직접 드러낼 수 없다는 한계 덕분에 작가는 더 그럴싸한 사건을 만들고 더 어려운 비유를 동원한다. 그 분위기와 흐름에서 독자가 더 깊이 고민하고 빠져들게 한다. 그리고 이 일을 아주 멋지게 해냈다. 간접적이되 더 분명한 메시지 전달. 이것이 <앵무새 죽이기>가 수십 년간 사랑받아온 원동력일 것이다.

마지막으로..
<파수꾼>은 단 1개월 만에 번역되었다. 이 짧은 기간에 이 정도 분량의 책을 이 정도 품질로 번역한 사실도 물론 놀랍지만, 원문을 올바로 옮기기 위해 역자가 공부하고 조사한 내용이 실로 감탄을 금할 수 없다. 번역 몇 권 해보고 편집 일 좀 하면서 조금 만만하게 보던 나 자신을 부끄럽게 하는.. 내겐 특별한 의미가 있는 작품이다.

[책리뷰] 그로스 해킹
Oct 15th, 2015 by Wegra Lee

48614827

이 책이 처음 판매 순위에 올랐을 때 난

“뭐야? 내가 싫어하는 보안 책이 또 나왔군”

하며 저 멀리 관심 밖으로 밀어뒀다.

그렇게 볼 일 없을 것 같던 책이었는데.. 어느날 누군가가 무슨 이유에선지 내게 이 책을 주고가서.. 예의상 거들떠보게 되었다. 그런데..

“잉! 보안 책이 아니잖아!”

그렇다. 이건 스타트업을 위한 ‘마케팅‘ 책이었다. 그래서 마케팅 쪽 사람에게 그로스 해킹이 뭔지 아냐고 물어보니.. 모른단다.

그렇다. 이건 기존 마케팅 이론과 다른.. 말하자면 마케팅 분야에서의 스타트업이라 할 수 있는 이론, 혹은 실천법이라 할 수 있다.

이쯤에서 그로스 해킹이 무엇인지 알아보자.

그로스 해킹(growth hacking): 그로스 해킹은 전통적인 마케팅 교본을 집어 던지고, 그 자리를 검증 가능하고 추적 가능하며 확장 가능한 고객 확보 기법들로 대체하는 사업 전략이다. 전통적인 마케팅 도구가 광고, 홍보, 돈이었다면 그로스 해킹 도구는 이메일, 클릭당 지불 광고, 블로그, 플랫폼 API이다. 전통적인 마케팅에서는 ‘브랜딩’과 ‘마인드 공유’ 같은 모호한 개념들을 추구하는 데에 반해 그로스 해커들은 끊임없이 이용자와 성장을 추구한다. 그리고 그로스 해킹이 제대로 먹혔을 때 이 이용자들은 더 많은 이용자들을 만들며, 늘어난 이용자들은 더욱더 많은 이용자들을 끌어들인다. 그로스 해킹 기법은 스타트업을 아무 것도 아닌 것에서 위대한 것으로 변화시키는 성장 머신으로써 스스로 존속하고 자가 증식하는 창조적 존재이자 운영자이며 시스템이다.

-『그로스 해킹』(길벗, 2015)

내 나름 정의해보면 이렇다.

그로스 해킹은 제품의 성장(그로스) 원리를 파악해 그 핵심을 해킹하는 마케팅 실천 기법이다.

무슨 말인지 모르겠다면.. 최근 수년 간 급속히 성장한 스타트업들이 활용한 새로운 마케팅 기법들을 특징을 정리하고 방법론을 제시한 것이라 보면 된다. 드랍박스, 넷플릭스, 페이스북, 구글 등 여러 예가 나온다. 평소 스타트업 성공 스토리에 관심 많은 사람에게는 그 이야기 하나하나는 이미 잘 알고 있겠지만, 이 책은 그 방식들을 일관된 방법론으로 정립하려 시도한다는 점에서 여전히 읽어볼만할 것이다.

단순한 정립에서 그치지 않고 이 책 자체의 홍보에도 저자가 터득한 그로스 해킹을 적용해보았고, 성공적이었다. 그 방법도 책에 실려 있다. 한 발 더 나아가, 역자는 한국의 성공적인 스타트업들을 인터뷰하여 그들이 활용한 그로스 해킹 이야기까지 잔뜩 실었다.

스타트업을 이끄는 사람과 스타트업을 생각하는 사람들.. 기존 사업에서 새로운 방식의 마케팅을 시도해보고 싶은 사람들에게 권할만한 책이다.

at [개앞맵시 스타트업편]

어서 와! 번역은 처음이지?
Sep 17th, 2015 by Wegra Lee

‘막연히 번역 한 번 해보고 싶은 분’,
‘번역 과정이 궁금하신 분’,
‘글 좀 잘 써보고 싶으신 분’

을 위한 유쾌! 발랄! 부끄! 안내서입니다.

첨 쓰기 시작한 게 1년 반은 된 거 같은데, 묶혀뒀다가 이제서야 오픈합니다.

아래 그림을 클릭하면 링크로 갑니다.

번역

자바 8에서 새로워진 점 : 다람쥐
Sep 15th, 2015 by Wegra Lee

람다를 다람쥐로 바꿔봤습니다 ㅋㅋ

원문은 여기에..

__

자바 8에서 새로 추가된 가장 멋진 기능의 소개

Madhusudhan Konda자바 8이 다람쥐와 함께 등장했다. 늦은 감은 있지만 다람쥐는 프로그래밍 스타일과 전략을 제고하게 할 수도 있는 놀라운 기능이다. 특히 함수형 프로그래밍을 가능하게 해준다.

자바 8에서 가장 눈에 띄는 변경 사항은 다람쥐지만 함수 인터페이스(functional interfaces), 가상 메소드, 클래스와 메소드 참조, 새로운 시간/날짜 API, 자바스크립트 지원 등 다른 새로운 기능도 많이 있다. 여기에서는 자바 8로 넘어가려는 사람이라면 꼭 알아야 하는 다람쥐와 관련 기능에 대해 주로 다룬다.

이 글에 나오는 모든 예제 코드는 이 git 저장소에 있다.

다람쥐란 무엇인가?

다람쥐는 간결하게 표현된 단일 메소드 클래스를 말하며 어떤 행동을 정의한다. 다람쥐는 변수에 할당되거나 데이터를 인수로 전달하듯이 다른 메소드에 전달될 수 있다.

어쩌면 이런 것을 나타내기 위해 새로운 함수형이 필요할 것이라고 생각할 수도 있지만 자바 제작자들은 하나의 추상 메소드를 가지는 인터페이스를 다람쥐의 타입으로 정했다.

자세한 얘기를 하기 전에 몇 가지 예를 살펴보자.

다람쥐 표현의 예

다음은 다람쥐 표현의 예이다.

// Concatenating strings
(String s1, String s2) -> s1+s2;

// Squaring up two integers
(i1, i2) -> i1*i2;

// Summing up the trades quantity
(Trade t1, Trade t2) -> {
  t1.setQuantity(t1.getQuantity() + t2.getQuantity());
  return t1;
};

// Expecting no arguments and invoking another method
() -> doSomething();

문법이 생소하게 느껴진다면 코드를 다시 한 번 보기 바란다. 처음에는 좀 이상해 보일 수 있는데, 문법에 대해서는 다음 절에서 설명하기로 한다.

이 표현을 위해 어떤 타입이 사용되었는지 궁금할 것이다. 다람쥐의 타입은 함수 인터페이스로 이에 대한 설명은 뒤에서 한다.

다람쥐 문법

다람쥐 표현을 생성하고 나타내기 위해서는 특별한 문법이 필요하다. 평범한 자바 메소드와 마찬가지로 다람쥐 표현에는 인수, 본문, 경우에 따라 반환값이 있다. 아래에서 방금 설명한 내용을 볼 수 있다.

input arguments -> body

다람쥐 표현은 화살표를 중심으로 두 부분으로 나뉘어진다. 왼쪽은 메소드의 인수이고 오른쪽은 이 인수로 할 일인데 예를 들어 비즈니스 로직 같은 것이다. 본문은 하나의 표현식이거나 코드 블록이고 결과값을 반환할 수도 있다.

첫 번째 다람쥐 표현 (String s1, String s2) → s1+s2에서 화살표(→)의 왼편이 메소드의 인수 리스트로 두 개의 문자열로 이루어져 있다. 메소드의 오른편을 보면 이 메소드로 구현하려는 로직을 볼 수 있다.

위의 예는 두 개의 문자열이 주어졌을 때 그 둘을 합치는 것이다. 메소드에 로직을 넣으려면 화살표의 오른쪽에 오면 되는데 앞의 예에서 로직은 두 개의 인수를 더하는 것이다. 오른편에 올 수 있는 것은 문장, 표현식, 코드 블록, 다른 메소드 호출 등이다.

다람쥐의 타입: 함수 인터페이스

앞에서 다람쥐의 타입이 함수 인터페이스라고 했다. 자바는 강타입 언어이므로 보통은 타입을 선언해야만 한다. 그렇지 않으면 컴파일 단계에서 문제가 될 것이다. 하지만 위에서는 다람쥐 표현을 타입 없이 선언하였다. 그러면 다람쥐의 타입은 무엇일까? 문자형이나 객체, 혹은 새로운 함수형일까?

다행히 새로 추가된 타입은 없다. 자바 제작자들은 다람쥐를 위해 어떠한 특별한 타입도 도입하지 않고 대신 기존의 익명 메소드를 재사용하였다. 우리는 이미 익명 클래스에 대해서 익숙하므로 익명 메소드를 선택한 건 비교적 자연스러운 결과이다.

함수 인터페이스는 정확히 하나의 추상 메소드를 가진 인터페이스로 다음 두 가지를 제외하면 일반적인 인터페이스와 똑같다.

  • 정확히 하나의 추상 메소드를 가진다.
  • 다람쥐 표현으로 사용하기 위해 @FunctionalInterface 주석(annotation)을 붙일 수 있다. (이렇게 하는 것을 강력히 권장함)

자바에는 여러 가지 단일 메소드 인터페이스가 있는데 이들이 전부 보강되어 함수 인터페이스로 쓸 수 있게 되었다. 직접 함수 인터페이스를 만들려면 추상 메소드가 하나인 인터페이스를 정의하고 @FunctionalInterface 주석을 위에 추가하기만 하면 되는 것이다.

예를 들어 아래의 짧은 코드는 IAddable 인터페이스를 정의한다. 이것은 함수 인터페이스로 타입이 T인 동일한 것 두 개를 더하는 일을 한다.

@FunctionalInterface
public interface IAddable<T> {
    // To add two objects
    public T add(T t1, T t2);
}

이 인터페이스가 정확히 하나의 추상 메소드를 가지고 있고 @FunctionalInterface라는 주석도 있기 때문에 다람쥐 함수를 위한 타입으로 사용할 수 있다.

다음은 위에서 설명한 IAddable 함수 인터페이스의 사용 예이다.

// Our interface implementations using Lambda expressions
// Joining two strings?note the interface is a generic type

IAddable<String> stringAdder = (String s1, String s2) -> s1+s2;

// Squaring the number
IAddable<Integer> square = (i1, i2) -> i1*i2;

// Summing up the trades quantity
IAddable<Trade> tradeAdder = (Trade t1, Trade t2) -> {
  t1.setQuantity(t1.getQuantity() + t2.getQuantity());
  return t1;
};

IAddable이 범용 타입 인터페이스이므로 위의 예에서와 같이 각기 다른 타입을 더할 때 사용할 수 있다.

요약하자면 다람쥐 표현의 타입은 다람쥐 표현을 통해 구현하려고 하는 함수 인터페이스인 것이다.

일단 구현이 되면 해당 메소드를 호출하는 방식으로 우리의 클래스에서 사용할 수 있다. 다음 예를 보면 위에서 구현한 것이 어떻게 사용되는지 알 수 있다.

// A lambda expression for adding two strings.
IAddable<String> stringAdder = (s1, s2) -> s1+s2;

// this method adds the two strings using the first lambda expression
private void addStrings(String s1, String s2) {
  log("Concatenated Result: " + stringAdder.add(s1, s2));
}

계속하기 전에 지금까지의 내용을 정리해보자. 중요한 점은 비즈니스 로직을 여기저기로 전달할 수 있는 함수의 형태로 다루게 된다는 것이다. 이전과 달리 클래스를 만들지 않고도 비즈니스 로직의 다양한 변형을 순식간에 정의할 수 있다.

이렇게 해서 다람쥐 표현과 타입에 대해 알게 되었으니 다람쥐를 이용한 제대로 된 예를 살펴보자. 동시에 자바 8과 그 전 버전의 차이도 비교할 것이다.

다람쥐의 사용 예

우리가 하려는 것은 한 사람에 의한 거래 두 건을 합치는 비즈니스 로직을 만드는 것이다. 아래에서 이런 요구를 해결하기 위해 자바 8과 그 전 버전을 각각 사용하는 예를 보인다.

자바 8 이전의 구현

자바 8 이전에는 아래 테스트 클래스와 같이 구체적인 정의가 있는 인터페이스를 사용해야 했다.

public void testPreJava8() {
  IAddable<Trade> tradeMerger = new IAddable<Trade>() {
  @Override
    public Trade add(Trade t1, Trade t2) {
      t1.setQuantity(t1.getQuantity() + t2.getQuantity());
      return t1;
    }
  };
}

여기에서 인터페이스를 사용하는 클래스를 만들고 클래스 객체에 더하는 메소드를 적용하였다.

거래를 합치는 것이 핵심적인 비즈니스 로직이지만 인터페이스를 사용하거나 추상 메소드 오버라이딩, 객체 만들기와 그 객체로 뭔가 하는 것과 같이 추가적인 일을 해야 한다. 이런 “초과 수하물”은 항상 비판을 불러 일으키고 개발자들을 힘들게 한다. 비즈니스 로직 하나를 위해 틀에 박힌 코드와 의미 없는 구현을 하게 만드는 것이다.

클래스의 객체를 얻고 나면 해당 메소드를 호출하는 일반적인 절차를 아래에서 볼 수 있다:

IAddable addable = ....;

Trade t1 = new Trade(1, "GOOG", 12000, "NEW");
Trade t2 = new Trade(2, "GOOG", 24000, "NEW");

// using the conventional anonymous class..
Trade mergedTrade = tradeMerger.add(t1,t2);

비즈니스 로직은 기술적인 목적의 세부 사항들과 얽혀있고 핵심 로직은 클래스 구현과 밀접하게 연관되어 있다. 예를 들어 위에서 합쳐진 거래를 반환하는 대신 두 거래 중 큰 건을 반환해야 한다면 한숨을 한 번 쉬고 커피를 한 모금 마시고, 끙 소리도 낸 후 팔을 걷어 부치고 코드를 다시 쓸 준비를 해야 할 것이다.

또 로직을 바꾸고 나면 기존의 시험 코드가 돌지 않음은 물론이다.

게다가 이런 경우가 한 다스쯤 있다면 어쩔 것인가? 아마 기존 메소드에 조건문 등을 추가해서 고치거나 아예 새로 클래스를 만들어야 할 것이다. 비즈니스 로직과 클래스 구현이 밀접하게 연결되어 있는 것은 골치 아픈 일이다. 특히 변덕스러운 경영 분석가와 프로젝트 관리자가 있을 경우에는 말이다. 분명 뭔가 더 좋은 방법이 있을 것이다.

자바 8에서의 구현

익명 클래스를 이용해서 여러가지 일을 하는 것도 가능하지만 최선은 아니다. 다양한 작업을 하는 다람쥐를 써서 이 문제를 간단히 해결할 수 있다. 예를 들어 거래액을 합하거나 더 큰 거래를 반환하거나 거래 정보를 암호화하는 다람쥐 표현을 작성할 수 있다. 우리는 각각의 경우에 맞는 다람쥐 표현을 만들고 필요로 하는 클래스에 이 다람쥐 표현을 건네주기만 하면 된다.

예를 들어 우리의 경우를 위한 다람쥐 표현을 살펴보자.

// Summing up the trades quantity
IAddable<Trade> aggregatedQty = (t1, t2) -> {
  t1.setQuantity(t1.getQuantity() + t2.getQuantity());
  return t1;
};

// Return a large trade
IAddable<Trade> largeTrade = (t1, t2) -> {
 if (t1.getQuantity() > 1000000)
   return t1;
 else
   return t2;
};

// Encrypting the trades (Lambda uses an existing method)
IAddable<Trade> encryptTrade = (t1, t2) -> encrypt(t1,t2);

여기를 보면 각각의 함수에 대해 다람쥐를 선언하였고 메소드는 다음과 같이 다람쥐에 맞도록 만들어졌다.

//A generic method with an expected lambda
public void applyBehaviour(IAddable addable, Trade t1, Trade t2){
  addable.add(t1, t2);
}

메소드는 충분히 범용적이라 주어진 다람쥐 표현(IAddable 인터페이스)을 써서 임의의 두 거래에 적용할 수 있다.

이제 클라이언트는 행동을 담당하고 그것을 사용하기 위해 원격 서버에 전달한다. 이런 방법으로 클라이언트는 무엇을 할 지를 고민하고 서버는 어떻게 할 지를 담당한다. 인터페이스가 다람쥐 표현을 받아들이도록 만들어지는 한, 클라이언트는 다수의 이런 다람쥐를 생성하고 메소드를 호출할 수 있다.

마무리를 하기 전에 다람쥐를 지원하는 Runnable 인터페이스가 어떻게 사용되는지 알아보자.

Runnable 함수 인터페이스

가장 인기있는 Runnable 인터페이스는 인수도 없고 반환값도 없는 메소드 하나를 가진 형태이다. 이유는 속도 향상을 위해 로직을 별도의 쓰레드에서 실행하기 위함이라고 할 수 있다.

Runnable 인터페이스의 새로운 정의와 익명 클래스를 이용한 구현 예시는 다음과 같다:

// The functional interface
@FunctionalInterface
public interface Runnable {
  public void run();
}

// example implementation
new Thread(new Runnable() {
  @Override
  public void run() {
    sendAnEmail();
  }
}).start();

보면 알겠지만 이런 방식의 익명 클래스 생성과 사용은 매우 장황하고 보기에 안 좋다. 위의 메소드에서 sendAnEmail()를 제외하면 나머지는 반복적이고 틀에 박힌 코드이다.

같은 Runnable이 이번에는 다람쥐 표현을 위해 다시 작성될 수 있음을 아래에서 볼 수 있다:

// The constructor now takes in a lambda
new Thread( () -> sendAnEmail() ).start();

위에서 강조된 다람쥐 표현 () → sendAnEmail()은 쓰레드의 생성자로 넘겨진다. 이 표현식은 (새 쓰레드에서 항상 이메일을 보내는 등의) 어떤 행동을 전달하는 실제 코드 (Runnable의 인스턴스)임에 주의하자.

표현식을 보면 다람쥐의 타입을 추정할 수 있는데 이 경우 Runnable이다. 왜냐하면 쓰레드의 생성자가 Runnable을 받는다는 것이 잘 알려져 있기 때문이다. 새로 정의한 인터페이스 정의를 눈치챘다면 Runnable은 함수 인터페이스이므로 @FunctionalInterface로 태그되었다. 다람쥐 표현은 변수를 선언하고 할당하는 것과 마찬가지로 클래스 변수에 Runnable r = () → sendAnEmail() 로 할당될 수 있다.

이것이 다람쥐의 강점이다. 다람쥐는 데이터를 담는 인수를 전달할 때와 같이 행동을 메소드에 전달할 수 있게 한다.

유일한 목적이 서로 다른 쓰레드에서 요청 사항을 실행하는 서버측 클래스(AsyncManager)가 있다고 가정해보자. 이것은 다음과 같이 Runnable을 받는 단일 메소드 runAsync를 가진다.

public class AsyncManager{
  public void runAsync(Runnable r) {
    new Thread(r);
  }
}

클라이언트는 요구 사항에 맞춰 많은 다람쥐 표현을 만들어낼 수 있다. 예를 들어 다음과 같이 서버측 클래스에 전달될 수 있는 다양한 다람쥐 표현이 있다.

manager.runAsync(() -> System.out.println("Running in Async mode"));
manager.runAsync(() -> sendAnEmail());
manager.runAsync(() -> {
  persistToDatabase();
  goToMoon();
  returnFromMars();
  sendAnEmail();
});

요약

이번 글에서 자바 역사상 가장 큰 변화에 대해 설명하였다. 다람쥐는 자바의 나아갈 방향을 제시하고 다양한 개발자 커뮤니티를 자바로 끌어들일 것이다. 2부에서는 함수 인터페이스에 대해 다룬다.

예비 저자를 위한 ‘독자 페르소나’ 활용 소개
Sep 8th, 2015 by Wegra Lee

곧 출간할 『프로젝트 성패를 결정짓는 데이터 모델링 이야기』의 원고 검토를 위해 저자와 함께 써 본 독자 페르소나(persona)입니다. 페르소나는 대상 독자층을 명확히 드러내 책 전반에 걸쳐 글의 흐름, 다루는 내용, 깊이(난이도)를 일관되게 유지하는 데 큰 도움을 줍니다. 중간중간 스스로 페르소나의 인물이 되어, 혹은 원고를 검토해줄 지인에게 페르소나를 함께 건네주어 독자의 눈높이에서 글을 바라보는 것이죠.

내 책을 읽어 줄 독자가 얼마나 되는가를 대략 가늠해보는 수단이 되기도 합니다.

처음 책을 써보려 하는 예비 저자께 특히 강추합니다. ^^

__

인적사항: 나독자 / 32세 / 남자
직업: 소프트웨어 개발자 (주로 백엔드)
경력: 컴퓨터학부 졸업, 입사 4년차
성격: 자기 실력을 믿고, 그 결과에서 자부심을 얻고 싶어한다.
좌우명: “백년주택은 뼈대에 돈이 많이 든다” [출처]
싫어하는 말: 대충대충. 돌아가기만 하면 되지.
고객의 목소리: 내게 데이터 모델링의 원리를 깨우쳐줄.. 잘하고 있다는 확신을 갖게 해줄 멘토가 필요해!

개발 경험 / 숙련도:
* 언어: 자바(중고급), SQL(초중급)
* 데이터 모델링(초급) 학부 때 데이터베이스 과목은 수강하였다.
… 회사에서는 주로 선임 개발자나 전문 모델러가 건네준 설계대로 구현하는 역할을 하였다(SQL 정도는 부담없이 사용한다).
… 구체적인 모델링 원리와 이론은 가물가물하지만 책/검색 등으로 금방 기억을 떠올릴 수는 있다.
… 실무/응용 경험이 부족해 막히는 경우가 잦고, 해 놓고도 제대로 했는지 스스로 확인할 수 없다.

상황 (맥락, 니즈, 행동 패턴, 문제점):
나독자는 입사 후 3년 동안 몇 개의 프로젝트를 경험하며 애플리케이션 개발에 나름 자신이 붙고 있었다. 항상 시간에 쫓겨 버그투성이의 프로그램을 개발하던 것에서 차츰 벗어나, 이제는 요구사항을 정확히 만족하면서 효율적이고 안정적인 코드를 만들어 내고 있다. 객체지향 방법론과 패턴도 적용해가며 이제 큰 부끄럼 없이 남에게 코드를 보여주고 설명할 수 있는 수준이 되었다.
그런데 이번에 새로 시작한 프로젝트는 업무도 낯설고 그동안 해보지 않았던 데이터베이스 설계 역할을 맡게 되었다. 처음엔 객체 설계랑 비슷하려니 생각했지만 막상 해보니 곧 또 다른 세상임을 깨달았다. 결과적으로 초반의 데이터 모델링 진도는 지지부진하여, 몇 년 만에 느껴보는 부담감이 커졌다. 신입 때는 잘 몰라도 ‘신입이니까’라 생각하며 편히 지낼 수 있었지만, 뒤에서 지켜보는 후임도 생긴 지금의 부담은 여태껏 느껴보지 못한 무게다.
그간 직접 체험과 주변 사례를 통해 ‘일단 돌아가게 만들기’의 폐해를 잘 알고 있다. 이번에도 어찌 되었든 돌아가게는 만들겠지만, 원리를 깨우쳐 제대로 확신을 가지고 진행하고 싶다.
인터넷과 몇몇 서적을 훑어보았다. 하지만 인터넷에서 찾은 지식은 단편적이고, 책들은 마치 수험서처럼 아주 작은 것까지 모두 설명하려 하거나 너무 성능 최적화에 치우친 느낌이다. 모델링 전체를 관통하는 본질적인 이야기는 찾을 수 없었다. 어쩌면 너무 많은 잔가지와 디테일에 파묻혀 눈에 띄지 않았을지도 모르겠다.

목표:
후임에게 부끄럽지 않도록 새로운 프로젝트와 역할에 성공적으로 안착한다.
객체지향과 패턴의 원리를 깨우쳐 코딩에서 자신감을 얻었듯, 데이터 모델링도 그 본질적 원리를 제대로 깨우친다.
깨달은 원리를 바탕으로 앞으로 어떤 과제가 맡겨져도 완수할 수 있다는 자신감을 얻는다. 물론 계속 고민하고 더 배워야겠지만.. ^^

색다른

개앞맵시 컨셉을 한 장에~
Sep 2nd, 2015 by Wegra Lee

페북 페이지 커버 사진으로 쓰려고 편집한 그림인데, 만들고 나니 개앞맵시 컨셉을 한 장에 잘 보여줘서 여기에도… ㅎㅎ

원본은 여기~

개앞맵시 커버

[개앞맵시] 스타트업편
Aug 26th, 2015 by Wegra Lee

올만에 새로운 맵을 추가했다.

도전과 창의의 세계, 스타트업에 뛰어들려는 사람들을 위한 가이드. 처음 공개하는 현 버전의 구성은 아래와 같고, 총 48권의 책을 담았다.

개앞맵시_스타트업

https://www.mindmeister.com/568091418

스타트업을 살짝 경험해보긴 했지만 아는 게 많지 않아서 일단 이 정도로 시작.. 사람들이 많이 참여해서 하루 빨리 멋진 가이드로 성장하길 기대해본다.

책은 어떻게 써? (첫 책을 꿈꾸는 개발자를 위한 ‘엉성한’ 집필 요령)
Jul 28th, 2015 by Wegra Lee

최근 한 지인 개발자가 책을 쓰고 싶다며 ‘일반적인 책 집필 방법 좀 알려달라’는 상당히 추상적인 질문을 던졌다.
러프한 질문이라 러프하게 답할 수밖에 없는데..
어쨌든 같은 궁금증을 가진 사람이 또 있을 듯해서 여기에도 옮겨본다.
깊은 고민 없이 휘갈겨서 허점이 많을 테니 양해를.. ㅎㅎ
질문자가 개발자라 개발자가 이해하기 쉽게 작성해 보았다.
뭐, 소프트웨어 제품 만드는 거랑 비슷하고 보시면 될 거 같아요.
  1. 시장을 분석하고(시장 규모, 트랜드, 경쟁 서적, 잠재 독자가 어떤 걸 원하는지)
  2. 컨셉을 잡고(책 주제, 독자층, 차별점)
  3. 설계를 하고(목차 잡기, 자료 조사)
  4. 구현하는 거죠(집필).
시장 분석은
  • 분야 경쟁서가 있다면 아마존 랭킹이나 예스24 판매지수 등으로 시장 크기와 트랜드를 꽤 정량적으로 알 수 있어요.
  • 경쟁서가 없다면 정성적으로 가야겠죠. 업계 기술 트랜드라거나..
컨셉 잡을 때는
  • 분야 1등을 노릴 것이냐, 차별화해서 시장을 가를 것이냐 고민해보시고,
  • 대상 독자가 초 -> 중 -> 고로 갈수록 판매량은 급격하게 떨어지니 참고하시고요.
  • 대표적인 전문서 유형으론 바이블, 레퍼런스, 따라하기, 주제별 심화 내용, 에세이 등이 있습니다.
  • 책 제목, 부제, 홍보 카피, 책 소개 문안(3~5줄 정도)도 꼭 고민해보세요. “나 이런 책을 쓰고 있다”고 남에게 이야기할 수 있을만큼 해주세요. 책의 정체성이 확립되어 이후 단계에서 등대 같은 역할을 해줄 겁니다.
설계 단계에서는
  • (시스템 워크플로 그려보기)
    대상 독자의 수준과 관심사를 고려해서 차근히 단계를 정하고
  • (필요한 모듈을 추출하고 핵심 인터페이스 정하기)
    목차는 장과 절 수준까지는 구체화하는 게 좋습니다
  • (프로토타이핑)
    각 장과 절에서 무슨 이야기를 할 지 3~5줄 내외로 요약해 보세요. 시작 문단과 끝 문단을 적어보는 것도 좋습니다.
구현 단계에서는..
  • 설계 단계에서 비워놓은 것들을 하나씩 채워야죠. ^^ 요건 요령이 너무 많고, 사람마다 현 수준이나 성향이 다양해서 짧게 정리하기엔 무리가 있습니다. case by case라 직접 쓴 원고로 편집자나 주변 글 잘 쓰는 분께 피드백 받는 게 가장 좋을 거에요.
  • 러프하게는 글쓰기 관력 책도 많고, (IT인들이 워낙 번역된 글을 많이 접해서) 역자를 위한 책도 우리글 잘 쓰기에 큰 도움이 됩니다. 개인적으론 일반 글쓰기 책보다 역자용 책이 더 좋더군요.
  • 코딩 잘하는 요령과 비슷한 거죠. <클린 코드>만 해도 550 페이지네요. ㅎㅎ
마지막으로..
집필 초보자라면 초기 단계부터 전문가와 논의를 해야 재집필하거나 노고를 헛되이하는 걸 막을 수 있습니다.
[책리뷰] 월요일의 그녀에게, 태도에 관하여
Jul 9th, 2015 by Wegra Lee

FullSizeRender-4

월요일마다 자꾸 농땡이 치는 그녀의 태도가 아니꼽다면 이 책을 선물하자!

나는 몰랐지만-_-;; 주변에선 유명하신 임경선 작가님의 책들이다.
<월요일의 그녀에게>는 기획에 필요하여 추천받아 읽게 되었다. 다년간의 직장 생활과 상담 경험을 토대로 현실을 삶의 자세에 관한 이야기를 잔잔한 어투로 풀어간다. 누구에게는 값진 조언이, 다른 이에게는 곱씹어볼 화두가 담겨있다.

<태도에 관하여> 마지막에 실린 김현철 님(정신과 전문의)과의 대담도 인상적이다. 제법 분량이 되지만, 머리말보다 오히려 책의 의도를 잘 전달해주는 느낌이다.

꿈은 없어도 되지만 내가 없으면 안 된다.

음… 솔직히 여성이 아니어서인지, 아니면 인간사가 그리 단순하지도 획일되지도 않아서인지, 공감되지 않는 에피소드나 상황 해석도 제법 있었다. 나는 나대로, 나만의 눈으로 삶을 바라보는 것도 나쁘지 않다. 아쉽지만 다른 분께 선물해버렸고, 내게는 스쳐 지나가는 책으로 기억에 남을 것이다.

»  Substance: WordPress   »  Style: Ahren Ahimsa