블록체인 개발자 면접 오픈북
미디움은 국내에서 몇 안되는 블록체인 플랫폼을 바닥부터 만들어 나가고 있는 개발사 입니다.
현재 완성도를 높히기 위해 개발에 박차를 가하고 있으며, 그에 따른 채용을 하고 있는데, (신입 4,000 전후 / 평균연봉 대기업 수준) 질문을 오픈해서 구인 합니다.
질문 리스트는 1. 블록체인 부분 2. 소프트웨어 일반/C++/Java/Go/Javascript 가 있습니다. 블록체인 부분은 블록체인 일반,이더리움,비트코인,하이퍼레저 패브릭,EOS에 한정되어 질문됩니다. 소프트웨어 부분은 저희 플랫폼이 기본적으로 C++ (17)으로 만들어져 있으며, Client SDK 는 자바로, SmartContract 와 특정서비스(Ordering Consensus 등)은 Go 와 Solidity로 만들어지기 때문에 소프트웨어 일반과 각 언어에 대한 질문이 포함 됩니다. (C++ 에 대한 깊이있는 이해는 필요. C 가 아닙니다.)
질문은 면접관이 면접자의 분야에 맞게 몇가지를 선택하여서 (주로 형광펜) 그리고 면접자가 자신의 분야 또는 공부한 것에 대해 선택하여 답변하는 방식 입니다. 답변은 말을 통해서 하거나 화이트 보드에 대략적으로 그려가면서 설명 할 수 있습니다. (가급적 코딩을 요구하진 않습니다. 가끔 슈도코딩 정도..)
1번(블록체인 부분)을 잘아는 분은 블록체인 아키텍트 2번(소프트웨어 개발) 을 잘아는 분은 블록체인 연구/개발을 맡으실 것이며, 새로운 영역이다 보니, 모두가 능동적으로 연구하고 스스로 해야 할 것을 찾는 분위기를 만들려고 합니다. 생각보다 빠르게 만들었다면, 다음 할일을 알아서 찾아보는 능동적인 인재상을 원하며, 생각보다 지연되는것에 대한 추궁을 하진 않습니다. 빠르게 만들기 보다는, 잘 만들기 위한 노력을 지원합니다. 마지막으로 생각나는데로 작성했지만 저도 잘 모르는 것들도 있습니다. 함께 모르는것을 공부하고 , 토론하고, 공유하는 마음으로 임하시면 될 거 같습니다. 이 블록체인 분야에서의 긍정적 열의가 가장 중요합니다. 참고로 모든 답변을 잘하는 분은 없었습니다. 존재 할 거 같지도 않네요. 안심하세요. :-)
* 현재 필요한 포지션은 스마트컨트랙트(Webassembly,LLVM ) 와 암호학(Privacy, Permissioning) 개발 부분임.
질문 리스트 (VER 1.9) - 형광펜 칠해져있는 부분중에서 주로 질문됩니다.
블록체인 부분

블록체인 일반

  • 블록체인은 무엇인가요?
  • 블록체인 트릴레마(Blockchain Trilemma)란?
  • 토큰과 코인의 차이는 무엇인가요?
  • 크립토 이코노미 or 토큰 디자인 에 대해서 생각나는데로 말해주세요.
  • 이더리움에서 ERC20 표준을 만든 이유는 무엇인가요?
  • Double Spending 문제, Replay Attack 문제, Eclipse Attack 문제 각각 무엇인가요?
  • DEX 와 0x protocol 에 대해서 말해주세요.
  • Fabric vs R3 vs EEA 의 Certificate management for permissioning 관점에서 주요 차이점

비트코인

  • 비트코인에서 UTXO 란 무엇인가요?
  • 비트코인에서 트랜잭션 검증은 어떻게 이루어 지나요? input 값 내부의 previous output 의 신뢰 여부는?
  • 비트코인에서 SPV는 불룸필터를 왜 사용 되나요?
  • 비트코인에서 Segwit 은 무엇인가요?
  • Mnemonic phrases 과 HD Wallet 이란?

이더리움

  • 이더리움에서 트랜잭션 검증은 어떻게 이루어 지나요
  • 이더리움에서 Transaction 과 RawTrancation의 차이는?
  • 이더리움에서 트랜잭션 nonce 가 필수인 이유는? 비트코인은 왜 트랜잭션 nonce 가 없나요?
  • 이더리움에서 머클패트리샤트리란 무엇인가요
  • 이더리움에서 RLP는 무엇인가요? 왜 필요한가요? Protocol buffer 와는 어떤 차이가 있나요
  • 이더리움에서 플라즈마란 무엇인가요
  • 이더리움에서 노드디스커버리는 어떻게 이루어 지나요
  • 이더리움에서 주소를 public key 자체가 아니라, 이더리움 경우 20byte로 줄여서 사용하는 이유는 무엇인가요.줄여진 주소를 가지고 서명을 어떻게 확인 하나요
  • EIP-55 체크섬이란?
  • 이더리움에서 블록싱크 방식은 어떻게 되나요
  • Parity 에서 warp-sync 란 무엇인가요?
  • 이더리움에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요?
  • 이더리움에서 이벤트(logs)는 어떻게 발생되며, 클라이언트에서는 어떻게 감지하나요?
  • 이더리움에서 Receipts정보는 용도가 무엇이며 언제 prunning 되나요?

하이퍼레저 패브릭

  • 하이퍼레저 패브릭에서 트랜잭션 흐름을 설명해 주세요.
  • 하이퍼레저 패브릭에서 genesis.block 은 무엇인가요? channel.tx 를 통해서 만들어지는 첫번째 블록과 차이점은?
  • 하이퍼레저 패브릭에서 MVCC 충돌이란 무엇인가요
  • 하이퍼레저 패브릭에서 MSP 란 무엇인가요
  • 하이퍼레저 패브릭에서 채널MSP 와 네트워크MSP는 무엇인가요?
  • 하이퍼레저 패브릭에서 nonce 에 대해서 말해주세요. 이더리움과 차이점은??
  • 하이퍼레저 패브릭에서 Fabric-CA가 하는 역할은 무엇인가요
  • 하이퍼레저 패브릭에서 RWSet이란 무엇인가요
  • 하이퍼레저 패브릭에서 블룸 필터는 어떻게 사용 되나요
  • 하이퍼레저 패브릭에서 ACL 은 어떤 정보를 어떻게 가져와서 적용 되나요
  • 하이퍼레저 패브릭에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요
  • 하이퍼레저 패브릭에서 Kafka 는 왜 사용 되나요? RAFT 는 왜 등장 한 걸 까요?
  • 하이퍼레저 패브릭에서 토큰은 만들 수 있나요? FabToken 왜 만들어 졌을까요?
  • 하이퍼레저 패브릭에서 리더피어와 앵커피어란 무엇인가요?
  • 하이퍼레저 패브릭에서 Gossip Protocol 모듈의 역할은 무엇인가요?
  • 하이퍼레저 패브릭에서 Gossip Protocol 은 어떻게 리더선출을 하나요?
  • 하이퍼레저 패브릭에서 블록싱크 방식은 어떻게 되나요?
  • 하이퍼레저 패브릭에서 이벤트는 어떻게 발생되며, 클라이언트에서는 어떻게 감지하나요?
  • 하이퍼레저 패브릭에서 TCert 를 대체하는 Identity Mixer에 대해서 말해 주세요.
  • 하이퍼레저 패브릭의 Fabtoken에서 StateDB에 UTXO들이 저장된다는데, 사용자 계정(지갑주소)은 어떻게 연결될까요? 연결되는게 가시적으로 보인다면 UTXO인데도 불구하고 개인정보에 취약하지 않을까요? 해결방법은?
  • 하이퍼레저 패브릭의 Fabtoken에서 UTXO를 사용해서 이중지출이 안된다는데 왜 그렇죠? 근데 UTXO를 사용하는 비트코인은 이중지출 문제를 가지고 있습니다. 기술적 차이점은?

EOS

  • EOS에서 트랜잭션 수수료는? 리소스 사용량 계산 방식은?
  • EOS의 뱅커 (Bancor)알고리즘 이란?

컨센서스

  • Safety(finality) & Liveness 란?
  • CFT와 BFT의 차이는 무엇인가요
  • POW 와 POS 의 가장 큰 차이는 무엇이라고 생각 하나요? (Safety(finality) & Liveness 관점에서)
  • PBFT 알고리즘은 무엇인가요?
  • DPOS 알고리즘은 무엇인가요?
  • 패브릭의 E-O-V 식의 합의프로세스의 장점과 단점은 무엇인가요?
블록체인 소프트웨어 일반/C++/Java/Go

소프트웨어 일반/설계

  • inheritance보다 Composition을 사용하라는 말은 무슨 의미인가요?
  • 주로 사용하는 리팩토링 3가지를 말해 주세요.
  • 주로 사용하는 디자인 패턴 3가지에 대해 말해 주세요.
  • Observer 패턴의 슈도코드 구현
  • 예외에 대해서 어떻게 생각하시나요? (예외 처리에 대한 6가지 화두 참고)
  • dead lock , live lock, starvation, race condition 이란?
  • Concurrent Programming Without Locks 또는 Transactional memory란?
  • 여러개의 쓰레드들에게 일을 분배하고, 모두 끝날 때 까지 기다리는 슈도코드를 구현.
  • Future / Promise 패턴에 대해서 말해주세요.
  • Actor 패턴과 Go언어의 CSP 모델의 차이점은 무엇인가요?
  • 공간(메모리)를 낭비해서 성능을 높이는 방식의 예를 3가지만 들어주세요.
  • Padding, Packing on memory alignmemt 은 무엇인가요?
  • SLOB 또는 Buddy Memory Allocator 란 무엇인가요?
  • Try / Option / Either in Scala 의 차이점은?

JAVA

  • 자바의 메서드 인자 전달 방식과 Shallow Copy / Deep Copy 에 대해 설명 해주세요.
  • 자바의 HashMap 은 어떻게 동작하나요?
  • 자바 리플렉션은 무엇이며, 활용처가 어떤게 있을 까요?
  • 자바9에서는 Observer , Observable 를 없앴는데 왜 그랬을까요?
  • fork-join 쓰레드풀에 대해서 말해주세요.
  • 다음 서블릿 호출 코드(필터들을 거친 후 target 이 한번 exectue 됨) 의 로직적 오류는?
  • //// Filter 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
            ...  인코딩처리 OR
            ...  로깅처리 OR
            ...  인증처리
    
            chain.doFilter(request, response);
         
            ...  
    }
    
    //// FilterChain
    
    public class FilterChain { 
       private List filters = new ArrayList(); 
       private Target target; 
       
       int currentFilter = 0; 
    
       public void addFilter(Filter filter){ 
          filters.add(filter); 
       } 
    
       public Filter getNextFilter(){ 
          if(currentFilter < filters.size()){ 
               return filters.get(currentFilter++); 
          } 
          return null; 
       } 
       public void doFilter(String request, String response){ 
             Filter f = getNextFillter(); 
             if(f != null){  
               f.doFilter(request,response,this);         
             } 
               
             target.execute(request,response); 
       } 
    
       public void setTarget(Target target){ 
          this.target = target; 
       } 
                                                
  • 아래처럼 Chain of Responsiblity 패턴식의 차이점은?
  • import java.util.ArrayList; 
    import java.util.List; 
    
    public class FilterChain { 
       private List filters = new ArrayList(); 
       private Target target; 
    
       public void addFilter(Filter filter){ 
          filters.add(filter); 
       } 
    
       public void doFilter(String request, String response){ 
          for (Filter filter : filters) { 
             filter.doFilter(request,response); 
          } 
          target.execute(request); 
       } 
    
       public void setTarget(Target target){ 
          this.target = target; 
       } 										        
    										    

C++

  • C++ 에서 기반 클래스의 가상 소멸자가 필요한 이유는?
  • C++ 함수포인터와 std:function 의 차이는?
  • C++ 에서 임시객체가 생성되는 이유는? 성능 향상을 위해 필요한 조치는?
  • C++ 에서 RVO vs std::move 에 대해서 논해주세요
  • C++ 에서 특수멤버함수는 무엇이며, 자동생성 조건들은?
  • C++ 에서 std::optional 이란 무엇이고 왜 사용 하나요?
  • C++ 에서 성능하락&향상에 관해 알아야 할 기본적인 것들은 무엇이 있을까요?
  • C++ 에서 set 과 unordered_set in STL 의 차이점은?
  • C++ 에서 함수포인터와 람다가 사용되는 경우는 어떤 경우가 있을까요?
  • C++ 에서 람다식을 쓸 때 캡쳐리스트는 무엇이며 [&] 는 무엇인가요?
  • C++ 템플릿에서 Trait 와 Policy 는 왜 사용되나요?
  • C++ 에서 STL 컨테이너에 객체 보다는 객체의 포인터(스마트포인터)를 넣어야 하는 이유는?
  • C++ 에서 STL 사용시 단일요소 멤버함수보다 , 범위 멤버함수를 써야 하는 이유
  • C++ 에서 STL 사용시 가급적이면 알고리즘을 사용해야 하는 이유
  • C++에서 메모리 풀링은 어떻게 구현하나요? (풀링 방식 종류 및 고정크기,가변크기에 대해서 각각 논해 주세요)
  • C++에서 아래 코드를 설명 해 주세요. (생산자-소비자 패턴중 소비자에 해당하며, 소비자는 여기 한 군데만 존재)
  • Buffer BufferPool::get_buf(){
       Buffer* buf = nullptr;
       std::unique_lock<std::mutex> ul(_mtx, std::defer_lock);
    
       while (buf == nullptr){
        ul.lock();
        if (_pool.empty()) _cond.wait(ul);
    
        if (!_pool.empty())  // 여기서 pool 이 empty 일 경우는?
        {
           buf = _pool.get();
        }
      }
    
       .... DO something ....
      return buf;
    }                                                
                                                
  • C++ 에서 다음 코드를 설명 해 주세요. (블럭이 아래 validator에서 사용되는데 릴리즈 하는 이유?)
  • void BlockPool::release(std::shared_ptr<Block> block) {
    
        if (block.get() != nullptr) {
             ... be returned to blockpool 
        }
    }
    
    /// 
    
    
    void Committer::executor() {
        ... 생략 ...
        std::shared_ptr<Block> block;
    
        while (!_stop) {
            .... 생략 ...
    
            block = _rblocks.front();
    
            if (headerParsing..) { 
                ... 생략 ...
                verifyBlockSign();
                verifyTransactionsSign();
                
                // validating start  
                vlock.lock();
                _vblocks.push_back(block);
                vlock.unlock();
                _vblockCond.notify_all();
    
                 block.reset();
            }
    
            rlock.lock();
            _rblocks.pop_front();
            rlock.unlock();
    
            if (block.get() != nullptr) {
               _pool.release(block); // 블럭이 아래 validator에서 사용되는데 릴리즈 하는 이유? 
            }
        }
    }
    
    ///
    
    void Committer::validator() {
    
         ... 생략 ..
    
        while (!_stop) {
            
            lock.lock();
            if (_vblocks.empty()) {
                _vblockCond.wait(lock);
            }
    
            if (_vblocks.empty()) {
                lock.unlock();
                continue;
            }
    
            block = _vblocks.front();
            _vblocks.pop_front();
            lock.unlock();
    
            .. Do something using block ..
        }
    
        _pool.release(block); // 여기서 block 이 릴리즈~                                                
                                                

Golang

  • Go의 덕타이핑의 장,단점은 무엇인가요?
  • Go에서 고루틴&채널은 무엇인가요?
  • Go에서 select 문은 어떻게 사용되나요? 아래 코드를 설명 해 주세요.
  • package main
    
    import (
       "fmt"
       "time"
    )
    
    var scheduler chan string
    
    func consuming (prompt string){
          fmt.Println("consuming 호출됨")
       select {
       case scheduler <- prompt:
          fmt.Println("이름을 입력받았습니다 : ", <- scheduler)
       case <-time.After(5 * time.Second):
          fmt.Println("시간이 지났습니다.")
       }
    }
    
    func producing (console chan string) {
       var name string
       fmt.Print("이름:")
       fmt.Scanln(&name)
       console <- name
    }
    func main() {
       console := make(chan string, 1)
       scheduler = make(chan string, 1)
    
       go func(){
          consuming(<-console)
       }()
    
       go producing(console)
    
       time.Sleep(100 * time.Second)                                                
                                                
    func (p *MsgPipeRW) WriteMsg(msg Msg) error {
      if atomic.LoadInt32(p.closed) == 0 {
        consumed := make(chan struct{}, 1)
        msg.Payload = &eofSignal{msg.Payload, msg.Size, consumed}
       select {
        case p.w <- msg:
          if msg.Size > 0 {
          // wait for payload read or discard
            select {
              case <-consumed:
              case <-p.closing:
            }
          }
          return nil
        case <-p.closing:
        }
      }
      return ErrPipeClosed
    }                                                
                                                

Javascript

  • 자바스크립트에 대한 열의는?
  • Javascript 에 대한 깊은 이해 (자바스크립트 완벽가이드 or You Don’t Know JS 시리즈 필독)
  • browser 동작에 대한 이해 (https://d2.naver.com/helloworld/59361)built-in Javascript objects / browser objects / HTML DOM objects 란?
  • Javascript 에서 객체 생성 방법은?
  • Javascript 에서 왜 this 가 문제인가?
  • __proto__ 와 prototype 의 차이는?
  • ajax 와 websocket 통신의 차이는?
  • async await 와 promise 차이는?
  • Redux 의 장점과 단점은?
  • React & CSS 스타일링에 대한 포토폴리오

분산시스템

  • CAP 이론이란?
  • consistent hashing 이란 무엇인가요?
  • RAFT 는 무엇인가요?
  • white-board architecture 는 무엇인가요?
  • Zookeeper 는 무엇이고 어떤 역할을 담당하나요?

컴파일러

  • AST 와 LLVM 이란?
  • 이더리움의 solidity 언어와 다르게, go, c++을 사용하면 비결정적 문제가 생깁니다. 무슨 의미인가요?
  • 이더리움의 solidity 언어는 어떤식으로 리소스에 대한 과금을 하나요?
  • EOS에서는 어떤식으로 리소스에 대한 과금을 하나요?
  • solidity 처럼 C++이나 Go로 만든 프로그램에서 CPU,Memory,Storage 를 사용한 만큼의 지표를 구하고 싶을 때 어떻게 할 수 있을까요?
  • ewasm의 동작방식을 설명해 주세요.

암호학

  • HMAC / PKI / ECDSA / ECDH는 무엇인가요
  • diffie-hellman 키 교환 알고리즘은 무엇인가요? 이더리움에서는 왜 사용하나요?
    (Diffie-hellman은 ECC 계열 (ECDH) 를 사용하고, 키값을 2048bit 이상으로 사용한다)
  • diffie-hellman 키 교환이 SSL (TLS) 에서는 어느 지점에서 사용 되나요?
  • Logjam 취약점이란?
  • 하이퍼레저 패브릭의 ECert 란 무엇인가요? 패브릭에서는 왜 사용하나요
  • 하이퍼레저 패브릭의 TCert 는 왜 없어졌고, 대체제는 무엇인가요
  • ECC 개인키,공개키는 수학적으로 어떻게 만들어지며 비트코인의 secp256k1 소스를 보고 함수를 설명 해 주세요.
  • group signature vs aggregation signature vs threshold signature 의 차이점은?
  • 이더리움에서 영지식증명은 어떻게 사용되나요?
  • Zcash에서 영지식증명은 어떻게 사용되나요?
  • 모네로에서 ring signature 란 무엇인가요?
  • Fabric IDentity Mixer 에서 영지식 증명은 어떻게 사용되나요?
  • zk-SNARKs 와 zk-STARKs 와 Schnorr proofs 의 차이점은?
  • 하이퍼레저 패브릭의 Fabtoken에서 StateDB에 UTXO들이 저장된다는데, 사용자 계정(지갑주소)은 어떻게 연결될까요? 연결되는게 가시적으로 보인다면 UTXO인데도 불구하고 개인정보에 취약하지 않을까요? 해결방법은?
  • 하이퍼레저 패브릭의 Fabtoken에서 Privacy-preserving 을 위해 zk-snarks 대신 schnorr proofs 를 사용해야 하는 이유?

DB

  • ACID 란 무엇인가요?
  • 디스크 기반 페이지 관리에 대해 다음 코드를 설명 해 주시고, 주석을 참고하여 한 라인의 코드를 넣어 주세요.
  • struct BufferManager {
            FILE * fp;
            int pageSize;
            int maxPageNo;
            int lastFreePageNo;
    };
    
    void init(cahr * name, int size){
        bufferManager = malloc(sizeof(BufferManager));
        bufferManager->fp = fopen(name, "rb+");
        if (bufferManager->fp == NULL) {
    		createF(name,0644);
            bufferManager->fp = fopen(name, "rb+");
        }
        bufferManager->pageSize = size;
        bufferManager->maxPageNo = 0;
        bufferManager->lastFreePageNo = -1;
    }
    
    
    BOOL readPage(int pageNo, BYTE * buffer) {
        int ret;
        fseek(bufferManager->fp, pageNo * bufferManager->pageSize, SEEK_SET);
        ret = (int) fread(buffer, sizeof(BYTE), bufferManager->pageSize, bufferManager->fp);
        rewind(bufferManager->fp);
        if (ret > 0 ) return TRUE;
    	else return FALSE;
    }
    
    BOOL writePage(int pageNo, BYTE * buffer) {
       //생략
    }
    
    int newPage(){
     int freePageNo, nextPageNo, offset;
     if(bufferManager->lastFreePageNo == -1 ){
        freePageNo = ++(bufferManager->maxPageNo);
     }
     else {
        freePageNo = bufferManager->lastFreePageNo;
        offset= freePageNo * bufferManager->pageSize;
        fseek(bufferManager->fp, offset, SEEK_SET);
        fread( & nextPageNo, sizeof(int), 1, bufferManager->fp);
        if (nextPageNo == -1) 
          bufferMananger->lastFreePageNo = -1;
        else 
          /* 여기에 들어 갈 한 라인의 코드는?? */
     }
    return freePageNo;
    }
    
    void freePage(int pageNo) {
       int offset;
       offset = pageNo * bufferManager->pageSize;
       fwrite(& (bufferManager->lastFreePageNo), sizeof(int), 1, bufferManager->fp);
       /* 여기에 들어 갈 한 라인의 코드는?? */
    
    }                                                
                                                
  • 트랜잭션에서 Two Phase Commit 이란 무엇인가요?
  • 저널링 / WAL (write-ahead logging) 은 무엇인가요?
  • Red&Black tree & B tree & Skip lists 자료구조를 비교해주세요.
  • LSM (log structed merge tree)은 대략 무엇인가요?
  • leveldb 와 redis 의 특징 및 차이점은?

MQ

  • Kafka 의 브로커,토픽,파티션은 무엇인가요?
  • Kafka 에서 acks 옵션은 무엇인가요? acks=0,1,2 각각에 대해서 말해주세요.
  • Kafka와 RabbitMQ의 차이점은?

네트워킹 / 소켓

  • 소위 응용레벨에서 RPC 방식과 스트리밍 방식의 차이점은 무엇인가요?
  • 멀티쓰레드/Select/Java NIO/ ePoll /IOCP 방식의 소켓통신 차이점을 아는 만큼 말해 주세요.
  • 소켓통신시 성능 향상을 위해 할 수 있는 것들은 무엇들이 있나요. 최대한 많이 말해주세요.
  • 소켓통신에서 타임아웃은 무엇이고 Nagle 알고리즘은 무엇인가요?
  • 소켓통신상 SSL/TLS flow를 간략히 말해주세요
  • React 방식과 Proact 방식의 차이점은 무엇인가요? (in POSA2)
  • Reactor Event Handling Allows event-driven applications to demultiplex and dispatch service requests that are delivered to an application from one or more clients.
    Proactor Event Handling Allows event-driven applications to efficiently demultiplex and dispatch service requests triggered by the completion of asynchronous operations, to achieve the performance benefits of concurrency without incurring certain of its liabilities.
  • NAT 와 UPnP 는 무엇인가요?

인프라 & 데브옵스 아키텍쳐

  • 애자일 관리 기법 (*JIRA)
  • 프로덕트 & 형상 관리 (Bitbucket)
  • 도커 + 쿠버네이트등 컨테이너화
  • 빌드자동화 (* Bamboo )
  • 테스트자동화 (* 유닛 테스트 gTest 연구)
  • 이슈등록자동화 (*JIRA)
  • 정보 공유 위키 관리 (confluence)
  • 정보 공유 채팅 관리 (slack)
  • 디플로이 자동화
  • 서비스 관리 자동화
  • 네트워킹 인프라에 대한 이해
  • 수직 / 수평 분활에 대한 이해
  • 무정지 시스템 이해 및 구축 (무정지 리소스 증축등)
  • AWS 매니지먼트

미디움 블록체인 플랫폼 팀 직무 정리

블록체인 플랫폼 아키텍트


  • 크립토 이코노미스트 : 플랫폼 코인/토큰 시스템 디렉션 / DApp 구상
  • 소스품질 매니져 : C++ 17+ 로직,컨벤션,문법,성능 검토,교육
  • 시큐리티 매니져 : 암호학/네트워킹 연구 및 샘플 개발
  • 프로덕트 매니져 : 플랫폼 진행 사항 체크/ 다른 그룹과의 소통 및 지원/ 나아가야할 방향 정리

  • 허가형&암호화 아키텍트
  • 플랫폼 소프트웨어 아키텍트
  • 스마트컨트랙트 아키텍트

  • 플랫폼 소프트웨어 팀
  • 분산네트워킹 & 패킷 직렬화, 압축등 연구/개발
  • BlockChain Data 연구/개발
  • 탈중앙화 및 컨센서스 알고리즘 연구/개발
  • Proxy & Orderer 연구/개발
  • 허가형 블록체인 설계
  • 성능 개선 연구/개발
  • C++ 기반 & 공통 라이브러리 연구/개발

  • 플랫폼 하드웨어 인터페이스 팀
  • 플랫폼 암호학/허가형 블록체인팀
  • 플랫폼 스마트컨트랙트 팀
  • 플랫폼 Client 인프라팀
  • 플랫폼 데브옵스 & 프로젝트 관리팀
  • 플랫폼 QA팀 블록체인 선행 연구 및 조사팀

사족)
오픈북 면접은, 면접자가 어떤 회사,학교,전공 출신인지 상관없이 현재 실력으로 판단하며, 나이,경력,성별,국적(외국인 환영) 등 이런 요소들은 평가에 영향을 미치지 않기 위해 노력 하고 있습니다. 면접시 토론을 잘하는게 최우선 순위입니다. 물론 완전할 수 없음은 인정하고 있습니다. 신뢰비용을 다시 정산하기 위한 최소한의 노력은 하려고 합니다.
우리가 면접을 볼 때를 생각해보면, 황당한 질문이 나올 수도 있고 - 모든 지식을 머리속에 두고 있지 않기 때문에 - 운에 따라서 모르는 질문만 나올 수도 있습니다. 이에 따라 우리는 사측에서 필요한 지식이 무엇인지 구체적으로 오픈하고, 이 중 선택하여 질문을 하거나, 면접자 본인이 자신이 잘 하는 것을 선택해서 답변을 하는게 서로 유리 할 거라 판단 하였습니다. 사측은 이를 통해서라도 준비된 인재, 블록체인 분야에 집중하는 인재를 구인 할 수 있을거 같습니다.
질문 리스트들에 대한 모든 것을 세부적으로 기억하고 있어야 채용한다는 의미는 아닙니다. 세상은 변하여서 머리속에 모든 것을 담아 두는 시대는 아니라고 생각합니다. 다만 자신의 관심 분야에 대한 Why? 는 기억하고 있어야하며 무엇을 어떻게 찾아야 하는지에 대한 나침판은 필요하겠지요. 저도 모르는 100% 완벽한 답을 원하는것 보다는 공부는 하였는지, 어떤 생각을 가지고 있는지 어떻게 이해하고 있는지, 모르는 것을 명확히 표현하는지에 대한 검토를 하려 합니다.