Thoughts2011.06.29 09:25
클라우드 개발자가 각광받고 있다는군요. 연봉이 20%~30% 정도는 뛰었고 팀장급은 아예 '부르는 게 값'일 정도라는데. 그런데 대관절 '클라우드 개발자'는 뭘까요?

1. 클라우드와 연동하는 앱 개발자

'연동가능한' 클라우드는 대부분 API가 있습니다. 이런 API를 제공하는 클라우드와의 연동은 웹 매쉬업 서비스를 개발하는 거나 마찬가지 수준입니다. 개발경험이 time to market을 낮추는데 기여할 수 있다는 이해하겠는데 20~30%나 연봉이 뛰어야 할 뭔가가 있는 건지는 알쏭달쏭한 영역. 하지만 여기까지 경험이 있다면 어차피 개발자들 연봉은 낮은 상태이므로 당연히 올려줘야 한다는 생각이 들기도. ㅎ



2. 클라우드 상에서 돌아가는 computing software 개발자

가령 구글의 Map-Reduce 모델 같은걸 사용해서 클라우드 computing resource 위에서 뭔가 대규모 데이터처리 어플리케이션 같은걸 개발해 보는 분들이 이 영역에 속하겠습니다. 종전의 GRID 컴퓨팅 하던 분들이 대거 이쪽으로 옮겨가는 통에 최근 각광받고 있는 듯. 그런데 이런 부분의 경험이 있는 개발자들은 (1) 학교에 계시거나 (2) 데이터센터를 보유한 대형 포털에 주로 몰려 계실 듯. 이 정도면 20~30% 정도 이상의 연봉 상승은 당연할 것 같고, 더 올려줘도 상관은 없을 듯.



3. 클라우드 플랫폼 소프트웨어 개발자

야후의 Hadoop이나 아마존의 Dynamo (Cassandra) 같은 소프트웨어를 개발하시는 분들이 여기에 해당. 이런 분야의 경력자라면 사실 100% 상승 정도는 당연하다고 봐도 아깝지 않을 정도의 초 고급 개발자로, 돈을 얼마 준다고 해도 아깝지 않을 정도의 희귀 인력.

4. 기타 영역

  • HIVE 같은 프로젝트를 이용해서 NOSQL DBMS에 SQL 인터페이스를 붙여봤다거나
  • Cassandra 같은 NoSQL 데이터베이스를 깔아서 데이터 처리에 응용해봤다거나
  • Google App Engine을 통해서 서비스하는 웹 기반 응용을 완벽하게 한번 만들어 봤다거나
  • 클라우드 기반의 인프라 서비스를 활용해서 뭔가를 만들어 봤다거나

이런 기술에 대한 경험이 있다면 20~30% 이상의 연봉향상을 기대하는 것이 타당할지도 모르겠군요. 어차피 돈이라는 것은 수요에 따라 변동하게 마련이니까요. 관련분야에서 석박사학위를 취득했거나 자격증이 있으면 좀 더 나을 수도 있겠습니다. 그런 경우에는 20~30% 보다 더 올려서 받을 수도 있겠죠. Hadoop Training을 받아서 Cloudera Certification을 취득하는 분도 있던데, 관심 있는 개발자라면 한번 시도해 볼 수도 있겠습니다.

개발자에 대한 요구가 늘어나고 개발자의 연봉이 늘어나는 건 좋은 일이지만, 한편으로는 현재 IT 업체들이 '굉장히 근시안적으로 사람을 뽑는' 경향이 드러난 것 같아서 씁쓸합니다. 사람을 뽑아서 문제를 해결하려고 하면 언제까지나 돌려막기가 될 수 밖에 없습니다. 쓸만한 사람을 뽑아서 미래를 보고 내부적으로 키워 인재로 만드는 것이 아니라, 이미 검증된 사람을 뽑아 일단 급한불을 끄겠다는 식으로 뭔가를 하면 그런 일은 급조된 농구팀으로 우승을 해 보겠다는 식의 이야기밖에 되질 않는 것 같네요.

인재로 만들어 놓으니 다른 데로 가버린다구요? 그럼 그건 '인재'로서의 대우를 제대로 안해줬다는 이야기겠죠. '인간적인 면'에 너무 기대시면, 나중에 더 큰 리스크가 다가옵니다. 요즘 같은 세상에선요.

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 댓글 보고 왔습니다. 사실 너무 놀랐습니다.

    열심히 사는 모습 살짝 엿보고 갑니다. 페이스북 친구와 블로그 북마크도 하고 갑니다.

    행복한 하루되세요. 저는 늘 똑같습니다. 세팍타크로 라이프 포에버~~~

    2011.06.29 21:40 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 재미있게 잘 보았습니다. 좋은 하루 되십시오.

    2011.06.30 10:48 신고 [ ADDR : EDIT/ DEL : REPLY ]

Languages/Erlang2009.06.23 14:07
Erlang과 Java를 연동시키려면 Erlang의 runtime을 띄울 때 epmd가 구동되도록 해야 합니다. 별도로 실행 방법을 알 필요는 없고, erl을 띄울 때 node 이름과 host name을 지정해 주면 됩니다.

$> erl -name foo@foo.bar

그렇게 하면 epmd가 자동으로 듭니다. 그래야 나중에 Java가 붙을 때 Java 프로그램의 node 이름이 해당 epmd에 등록 되기 때문에, 반드시 이렇게 해 주어야 합니다.

Erlang과 Java 프로그램의 연동은 서로 메시지를 주고 받는 과정을 통해서 이루어집니다. 따라서 연동을 하려면 Java 프로그램과 연동할 Erlang 프로세스가 떠 있어야 합니다. 다음의 간단한 프로그램 예제를 봅시다. 이 파일을 ets_java_frontend.erl로 저장하고 컴파일 해 둡니다.

-module(ets_java_frontend).
-export([start/0, shutdown/0, show/0, rpc/1]).

start() ->
    LoopPid = spawn(fun loop/0),
    register(ets_server, LoopPid).

shutdown() ->
    Pid = whereis(ets_server),
    Pid ! quit.

show() ->
    Pid = whereis(ets_server),
    Pid ! show.

rpc(T) ->
    Pid = whereis(ets_server),
    Pid ! T.

loop() ->
    EtsHandle = ets:new(test, [set]),
    loop(EtsHandle).

loop(Handle) ->
    receive
        show ->
            List = ets:tab2list(Handle),
            io:format("~p~n", [List]),
            loop(Handle);
        quit ->
            {ok, terminated};
        {tuple, T} ->
            io:format("msg is received ~p~n", [T]),
            ets:insert(Handle, T),
            loop(Handle);
        true ->
            io:format("unprocessable msg is received~n"),
            loop(Handle)
    end.

이 Erlang 프로그램은 {tuple, T} 형태의 메시지를 받으면 T (투플입니다)를 ets에 저장하는 프로그램입니다. spawn해서 프로세스를 생성할 때 해당 프로세스의 Pid를 register() 호출을 통해 등록하고 있는데, Java쪽에서 이 Erlang 프로그램에 메시지를 보낼 때 register()할 때 전달한 프로세스 이름(위의 경우에는 ets_server)을 통해 해당 프로세스의 mbox에 메시지를 전달하므로, register()를 반드시 호출해 프로세스 이름을 등록해 두어야 합니다.

이렇게 하면 Java 프로그램 안에서 Erlang 프로세스에 메시지를 전달할 수 있는데요. 공짜로 되는 것은 아니고 (당연하겠죠?) Erlang 패키지에 포함되어 있는 JInterface라는 라이브러리를 통하여야 합니다. Windows라면 해당 라이브러리는 C:/Program Files/erl5.7.2/lib/jinterface-1.5.1/priv에 있고, Unix라면 아마 /usr/lib/erlang/ 아래 어딘가에 해당 jar가 있을 겁니다. ^^;

잡소리는 집어치우고 해당 프로그램 예제를 간단하게 훑어보면...

import java.io.IOException;
import com.ericsson.otp.erlang.*;

public class ETP {

    private String node;
    private OtpNode self;
    private OtpMbox mbox;

    /**
     * create ETP instance.
     * @param name name of the erlang server node.
     * @throws IOException
     */
    public ETP(String node) throws IOException {
       
        this.node = node;
       
        try {
            this.self = new OtpNode("java_erl_bjlee");
        } catch ( IOException e ) {
            System.err.println("cannot create ETP instance.");
            e.printStackTrace();
            throw e;
        }

        this.mbox = self.createMbox("etp_java_client");
    }

    private OtpErlangTuple createMessage(OtpErlangTuple tuple) {
       OtpErlangObject[] aTerm = new OtpErlangObject[2];
       aTerm[0] = new OtpErlangAtom("tuple");
       aTerm[1] = tuple;
       OtpErlangTuple msg = new OtpErlangTuple( aTerm );
       return msg;
   }

   private void send(OtpErlangTuple msg) {
       mbox.send("ets_server", this.node, msg);
   }
   
    public boolean put(String key, String value) {
        OtpErlangObject[] aTuple = new OtpErlangObject[2];
        aTuple[0] = new OtpErlangAtom(key);
        aTuple[1] = new OtpErlangAtom(value);
        OtpErlangTuple tuple = new OtpErlangTuple(aTuple);
       
        OtpErlangTuple msg = createMessage(tuple);
       
        send(msg);
       
        return true;
    }
}

this.node에는 통신할 Erlang 노드의 이름이 들어갑니다. 이 페이지 맨 위에서처럼 했다면 foo가 들어가야겠군요. 먼저 OtpNode를 생성하구요. (이름을 주어야 합니다. Java 프로그램은 별개의 Erlang 노드인 것처럼 동작하거든요.) 그 다음에 message 송수신에 사용될 mbox를 만듭니다.

그 다음에는 이제 메시지를 보내 Erlang 프로그램이 원하는 작업을 하도록 만들면 됩니다. put 메소드의 코드를 보시면 되겠습니다. mbox.send() 함수가 최종적으로 호출되는데, 이 때 첫 번째 인자로는 통신할 erlang 프로세스의 registered name이 들어가고, 두 번째 인자로는 해당 프로세스가 돌고 있는 Erlang node, 그리고 세 번째 인자로는 실제로 전송할 메시지가 들어갑니다.

이제 Main 클래스를 다음과 같이 작성하고 돌려보면...

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
       
        ETP etp;
       
        try {
            etp = new ETP("foo");
        } catch (IOException e) {
           
            e.printStackTrace();
            return;
        }
       
        etp.put("test1", "value1");
        etp.put("test2", "value2");
       
        System.out.println("finished");
    }
}

참. 돌리기 전에 erl 셸에서 ets_java_frontend:start()를 먼저 실행해주어야 합니다. ㅎㅎ 어쨌든 실행하고 위의 Java 프로그램을 돌려보면... erl 쪽 화면에 메시지들이 찍히면서 ets에 내가 전송한 투플들이 저장됩니다. 저장이 잘 되었는지는 erl 셸에서 ets_java_frontend:show()를 실행하여 확인할 수 있습니다.

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 땅꼬마

    감사합니다, 좋은 정보 얻어가네요 ^^

    2009.12.24 10:28 신고 [ ADDR : EDIT/ DEL : REPLY ]