드리밍 인 코드

2009/07/04 13:21

드리밍 인 코드

드리밍 인 코드를 읽고 있다. 넷스케이프의 핵심 인력, 초창기 매킨토시의 핵심 인력, 등등의 전설적인 인물들 몇 명이 모여서, 몇 년 간 진행했지만 망해버린 -_- 챈들러 프로젝트에 대한 이야기인데, 상당히 재미있다. 절반쯤 읽었는데, 문장 몇 개를 뽑아보자면…

오늘날 사람들은 넷스케이프를 인터넷 초기에 엄청난 성공을 거두었던 회사로 기억하지만, 넷스케이프 개발자들은 스스로 불가능한 일정에 뒤쫓기고 눈앞에는 피해갈 수 없는 실패와 마주선 사람들이라고 생각했다.

하지만 FAA 프로젝트 참여자들처럼 직접 재앙을 겪은 이들을 제외하고는 새로운 소프트웨어 개발 프로젝트에 참여하는 대부분의 사람들은 과거에 대해 잘 모르고 있거나 미래에 대해 지나치게 긍정적인 경우가 많다. 그들은 그저 이번에는 다를 것이라고 낙관적으로 확신한다.

"맨먼스 미신"에서 브룩스는 바벨탑을 인간이 시도한 두 번째 대규모 엔지니어링 프로젝트라고 말한다(첫 번째 대규모 엔지니어링 프로젝트는 '노아의 방주'였다). 하지만 바벨탑은 동시에 첫 번째로 실패한 엔지니어링 프로젝트였다. 바벨탑 건축 관리자들은 성공을 위한 모든 조건을 완벽히 갖추고 있었다. 그들은 명확한 임무와 인력과 자재, 충분한 시간, 기술을 가지고 있었다. "바벨탑 건설이 실패한 까닭은 건설에 참여한 사람들이 서로 말이 통하지 않아서 협업을 할 수 없었기 때문이다. 사람들 간의 협업이 조직되지 않으면 업무는 중단된다."

하지만 가장 중요한 문제는 속도였다. "저는 사람들을 몰아쳐서 일하는 것을 선호합니다. 위대한 프로그램을 만들기 위해서는 누군가 중심에서 프로젝트에 생명을 불어넣는 사람이 필요합니다. 무자비한 방식으로라도요. 그것이 부재했던 게 문제였죠."

이 책을 읽고 있는 당신이 소프트웨어 개발자라면, 아마 이쯤에서 이런 말을 외치며 이 책을 벽에 던져버렸을지도 모르겠다. "이런 미친 짓은 이제 그만 두라고! 이미 교과서에 나와있는 모든 실수를 저지르고 있어!" 내 생각에 대부분 프로그래머들은 이렇게 생각할 것 같다. "나는 저런 바보 같은 짓은 하지 않을 거야. 나라면 훨씬 더 잘할 수 있다고." 물론 그게 사실일 수도 있다. ...(생략)... 소프트웨어 역사의 연대기에서, 챈들러의 실망스런 진전 속도는 예외가 아니라 오히려 평균적인 경우에 가깝다. 역사는 모든 운전사가 길에서 벗어나는 방법은 다르지만, 그들 모두가 언젠가는 바퀴를 도랑에 처박고 만다는 사실을 여실히 보여준다.

만약 당신이 자신은 분명히 더 잘 할 수 있다고 확신하는 프로그래머 중 한 명이라면 지난 번 프로젝트에서 이런 생각을 한 적이 몇 번이었는지 자문 해보기 바란다. "맞아요. 나는 우리가 아마도 이것을 해야만 한다는 사실을 압니다." (여기에서 '이것'은 소프트웨어 업계에서 잘 알려진 소프트웨어 개발과 관련한 기본 원칙 중 어떤 것일 수도다.) "하지만 지금은 특수한 상황입니다. 우리는 아주 특별한 경우입니다." 앤디 허츠펠드는 이렇게 말하곤 했다. "통상적인 프로젝트란 없습니다. 모든 프로젝트에는 저마다 고유한 특성이 있지요.”

특히, 바벨탑에 대한 비유는 엄청난 것 같다. 망한 첫 번째 엔지니어링 프로젝트라니. 푸핫.
아, Geek에 대한 이야기도 나온다.

긱들과 긱이 아닌 사람들은 왜 사이좋게 지낼 수 없을까? 미국 국방산업대학교에서 최근에 진행한 '정보기술팀에서의 인간 관계 역학' 연구에서는 77개 팀의 IT 전문가들(주로 프로그래머들과 프로그래밍 관리자들)의 머릿속을 해부하려는 시도를 했다. 관찰, 면담, 다양한 설문 등 여섯 가지 측정 방법을 통해 연구자들은 IT 전문가들의 성격 성향이 일반인들과는 근본적으로 다르다는 사실을 발견했다.

헐… 근본적으로 다르대. -_-;;

-- 이상한 나라의 종텐.


Trackback URL : http://www.jong10.com/trackback/428 관련글 쓰기

Leave a comment

The Resurrection

2009/07/03 01:43

총체적 난국이었다. 내 신념이 뿌리 채 흔들리며, 존재하지 않는 가치를 추구하는 것은 아닌지 의심했다. 비흡연자인 내가 담배를 피고, 새치가 나기 시작하며, 머리 속은 온통, “나는 뭘 해도 안 되는 걸까?”라는 생각이 가득 찼다. 가슴은 답답하고, 신은 항상 내 편이 아니라는 생각 뿐이 들지 않았다. 운명은 내 편이 아니었다. 그토록, 너무나 많은 것들을 포기하고, 잃어왔지만, 이젠 더 이상은 버릴 것도 없었다. 이미 모든 것들을 충분히 버리지 않았나? 나는 이미 충분히 지쳐 있었다.

어떻게 보면, 굉장히 사소한 일이었지만, 나에겐 전혀 사소하지 않았다. “잘했어”라는 이야기를 듣는데, 8년이 걸렸다. 난 그냥 단지, “잘했어”라는 말이 듣고 싶었다. 몇 년간 쌓였던 패배감들이 눈 녹듯이 사라지기 시작했다. 집에 오는 내내, 감정에 복받쳐 자꾸만 눈물이 났다. 패배감에 휩싸였던 시간들이 기억에서 떠올라 부유했다. 지하철 유리창 안에 비친 내 모습에, 갈 곳을 찾지 못하고 방황하던 몇 일 전의 내 영혼이 오버랩 되었다.

실질적으로 내 자신에겐 아무 것도 변하지 않았지만, 모든 것이 달라졌다. 유리창에 비친 몇 일 전에 내 모습에게 말했다. 너는 누구니? 나는 종텐이다. 불가능은 없다는 말의 다른 표현이지.

-- 이상한 나라의 종텐.


Trackback URL : http://www.jong10.com/trackback/427 관련글 쓰기

  1. # 기원 2009/07/03 09:54 Delete Reply

    담배펴?? 돈이 많이드는데.. 내년 부터 담배에 붙는 세금도 많이 오른다고 하던데.

    1. Re: # jong10 2009/07/03 10:08 Delete

      그냥 아주 잠깐.. ㅋ

  2. # 기원 2009/07/03 09:57 Delete Reply

    그러고보니 방학이겠구나.. 좋겠다.

    1. Re: # jong10 2009/07/03 10:09 Delete

      휴학 할 것 같애요. 조만간 술 한잔 해요~ =_=)/

  3. # Jyui 2009/07/04 18:13 Delete Reply

    나도 '잘했어' 란 말 듣고 싶어..

    1. Re: # jong10 2009/07/04 20:11 Delete

      너는 잘 하니깐, 금방 들을 수 있을꺼야. :-)

Leave a comment

Python에는 Iterable한 항목을 감싸서 메모리 사용량을 최소로 하면서, 인덱스가 포함된 튜플을 돌려주는, enumerate라는 훌륭한 built-in function이 있다. Java에도 있으면 좋을 것 같아서, 흉내 내봤다.

// coded by jong10
// Enumerator class, version:20090630

import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class Enumerator<T> implements Iterable<Enumerator.Entry<T>> {
	public static class Entry<T> {
		private T value;
		private int index;

		Entry(int index, T value) {
			this.index = index;
			this.value = value;
		}

		public int getIndex() {
			return index;
		}

		public T getValue() {
			return value;
		}
	}

	private static class EnumeratorIterator<T> implements Iterator<Enumerator.Entry<T>> {
		private int lastIndex = 0;
		private Iterator<T> iterator;
		
		public EnumeratorIterator(Iterator<T> iter) {
			this.iterator = iter;
		}
		
		public boolean hasNext() {
			return iterator.hasNext();
		}
		
		public Enumerator.Entry<T> next() {
			if (hasNext() == false)
				throw new NoSuchElementException();
			
			return new Enumerator.Entry<T>(lastIndex++, iterator.next());
		}
	
		public void remove() {
			iterator.remove();
		}
	}

	private EnumeratorIterator<T> iterator;

	public Enumerator(Collection<T> c) {
		this.iterator = new EnumeratorIterator<T>(c.iterator());
	}

	@Override
	public Iterator<Enumerator.Entry<T>> iterator() {
		return iterator;
	}
}

사용 방법을 보여주는 JUnit 테스트케이스이다.

@Test
public void testEnumerator() {
	List<Character> list = Arrays.asList(new Character[] {'h', 'e', 'l', 'l', 'o'});
	
	int[] indexes = new int[list.size()];
	char[] values = new char[list.size()];
	
	for (Entry<Character> entry : new Enumerator<Character>(list)) {
		indexes[entry.getIndex()] = entry.getIndex();
		values[entry.getIndex()] = entry.getValue();
	}
	
	assertArrayEquals(new int[] {0, 1, 2, 3, 4}, indexes);
	assertArrayEquals(new char[] {'h', 'e', 'l', 'l', 'o'}, values);
}

자바도 제네레이터가 있으면 좋을텐데…

-- 이상한 나라의 종텐.


Trackback URL : http://www.jong10.com/trackback/426 관련글 쓰기

Leave a comment

« Previous : 1 : 2 : 3 : 4 : 5 : ... 103 : Next »