관리 메뉴

HAMA 블로그

[미디움] 블록체인 개발자 면접 오픈북 본문

블록체인

[미디움] 블록체인 개발자 면접 오픈북

[하마] 이승현 (wowlsh93@gmail.com) 2019.04.25 11:27
 

Medium

기존의 IT 시스템과 네트워크를 혁신할 수 있는 가장 빠른 블록체인 기술을 개발합니다

themedium.io

미디움 (채용정보) 는 국내에서 몇 안되는 블록체인 플랫폼을 바닥부터 만들어 나가고 있는 개발사 입니다.
현재 완성도를 높히기 위해 개발에 박차를 가하고 있으며, 그에 따른 채용을 하고 있는데, (신입 초봉 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) R/D  부분임.



질문 리스트 (VER 1.5)

블록체인 부분 

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

비트코인 
1. 비트코인에서 UTXO 란 무엇인가요?
2. 비트코인에서 트랜잭션 검증은 어떻게 이루어 지나요
3. 비트코인에서 불룸필터는 왜 사용 되나요 
4. 비트코인에서 MultiSig는 어떻게 하나요? 
5. 비트코인에서 Segwit 은 무엇인가요? 

이더리움
1. 이더리움에서 트랜잭션 검증은 어떻게 이루어 지나요
2. 이더리움에서 트랜잭션 nonce 가 필수인 이유는? 비트코인은 왜 트랜잭션 nonce 가 없나요?
3. 이더리움에서 블룸필터는 왜 사용 되나요

4. 이더리움에서 머클패트리샤트리란 무엇인가요
5. 이더리움에서 RLP는 무엇인가요? 왜 필요한가요? Protocol buffer 와는 어떤 차이가 있나요
6. 이더리움에서 플라즈마란 무엇인가요
7. 이더리움에서 노드디스커버리는 어떻게 이루어 지나요
8. 이더리움에서 주소를 public key 자체가 아니라, 이더리움 경우 20byte로 줄여서 사용하는 이유는 무엇인가요 장점은? 줄여진 주소를 가지고 서명을 어떻게 확인 하나요 
9. 이더리움에서 블록싱크 방식은 어떻게 되나요
10. Parity 에서 warp-sync 란 무엇인가요? 
11. 이더리움에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요?
12. 이더리움에서 이벤트는 어떻게 발생되며, 클라이언트에서는 어떻게 감지하나요? 
13. 이더리움에서 Receipts정보는 용도가 무엇이며 언제 prunning 되나요?

하이퍼레저 패브릭
1. 하이퍼레저 패브릭에서 트랜잭션 흐름을 설명해 주세요.
2. 하이퍼레저 패브릭에서 MVCC 충돌이란 무엇인가요

3. 하이퍼레저 패브릭에서 MSP 란 무엇인가요
4. 하이퍼레저 패브릭에서 Fabric-CA가 하는 역할은 무엇인가요
5. 하이퍼레저 패브릭에서 RWSet이란 무엇인가요 
6. 하이퍼레저 패브릭에서 블룸 필터는 어떻게 사용 되나요
7. 하이퍼레저 패브릭에서 ACL 은 어떤 정보를 어떻게 가져와서 적용 되나요
8. 하이퍼레저 패브릭에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요
9. 하이퍼레저 패브릭에서 Kafka 는 왜 사용 되나요? RAFT 는 왜 등장 한 걸 까요?
10. 하이퍼레저 패브릭에서 토큰은 만들 수 있나요?  FabToken 왜 만들어 졌을까요?  
11. 하이퍼레저 패브릭에서 리더피어와 앵커피어란 무엇인가요?
12. 하이퍼레저 패브릭에서 Gossip Protocol 모듈의 역할은 무엇인가요?  
13. 하이퍼레저 패브릭에서 블록싱크 방식은 어떻게 되나요? 
14. 하이퍼레저 패브릭에서 이벤트는 어떻게 발생되며, 클라이언트에서는 어떻게 감지하나요? 
15. 하이퍼레저 패브릭의 Fabtoken에서 UTXO를 사용해서 이중지출이 안된다는데 왜 그렇죠? 근데 UTXO를 사용하는 비트코인은 이중지출 문제를 가지고 있습니다. 기술적 차이점은? 
16. 하이퍼레저 패브릭의 Fabtoken에서 StateDB에 UTXO들이 저장된다는데, 사용자 계정(지갑주소)은 어떻게 연결될까요? 연결되는게 가시적으로 보인다면 UTXO인데도 불구하고 개인정보에 취약하지 않을까요? 해결방법은? 
17. 하이퍼레저 패브릭의 Fabtoken에서 Privacy-preserving 을 위해 zk-snarks 대신 schnorr proofs 를 사용해야 하는 이유? 

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


컨센서스
1. Safety(finality) & Liveness 란? 
2.CFT와 BFT의 차이는 무엇인가요 
3. RAFT 에서 리더 선출은 어떻게 하나요? 
4. PBFT 알고리즘은 무엇인가요
5. DPOS 알고리즘은 무엇인가요


블록체인 소프트웨어 일반/C++/Java/Go 

소프트웨어 일반/설계
1. inheritance보다 Composition을 사용하라는 말은 무슨 의미인가요?
2. 주로 사용하는 리팩토링 3가지를 말해 주세요.
3. 주로 사용하는 디자인 패턴 3가지에 대해 말해 주세요.
5. 예외에 대해서 어떻게 생각하시나요? (예외 처리에 대한 6가지 화두 참고)
6. Future 패턴에 대해서 말해주세요.
7. 잠금 없는 동시성 프로그래밍이란 무엇인가요?
8. Actor 패턴과 Go언어의 CSP 모델의 차이점은 무엇인가요?
9. 공간(메모리)를 낭비해서 성능을 높이는 방식의 예를 3가지만 들어주세요.
10. Padding, Packing on memory alignmemt 은 무엇인가요? 
11. Buddy Memory Allocator 란 무엇인가요?
12. Try 모나드와 Optional 모나드와의 차이점은? 

JAVA
1. 자바의 메서드 인자 전달 방식과 Shallow Copy / Deep Copy 에 대해 설명 해주세요.
2. 자바의 HashMap 은 어떻게 동작하나요?
3. 자바 리플렉션은 무엇이며, 활용처가 어떤게 있을 까요?
4. 자바9에서는 Observer , Observable 를 없앴는데 왜 그랬을까요?
5. fork-join 쓰레드풀에 대해서 말해주세요.
6. 다음 코드의 오류와 차이점을 설명해 주세요.

//// 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++
1. C++ 에서 기반 클래스의 가상 소멸자가 필요한 이유는?
2. C++ 함수포인터와 std:function 의 차이는?
3. C++ 에서 임시객체가 생성되는 이유는? 성능 향상을 위해 필요한 조치는?  
4. C++ 에서 RVO vs std::move 에 대해서 논해주세요
5. C++ 에서 특수멤버함수는 무엇이며, 자동생성 조건들은? 
6. C++ 에서 std::optional 이란 무엇이고 왜 사용 해야 할 까요?
7. C++ 에서 성능하락을 막기 위해 알아야 할 기본적인 것들은 무엇이 있을까요?
8. C++ 에서 성능향상을 위해서 일반적으로 할 수 있는게 무엇이 있을까요?
9. C++ 에서 함수포인터와 람다가 사용되는 경우는 어떤 경우가 있을까요?

10. C++ 에서 람다식을 쓸 때 캡쳐리스트는 무엇이며 [&] 는 무엇인가요?
11. C++ 템플릿에서 Trait 와 Policy 는 왜 사용되나요?
12. C++ 에서 STL 컨테이너에 객체 보다는 객체의 포인터(스마트포인터)를 넣어야 하는 이유는?
13. C++ 에서 STL 사용시 단일요소 멤버함수보다 , 범위 멤버함수를 써야 하는 이유
14. C++ 에서 STL 사용시 가급적이면 알고리즘을 사용해야 하는 이유 
15. C++에서 메모리 풀링은 어떻게 구현하나요? (풀링 방식 종류 및 고정크기,가변크기에 대해서 각각 논해 주세요) 
16. 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;
}

17. 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
1. Go의 덕타이핑의 장,단점은 무엇인가요?
2. Go에서 고루틴&채널은 무엇인가요? 
3. 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 (8,9번은 롤입니다.)
0. 자바스크립트와 블록체인 연구에 대한 열의 (스스로 연구/개발해야합니다) 
1. Javascript 에 대한 깊은 이해 (You Don’t Know JS 시리즈 필독) 
2. Javascript 에서 객체 생성 방법은? 
3. Javascript 에서 왜 this 가 문제인가? 
4.  __proto__ 와 prototype 의 차이는?
5. async await 와 promise 차이는? 
6. Redux 의 장점과 단점은?
7. React & CSS 스타일링에 대한 포토폴리오 
8. Node (블록익스플로러 Backend개발 / Client SDK 개발)
9. React (블록익스플로러 Frontend / 지갑 프로토타입 개발)

분산시스템
1. CAP 이론이란? 
2. consistent hashing 이란 무엇인가요?
3. Gossip Protocol 는 무엇인가요?
4. white-board architecture 는 무엇인가요?
5. Zookeeper 는 무엇이고 어떤 역할을 담당하나요? 

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

암호학
1.HMAC / PKI / ECDSA는 무엇인가요
2. diffie-hellman 키 교환 알고리즘은 무엇인가요? 이더리움에서는 왜 사용하나요 
3. 하이퍼레저 패브릭의 ECcert 란 무엇인가요? 패브릭에서는 왜 사용하나요 
4. 하이퍼레저 패브릭의 TCert 는 왜 없어졌고, 대체제는 무엇인가요 
5. Schnorr signature는 무엇인가요?
6. 이더리움에서 영지식증명은 어떻게 사용되나요?
7. Fabric IDentity Mixer 와 Fabric fabtoken 에서 영지식 증명은 어떻게 사용되나요?

8. Zcash에서 영지식증명은 어떻게 사용되나요? 
8. ECC 개인키,공개키는 수학적으로 어떻게 만들어지며 비트코인의 secp256k1 소스를 보고 함수를 설명 해 주세요.
9. zk-SNARKs 와 zk-STARKs 와 
Schnorr proofs 의 차이점은?


DB
1. 트랜잭션에서  Two Phase Commit 이란 무엇인가요?
2. WAL (write-ahead logging) 은 무엇인가요?
3. B+tree 는  무엇인가요?
4. LSM (log structed merge tree)은 대략 무엇인가요?
5. leveldb의 특징 및 장점은 무엇인가요? 

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

네트워킹 / 소켓
1. 소위 응용레벨에서 RPC 방식과 스트리밍 방식의 차이점은 무엇인가요? 
2. 멀티쓰레드/Select/ ePoll /IOCP 방식의 소켓통신 차이점은 무엇인가요? 간략히
3. 소켓통신시 성능 향상을 위해 할 수 있는 것들은 무엇들이 있나요. 최대한 많이 말해주세요.
4.. 소켓통신에서 타임아웃은 무엇이고 Nagle 알고리즘은 무엇인가요?
5. 소켓통신상 SSL/TLS flow를 말해주세요
6. 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.

7. NAT 와 UPnP 는 무엇인가요?
8. Evpp or boost.asio 라이브러리의 차이점은? 

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

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



사족)

오픈북 면접은, 면접자가 어떤 회사,학교,전공 출신인지 상관없이 현재 실력으로 판단하며, 나이,경력,성별,국적(외국인 환영) 등 이런 요소들은 평가에 영향을 미치지 않습니다. 면접시 토론을 잘하는게 최우선 순위입니다. 물론 완벽 할 수 없음은 인정하고 있습니다. 

우리가 면접을 볼 때를 생각해보면, 황당한 질문이 나올 수도 있고 - 모든 지식을 머리속에 두고 있지 않기 때문에 - 운에 따라서 모르는 질문만 나올 수도 있습니다. 이에 따라 우리는 사측에서 필요한 지식이 무엇인지 구체적으로 오픈하고, 이 중 선택하여 질문을 하거나, 면접자 본인이 자신이 잘 하는 것을 선택해서 답변을 하는게 서로 유리 할 거라 판단 하였습니다. 사측은 이를 통해서라도 준비된 인재, 블록체인 분야에 집중하는 인재를 구인 할 수 있을거 같습니다.

질문 리스트들에 대한 모든 것을 세부적으로 기억하고 있어야 채용한다는 의미는 아닙니다. 세상은 변하여서 머리속에 모든 것을 담아 두는 시대는 아니라고 생각합니다. 다만 Why? 는 기억하고 있어야하며 무엇을 어떻게 찾아야 하는지에 대한 나침판은 필요하겠지요. 저도 모르는 100% 완벽한 답을 원하는것 보다는 공부는 하였는지, 어떤 생각을 가지고 있는지 어떻게 이해하고 있는지, 모르는 것을 명확히 표현하는지에 대한 검토를 하려 합니다.

ps)

미디움에서 구인하는 블록체인 플랫폼 팀 직무 정리 

블록체인 플랫폼 아키텍트
블록체인 크립토 이코노미스트  
소스품질 매니져 
시큐리티 매니져 
프로덕트 매니져 


플랫폼 소프트웨어 팀 

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

플랫폼 하드웨어 팀 
플랫폼 암호학/허가형 블록체인팀
플랫폼 스마트컨트랙트 팀 
플랫폼 Client 인프라팀 
플랫폼 데브옵스 & 프로젝트 관리팀 
플랫폼  QA팀 
 

문의) seunghyun.lee@themedium.io 

[미디움] 블록체인 플랫폼 개발자 공간 

0 Comments
댓글쓰기 폼