2009년 9월 30일 수요일

안철수 KAIST 석좌교수 "개발자가 성공하는 길"

데브멘토를 동영상 자료에 인터뷰 형태로 안철수 카이스트 석좌교수님의 "개발자가 성공하는 길"이 있다. 일단 판도라 TV에 동영상이 올라와 있어 해당 동영상을 가져왔다.


안철수 교수님의 강연이나 세미나이면 챙겨서 듣는 편인지라 업무시간임에도 불구하고 보게 되었다.
인터뷰 내용을 짧게나마 기억을 더듬어 살펴보면 다음과 같다.

1. 개발자가 성공하는 5가지 요건
- 전문지식(전문성)
- 창조적인 마인드(Creative Mind)
- 장인정신
- 커뮤니케이션 능력
- 팀워크(희생정신)

2. 추천도서
- 세계는 평평하다
- 좋은 기업을 넘어 위대한 기업으로
- 성공하는 사람들의 7가지 습관
- 티핑 포인트
- 아웃 라이어

3. 전망은 부질없다. 비전을 가져라.

4. 성공의 기준은 각자 다르다. 자신의 성공 조건을 기준으로 성공의 잣대를 세워야 한다.

기억을 더듬어 적다보니 자세한 내용을 적기는 힘들다. 그래도 좋은 내용인지라 가능한 기억해 두어야 한다. 다행히 추천도서 중에 세 권은 읽었네^^

HashMap의 key에 MultiKey object 사용해 보자.

자바가 Generic 프로그래밍 방식을 지원하면서 많은 자바 유틸 클래스중 Collection 객체들이 generic을 이용한다.

여기서 잠시 다루어 보려는 HashMap 컬렉션 유틸리티 객체도 generic을 이용한 코딩을 할 수 있다.
이와 같이 HashMap 클래스의 정의를 HashMap<K, V>로 하고 있다.

K : Key
V : Value

형태인데 key와 value에 generic을 이용하면 자바 클래스및 사용자 클래스를 줄 수 있다. 하지만 보통은 HashMap을 이용한 간단한 샘플 코드는 Integer 또는 String 을 이용한 코드가 대부분이다. 예를 들면 다음과 같다.

public class HashMap1
  {
  public static void main( String[] args )
    {
    HashMap map = new HashMap();
    map.add( new Integer( 2 ), "two" );
    map.add( new Integer( 4 ), "four" );
    System.out.println( map );
    System.out.println();

    System.out.println( "Enumerate the HashMap" );
    Enumeration e = map.elements();
    while ( e.hasMoreElements() )
      System.out.println( e.nextElement() );
    System.out.println();

    System.out.println( "Iterate through the HashMap" );
    for ( HashMapIterator i = map.begin(); !i.atEnd(); i.advance() )
      System.out.println( i.get() + ", key = " + i.key() + ", value = " + i.value() );
    System.out.println();

    System.out.println( "Demonstrate access" );
    System.out.println( "map.get( 2 ) = " + map.get( new Integer( 2 ) ) );
    System.out.println( "map.get( 5 ) = " + map.get( new Integer( 5 ) ) );
    System.out.println( "map = " + map );
    System.out.println();

    System.out.println( "Show that duplicates cannot be added." );
    Object value = map.add( new Integer( 8 ), "eight" );
    if ( value != null )
      System.out.println( "Could not add 8." );
    else
      System.out.println( "Added 8." );
    System.out.println( "map = " + map );

    value = map.add( new Integer( 4 ), "FOUR" );
    if ( value != null )
      System.out.println( "Could not add 4." );
    else
      System.out.println( "Added 4." );
    System.out.println( "map = " + map );
    System.out.println();

    System.out.println( "Demonstrate modification" );
    map.put( new Integer( 4 ), "FOUR" );
    System.out.println( "map = " + map );
    }
  }


위의 코드가 문제가 된다는 것은 아니다. 다만 HashMap의 Key에 해당하는 클래스가 두 개의 좌표값을 가진 클래스인 경우를 생각해 보자. UserKey라는 클래스는 두 개의 좌표(x, y) 값을 가진 간단한 클래스이다.

/**
 * @author Sang-Hyup Lee
 *
 */
public class UserKey {

private int x;
private int y;
/**
* @param x
* @param y
*/
public UserKey(int x, int y) {
super();
this.x = x;
this.y = y;
}

/**
* @return the x
*/
public int getX() {
return x;
}

/**
* @param x the x to set
*/
public void setX(int x) {
this.x = x;
}

/**
* @return the y
*/
public int getY() {
return y;
}

/**
* @param y the y to set
*/
public void setY(int y) {
this.y = y;
}
}

다음은 Value 클래스에 해당하는 UserValue 객체를 만들어보자.

import java.util.UUID;

/**
 * @author Sang-Hyup Lee
 *
 */
public class UserValue {

private int x, y;
private String uniKey;
public UserValue(int x, int y) {
this.x = x;
this.y = y;
this.uniKey = "" + UUID.randomUUID();
}
/**
* @return the uniKey
*/
public String getUniKey() {
return uniKey;
}

/**
* @param uniKey the uniKey to set
*/
public void setUniKey(String uniKey) {
this.uniKey = uniKey;
}

/**
* @return the x
*/
public int getX() {
return x;
}

/**
* @param x the x to set
*/
public void setX(int x) {
this.x = x;
}

/**
* @return the y
*/
public int getY() {
return y;
}

/**
* @param y the y to set
*/
public void setY(int y) {
this.y = y;
}

}

위의 두 개의 key, value 클래스를 이용하여 HashMap 테스트를 위한 JUnit 코드를 만들어보자. 아래의 UnikeyHashMap junit 코드의 결과값을 예상해 보자.

import java.util.HashMap;

import junit.framework.TestCase;

/**
 * @author Sang-Hyup Lee
 *
 */
public class UnikeyHashMap extends TestCase {

private HashMap<UserKey, UserValue> userHashMap = new HashMap<UserKey, UserValue>();
protected void setUp() throws Exception {
super.setUp();
for ( int x=0; x < 10; x++ ) {
int y = x + 1;
UserKey userKey = new UserKey(x, y);
UserValue sohiPoint = new UserValue(x, y);

userHashMap.put(userKey, sohiPoint);
}
}
public void testUnikeyHashMap() {
UserKey targetUserKey = new UserKey(2, 3);
/*
UserValue userValue = null;
if ( userHashMap.get(targetUserKey) != null ) {
userValue = userHashMap.get(targetUserKey);
}
*/
assertNotNull(userHashMap.get(targetUserKey));
// assertEquals(2, foundSohi.getX());
// assertEquals(3, foundSohi.getY());
}

}

주석문으로 처리된 부분은 UserValue가 정상적으로 찾았을 때를 대비해서 최종 체크하기 위한 코드이다. 적절한 형태로 사용해도 된다.

여기서 중요한 건 testUnikeyHashMap() 테스트가 정상적으로 동작할까? 하는 것이다.
결과는 에러를 리턴한다. 즉, userHashMap.get(targetUserKey)의 결과값이 null 이란 것이다. 일반적인 생각에는 Key를 주어진 Value를 찾아야 한다.
HashMap 클래스의 get 메소드를 따라가보면 문제가 발생한 곳은 파라미터로 받는 key object의 equals 메소드 구현에 있다는 것을 알 수 있다.

이미 이러한 문제는 실무에서 사용할 일이 많았던 거 같다. 즉 HashMap과 같은 Key를 가진 컬렉션 객체에 다중의(Multi) 값을 가진 key 객체를 사용하고 싶은 요구사항인 것이다.
Apache commons collections 오픈소스에 이에 대한 해답이 있다. MultiKey라는 클래스이다.

사용법은 다음과 같이 정의하고 있다.

Example usage:

 // populate map with data mapping key+locale to localizedText
 Map map = new HashMap();
 MultiKey multiKey = new MultiKey(key, locale);
 map.put(multiKey, localizedText);

 // later retireve the localized text
 MultiKey multiKey = new MultiKey(key, locale);
 String localizedText = (String) map.get(multiKey);

간단하다. 실제로 아파치 라이센스를 따르니 해당 소스를 가져와도 상관이 없다. 해당 전체 소스 코드를 살펴볼 필요가 있다.

여기서는 MultiKey 클래스를 이용해서 UnikeyHashMap 테스트 코드를 다음과 같이 수정해 보자.

import java.util.HashMap;

import junit.framework.TestCase;

/**
 * @author Sang-Hyup Lee
 *
 */
public class UnikeyHashMap extends TestCase {

private HashMap<MultiKey, UserValue> userHashMap = new HashMap<MultiKey, UserValue>();
protected void setUp() throws Exception {
super.setUp();
for ( int x=0; x < 10; x++ ) {
int y = x + 1;
MultiKey userKey = new MultiKey(x, y);
UserValue sohiPoint = new UserValue(x, y);

userHashMap.put(userKey, sohiPoint);
}
}
public void testUnikeyHashMap() {
MultiKey targetUserKey = new MultiKey(2, 3);
UserValue userValue = null;
if ( userHashMap.get(targetUserKey) != null ) {
userValue = userHashMap.get(targetUserKey);
}
assertNotNull(userHashMap.get(targetUserKey));
assertEquals(2, userValue.getX());
assertEquals(3, userValue.getY());
}

}

UserKey에 해당하는 Key 클래스를 MultiKey로 바꾼 것 말고는 실제로 코드를 수정한 것은 아니다. testUnikeyHashMap 메소드의 세 개의 unit test 메소드가 정상적으로 실행될 것이다. 그리고 실제로 x, y 좌표값에 해당하는 value 객체도 얻어진 것을 확인할 수 있다.

2009년 9월 25일 금요일

블로그를 textcube 로 이전하다!!

흠... 오늘 또 다시 서버 하드 디스크가 벅 났습니다^^;;
PC 환경에 IDE 하드이다보니 1년을 버티질 못하는군요...^^;;

그래서 이 참에 텍스트큐브로 블로그를 이전합니다.
네임서버를 새로 설정해야 해서 24시간 정도 소요가 될 것으로 보입니다.

참고로 텍스트큐브 블로그와 도메인을 연결해서 사용하는 방법

주말 또는 다음 주 중으로 복귀된 모습으로 오겠습니다.

감사합니다.

2009년 9월 22일 화요일

[링크]HTC 안드로이드폰 국내 출시된다

몇 일지난 기사입니다. HTC 코리아와 SKT가 2010년 HTC 안드로이드폰 HERO(히어로)를 국내에 출시한다는 소식이네요.
Sense UI가 참 마음에 들던데...
SMS/MMS 개발은 HTC가 직접하는 걸까요? SKT가 MMS는 OEM으로 모두 넘긴걸로 아는데...

암튼 핵심기능도 그대로 유지한다고 하니 곧 나올 모토롤라, LG, Samsung과 경쟁일 할거 같군요...
다른 단말사가 어떤 UI를 가지고  나올지 궁금해 집니다.



닌텐도는 화투 팔던 회사였다

닌텐도가 화투를 개발하고 팔던 회사였던 것을 알게되었다. 흠... 그동안 내가 잘 몰랐던거 같다.
게임에 많은 관심이 있는 편은 아니었던지라 조금은 생소한 분야가 아니었나 싶다...
잠시 신문기사를 통해서 닌텐도 회사에 대해서 이야기를 들어보자!

닌텐도는 화투 팔던 회사였다
[스토리텔링으로 성공하기]닌텐도의 개발스토리(상)

"95살에게도 게임기를" 닌텐도의 변신
[스토리텔링으로 성공하기]닌텐도의 개발스토리(하)

닌텐도DS, 닌텐도 Wii 등은 사용해 보진 않았지만 엄청난 인기를 끌고 많은 사람들이 사용하고 있다. 사실 주위에 게임을 좋아하는 사람들은 한 번씩 다 사용하고 있다^^;;

흠... 그런데 뜬금없이 화투를 만들었던 회사라니? 이런 이야기를 듣고는 자료를 찾아보던 중에 위의 기사를 찾게 되었다.

관심이 화투에 있는 것이 아니라 '스토리텔링', '창의성', '혁신', '좌절하지 않는 열정' 등에 있다.
쉽고 간단한 게임을 개발? 누구나 생각할 수 있지만, 대부분 매니아나 게임을 좋아하는 사람들만 게임을 할 것이라 생각할 때 나이 많은 성인이나 여성들이 쉽고 재밌게 할 수 있는 게임이 잘 될거란 생각 자체가 역발상과 혁신이 아닐까?

섣부른 판단을 하려는 것은 아니지만 스마트폰에도(특히,안드로이드폰) 이렇게 간단하고 사용층이 두꺼운 게임을 개발하는 것은 어떨까?

혼자서 궁금한 것이 많아졌다. 이런 아이디어에 동참할 사람!!!!! 손!!!

2009년 9월 17일 목요일

[링크]TDD(테스트 주도 개발) WIKI

TDD(Test Driven Development) 에 대한 설명을 잘 해 둔 위키 페이지가 있다.
회사에서 간혹 일전에 TDD 세미나를 잠시 진행한 적이 있었는데,
아직은 많은 사람들이 적용을 잘 하진 못한다.
나중에라도 소개할 때 사용해야겠다.


2009년 9월 11일 금요일

집단지성이란 무엇인가 - 우리는 나보다 똑똑하다

사용자 삽입 이미지
'웹2.0'이란 새로운 웹 플랫폼에 대한 논의가 한창이던 때가 지나고 이젠 실생활에서 웹2.0 이 실현되고 현실화되고 있는 시점이다.
당시 단순한 마케팅이나 버블에 불과하거란 의견도 상당히 많았는데 어쨌든 웹은 발전하고 변화하고 거듭나고 있다.

그리고 상당부분 웹은 사회와 문화, 정치, 생활방식에 변화를 가져왔다. IT에 종사하지 않는 사람들이 '웹2.0'이란 단어를 모른다고 하더라도 이미 사람들은 새로운 웹 생태계에서 살아가고 있는 것이다.
"집단지성이란 무엇인가"라는 책은 단순히 웹에서 일어나는 기술적인 이슈나 문제, 아이디어를 말하는 것이 아니라 사람들이 부딪히고 현실 속에서 만날 수 있는 다양한 이슈들을 '공유', '참여', '함께' - 저자의 말을 빌림 - 등의 단어를 통해 풀어가고 있다.

즉, 웹을 넘어 경제와 정치, 실생활을 지배하는 집단지성의 모든 것을 파헤치고 있다 - 책의 표지의 카피에 정치란 단어를 더했을 뿐이다.

집단지성의 예를 들어보면 빼 놓을 수 없는 것이 리눅스와 위키피디어 그리고 오픈소스에 대한 이야기인데 여러 가지 관점에서 재밌게 생각해 볼 수 있다.
재밌는 것은 책의 첫 부분에 나오는 '캐논' 기타 연주 동영상의 소개부터 나온다. 책의 상당 부분에서 한국의 인터넷 문화, 정치에 끼친 영향, 미래 등을 보여 주는 부분이다.

이 책에서 말하고자 하는 바는 웹을 넘어 '집단지성', 즉 우리는 나보다 똑똑하기 때문에 20세기와는 다른 서로 함께 사회적 문제도 해결하고 더 나은 공동체를 세워가려고 하는 의미가 담겨져 있다.
저저 역시 인터넷 공유 문화가 가진 문제들, 지식의 공유로 인한 부작용 등을 알고 소개하면서 염려하는 부분이 있다는 것을 이야기한다. 그러나 더 나은 문화와 사회, 인류의 발전을 위해선 참여하고 공유하면서 함께해야 한다는 것을 계속해서 강조한다. 너무나도 공감하는 말이다.

21세기에는 기술은 더욱 빠른 속도 발전할 것이고 사람들의 생활도 상당 부분은 마치 영화같은 삶을 살아가게 될 것이다. 하지만 그 속에 철학이 부재하고, 문화가 올바로 성장하지 못하고, 더불어 함께하는 사회가 되어 있지 못하면 오히려 과학기술로 인해 대부분의 사람들은 통제 속에서 자아를 상실한 채 살아갈 것이다.
앞으로 계속해서 이러한 책이나 논의를 통해서 더불어 살아가는 사회를 웹과 과학기술, 문화가 집단-공동체-를 통해서 발전하지 않을까?

끝으로 책의 말미에 함께하는 아이디어에 대한 좋은 정의가 있어 소개한다.

아이디어는 다른 사람과 나눌 때 비로소 움직인다. 혁신과 창조, 더 근본적으로는 번영과 행복, 그리고 미래에 대한 희망은 우리가 아이디어를 축적하고, 교환하고, 개발하는 데 이용할 수 있는 도구를 얼마나 갖고 있느냐에 따라 결정된다. 아이디어는 표현되고, 검토되고, 다듬어지고, 차용되고, 수정되고, 개작되고, 확장되면서 성정한다. 이런 활동은 한 사람의 머릿속에서 한꺼번에 이루어지는 경우는 거의 드물고, 대개 다양한 관점과 안목을 가진 수많은 사람들을 거치면서 이루어진다.
- p. 276

우리는 아이디어를 공유해야 한다. 그것만이 아이디어를 실현할 수 있는 방법이다. 아이디어를 공유하면 아이디어는 점점 늘어나고 자라나서 아이디어를 더욱 강화하는 순환고리를 이룬다. 우리는 무엇을 갖고 있느냐뿐만 아니라 무엇을 공유하고 있느냐에 따라서도 규정된다. 이것은 우리가 앞으로 백년 동안 신조로 삼아야 할 가치관이다.
- p. 296 책의 끝...