태그

2014년 7월 12일 토요일

[번역] JDK 8 2/3 - Lambda expressions

KSUG에서 번역 요청한 두 번재 포스트입니다.

본문 링크 : http://blog.hartveld.com/2013/03/jdk-8-23-lambda-expressions.html

게시자 : 
게시일 : 2013/03/22
번역자 : 조인석(isi.cho@gmail.com)
번역일 : 2014/07/12

번역을 하다가 한글로 변경하기 애매 한 경우는 의역하거나 내버려 두었습니다. 참고하세요..
조언이나 교정은 언제든지 감사한 마음으로 받겠습니다. :)

=====================================================================




Posted  by 


이 포스트는 JDK 8를 위한 짧은 시리즈 중에 두 번째이다 - 나의 이전 포스트인 default methods for interfaces (번역), 그리고 다음 포스트인 Stream API도 참고하기 바란다.
JDK 8이 Java에 제공 할 신규 기능 중 하나는 익명 함수(anonymous function)를 정의 할 수 있는 가능성을 열어 놓은 것이다. 보통 자바 월드에서는  람다(lambda) 표현식이라고 부른다. 기본적으로, 이 기능은 익명 내부 클래스 정의를 적은 코드로 간편하게 해준다. - AIC(역자주 : Architecture-Independent checkpointing의 약자로 모든 변수 타입을 명시적으로 선언해야 한다는 차원에서 나온 용어로 보여지며,  플랫폼 종속적이지 않은 Java 언어의 특징 중 하나 임(참고))s 의 장황성과 비교되는 군더더기 없는 코드는 새로운 타입의 API를 만드는 것을 가능케 한다. 이번 포스트에서는 람다 표현식의 설계, 구현 방식 그리고 사용법에 대해 조금 더 자세히 들여다 보겠다.

Lambda expression types: functional interfaces

(람다 표현식 타입: 함수형 인터페이스)

람다 표현식의 타입은 단 하나의 추상 메소드를 가지고 있는 함수형 인터페이스(functional interface)라 할 수 있다. (이러한 이유로 이전에는 SAM(Single Abstract Method) 인터페이스로 불려짐) 실제 JDK 인터페이스 기반의 함수형 인터페이스의 예시를 살펴 보자.

// Existing interfaces that are now considered functional interfaces:

interface java.lang.Runnable {
 void run();
}

interface java.util.concurrent.Executor {
 void execute(java.lang.Runnable command);
}

interface java.lang.Iterable<T> {
 java.util.Iterator<T> iterator();
}

interface java.awt.event.ActionListener {
  void actionPerformed(java.awt.event.ActionEvent e);
}

// New functional interfaces:

interface java.util.function.Consumer<T> {
  void accept(T t);
}

interface java.util.function.Function<T, R> {
  R applly(T t);
}

interface java.util.function.Predicate<T> {
  boolean test(T t);
}





Runnable, Executor, Iterable, ActionListener 와 같은 일부 인터페이스들은 단 하나의 추상 메소드를 지니고 있는(함수형 인터페이스의 규칙을 따르고 있는) 기존의 인터페이스들이다. 나머지 Consumer, Function, Predicate와 같은 인터페이스들은 람다 표현식의 편리한 사용을 위하여 java.util.function 라는 이름의 신규 패키지 안에서 찾아 볼 수가 있다. 

Lambda expressions (람다 표현식)

Java 7에서는 함수형 인터페이스(혹은 SAM 인터페이스)의 구현체는 익명 내부 클래스 정의를 위하여 5줄 정도의 코드로 작성 해야 한다. (내부 클래스 밖의 함수 본체 라인은 세지 않았음) - 이 거추장스러운 구문을 보자:
java.util.function.BiFunction<String, String, String> concat
          = new java.util.function.BiFunction<String, String, String>() {
            @Override
            public String apply(String t, String u) {
              return t + u;
            }
          };



람다 표현식(혹은 익명 함수)은 프로그래머가 같은 구문을 무척 간결하게 작성할 수 있게 해준다. 이는 타 언어들(other programming languages)과도 무척 닮았다. 위 구문과 같은 내용의 람다 표현식을 아래의 예제를 통해 확인 해 보자. - 두 개 String 변수 연결하기(concatenation)
java.util.function.BiFunction<String, String, String> concat1
 = (String s, String t) -> {
   return s + t;
 };

java.util.function.BiFunction<String, String, String> concat2
 = (s, t) -> s + t;

첫 번째(concat1) 예제는 Java 8 람다 표현식의 장황한 버전이다. 대개 매개 변수 타입의 정의를 생략하여 더욱 간결하게 표현한 두 번째(concat2) 예제 역시 유효하다. 또한, 함수가 단 하나의 반환 구문을 가지는 경우, 중괄호({}) / return 키워드 / 끝 부분의 세미클론(;)의 제거가 가능하다.

반면에 어떤 경우에는 명확하게 매개 변수 타입을 명시해야 하는 경우도 있다. 한 가지 예를 들자면, 함수형 인터페이스의 매개 변수 변경에 의한 오버로딩된 함수를 들 수 있겠다. 이러한 경우에는 API 설계시 람다 매개 변수의 타입을 명시한 폼(위 예제 중 concat1) 에 의해 명확성을 요구하는 API 를 사용하여 코드가 작성되었는 지를 기술 해야만 한다. Stram.flatMap 오버로딩의 모호함(Ambiguity of Stream.flatMap overloads)은 람다 개발자 메일링 리스트(lambda-dev)에서 논의 되어지고 있다. 이러한 함수 같은 경우는 오버로딩 하지 말고, 오버로딩된 함수의 이름을 변경하기를 권장한다.

Functional interfaces and default methods (함수형 인터페이스와 기본 함수)

함수형 인터페이스는 기본 함수(default methods)를 지닐수 있다. 해서 함수형 함수는 단 하나의 추상 메소드를 가질 수 밖에 없다는 제약사항에서 벗어 날 수 있다.(기본 함수는 추상 함수가 아니기 때문이다.) 좋은 예로 Iterable는 함수형 함수이며 람다 표현식과 함께 구현되어 질 수 있다.
interface java.lang.Iterable<T> {
  abstract Iterator<T> iterator();

  default void forEach(Consumer<? super T> consumer) {
    for (T t : this) {
      consumer.accept(t);
    }
  }
}

java.lang.Iterable<Object> i = () -> java.util.Collection.emptyList().iterator();

Method references (함수 참조)

익명 함수로 함수형 인터페이스를 정의하는 것 대신에, 함수의 참조로써 정의 하는 것도 가능하다. 함수형 인터페이스 명세를 따르기만 한다면, 아래의 예제도 가능하다.
public class MethodReferences {
  public void f() { }

  public void g() {
    Runnable r = this::f;
    r.run(); // f() is called.
  }
}

Higher-order functions in Java (Java내의 고순위 함수)

함수형 함수의 명세를 정의한 다양한 타입과 (익명) 함수 정의를 허용함으로써, Java는 고순위 함수를 제공하기 위하여 확장되어졌다. 이는 더욱 간결한 코드 작성을 위해 여러 가지 타입의 신규 프로그램 생성자를 작성 가능 하게 하며, 무척 흥미로운 부분이다. JDK 8의 이러한 신규 기능들은 데이터스트림 중심의 프로그래밍 파라다임을 적용할 수 있게 하는 예시를 Stream API를 통하여 제공하며, 이는 .NET의 interactive extensions 혹은 스칼라의 collections API 와 닮았다 : 
List<String> ss = new ArrayList<>();
ss.add("x,y,z");
ss.add("x.y.z");
ss.add("a,b,c");
ss.add("i,j,k");

String result = ss.stream()
    .map(s -> s.replace(",", "."))
    .filter(s -> !s.contains("b"))
    .distinct()
    .sorted()
    .collect(Collectors.toStringJoiner(",")).toString();

System.out.println("Result: " + result);

== Output ==
Result: i.j.k,x.y.z

이번 시리즈 중 세 번째 포스트에서는 스트림 API에 대해서 더 상세하게 알아 볼 수 있다.

Java 8 은 타 함수형 프로그래밍 언어에서 제공하는 부분적 사용 함수(partially apply functions)는 제공하지 않고 있다. Java 8은 여전히 완전한 객체 지향적이며, 명령형 프로그래밍 언어이다.

Advanced example (고급 예제)

Java 8 언어 기능들로 이루어진 조금 더 복잡해 보이는 아래 예제는 이번 포스트의 최종 예제이다. 이는 IObservable 인터페이스의 무척 단순한 구현체이며, Microsoft's Reactive Extensions for .NET에서 사용하는 표준 쿼리 연산자(standard query operators)의 일부를 포함하고 있다. - 기본 함수와 많은 람다 표현식을 가지고 있는 인터페이스 : 
package com.hartveld.examples;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

public interface Observable<T> {

  void subscribe(Consumer<T> onNext);

  default <R> Observable<R> map(Function<T, R> mapper) {
    return onNext -> {
      subscribe(e -> {
        onNext.accept(mapper.apply(e));
      });
    };
  }

  default Observable<T> filter(Predicate<T> filter) {
    return onNext -> {
      subscribe(e -> {
        if (filter.test(e)) {
          onNext.accept(e);
        }
      });
    };
  }

  default <R> Observable<R> bind(Function<T, Observable<R>> binder) {
    return onNext -> {
      subscribe(e -> {
        binder.apply(e).subscribe(onNext);
      });
    };
  }

  // Alternative filter implementation based on bind.
  default Observable<T> filter2(Predicate<T> filter) {
    return bind(t -> {
      return onNext -> {
        if (filter.test(t)) {
          onNext.accept(t);
        }
      };
    });
  }
}

위 소스를 위한 테스트 케이스는 여기(here)를 참고하기 바란다. JUnit 과 Mockito 를 클래스패스에 추가한 뒤 실행 해야 한다.


Conclusion (결론)

람다 표현식의 추가로 인해 Java 프로그래머의 도구함에는 강력하고 표현력이 강한 신규 언어 기능이 추가 되었다. 비록 위 Observable 예제와 같이 남용하게 되면 복잡성이 증가하게 되겠지만(여전히 표현성은 높다), 이 언어 기능은 많은 기존의 프로그램들을 개선하는 데 사용될 수 있다. 많은 익명 내부 클래스 초기화 구문을 제거하고, Stream API 기반의 전통적인 for 루프를 전환하는 것 만으로도 해당 코드의 가독성을 증대시키는 데 기여 할 수 있다.

Posted  by 

=======================================================================

2014년 7월 6일 일요일

[번역] JDK 8 1/3 - Interface default method implementations

KSUG 페북에 아래 글에 대한 번역이 요청이 빈발(?) 하여 손들고 한번 해 봅니다.

본문 링크 : http://blog.hartveld.com/2013/03/jdk-8-13-interface-default-method.html

게시자 : 
게시일 : 2013/03/22
번역자 : 조인석(isi.cho@gmail.com)
번역일 : 2014/07/06

번역을 하다가 한글로 변경하기 애매 한 경우는 의역하거나 내버려 두었습니다. 참고하세요..
조언이나 교정은 언제든지 감사한 마음으로 받겠습니다. :)



==============================================================


Posted 
 by 

이 포스트는 JDK 8를 위한 짧은 시리즈 중에 첫 번째이다 - 나의 다음 포스트인 lambda expressions, 그리고 마지막 포스트인 Stream API도 참고하기 바란다.

현재, OpenJDK 개발팀은 JDK 8 기능들을 완성하기 위해 바쁜 나날을 보내고 있다. OpenJDK의 최근 Project lambda 빌드에서는 Java 8 프로그램을 작성할 수 있는 꽤 완벽한 자바 개발 환경을 포함하고 있다. 필자는 아직까지 이번 JDK에 대해 어떤 문제도 발견할수 없었고, 근래의 lambda-dev 메일링 리스트에도 버그 레포트 관련 내용은 찾아보기 힘들다. Java 8의 신규 기능들 중 필자가 설명할 람다 관련 기능 셋은 무척 흥미로운 주제다. 이번 포스트는 그 중에 하나인 "default methods(기본 함수)"를 다루고 있다. (역자 주 : default methods는 함수 접근 제어자가 default인 것을 의미하여 아래 글에서는 '기본 함수'로 표현하겠음)


Extending interfaces: default methods(확장 인터페이스: 기본 함수)

추상 메소드로 선언된 일반적인 인터페이스 함수는 해당 인터페이스를 구현한 클래스에서 반드시 정의(must be defined) 되어져야 한다. 이러한 '짐(burdens)'은 매 선언 함수를 구현해야 할 책임을 개발자에게 지게 한다. 더 중요한 것은 '배포(publication)' 이후에는 인터페이스의 확장이 불가하다는 것이다. 다르게 말하자면, 모든 개발자는 개발된 소스와 망가진 이전 소스, 컴파일된 바이너리 클래스와의 호환성을 반드시 고려해야 한다.

이러한 문제점들을 해결하기 위해서, JDK 8의 신규 기능 중 하나인 기본함수(default methods)는 이미 배포된 인터페이스의 확장을 가능케 한다. 기본 함수는 독립적으로 선언될 뿐만 아니라 인터페이스 내부에 정의도 가능하다.

예제를 한번 살펴 보자.:


public interface Person {

  public abstract String getFirstName();
  public abstract String getLastName();

  public default String getDisplayableFullName() {
    return getLastName() + ", " + getFirstName();
  }

  public abstract boolean isStudent();

  public default boolean isNotStudent() {
    return !isStudent();
  }

}

Person 인터페이스를 구현한 개발자는 추상함수인 getFirstName(), getLastName(), isStudent()를 반드시 구현해야 한다.  하지만 기본함수인 getDisplayableFullName() 혹은 isNotStudent() 는 구현하지 않아도 된다.  개발자는 마치 하위 클래스에 일반적인 non-final 클래스 함수를 오버라이딩 하는 것 처럼, 여전히 기본 함수를 오버라이딩 할 수 있다. 추상 클래스는 기본 함수를 추상 함수로 (재)정의 할 수 있으며, 하위 클래스로 하여금 재구현 할 수 있게 제한 할 수 있다. (간혹 '재추상화(re-abstraction)' 라고도 불림).


Use cases for default methods (기본 함수를 위한 유스케이스)


1) Extending existing interfaces (기존 인터페이스의 확장)
JDK 라이브러리 중 이 신규 기능을 위한 가장 중요한 유스케이스는 인터페이스에 대한 기존 구현체를 수정하지 않고도 확장이 가능하다는 점이다 : 이전에는 인터페이스에 신규 추상 메소드를 추가하면 모든 기존 구현체에 추가된 추상 메소드를 구현해야만 했었다. 그리고 기존 인터페이스를 확장하는 것은 앞으로 Collections API(나의 JDK 8에 대한 세 번째 포스트(third blog post) 참고)로 확장 될 예정인 신규 Stream API 의 이전 버전의 구현체와 호환이 되는지 확인 할 필요가 있었다.

신규 Collection 인터페이스에 대한 코드를 살펴보자:

public interface Collection<E> extends Iterable<E> {
  
  // Traditional, abstract methods:

  int size();
  boolean contains(Object o);
  boolean add(E e);
  boolean remove(Object o);
  // Etc...

  // New methods stream() and parallelStream() with default implementations:

  default Stream<E> stream() {
    return Streams.stream(() -> Streams.spliterator(iterator(), size(), Spliterator.SIZED), Spliterator.SIZED);
  }

  default Stream<E> parallelStream() {
    return stream().parallel();
  }

}

Collection 인터페이스는 stream() 와 parallelStream() 함수에 의해 확장된다. 두 함수 모두 반드시 기본 함수로 정의 되어져야 한다. 그렇지 않으면 기존 Collection을 구현체들 (가령, ArrayList나 3rd 파티 모듈들)은 깨지거나 다시 구현해야만 한다.

2) Additional design flexibility in the inheritance hierarchy (상속 계층에서의 추가 설계 유연성)

간혹, 서로 다른 구현 클래스간에 공유하는 기능이 있을 수 있다. 전통적으로는 이 클래스들을 위한 상위 (추상) 클래스를 작성하게 된다. 다른 방식으로는 이벤트 리스너를 정의하여 여러 함수를 가진 인터페이스가 구현 되어져야만 하지만, 대개 개발자는 단 하나의 이벤트(싱글 함수)에만 관심을 가지고 있다. 일반적으로는 추상 (어댑터) 클래스(abstract (adapter) class)를 확장함으로써, 이러한 인터페이스 함수를 위한 기본 구현체를 제공한다.
기본 함수 구현체는 위 두 사례에 대하여 더 나은 설계 유연성을 제공한다. 스칼라의 특성과 마찬가지로(Similar to traits in Scala), 기본 함수는 서로 다른 타입에 대하여 행위를 공유 혹은 재사용 할 수 있다. 그리고 클래스의 다중 인터페이스 구현이 가능해짐에 따라, 다중 상속의 안전성과 제약적인 형식(safe and limited form)이 제공된다. 상태를 공유하기 위해서는 (추상) 상위 클래스가 여전히 요구되어진다.


3) Alternative: extension methods (대안: 확장 함수)

C# 확장 함수(C# extension methods)의 다른 형태가 고려되어져 왔으며 이에 대한 대안이 된다. 그럼에도 불구하고, 확장 함수는  새로운 '정적-성(static-ness)'을 소개하고 있다 : 확장 함수는 첫 번째 인자값을 실행 대상 객체로 취하는 일종의 정적 함수이다.  또한 확장 함수는 기본적으로 코딩시 편리함을 제공한다 : IDE를 사용하는 프로그래머는 '.'를 통해 확장함수를 쉽게 호출 할 수 있다.
이러한 시도의 한 가지 문제점은 개발자가 함수를 오버라이딩 하지 않고, 전체 클래스 계층이 모든 케이스에 사용이 가능하게 구현된 소스로 인해 정체될 수 있다는 부분이다. 대개 이런식으로 큰 규모내의 추가된 정적 함수를 소개 하는 것은 바람직 하지 않다(considered undesirable). 또한, 확장 함수는 reflection을 사용하는 경우 제대로 동작하지 않는다 : 확장 함수는 클래스의 정의된 함수가 아니기 때문에 찾을 수가 없다 (예를 들자면, 메일 클래스가 로딩되고 난 다음 reflection을 통해서만 확장 함수를 포함한 클래스가 로드 되었다고 치자 - JVM은 확장 함수의 존재를 알 방법이 없다).

2014년 6월 8일 일요일

SW개발자의 군생활 - SW개발병(현 SW관리병) part 1

오랜만에 글을 쓴다. 매주 하나씩 쓰려고 했는데, 몇 주간 발등에 떨어진 일 때문에 정신이 없었다. 각설하고..

오늘은 SW개발병으로 지낸 군 생활을 하고자 한다.


앞 글 에서 언급했듯이, 난 4년제 대학교를 졸업한 뒤, 핵심기술특화병 중 하나인 SW개발병으로 육군 병사로 입대하였다. 현재의 정확한 주특기 번호 및 명칭은 '175262 S/W관리병' 이다. 2004년 당시에는 대졸에 정보처리 산업기사 / 기사 자격증을 보유하고, JAVA/JSP 관련 경험이 있으면 들어가는데 큰 무리가 없었던 걸로 기억 한다.


입대 당시, 훈련소에는 나보다 나이 어린 애들이 대부분이 이였고, 심지어는 교육을 담당했던 병사도 나보다 어렸는데 속였다가 걸리고 그랬었다. 지금 생각 해보니까 나이도 한참 어린애들이 내 이름을 부르면 무척 기분 나빠했었고, 이름 부르지 말라고 했었던 적도 있었다. 하지만 대부분의 훈련소 동기들은 나이 많은 대접(?)을 해줬었고, 6주의 훈련 기간동안 나름 의미있는 시간을 보낸듯..

자대 배치를 받았을 때는 나이 때문에 걱정을 많이 했었으나.. 내 나이가 배치를 받은 육군전산소(현재 정보체계관리단)의 평균 나이 정도 여서 전혀 문제가 되지 않았다. 아마 나와 비슷한 처지에 있는 분들이 대부분이였던 듯.. 입대 동기들은 대부분 나와 나이가 같았고, 선임들은 결혼해서 애도 있는데 이혼한 사람도 있었고, 여튼 다 '어른' 이였다. ㅡㅡㅋ

5개 내무실만 있던 작은 부대였던 육군전산소는 육군 유일 전상병으로만 이루어진 부대였고, 규모가 크기 않아 육군 전산소의 헌병대가 있던 건물 3층에 3개 내무실만 있던 모 부대(무슨 정보 관리 하는 부대였는데 이름이 기억이 안나네..ㅡㅡㅋ)와 같은 층을 썼었다. 같은 층에 타 부대원들과 화장실(샤워실, 세탁실)과 공유 장소(탁구실, 체력단련실, PC방 등)를 공유 하면서 자주 다퉜던 걸로 기억 한다. 하루는 이발을 하는데 난 상병이였고 옆 부대 개념없는 이등병이 ㅈㄹ하는 바람에 싸운적도 있었다. ㅋㅋㅋㅋ

5개 내무실 중 마지막 1개 내무는 운전병들을 포함한 행정병들이 모여 있는 내무실이였고, 나머지 4개 내무실은 육군 본부의 각 산하 기간들과 관계 있는 부서의 병사들이 모여 있었다. 현재는 어떻게 구성되어 있는 지 모르겠으나, 난 그 당시 군수 관련된 부서에 배정된 3~4명의 병사중 한 명 이였다. 이외에도 여러 참모부의 여러 과에 소속된 병사들이 삼삼오오 모여서 내무반을 이루게 된다. 여기서 다루던 프로젝트는 자세히 말하기에는 보안상 문제가 될 수 있으니 간단하게 말하자면.. 전산화 프로젝트 중에 외주 주기에는 다소 가볍고 지속적으로 관리해야 하는 프로젝트.. 좋은 예로 예비군 홈페이지 정도 되겠다. 또 나름 중요한데 보안상 외주 업체에게 데이터를 모두 공개하기 어려운 프로젝트.. 가령 워게임이나 전시에 사용하는 예측성 프로그램 등 을 영관급 장교 - 군무원 - 개발병과 함께 개발하여 사용하게 된다.

내가 관여했던 플젝은 크게 2개 였다. 첫번째는 전시 상황에 각 부대에 미치는 피해상황을 예측하는 프로그램(편의상 A 프로그램)이였고, 두번째는 특전사 낙하산을 관리하는 프로그램(B프로그램)이였다. A프로그램은 입대 당시 이미 L모사에서 무슨 큰 프로젝트 수행시 곁다리(?)로 이미 만든 프로그램이였다.  MFC 기반의 C/S 프로그램이였고, DB 는 Informix, DB 관련된 로직은 Pro*C로 개발이 되어 있었다. 프로젝트 투입당시 사수는 전역을 앞둔 말년 병장이였고, 그때 당시에는 어린나이에 이것저것 다 하고 있는 것이 대단해 보였었다. 그 친구가 전역하고 혼자 맡게 되었을때 매번 마주치는 비즈니스 파트너(고객 혹은 갑)가 모 중령님이였다.

이 분은 정말 대화하기 힘든 분이였다. 머.. 중령과 일개 병사와의 대화가 있을 수 있는 지 의문을 갖는 사람도 있겠지만..(대부분 그렇지.. 중령이면 일반 부대에서는 얼굴도 한번 마주치기 힘든 사람이니..) 워낙 막무가내였고, 안되면 '나라의 명령' 이라느니 머라느니 하면서 말도 안되는 논리도 사람을 뭉개기 일쑤였고, 가만히 듣고 있으면 듣고 있는 사람 모두 열받게 만드는 그런 사람이였다. 게다가 제대로 만든 프로그램도 아니고, 정식 offer없이 받은 프로그램이다 보니 유지보수도 제대로 되지 않았고 인수인계도 엉망이였으니 짜증날만 했을 것이다. (그때는 이런 생각 못했었다.ㅡㅡㅋ) 게다가 이 프로그램은 군에서 수행하는 가장 큰 훈련(태극훈련, 을지훈련 등) 수행시 고위급 장관들에게 보고 하기 위해 사용하는 무척 중요한 프로그램 중 하나였다.

내가 만약에 이 분과 군생활을 계속 같이 했었다면, 아마 프로그래머로서의 업은 절대 하지 않았을 것이다. 실은.. 이 대목이 가장 중요한 포인트 이긴 하다.

한 3개월정도 해당 프로그램 유지보수를 하면서, 대학교때 잠시 Visual Studio로 그림그리기 하던 MFC 손좀 데보고, 쌩판 해보지도 못했던 Pro*C 수정 및 컴파일, 배포, 그리고 여러 DB 툴을 가지고 전군에서 취합한 데이터를 SQL 공부하면서 이리저리 살펴보고 있었을때, 모 중령님의 좌천(?) 소식을 듣게 되었다. A 프로그램때문에 그렇게 된건 아니겠지만, 여러가지 상황이 복잡하게 얽혀 있었겠지.. 그리고서는 강중령님이라는 분이 내 새 파트너로 오시게 되었다. 이 분 역시 전산쪽에는 깊은 지식은 없으셨고, 나라에 충성을 다하시는 분 이였지만, 모 중령님과 다른 중요한 한 가지가 있었다. 바로, 경청하는 자세였다.

일개 병사였던 나의 이야기를 이분은 차근 차근 들어 주셨다. 이 과정을 통해 무엇이 문제였는지, 이 프로그램을 제대로 돌아가게 하기 위해서는 무엇이 필요한지 하나 하나씩 풀어 나가셨다. 내가 강중령님께 제안을 했던 것은 크게 3가지 였다. 첫번째, 현재 DB가 Informix로 되어 있는데  Oracle 로 변경하는 것이 좋겠다. Informix를 쓰는 것은 목적지를 도착하기 위한 지름길이 있는데 돌아가는 격이다 라고 설명했었다. 두번째, 데이터 가공을 위해 Pro*C 를 사용하는 것은 비효율적이다. 상대적으로 리소스가 충분한 Oracle 서버에서 돌수 있는 PL/SQL(Stored Procedure, SP)로 변경하자. 세번째, 그 당시 유상으로 구매했던 JBuilder의 기능이 현재 프로그램 개발하는데 좋은 기능들이 많다. MFC는 버리고 Java 기반으로 가자..

회사로 따지만 입사 1년차에 어떻게 이런 제안을 했었는지 지금 생각 해보니 대단한 것 같기도 한다. 내 제안은 대부분 앞으로 내 경력을 쌓아가기 위해 전략적(?)으로 제시한 것이기도 하였지만, 나에게는 잘 알지도 못 하는 것을 억지로 배워가면서까지 개발할 여력도 없었고, 이유도 없었다. 그리고 나의 이야기에 귀기울여 주셨던 강대령님은 나의 제안을 모두 수용해주셨다. 해서 수 년 동안 애물단지로 취급받던 프로그램을 새로 재구성하기 시작했다. 이때 한 가지 유의했던 점은, 기존에 있던 프로그램을 그대로 마이그레이션 하지 않았었다. 왜냐하면, 테이블 구성이라던지 비즈니스 로직 자체에 비효율적인 부분이 무척 많았다고 생각 했기 때문이다. 가령, 군수 물자에는 종류가 분류되어 있고, 어떤 종은 전시 피해 상황시 계산할 필요가 없는 종도 있다.(자세히는 말하지 않겠다.) 헌데, 기존 프로그램 볼 필요도 없는 종 때문에 계산하는 시간이 소요되기 마련이였다. 전쟁 시나리오를 넣고 계산 버튼을 누르면, 답이 나오기까지는 꼬박 2박 3일이 소요 되었다. 이런 프로그램은 최소한 반나절에 한번 이상씩 데이터 기반으로 보고를 해야 되는 훈련 상황에 적합하지 않았다.

나는 약 7개월동안 강중령님께 말씀 드린 모든 약속들을 충실히 이행해 나갔다. Oracle 기반의 데이터 테이블 구조를 만들고, 일반적인 정규화를 바탕으로 관계형 데이터베이스에 충실한 데이터 모델을 만들어 냈다.(그때 당시에는 같은 데이터가 여러개 테이블에 분산되어 있으면 죄악으로 삼던 시절인 듯..ㅡㅡ) 잘 알지도 못하는 SP 작성을 위해 오라클사에서 제공한 복사본 매뉴얼을 옆에 끼고 살았다.  그때 버전이 9i 였고, 이 과정이 무척 재미 있었다. 그리고 모든 UI는 JAVA기반으로 변경했고, JBuilder 컴포넌트도 다수 사용했었다.

SP 작업시 기억이 나는 작업이 하나 있다. 육본은 냉방이 잘되는 건물이지만, 주말 혹은 퇴근 시간 이후에는 냉방이 되지 않는다. 비즈니스 로직을 전혀 모르고 있던 나는, 프로시저를 제대로 작성하기 위해서 강중령님의 도움이 절대적으로 필요 했다. 물론, 서로의 능력이 절실히 필요했던 여름이였다. 정말 무더운 여름에 중령님과 나는 텅빈 사무실에 앉아 함께 작업을 했고, 옷에 있어서는 격식 차리지 말자는 말씀에 속옷만 입고 땀을 뻘뻘 흘리면서 이천줄 정도 되는 프로시저를 검토하곤 했었다. 지금 짜면 그렇게 안 짜겠지..ㅡㅡㅋ 프로시저 전체를 글자 줄여서 출력한 다음 테이프로 붙이면 길이가 꽤 되었다. 그걸 앞에 벽에 붙여 놓고 한 줄 한 줄 훑어 나가면서 잘 못 된 부분이 있는 지 없는 지 검토 했었다. 쉽지 않은 작업이였지만.. 난 그 순간이 지금도 힘들때면 기억을 하는 좋은 기억이다.

이렇게 만든 프로그램은 7개월안에 모습이 들어났고, 가장 중요하게 생각했던 산정 시간은 기존 2박 3일의 시간이 13시간으로 단축하게 되었다. 프로시저 중간 중간에 로그성 구문을 집어넣어 커밋 갯수와 루프를 튜닝하고 나니 최종적으로 4시간 30분으로 단축이 되었고, 이 프로그램은 전시 훈련시에 가장 중요한 프로그램으로 자리매김 하게 되었다. 실제로 훈련상황을 모니터링하는 대형화면에 내가 만든 프로그램이 한 켠을 차지하게 되었고, 결과물은 신뢰도가 무척 높았다.

이 프로그램을 만든 사람들을 생각해보니, 강중령님과 나, 그리고 주사님 한분, UI 를 그려주었던 후임이 투입되었었다. 그리고 상병쯤에 해당 프로젝트의 성과를 인정받아 군수참모부 표창장(2스타)을 받게 되었다.

그때 당시에는 군에서 수행하는 프로젝트가 별거 아니겠다는 생각을 많이 했고, 밖에 나오면 제대로 된 환경에서 더 큰 프로젝트를 수행하겠지 라고 생각했었지만, 지금 생각해보면 꽤 규모도 컸고, 나름 체계적이였었다. 그리고 첫 프로젝트가 대량 데이터를 가공하는 작업을 하다 보니 자연스럽게 대용량 데이터베이스, 처리속도 등을 고민하게 되었었고, 이후 대부분의 경험들이 대용량 데이터와 직접적인 관계를 맺게 해주었고, 잘 수행하게 해준 원동력이 되지 않았나 싶다.

쓰다 보니 너무 길어진듯 하다. 두 번째 프로젝트와 기타 기억에 남는 프로젝트는 다음 글에 남기도록 하겠다. 오늘도 쓰다 보니 무척 길어지는 듯..ㅋ 하지만 더 잊혀지기 전에 꼭 정리해보고 싶다. 참고로 함께 근무했던 선후임들은 대부분 이름있는 회사에서 기량을 뽐내고 있음..ㅋ 자랑스러운 친구들이다.

To be continued..

>_



-- My Story ---------------------------------------










---------------------------------------------------

2014년 4월 27일 일요일

학생시절 경험한 프로그래밍

나는 어렸을때 부터 프로그래밍에 관심이 많았던 아이는 아니였다.
(와이프가 와서 태클 겁니다. 다들 그렇다고..ㅡㅡㅋ)

초등학교 3,4 학년쯤(90년대 초반), 어머님께서 컴퓨터 프로그래밍 학원에 보내주셨던 것도 기억한다. 조그마한 상가의 3층에 한켠의 방처럼 생긴 학원에 들어서면, 컴퓨터가 여러대 놓여 있는 방이 있었고, 내 기억으로는 검은 스크린에 초록색 글자로 더하기, 빼기 같은 걸 했던 듯 싶다. 아마도 Basic이였겠지.. 헌데, 그리 관심은 많지 않았었고, 학원도 오래 다니지 않았던 걸로 기억한다. 지금처럼 코딩 조금 하면 웹 브라우저나 스마트폰으로 멋진 화면들을 볼 수 있었다면, 어린 시절에라도 눈에 확 들어올 수도 있었을 텐데.. 친구들과 뛰어 놀거나, 오락실에서 오락하는 걸 즐겨 했던 나에게는 별 감흥이 없었었다.

중학교 시절(90년대 중반)에는 삐삐가 유행했었다. 부모님 몰래 삐삐를 구해서 친구들과 번호로 장난치다가 걸린게 한 두 번이 아닌 듯.. 한번은 삐삐에서 버튼을 누르면 현재 시간을 음성으로 알려주는 검은색 기계를 들고 다녔었는데, 어머님 앞에서 버튼이 실수로 눌러져 "지금은 몇 시 몇 분 입니다." 라는 여자 음성이 흘러 나온 걸 들으시고 놀라시던 모습이 지금도 기억이 난다. "새로 산 시계에요." 하고 말도 안 되게 얼버무렸었다..ㅋ 이 시점에는 전화선을 모뎀에 연결하여 컴퓨터 통신을 하던 시절이다. 천리안, 나우누리와 같은 곳에 가입하여 회원들과 채팅 하던게 낙이였던 사람들이 점점 많아진 듯 싶다. 삐삐를 받으면, 근처 공중전화나 집 전화기로 전화를 걸면 한시간 넘게 통화가 되지 않는 집은, 분명 모뎀으로 컴퓨터 통신하고 있는 것으로 생각 했었던 걸로 기억한다. 그걸로 전화요금 폭탄 맞는 경우도 많았다.

고등학교 시절(90년대 후반)에는 각 집마다 PC를 구매 하는 비율이 점점 올라간 듯 싶다. 특히, 스타크래프트가 나오면서, 학교 근처에 PC방들이 성행하기 시작했고, 농구, 축구, 당구에 빠져 있던 애들이 전부 PC방으로 몰렸었다. 나는 수능보기 전에 게임에 빠지는 게 두려워 친구들과 스타를 하기 보다는 당구장(응?)에 살다 시피 했었던 듯..그리고 고등학교 졸업 할 때까지는 집에 컴퓨터가 없었다.

대학교 입학시 전공을 고민하던 나는 다른 건 몰라도 공학도가 되고 싶었고, 그나마 가장 관심이 많았던.. 아니.. 관심보다는 조금이라도 일상생활에 접해 봤었던 컴퓨터 관련 전공을 하고 싶었고, 수능 점수에 맞는 서울내 4년제 대학교 중 컴퓨터공학과가 있었던 대학의 공학부에 입학하게 되었다. 580명인가 되었던 공학부의 내 전공은 3학년때 정해지는 거였지만, 주 전공 필수 강의를 2학년부터는 들어야 했기 때문에 1년만에 희망 전공을 정해야 했고, 그 당시 내 선배들은 컴공이 아니라 식품공학과였다. 공학부이다 보니, 선배를 정할 때 이름순으로 580명을 펼쳐 넣고, 40명씩 반을 잘라 A ~ O반까지 나눠서 A,B 반은 컴공이 선배.. 이런식으로 선배를 배정 받았었다. 난, 조씨 성 덕분에 M반에 속했었고, 지금도 만나는 내 대학동기들은 모두 성이 조씨, 최씨, 황씨 등이다..ㅋㅋ (이런 방식의 입학 방식은 바로 폐지되었음..ㅡㅡㅋ) 여튼, 대학생 초반에는 컴공에 깊은 관심을 가지고 있지 않은 이상.. 관련 공부를 하기 쉽지 않았었고, 열심히 동아리 생활을 했던 나에게 학부 생활은 그리 즐겁지 많은 아니였다. 관심있는 동기, 선배들과 자연스럽게 분위기를 만들어나가는 과정은 없었다고 볼 수 있다..

군대를 가기위해 2학년을 마치고 휴학을 했다. 학부 생활보다는 동아리 생활에 치중했던 나는 학점이 엉망이였다. 부끄럽지만, 4개 학기 평균 학점이 4.5점 만점에 2점대를 넘기지 못 했었다.ㅡㅡㅋ 군입대까지 시간이 남아서 PC방, 당구장, 호프집 같은데에서 알바를 하며 시간을 떼우고 있었다. 헌데, 어느 날.. 아무것도 준비 못 하고 군대를 가서 2년 삽질 하고 와야 하는게 억울했고, 불안했다. 해서, 멋도 모르고 컴공으로 졸업하여 관련 업에 종사하기 위해서는 방위산업체에서 프로그래머로 근무를 해야 겠다는 야심찬 포부를 안고, 복학을 하였다.(실은, 집안 사정상 군대를 가기 힘든 것도 있었다.)

군대를 갔다 온 건 아니였지만, 일을 구하기 위해서는 내 코딩 능력을 어떻게든 올려야 겠다는 생각이 들었다. 그 생각에 강남의 모 컴퓨터학원에서 강의를 듣기도 하였지만, 별 도움이 되지는 않았다. 대신, 학교에서 프로그래밍 관련 강의는 다 듣기 시작했고, 성적도 나쁘지 않았다.  그리고 그때 당시(2000년대 초반) Java관련된 과목이 하나밖에 없어서 맘 맞는 선,후배들과 함께 스터디를 했던 것도 도움이 되었다. 실력이 늘었다기 보다는 프로그래밍에 대해서 나름 철학을 가지고 있던 선,후배들과 코딩을 함께 해 가면서 재미와 분위기를 익혔던 걸로 기억 한다. 솔직히 후배들보다 훨씬 못 하고 있어서 쪽 팔려서 더 노력했던 듯..대학 강의 과정에서 했던 프로젝트는 대부분 네트워크 관련된 프로젝트 였다. 채팅 프로그램, FTP 프로그램, MFC 기반의 C/S 프로그램 등 이였다. Copy & Paste 를 미친듯이 했었었고 내 머리속에서 나온 코딩은 몇 줄 안되었지만, 재미를 느꼈었고, 여러 밤을 쉽게 세곤 했었다. 한번은 PC방에서 FTP 프로그램 관련 작업을 진행하고 있었는데, PC방 주인이 옆자리에 앉더니 머 하냐고 이상한 눈초리로 쳐다 본적도 있었다. 아마, PC에 머 이상한 작업 하는 걸로 오해 한 듯 싶다..ㅋ

4학년 졸업이 다가오면서 방산업체를 구하기 위해 갖은 애를 다 썼었다. 헌데, 아쉽게도 정부에서는 병역특례 인력을 줄인다고 정책을 바꿨고, 심지어는 두 자리수로 줄어 들어 대부분은 이미 입사하여 T/O를 기다리고 있는 내정자들에게 돌아가는 실정이였다. 나는 병무청에서 그해 방위산업체로 T/O를 배정받은 전체 업체의 리스트를 확보하였고, 전체 업체에 이력서를 넣기 시작했다. 메일 주소가 있는 곳에는 메일을 보냈고, 것도 없으면 일일히 전화를 걸었다. 몇 군데에서는 면접을 보자고 했었고, 모 대학교 안의 산학연으로 들어가 있던 업체도 있었다. 정확이 어딘지 기억이 안나지만, 기차타고 남해 어딘가 가서 바다가 보이던 대학 캠퍼스 안에서 면접을 봤던 기억이 난다. 면접관이 물어봤다. "입사하면 어떻게 일을 할 것이냐" 답은 별거 없었다. "최선을 다 하겠습니다." 다시 묻더라. "어떻게 최선을 다할 것이냐" ㅋ.. 지금 생각 해보니 딱히 내세울만한 기술이 없었던 나에게 일자리를 줄 업체는 없었던 듯 싶다. 그때 만약 학교에서 데이터베이스의 테이블 만드는 방법과 SQL 활용법, 웹어플리케이션 작성 및 WAS사용법 같은 것을 가르쳤다면, 쉽게 입사 할 수 있었을 듯..ㅡㅡㅋ

결국, 난 병역특례 업체를 구하지 못 했고, 군대를 가야 하는 입장이 되었다. 대학을 졸업 한 상황이였으니 여러가지 옵션이 있었다. 학사 장교도 있고, 걍 병사로 가도 되고.. 처음엔 나이 먹고 병사로 가기는 쪽 팔려서 공군 학사 장교 시험도 봤었다. 공군으로 본 이유는 그 당시 내 동생이 공군으로 군 생활을 하고 있었다는 이유 밖에 없었던 듯.. 그 시험은 내가 지금까지 본 시험 중에 제일 어려웠던 시험이였던 걸로 기억한다. 보기 좋게 떨어지고 다시 고민 해 보았다. 내 전공을 살리면서 군 생활을 짧게 할 수 있는 방법이 없을까..

그때 우연히 알게 되었던 핵심 기술 특화병 중 하나였던, SW개발병.. 이력서를 준비해서 병무청에 제출하고, 서류 면접이 통과한 인력에 한해서 면접을 수행했다. 그 당시 육군전산소의 대위님이 면접관으로 오셨고, 나에게 이것 저것 물어 봤었다. 그때 기억이.. JSP 해본적 있냐, 요거만 기억 난다. 다행히 Java 공부하면서 해 본게 있어서 할 수 있다고 답했었다. 실은, 컴공을 졸업한 사람이 정보처리기사 자격증과 함께, 육군 병사로 지원 하는 것 만 해도 큰 가산점이였다. 해서, 나는  대학을 졸업하고 그해 4월에 이등병으로 논산 훈련소에 입소 하였다. 그리고 6주 훈련후, 배치 받은 부대는 바로 계룡대 육군전산소, 여러 부서중에 군수참모부의 군수소요과 관련 업무를 진행하는 곳에서 군생활이자 군SI 업무를 처음 수행 하게 되었다.

나는 이 순간 전 까지만 하더라도, 컴퓨터공학을 전공하였지만, 이 분야에서 일을 할 수 있을 까 하는 막연한 생각이 짙었던 지극히 평범하면서도 미래가 불투명하던 아이였다. 대학은 공부도 열심히 하지 않았고 음악 동아리 생활만 열심히 하면서 설렁 설렁 다녔고, 막판 2년동안 계절학기 3번을 강행하면서 겨우 대기업 커트라인에 부합하는 학점을 만들어낸 아이였다. 하지만 지금 생각해보니, 학점이라던지 학부생활의 충실도가 나중에 직장생활이후의 삶을 좌지우지 하는 것은 아닌 듯 싶다. 가령, 음악 동아리에 가입하는 녀석들은 누가 시키지도 않았지만, 자기가 관심있는 악기를 자기 돈으로 사서 좋아하는 음악을 들어가며 연습을 해서, 개성 뚜렷한 다른 녀석들과 합주를 하는 재미로 대학 생활을 즐긴다. 이 모습은 프로그래머들이 본인이 원하는 프로그래밍 언어를 선택하여 연마하고 크고 작은 프로젝트에서 협업을 통해 어플리케이션을 만들어내는 과정과 무척 닮았다. 실리콘 밸리의 근무 환경이 좋기로 소문난 회사에 가보면, 방음이 잘 되어 있고 투명한 벽으로 둘러 쌓인 합주실을 본적이 있다. 아마도 이런 연관관계가 주된 이유가 아닐까..  

나는 나의 IT 인생의 시작은 대학을 졸업하고 SW개발병으로 복무를 시작하는 순간 부터라고 생각한다. 이때 겪었던 프로젝트나 보안관제 근무를 섰던 모니터링 실, 서버실, 거기서 작업하던 크고 작은 업체 분들과의 만남 등은 나의 업을 정하고 시작하는데 주요한 역할을 했기 때문이다. SW개발병 생활은 다음 글 부터 쓰겠다.

복무시절 병무청 홈페이지에 핵심기술특화병 홍보를 위해 찍어 간 사진이 있다. 헌데, 그게 아직도 있다. SW관리병으로 이름이 바뀌었고, 특기 번호도 바뀐듯..한번 웃자는 뜻에서..링크 공유한다..:)




>_


-- My Story ---------------------------------------










---------------------------------------------------


2014년 4월 19일 토요일

미국에서의 어린시절, 그리고 내 생애 최초의 컴퓨터

어린시절, 나의 아버지는 직장에서 선발된 미국 박사과정 수행 가능인력(?)으로 선정되셨다.

요즘 같으면 학비까지 모두 지원 되는 것으로 알고 있었으나, 알고 보니 학비 지원은 전혀 없었다고 하셨다. 


해서, 아버지는 장학금 지원을 받을 수 있는 미국내 대학교를 수소문하고 지원하셔서 두어군데에서 응답을 받으셨고, 조교 역할을 하면 전액 장학금을 제공 받을 수 있는 모 주립대학교로 학교를 결정하시게 되었다.


80년 초반에 영어는 한국에서 배운 것이 전부였던 부모님은 나와 내 동생을 데리고 미국 유학길에 오르셨고, 만 5년만에 박사과정을 우수한 성적으로 밟으셨고, 다시 한국으로 돌아왔다.


지금 생각 해 보면, 대단한 모험이지 않았나 싶다.


덕분에 나는 한국나이로 3살부터 8살때까지, 5년간 미국 본토에서 생활 할 수 있었었고, 자연스럽게 다양한 피부색을 가진 친구들을 사귈 수 있었고, 영어를 익히는 기회가 되었다. 




(만 6세 생일 파티 인 듯.. 얘네들 다 어딨을까..ㅋ)

그렇다고 지금 영어를 native처럼 구사하는 건 아니다. 실은 귀국 한 뒤 한국말이 서투른 상태에서 초등학교(그 당시 국민학교) 1학년 다니는 것이 힘들어 한국어 학원을 다녔었다고 한다. 그리고 어린 아이의 엄청난 언어 습득력으로 인해 6개월만에 유창하던 영어를 거의 다 잊어 버렸다고 하더라..


하나의 에피소드가.. 귀국후 1년정도 있다가 외할아버님 환갑잔치때 만났던 사촌형이 영어로 무언가를 물어봤는데, 나와 내 동생은 천진난만한 얼굴로 이렇게 물어봤다고 한다.

"형, 머라고 말 하는 거야?"

그 이후로 사회 생활할 때까지 영어를 사용할 기회는 거의 없었고, 학창시절에 영어 점수가 빼어나게 좋지는 않았던 걸로 기억한다. 물론, 누군가 영어로 말하면 알아 듣는 수준이라던지, 발음은 무척 좋은 편에 속했었다.하지만, 입사할때 생각해보니 대기업 토잌 커트라인을 넘기기 위해서 고군분투 했었고, 입사 지원시 자기소개서에는 미국에 살았었다는 부분을 쓰지 않았었다. 혹시나 면접관이 그 내용을 보고 영어를 시킬까봐 두려웠었던 듯 싶다. 그 만큼, 난 영어에 자신이 없었다. 


이런 경험을 통해, 학창시절에 배운 영어는 영어로 커뮤니케이션하는 데에는 큰 도움이 되지 않았던 것을 몸소 체험했다. 추후에 사회생활을 시작하고, 우연히 글로벌 프로젝트에 투입되어 미국, 벨라루스, 독일, 인도 등의 엔지니어들과 일을 함께 하다 보니, 물 밑에 가라 앉아 있던 영어 능력이 무서운 속도로 기어 올라오기 시작했다.이 내용은 나중에 자세히 다시 설명하도록 하겠다.


미국 생활할 당시 우리 집에 컴퓨터가 한 대 있었다. 내 생애 첫 컴퓨터이다. 솔직히 정확한 모델이 머였는지, 그 컴퓨터로 멀 했었는지 기억이 잘 나지는 않는다. 그저 플로피 디스크통에 들어 있는 게임 같은 것을 가끔 했던 걸로 기억한다.





(책상위에서 놀던 동생과 나, 책상위에는 컴퓨터 본체와 모니터, 키보드가 있었었다.)

울 어머니는 이 컴퓨터의 존재를 거의 기억 못 하고 계셨다. 하지만 나는 이 컴퓨터를 가지고 논 기억이 무척 또렸하다. 한국에 가지고 와서는 안에 어떻게 생겼는지 궁금해서 드라이버로 뜯어 보려고 했던 것도 기억 한다. 헌데, 지금 컴퓨터와는 다르게 납땜이 되어 있어서 속을 들여다 보려면, 철판을 뜯어내야 했었다. 해서, 결국 포기했었고, 어는 날엔가 고철덩어리가 되어서 사라진 듯 하다. 계속 가지고 있었으면 참 좋았을텐데.. 아쉽다.

이 컴퓨터 모델을 기억하고 싶은데, 어렴풋이 대우가 영어로 적혀 있었던듯..(DAEWOO) 미국에서 대우전자가 수출(?)한 제품을 사지 않았나 싶다. 싸이트 뒤져 봤는데, 도저히 못 찾겠다. 아무래도 81년도에 판매된 IBM PC와 대충 스펙이 비슷하지 않을까 싶다.모르지.. 한참 떨어질지도..

http://oldcomputers.net/ibm5150.html

나는 어렸을 때 부터 다른 사람 앞에 나서길 좋아했고, 늘 밝은 편이였으며, 감정에 솔직하게 커 왔고, 지금도 그렇다. 일하는 방식도, 똑같은 일을 계속 반복하는 것 보다는 항상 새로운 일을 찾아서 challanging하는 것을 즐기며, 새로운 것을 배워서 실무에 적용하는 것을 무척이나 원하고 바랜다.

지금 생각해보면 미국에서의 생활이 단순히 영어가 늘었다는 것 보다는, 한국에 비해서 무척이나 자유로운 서구문화에 대한 경험이 내 자신의 생각의 틀을 넓히게 해주었고,  지금의 나를 만들어낸 것이 아닌가 싶다. 또한, 피부색이 다른 친구들을 만날때 어색함 보다는 설레임이 가득한 나에게, 자연스럽게 그들과 어울릴 수 있게 해 주었고, 그것 또한 나에게는 글로벌 엔지니어로 성장 하기 위한 강력한 자양분이 된다는 것에 무척 감사해 하고 있다.



(Elementary School 같은 반 친구들.. 서있는 애들 중, 우측 끝이 나다..) 


2013년 6월, 멕시코 티후아나의 생산법인 시스템 구축을 위해 2개월정도 출장을 다녀온적이 있었다. 그때, 보안문제로 근접한 미국 샌디에고의 호텔에 투숙하게 되었었다. 샌디에고에 도착한 첫 날,  26년만에 다시 밟은 미국땅은 너무나도 포근했다. 이상하리만큼, 익숙했었다.

두 아이의 아버지가 된 지금, 난 꿈을 꾸고 있다. 미국땅에서 대한민국의 IT 엔지니어로서 활약할 수 있게 되기를.. 그리고 나의 부모님이 나에게 주셨던 경험을, 내 자식에게도 해주고 싶다.

나의 꿈은.. 진행형이다!!

>_


2014년 4월 16일 수요일

 대한민국 SW 개발자 생활 10년을 돌아보며..

2004년 4월 16일..

내가 이 세계에 발을 들여놓은 첫 날이다..

그날은.. 대학교를 갓 졸업하고, 늦게 나마 군대에 입대한 날이다..

나의 SW개발자 인생은 조금은 특이하게 시작하였다..

4년제 대학교 컴퓨터 공학을 졸업하고 '과연 이걸로 밥먹고 살 수 있을랑가' 하는 막연한 마음속에서..

국방의 의무를 효율(?)적으로 다하고자 핵심기술특화병인 'SW개발병'으로 입대한 것이 지금까지 이어진 듯 하다..

머.. 이에 대한 이야기는 나중에 자세히 하기로 하고..

만 10년이 된 지금, 무언가 새롭게 시작 혹은 무언가 값진 일을 해야 되겠다는 생각을 계속 하게 된다.

어떤것이 좋을까..

해서 오랜 시간(?) 끝에 결심한게 '블로그' 이다.

어디선가 SW개발자에게 블로깅은 필수라고 했던 글을 본 듯 하기도 한데.. 솔직히 시간을 내서 의미있는 글들을 만들어 나가는 것이 쉽지 않았었다.. 허나..

나만의 브랜드를 만들어가면서, 고민하고 나누고 싶은 내용들을 블로그에 담아보고자 한다.

처음부터 무거운 주제로 시작하기에는 겁이 날 듯 해서리..

내가 그 동안 지나온 발자취를 한번 천천히 정리해 나가보고자 한다..

이유는..

첫째.. 나 자신을 돌아보고 또 다른 10년을 새롭게 시작하기 위함이다.

둘째.. 이공계 기피현상(?)과 특히 IT 관련 업은 3D 업종으로 생각하며 거들떠도 보지 않는 우리 젊은 후배들에게 조금이나마 내 업에 대한 매력을 느끼게 해주고 싶고, 도전해보고 싶은 후배들에게 평범한 대한민국 개발자 이야기를 들려주고 싶기 위함이다.
(이렇게 말하면 굉장히 거만해 보일 수도 있을 터인데, 저는 무척 평범하고 능력도 적당한 인간이기에 오히려 더 도움이 되지 않을까 싶어서..ㅡㅡㅋ)

셋째.. 그 동안 국내의 외국인들과 일하면서 느낀 감정 및 현실을 토대로, 대한민국 IT의 글로벌화에 조금이나마 기여 할 수 있는 글들을 써보고 싶기 때문이다.

앞으로 이 글들은 일기 형태로 풀어 나갈 생각이다.. 한 주에 한 개씩 써 나가봐야지..

현재 생각하는 콘텐츠는..

. 어린시절의 컴퓨터와 프로그래밍에 대한 경험

. 대학시절 컴퓨터 공학과 학생으로서의 삶

. SW개발병으로 입대하게 되는 과정

. 육군전산소에서 개발자로서의 프로젝트 이야기 - part 1,2

. 사회 생활 시작을 위한 준비 및  최초 SI  업체 진출기

. 두번째 SI 업체 신입사원으로 입사하기

. 사원때 초보아닌 초보 개발자로써의 프로젝트 방황기

. Framework 개발자 진입기

. 개발자 및 SA로써 수행한 대형 보험사 차세대 프로젝트 수행기

. SA/FA로써 수행한 대형 제조사 글로벌 프로젝트 수행기

. 내 개인 브랜드에 대한 고민 및 이직기

머.. 중간 중간에 조금씩 수정 될 수는 있겠지만.. 이런 형태로 진행 해 볼까 한다..

그럼.. 시작해 볼까?

>_



-- My Story ---------------------------------------












---------------------------------------------------